source: clfs-sysroot/patches/vim-7.2-branch_update-3.patch@ 0cdbce9

Last change on this file since 0cdbce9 was d25b7db, checked in by Joe Ciccone <jciccone@…>, 16 years ago

Updated Vim Patch.

  • Property mode set to 100644
File size: 160.4 KB
RevLine 
[d25b7db]1Submitted By: Jim Gifford (jim at linuxfromscratch dot org)
2Date: 12-30-2008
3Initial Package Version: 7.2
4Origin: Upstream
5Upstream Status: Applied
6Description: Contains all upstream patches up to 7.2.076
7 The following patches were skipped
8 007 036 041 049 071 072 074
9
10diff -Naur vim72.orig/Filelist vim72/Filelist
11--- vim72.orig/Filelist 2008-07-06 11:02:23.000000000 -0700
12+++ vim72/Filelist 2008-12-30 16:15:18.000000000 -0800
13@@ -285,6 +285,7 @@
14 src/proto/os_win32.pro \
15 src/proto/os_mswin.pro \
16 src/testdir/Make_dos.mak \
17+ src/testdir/Make_ming.mak \
18 src/testdir/dos.vim \
19 src/uninstal.c \
20 src/vim.def \
21diff -Naur vim72.orig/runtime/doc/cmdline.txt vim72/runtime/doc/cmdline.txt
22--- vim72.orig/runtime/doc/cmdline.txt 2008-08-09 07:22:59.000000000 -0700
23+++ vim72/runtime/doc/cmdline.txt 2008-12-30 16:15:47.000000000 -0800
24@@ -1,4 +1,4 @@
25-*cmdline.txt* For Vim version 7.2. Last change: 2008 Jul 29
26+*cmdline.txt* For Vim version 7.2. Last change: 2008 Sep 18
27
28
29 VIM REFERENCE MANUAL by Bram Moolenaar
30@@ -157,6 +157,11 @@
31 (doesn't work at the expression prompt; some
32 things such as changing the buffer or current
33 window are not allowed to avoid side effects)
34+ When the result is a |List| the items are used
35+ as lines. They can have line breaks inside
36+ too.
37+ When the result is a Float it's automatically
38+ converted to a String.
39 See |registers| about registers. {not in Vi}
40 Implementation detail: When using the |expression| register
41 and invoking setcmdpos(), this sets the position before
42@@ -730,19 +735,29 @@
43 In Ex commands, at places where a file name can be used, the following
44 characters have a special meaning. These can also be used in the expression
45 function expand() |expand()|.
46- % is replaced with the current file name *:_%*
47- # is replaced with the alternate file name *:_#*
48+ % Is replaced with the current file name. *:_%* *c_%*
49+ # Is replaced with the alternate file name. *:_#* *c_#*
50 #n (where n is a number) is replaced with the file name of
51- buffer n. "#0" is the same as "#"
52- ## is replaced with all names in the argument list *:_##*
53+ buffer n. "#0" is the same as "#".
54+ ## Is replaced with all names in the argument list *:_##* *c_##*
55 concatenated, separated by spaces. Each space in a name
56 is preceded with a backslash.
57-Note that these give the file name as it was typed. If an absolute path is
58-needed (when using the file name from a different directory), you need to add
59-":p". See |filename-modifiers|.
60+ #<n (where n is a number > 0) is replaced with old *:_#<* *c_#<*
61+ file name n. See |:oldfiles| or |v:oldfiles| to get the
62+ number. *E809*
63+ {only when compiled with the +eval and +viminfo features}
64+
65+Note that these, except "#<n", give the file name as it was typed. If an
66+absolute path is needed (when using the file name from a different directory),
67+you need to add ":p". See |filename-modifiers|.
68+
69+The "#<n" item returns an absolute path, but it will start with "~/" for files
70+below your home directory.
71+
72 Note that backslashes are inserted before spaces, so that the command will
73 correctly interpret the file name. But this doesn't happen for shell
74-commands. For those you probably have to use quotes: >
75+commands. For those you probably have to use quotes (this fails for files
76+that contain a quote and wildcards): >
77 :!ls "%"
78 :r !spell "%"
79
80diff -Naur vim72.orig/runtime/doc/eval.txt vim72/runtime/doc/eval.txt
81--- vim72.orig/runtime/doc/eval.txt 2008-08-09 07:22:59.000000000 -0700
82+++ vim72/runtime/doc/eval.txt 2008-12-30 16:17:36.000000000 -0800
83@@ -1,4 +1,4 @@
84-*eval.txt* For Vim version 7.2. Last change: 2008 Aug 09
85+*eval.txt* For Vim version 7.2. Last change: 2008 Nov 27
86
87
88 VIM REFERENCE MANUAL by Bram Moolenaar
89@@ -1484,6 +1484,17 @@
90 This is the screen column number, like with |virtcol()|. The
91 value is zero when there was no mouse button click.
92
93+ *v:oldfiles* *oldfiles-variable*
94+v:oldfiles List of file names that is loaded from the |viminfo| file on
95+ startup. These are the files that Vim remembers marks for.
96+ The length of the List is limited by the ' argument of the
97+ 'viminfo' option (default is 100).
98+ Also see |:oldfiles| and |c_#<|.
99+ The List can be modified, but this has no effect on what is
100+ stored in the |viminfo| file later. If you use values other
101+ than String this will cause trouble.
102+ {only when compiled with the +viminfo feature}
103+
104 *v:operator* *operator-variable*
105 v:operator The last operator given in Normal mode. This is a single
106 character except for commands starting with <g> or <z>,
107@@ -1695,7 +1706,7 @@
108 exists( {expr}) Number TRUE if {expr} exists
109 extend({expr1}, {expr2} [, {expr3}])
110 List/Dict insert items of {expr2} into {expr1}
111-expand( {expr}) String expand special keywords in {expr}
112+expand( {expr} [, {flag}]) String expand special keywords in {expr}
113 feedkeys( {string} [, {mode}]) Number add key sequence to typeahead buffer
114 filereadable( {file}) Number TRUE if {file} is a readable file
115 filewritable( {file}) Number TRUE if {file} is a writable file
116@@ -1747,8 +1758,9 @@
117 getwinposx() Number X coord in pixels of GUI Vim window
118 getwinposy() Number Y coord in pixels of GUI Vim window
119 getwinvar( {nr}, {varname}) any variable {varname} in window {nr}
120-glob( {expr}) String expand file wildcards in {expr}
121-globpath( {path}, {expr}) String do glob({expr}) for all dirs in {path}
122+glob( {expr} [, {flag}]) String expand file wildcards in {expr}
123+globpath( {path}, {expr} [, {flag}])
124+ String do glob({expr}) for all dirs in {path}
125 has( {feature}) Number TRUE if feature {feature} supported
126 has_key( {dict}, {key}) Number TRUE if {dict} has entry {key}
127 haslocaldir() Number TRUE if current window executed |:lcd|
128@@ -3275,14 +3287,16 @@
129 :let list_is_on = getwinvar(2, '&list')
130 :echo "myvar = " . getwinvar(1, 'myvar')
131 <
132- *glob()*
133-glob({expr}) Expand the file wildcards in {expr}. See |wildcards| for the
134+glob({expr} [, {flag}]) *glob()*
135+ Expand the file wildcards in {expr}. See |wildcards| for the
136 use of special characters.
137 The result is a String.
138 When there are several matches, they are separated by <NL>
139 characters.
140- The 'wildignore' option applies: Names matching one of the
141- patterns in 'wildignore' will be skipped.
142+ Unless the optional {flag} argument is given and is non-zero,
143+ the 'suffixes' and 'wildignore' options apply: Names matching
144+ one of the patterns in 'wildignore' will be skipped and
145+ 'suffixes' affect the ordering of matches.
146 If the expansion fails, the result is an empty string.
147 A name for a non-existing file is not included.
148
149@@ -3296,20 +3310,22 @@
150 See |expand()| for expanding special Vim variables. See
151 |system()| for getting the raw output of an external command.
152
153-globpath({path}, {expr}) *globpath()*
154+globpath({path}, {expr} [, {flag}]) *globpath()*
155 Perform glob() on all directories in {path} and concatenate
156 the results. Example: >
157 :echo globpath(&rtp, "syntax/c.vim")
158 < {path} is a comma-separated list of directory names. Each
159 directory name is prepended to {expr} and expanded like with
160- glob(). A path separator is inserted when needed.
161+ |glob()|. A path separator is inserted when needed.
162 To add a comma inside a directory name escape it with a
163 backslash. Note that on MS-Windows a directory may have a
164 trailing backslash, remove it if you put a comma after it.
165 If the expansion fails for one of the directories, there is no
166 error message.
167- The 'wildignore' option applies: Names matching one of the
168- patterns in 'wildignore' will be skipped.
169+ Unless the optional {flag} argument is given and is non-zero,
170+ the 'suffixes' and 'wildignore' options apply: Names matching
171+ one of the patterns in 'wildignore' will be skipped and
172+ 'suffixes' affect the ordering of matches.
173
174 The "**" item can be used to search in a directory tree.
175 For example, to find all "README.txt" files in the directories
176@@ -5332,10 +5348,12 @@
177 "fg" foreground color (GUI: color name used to set
178 the color, cterm: color number as a string,
179 term: empty string)
180- "bg" background color (like "fg")
181+ "bg" background color (as with "fg")
182+ "sp" special color (as with "fg") |highlight-guisp|
183 "fg#" like "fg", but for the GUI and the GUI is
184 running the name in "#RRGGBB" form
185 "bg#" like "fg#" for "bg"
186+ "sp#" like "fg#" for "sp"
187 "bold" "1" if bold
188 "italic" "1" if italic
189 "reverse" "1" if reverse
190@@ -5823,7 +5841,8 @@
191 mouse_pterm Compiled with support for qnx pterm mouse.
192 mouse_sysmouse Compiled with support for sysmouse (*BSD console mouse)
193 mouse_xterm Compiled with support for xterm mouse.
194-multi_byte Compiled with support for editing Korean et al.
195+multi_byte Compiled with support for 'encoding'
196+multi_byte_encoding 'encoding' is set to a multi-byte encoding.
197 multi_byte_ime Compiled with support for IME input method.
198 multi_lang Compiled with support for multiple languages.
199 mzscheme Compiled with MzScheme interface |mzscheme|.
200diff -Naur vim72.orig/runtime/doc/options.txt vim72/runtime/doc/options.txt
201--- vim72.orig/runtime/doc/options.txt 2008-08-09 07:22:59.000000000 -0700
202+++ vim72/runtime/doc/options.txt 2008-12-30 16:16:50.000000000 -0800
203@@ -1,4 +1,4 @@
204-*options.txt* For Vim version 7.2. Last change: 2008 Aug 06
205+*options.txt* For Vim version 7.2. Last change: 2008 Nov 25
206
207
208 VIM REFERENCE MANUAL by Bram Moolenaar
209@@ -7472,7 +7472,9 @@
210 {not available when compiled without the |+wildignore|
211 feature}
212 A list of file patterns. A file that matches with one of these
213- patterns is ignored when completing file or directory names.
214+ patterns is ignored when completing file or directory names, and
215+ influences the result of |expand()|, |glob()| and |globpath()| unless
216+ a flag is passed to disable this.
217 The pattern is used like with |:autocmd|, see |autocmd-patterns|.
218 Also see 'suffixes'.
219 Example: >
220diff -Naur vim72.orig/runtime/doc/spell.txt vim72/runtime/doc/spell.txt
221--- vim72.orig/runtime/doc/spell.txt 2008-08-09 07:23:00.000000000 -0700
222+++ vim72/runtime/doc/spell.txt 2008-12-30 16:17:18.000000000 -0800
223@@ -1,4 +1,4 @@
224-*spell.txt* For Vim version 7.2. Last change: 2008 Jun 21
225+*spell.txt* For Vim version 7.2. Last change: 2008 Nov 30
226
227
228 VIM REFERENCE MANUAL by Bram Moolenaar
229@@ -831,8 +831,11 @@
230
231 # comment line ~
232
233-With some items it's also possible to put a comment after it, but this isn't
234-supported in general.
235+Items with a fixed number of arguments can be followed by a comment. But only
236+if none of the arguments can contain white space. The comment must start with
237+a "#" character. Example:
238+
239+ KEEPCASE = # fix case for words with this flag ~
240
241
242 ENCODING *spell-SET*
243@@ -965,6 +968,9 @@
244
245 Note: When using utf-8 only characters up to 65000 may be used for flags.
246
247+Note: even when using "num" or "long" the number of flags available to
248+compounding and prefixes is limited to about 250.
249+
250
251 AFFIXES
252 *spell-PFX* *spell-SFX*
253@@ -1178,6 +1184,9 @@
254 The flag also applies to the word with affixes, thus this can be used to mark
255 a whole bunch of related words as bad.
256
257+ *spell-FORBIDDENWORD*
258+FORBIDDENWORD can be used just like BAD. For compatibility with Hunspell.
259+
260 *spell-NEEDAFFIX*
261 The NEEDAFFIX flag is used to require that a word is used with an affix. The
262 word itself is not a good word (unless there is an empty affix). Example:
263@@ -1268,6 +1277,10 @@
264
265 NEEDCOMPOUND & ~
266
267+ *spell-ONLYINCOMPOUND*
268+The ONLYINCOMPOUND does exactly the same as NEEDCOMPOUND. Supported for
269+compatiblity with Hunspell.
270+
271 *spell-COMPOUNDMIN*
272 The minimal character length of a word used for compounding is specified with
273 COMPOUNDMIN. Example:
274@@ -1328,6 +1341,20 @@
275 rules. Can also be used for an affix to count the affix as a compounding
276 word.
277
278+ *spell-CHECKCOMPOUNDPATTERN*
279+CHECKCOMPOUNDPATTERN is used to define patterns that, when matching at the
280+position where two words are compounded together forbids the compound.
281+For example:
282+ CHECKCOMPOUNDPATTERN o e ~
283+
284+This forbids compounding if the first word ends in "o" and the second word
285+starts with "e".
286+
287+The arguments must be plain text, no patterns are actually supported, despite
288+the item name. Case is always ignored.
289+
290+The Hunspell feature to use three arguments and flags is not supported.
291+
292 *spell-SYLLABLE*
293 The SYLLABLE item defines characters or character sequences that are used to
294 count the number of syllables in a word. Example:
295@@ -1496,6 +1523,10 @@
296 ACCENT (Hunspell) *spell-ACCENT*
297 Use MAP instead. |spell-MAP|
298
299+BREAK (Hunspell) *spell-BREAK*
300+ Define break points. Unclear how it works exactly.
301+ Not supported.
302+
303 CHECKCOMPOUNDCASE (Hunspell) *spell-CHECKCOMPOUNDCASE*
304 Disallow uppercase letters at compound word boundaries.
305 Not supported.
306@@ -1512,9 +1543,6 @@
307 Forbid three identical characters when compounding. Not
308 supported.
309
310-CHECKCOMPOUNDPATTERN (Hunspell) *spell-CHECKCOMPOUNDPATTERN*
311- Forbid compounding when patterns match. Not supported.
312-
313 COMPLEXPREFIXES (Hunspell) *spell-COMPLEXPREFIXES*
314 Enables using two prefixes. Not supported.
315
316@@ -1536,13 +1564,18 @@
317 COMPOUNDMIDDLE (Hunspell) *spell-COMPOUNDMIDDLE*
318 Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
319
320+COMPOUNDRULES (Hunspell) *spell-COMPOUNDRULES*
321+ Number of COMPOUNDRULE lines following. Ignored, but the
322+ argument must be a number.
323+
324 COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE*
325 Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE|
326 |spell-COMPOUNDSYLMAX|
327
328-FORBIDDENWORD (Hunspell) *spell-FORBIDDENWORD*
329- Use BAD instead. |spell-BAD|
330-
331+KEY (Hunspell) *spell-KEY*
332+ Define characters that are close together on the keyboard.
333+ Used to give better suggestions. Not supported.
334+
335 LANG (Hunspell) *spell-LANG*
336 This specifies language-specific behavior. This actually
337 moves part of the language knowledge into the program,
338@@ -1553,10 +1586,7 @@
339 Only needed for morphological analysis.
340
341 MAXNGRAMSUGS (Hunspell) *spell-MAXNGRAMSUGS*
342- Not supported.
343-
344-ONLYINCOMPOUND (Hunspell) *spell-ONLYINCOMPOUND*
345- Use NEEDCOMPOUND instead. |spell-NEEDCOMPOUND|
346+ Set number of n-gram suggestions. Not supported.
347
348 PSEUDOROOT (Hunspell) *spell-PSEUDOROOT*
349 Use NEEDAFFIX instead. |spell-NEEDAFFIX|
350diff -Naur vim72.orig/runtime/doc/starting.txt vim72/runtime/doc/starting.txt
351--- vim72.orig/runtime/doc/starting.txt 2008-08-09 07:23:00.000000000 -0700
352+++ vim72/runtime/doc/starting.txt 2008-12-30 16:15:47.000000000 -0800
353@@ -1,4 +1,4 @@
354-*starting.txt* For Vim version 7.2. Last change: 2008 Jun 21
355+*starting.txt* For Vim version 7.2. Last change: 2008 Nov 09
356
357
358 VIM REFERENCE MANUAL by Bram Moolenaar
359@@ -1337,8 +1337,9 @@
360 *viminfo-read*
361 When Vim is started and the 'viminfo' option is non-empty, the contents of
362 the viminfo file are read and the info can be used in the appropriate places.
363-The marks are not read in at startup (but file marks are). See
364-|initialization| for how to set the 'viminfo' option upon startup.
365+The |v:oldfiles| variable is filled. The marks are not read in at startup
366+(but file marks are). See |initialization| for how to set the 'viminfo'
367+option upon startup.
368
369 *viminfo-write*
370 When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo
371@@ -1372,6 +1373,8 @@
372 that start with any string given with the "r" flag in 'viminfo'. This can be
373 used to avoid saving marks for files on removable media (for MS-DOS you would
374 use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:").
375+The |v:oldfiles| variable is filled with the file names that the viminfo file
376+has marks for.
377
378 *viminfo-file-marks*
379 Uppercase marks ('A to 'Z) are stored when writing the viminfo file. The
380@@ -1463,8 +1466,8 @@
381 *:rv* *:rviminfo* *E195*
382 :rv[iminfo][!] [file] Read from viminfo file [file] (default: see above).
383 If [!] is given, then any information that is
384- already set (registers, marks, etc.) will be
385- overwritten. {not in Vi}
386+ already set (registers, marks, |v:oldfiles|, etc.)
387+ will be overwritten {not in Vi}
388
389 *:wv* *:wviminfo* *E137* *E138* *E574*
390 :wv[iminfo][!] [file] Write to viminfo file [file] (default: see above).
391@@ -1479,4 +1482,20 @@
392 the .viminfo file.
393 {not in Vi}
394
395+ *:ol* *:oldfiles*
396+:ol[dfiles] List the files that have marks stored in the viminfo
397+ file. This list is read on startup and only changes
398+ afterwards with ":rviminfo!". Also see |v:oldfiles|.
399+ The number can be used with |c_#<|.
400+ {not in Vi, only when compiled with the +eval feature}
401+
402+:bro[wse] ol[dfiles][!]
403+ List file names as with |:oldfiles|, and then prompt
404+ for a number. When the number is valid that file from
405+ the list is edited.
406+ If you get the |press-enter| prompt you can press "q"
407+ and still get the prompt to enter a file number.
408+ Use ! to abondon a modified buffer. |abandon|
409+ {not when compiled with tiny or small features}
410+
411 vim:tw=78:ts=8:ft=help:norl:
412diff -Naur vim72.orig/runtime/doc/usr_21.txt vim72/runtime/doc/usr_21.txt
413--- vim72.orig/runtime/doc/usr_21.txt 2008-08-09 07:23:01.000000000 -0700
414+++ vim72/runtime/doc/usr_21.txt 2008-12-30 16:15:47.000000000 -0800
415@@ -1,4 +1,4 @@
416-*usr_21.txt* For Vim version 7.2. Last change: 2007 May 01
417+*usr_21.txt* For Vim version 7.2. Last change: 2008 Nov 09
418
419 VIM USER MANUAL - by Bram Moolenaar
420
421@@ -153,7 +153,7 @@
422 to be lost. Each item can be remembered only once.
423
424
425-GETTING BACK TO WHERE YOU WERE
426+GETTING BACK TO WHERE YOU STOPPED VIM
427
428 You are halfway editing a file and it's time to leave for holidays. You exit
429 Vim and go enjoy yourselves, forgetting all about your work. After a couple
430@@ -168,6 +168,48 @@
431 The |:marks| command is useful to find out where '0 to '9 will take you.
432
433
434+GETTING BACK TO SOME FILE
435+
436+If you want to go back to a file that you edited recently, but not when
437+exiting Vim, there is a slightly more complicated way. You can see a list of
438+files by typing the command: >
439+
440+ :oldfiles
441+< 1: ~/.viminfo ~
442+ 2: ~/text/resume.txt ~
443+ 3: /tmp/draft ~
444+
445+Now you would like to edit the second file, which is in the list preceded by
446+"2:". You type: >
447+
448+ :e #<2
449+
450+Instead of ":e" you can use any command that has a file name argument, the
451+"#<2" item works in the same place as "%" (current file name) and "#"
452+(alternate file name). So you can also split the window to edit the third
453+file: >
454+
455+ :split #<3
456+
457+That #<123 thing is a bit complicated when you just want to edit a file.
458+Fortunately there is a simpler way: >
459+
460+ :browse oldfiles
461+< 1: ~/.viminfo ~
462+ 2: ~/text/resume.txt ~
463+ 3: /tmp/draft ~
464+ -- More --
465+
466+You get the same list of files as with |:oldfiles|. If you want to edit
467+"resume.txt" first press "q" to stop the listing. You will get a prompt:
468+
469+ Type number and <Enter> (empty cancels): ~
470+
471+Type "2" and press <Enter> to edit the second file.
472+
473+More info at |:oldfiles|, |v:oldfiles| and |c_#<|.
474+
475+
476 MOVE INFO FROM ONE VIM TO ANOTHER
477
478 You can use the ":wviminfo" and ":rviminfo" commands to save and restore the
479diff -Naur vim72.orig/runtime/scripts.vim vim72/runtime/scripts.vim
480--- vim72.orig/runtime/scripts.vim 2008-08-08 15:27:21.000000000 -0700
481+++ vim72/runtime/scripts.vim 2008-12-30 16:14:26.000000000 -0800
482@@ -234,6 +234,10 @@
483 elseif s:line1 =~ '\<DTD\s\+XHTML\s'
484 set ft=xhtml
485
486+ " HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
487+ elseif s:line1 =~? '\<DOCTYPE\s\+html\>'
488+ set ft=html
489+
490 " PDF
491 elseif s:line1 =~ '^%PDF-'
492 set ft=pdf
493diff -Naur vim72.orig/src/auto/configure vim72/src/auto/configure
494--- vim72.orig/src/auto/configure 2008-07-24 05:40:36.000000000 -0700
495+++ vim72/src/auto/configure 2008-12-30 16:16:27.000000000 -0800
496@@ -16819,21 +16819,29 @@
497 LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc"
498 fi
499
500-{ $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5
501-$as_echo_n "checking for GCC 3 or later... " >&6; }
502 DEPEND_CFLAGS_FILTER=
503 if test "$GCC" = yes; then
504+ { $as_echo "$as_me:$LINENO: checking for GCC 3 or later" >&5
505+$as_echo_n "checking for GCC 3 or later... " >&6; }
506 gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'`
507 if test "$gccmajor" -gt "2"; then
508 DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
509- fi
510-fi
511-if test "$DEPEND_CFLAGS_FILTER" = ""; then
512- { $as_echo "$as_me:$LINENO: result: no" >&5
513+ { $as_echo "$as_me:$LINENO: result: yes" >&5
514+$as_echo "yes" >&6; }
515+ else
516+ { $as_echo "$as_me:$LINENO: result: no" >&5
517 $as_echo "no" >&6; }
518-else
519- { $as_echo "$as_me:$LINENO: result: yes" >&5
520+ fi
521+ { $as_echo "$as_me:$LINENO: checking whether we need -D_FORTIFY_SOURCE=1" >&5
522+$as_echo_n "checking whether we need -D_FORTIFY_SOURCE=1... " >&6; }
523+ if test "$gccmajor" -gt "3"; then
524+ CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=1"
525+ { $as_echo "$as_me:$LINENO: result: yes" >&5
526 $as_echo "yes" >&6; }
527+ else
528+ { $as_echo "$as_me:$LINENO: result: no" >&5
529+$as_echo "no" >&6; }
530+ fi
531 fi
532
533
534diff -Naur vim72.orig/src/buffer.c vim72/src/buffer.c
535--- vim72.orig/src/buffer.c 2008-08-06 04:00:48.000000000 -0700
536+++ vim72/src/buffer.c 2008-12-30 16:17:24.000000000 -0800
537@@ -647,6 +647,9 @@
538 vim_free(buf->b_start_fenc);
539 buf->b_start_fenc = NULL;
540 #endif
541+#ifdef FEAT_SPELL
542+ ga_clear(&buf->b_langp);
543+#endif
544 }
545
546 /*
547@@ -1237,7 +1240,7 @@
548 * "buf" if one exists */
549 if ((swb_flags & SWB_USEOPEN) && buf_jump_open_win(buf))
550 return OK;
551- /* If 'switchbuf' contians "usetab": jump to first window in any tab
552+ /* If 'switchbuf' contains "usetab": jump to first window in any tab
553 * page containing "buf" if one exists */
554 if ((swb_flags & SWB_USETAB) && buf_jump_open_tab(buf))
555 return OK;
556@@ -1351,11 +1354,12 @@
557 }
558 }
559 #ifdef FEAT_AUTOCMD
560+ /* An autocommand may have deleted "buf", already entered it (e.g., when
561+ * it did ":bunload") or aborted the script processing! */
562 # ifdef FEAT_EVAL
563- /* An autocommand may have deleted buf or aborted the script processing! */
564- if (buf_valid(buf) && !aborting())
565+ if (buf_valid(buf) && buf != curbuf && !aborting())
566 # else
567- if (buf_valid(buf)) /* an autocommand may have deleted buf! */
568+ if (buf_valid(buf) && buf != curbuf)
569 # endif
570 #endif
571 enter_buffer(buf);
572@@ -1397,6 +1401,9 @@
573 curwin->w_cursor.coladd = 0;
574 #endif
575 curwin->w_set_curswant = TRUE;
576+#ifdef FEAT_AUTOCMD
577+ curwin->w_topline_was_set = FALSE;
578+#endif
579
580 /* Make sure the buffer is loaded. */
581 if (curbuf->b_ml.ml_mfp == NULL) /* need to load the file */
582@@ -1436,7 +1443,8 @@
583 maketitle();
584 #endif
585 #ifdef FEAT_AUTOCMD
586- if (curwin->w_topline == 1) /* when autocmds didn't change it */
587+ /* when autocmds didn't change it */
588+ if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
589 #endif
590 scroll_cursor_halfway(FALSE); /* redisplay at correct position */
591
592@@ -3963,7 +3971,7 @@
593 width = vim_strsize(out);
594 if (maxwidth > 0 && width > maxwidth)
595 {
596- /* Result is too long, must trunctate somewhere. */
597+ /* Result is too long, must truncate somewhere. */
598 l = 0;
599 if (itemcnt == 0)
600 s = out;
601@@ -5062,7 +5070,7 @@
602 {
603 if (buf->b_sfname != NULL)
604 return (char *)buf->b_sfname;
605- return "[Scratch]";
606+ return _("[Scratch]");
607 }
608 #endif
609 if (buf->b_fname == NULL)
610diff -Naur vim72.orig/src/configure.in vim72/src/configure.in
611--- vim72.orig/src/configure.in 2008-07-24 05:40:26.000000000 -0700
612+++ vim72/src/configure.in 2008-12-30 16:16:27.000000000 -0800
613@@ -3152,18 +3152,25 @@
614 dnl But only when making dependencies, cproto and lint don't take "-isystem".
615 dnl Mac gcc returns "powerpc-apple-darwin8-gcc-4.0.1 (GCC)...", need to allow
616 dnl the number before the version number.
617-AC_MSG_CHECKING(for GCC 3 or later)
618 DEPEND_CFLAGS_FILTER=
619 if test "$GCC" = yes; then
620+ AC_MSG_CHECKING(for GCC 3 or later)
621 gccmajor=`echo "$gccversion" | sed -e 's/^\([[1-9]]\)\..*$/\1/g'`
622 if test "$gccmajor" -gt "2"; then
623 DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'"
624+ AC_MSG_RESULT(yes)
625+ else
626+ AC_MSG_RESULT(no)
627+ fi
628+ dnl -D_FORTIFY_SOURCE=2 crashes Vim on strcpy(buf, "000") when buf is
629+ dnl declared as char x[1] but actually longer. Introduced in gcc 4.0.
630+ AC_MSG_CHECKING(whether we need -D_FORTIFY_SOURCE=1)
631+ if test "$gccmajor" -gt "3"; then
632+ CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=1"
633+ AC_MSG_RESULT(yes)
634+ else
635+ AC_MSG_RESULT(no)
636 fi
637-fi
638-if test "$DEPEND_CFLAGS_FILTER" = ""; then
639- AC_MSG_RESULT(no)
640-else
641- AC_MSG_RESULT(yes)
642 fi
643 AC_SUBST(DEPEND_CFLAGS_FILTER)
644
645diff -Naur vim72.orig/src/diff.c vim72/src/diff.c
646--- vim72.orig/src/diff.c 2008-03-05 03:16:56.000000000 -0800
647+++ vim72/src/diff.c 2008-12-30 16:17:15.000000000 -0800
648@@ -73,6 +73,8 @@
649 {
650 tp->tp_diffbuf[i] = NULL;
651 tp->tp_diff_invalid = TRUE;
652+ if (tp == curtab)
653+ diff_redraw(TRUE);
654 }
655 }
656 }
657@@ -102,6 +104,7 @@
658 {
659 curtab->tp_diffbuf[i] = NULL;
660 curtab->tp_diff_invalid = TRUE;
661+ diff_redraw(TRUE);
662 }
663 }
664 }
665@@ -131,6 +134,7 @@
666 {
667 curtab->tp_diffbuf[i] = buf;
668 curtab->tp_diff_invalid = TRUE;
669+ diff_redraw(TRUE);
670 return;
671 }
672
673@@ -661,6 +665,7 @@
674 char_u *tmp_diff;
675 FILE *fd;
676 int ok;
677+ int io_error = FALSE;
678
679 /* Delete all diffblocks. */
680 diff_clear(curtab);
681@@ -697,18 +702,26 @@
682 {
683 ok = FALSE;
684 fd = mch_fopen((char *)tmp_orig, "w");
685- if (fd != NULL)
686+ if (fd == NULL)
687+ io_error = TRUE;
688+ else
689 {
690- fwrite("line1\n", (size_t)6, (size_t)1, fd);
691+ if (fwrite("line1\n", (size_t)6, (size_t)1, fd) != 1)
692+ io_error = TRUE;
693 fclose(fd);
694 fd = mch_fopen((char *)tmp_new, "w");
695- if (fd != NULL)
696+ if (fd == NULL)
697+ io_error = TRUE;
698+ else
699 {
700- fwrite("line2\n", (size_t)6, (size_t)1, fd);
701+ if (fwrite("line2\n", (size_t)6, (size_t)1, fd) != 1)
702+ io_error = TRUE;
703 fclose(fd);
704 diff_file(tmp_orig, tmp_new, tmp_diff);
705 fd = mch_fopen((char *)tmp_diff, "r");
706- if (fd != NULL)
707+ if (fd == NULL)
708+ io_error = TRUE;
709+ else
710 {
711 char_u linebuf[LBUFLEN];
712
713@@ -761,6 +774,8 @@
714 }
715 if (!ok)
716 {
717+ if (io_error)
718+ EMSG(_("E810: Cannot read or write temp files"));
719 EMSG(_("E97: Cannot create diffs"));
720 diff_a_works = MAYBE;
721 #if defined(MSWIN) || defined(MSDOS)
722@@ -925,10 +940,10 @@
723 {
724 # ifdef TEMPDIRNAMES
725 if (vim_tempdir != NULL)
726- mch_chdir((char *)vim_tempdir);
727+ ignored = mch_chdir((char *)vim_tempdir);
728 else
729 # endif
730- mch_chdir("/tmp");
731+ ignored = mch_chdir("/tmp");
732 shorten_fnames(TRUE);
733 }
734 #endif
735diff -Naur vim72.orig/src/eval.c vim72/src/eval.c
736--- vim72.orig/src/eval.c 2008-08-07 12:37:22.000000000 -0700
737+++ vim72/src/eval.c 2008-12-30 16:17:49.000000000 -0800
738@@ -32,6 +32,9 @@
739
740 #define DICT_MAXNEST 100 /* maximum nesting of lists and dicts */
741
742+#define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not
743+ be freed. */
744+
745 /*
746 * In a hashtab item "hi_key" points to "di_key" in a dictitem.
747 * This avoids adding a pointer to the hashtab item.
748@@ -348,6 +351,7 @@
749 {VV_NAME("mouse_col", VAR_NUMBER), 0},
750 {VV_NAME("operator", VAR_STRING), VV_RO},
751 {VV_NAME("searchforward", VAR_NUMBER), 0},
752+ {VV_NAME("oldfiles", VAR_LIST), 0},
753 };
754
755 /* shorthand */
756@@ -355,6 +359,7 @@
757 #define vv_nr vv_di.di_tv.vval.v_number
758 #define vv_float vv_di.di_tv.vval.v_float
759 #define vv_str vv_di.di_tv.vval.v_string
760+#define vv_list vv_di.di_tv.vval.v_list
761 #define vv_tv vv_di.di_tv
762
763 /*
764@@ -426,7 +431,6 @@
765 static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
766 static void list_append __ARGS((list_T *l, listitem_T *item));
767 static int list_append_tv __ARGS((list_T *l, typval_T *tv));
768-static int list_append_string __ARGS((list_T *l, char_u *str, int len));
769 static int list_append_number __ARGS((list_T *l, varnumber_T n));
770 static int list_insert_tv __ARGS((list_T *l, typval_T *tv, listitem_T *item));
771 static int list_extend __ARGS((list_T *l1, list_T *l2, listitem_T *bef));
772@@ -788,6 +792,8 @@
773 static void func_unref __ARGS((char_u *name));
774 static void func_ref __ARGS((char_u *name));
775 static void call_user_func __ARGS((ufunc_T *fp, int argcount, typval_T *argvars, typval_T *rettv, linenr_T firstline, linenr_T lastline, dict_T *selfdict));
776+static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ;
777+static void free_funccal __ARGS((funccall_T *fc, int free_val));
778 static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr));
779 static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp));
780 static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off));
781@@ -845,11 +851,17 @@
782 p = &vimvars[i];
783 if (p->vv_di.di_tv.v_type == VAR_STRING)
784 {
785- vim_free(p->vv_di.di_tv.vval.v_string);
786- p->vv_di.di_tv.vval.v_string = NULL;
787+ vim_free(p->vv_str);
788+ p->vv_str = NULL;
789+ }
790+ else if (p->vv_di.di_tv.v_type == VAR_LIST)
791+ {
792+ list_unref(p->vv_list);
793+ p->vv_list = NULL;
794 }
795 }
796 hash_clear(&vimvarht);
797+ hash_init(&vimvarht); /* garbage_collect() will access it */
798 hash_clear(&compat_hashtab);
799
800 /* script-local variables */
801@@ -916,6 +928,10 @@
802 /* pointer to funccal for currently active function */
803 funccall_T *current_funccal = NULL;
804
805+/* pointer to list of previously used funccal, still around because some
806+ * item in it is still being used. */
807+funccall_T *previous_funccal = NULL;
808+
809 /*
810 * Return TRUE when a function was ended by a ":return" command.
811 */
812@@ -1256,23 +1272,26 @@
813
814 /*
815 * Top level evaluation function, returning a string.
816+ * When "convert" is TRUE convert a List into a sequence of lines and convert
817+ * a Float to a String.
818 * Return pointer to allocated memory, or NULL for failure.
819 */
820 char_u *
821-eval_to_string(arg, nextcmd, dolist)
822+eval_to_string(arg, nextcmd, convert)
823 char_u *arg;
824 char_u **nextcmd;
825- int dolist; /* turn List into sequence of lines */
826+ int convert;
827 {
828 typval_T tv;
829 char_u *retval;
830 garray_T ga;
831+ char_u numbuf[NUMBUFLEN];
832
833 if (eval0(arg, &tv, nextcmd, TRUE) == FAIL)
834 retval = NULL;
835 else
836 {
837- if (dolist && tv.v_type == VAR_LIST)
838+ if (convert && tv.v_type == VAR_LIST)
839 {
840 ga_init2(&ga, (int)sizeof(char), 80);
841 if (tv.vval.v_list != NULL)
842@@ -1280,6 +1299,13 @@
843 ga_append(&ga, NUL);
844 retval = (char_u *)ga.ga_data;
845 }
846+#ifdef FEAT_FLOAT
847+ else if (convert && tv.v_type == VAR_FLOAT)
848+ {
849+ vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float);
850+ retval = vim_strsave(numbuf);
851+ }
852+#endif
853 else
854 retval = vim_strsave(get_tv_string(&tv));
855 clear_tv(&tv);
856@@ -3277,7 +3303,7 @@
857
858 if (*startarg != '(')
859 {
860- EMSG2(_("E107: Missing braces: %s"), eap->arg);
861+ EMSG2(_("E107: Missing parentheses: %s"), eap->arg);
862 goto end;
863 }
864
865@@ -3657,8 +3683,8 @@
866 }
867
868 /*
869- * Return TRUE if typeval "tv" is locked: Either tha value is locked itself or
870- * it refers to a List or Dictionary that is locked.
871+ * Return TRUE if typeval "tv" is locked: Either that value is locked itself
872+ * or it refers to a List or Dictionary that is locked.
873 */
874 static int
875 tv_islocked(tv)
876@@ -6047,6 +6073,25 @@
877 }
878
879 /*
880+ * Get list item "l[idx - 1]" as a string. Returns NULL for failure.
881+ */
882+ char_u *
883+list_find_str(l, idx)
884+ list_T *l;
885+ long idx;
886+{
887+ listitem_T *li;
888+
889+ li = list_find(l, idx - 1);
890+ if (li == NULL)
891+ {
892+ EMSGN(_(e_listidx), idx);
893+ return NULL;
894+ }
895+ return get_tv_string(&li->li_tv);
896+}
897+
898+/*
899 * Locate "item" list "l" and return its index.
900 * Returns -1 when "item" is not in the list.
901 */
902@@ -6137,7 +6182,7 @@
903 * When "len" >= 0 use "str[len]".
904 * Returns FAIL when out of memory.
905 */
906- static int
907+ int
908 list_append_string(l, str, len)
909 list_T *l;
910 char_u *str;
911@@ -6454,7 +6499,7 @@
912 buf_T *buf;
913 win_T *wp;
914 int i;
915- funccall_T *fc;
916+ funccall_T *fc, **pfc;
917 int did_free = FALSE;
918 #ifdef FEAT_WINDOWS
919 tabpage_T *tp;
920@@ -6497,6 +6542,9 @@
921 set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID);
922 }
923
924+ /* v: vars */
925+ set_ref_in_ht(&vimvarht, copyID);
926+
927 /*
928 * 2. Go through the list of dicts and free items without the copyID.
929 */
930@@ -6535,6 +6583,20 @@
931 else
932 ll = ll->lv_used_next;
933
934+ /* check if any funccal can be freed now */
935+ for (pfc = &previous_funccal; *pfc != NULL; )
936+ {
937+ if (can_free_funccal(*pfc, copyID))
938+ {
939+ fc = *pfc;
940+ *pfc = fc->caller;
941+ free_funccal(fc, TRUE);
942+ did_free = TRUE;
943+ }
944+ else
945+ pfc = &(*pfc)->caller;
946+ }
947+
948 return did_free;
949 }
950
951@@ -6587,7 +6649,7 @@
952 {
953 case VAR_DICT:
954 dd = tv->vval.v_dict;
955- if (dd->dv_copyID != copyID)
956+ if (dd != NULL && dd->dv_copyID != copyID)
957 {
958 /* Didn't see this dict yet. */
959 dd->dv_copyID = copyID;
960@@ -6597,7 +6659,7 @@
961
962 case VAR_LIST:
963 ll = tv->vval.v_list;
964- if (ll->lv_copyID != copyID)
965+ if (ll != NULL && ll->lv_copyID != copyID)
966 {
967 /* Didn't see this list yet. */
968 ll->lv_copyID = copyID;
969@@ -7525,8 +7587,8 @@
970 {"getwinposx", 0, 0, f_getwinposx},
971 {"getwinposy", 0, 0, f_getwinposy},
972 {"getwinvar", 2, 2, f_getwinvar},
973- {"glob", 1, 1, f_glob},
974- {"globpath", 2, 2, f_globpath},
975+ {"glob", 1, 2, f_glob},
976+ {"globpath", 2, 3, f_globpath},
977 {"has", 1, 1, f_has},
978 {"has_key", 2, 2, f_has_key},
979 {"haslocaldir", 0, 0, f_haslocaldir},
980@@ -9518,7 +9580,7 @@
981 else
982 {
983 /* When the optional second argument is non-zero, don't remove matches
984- * for 'suffixes' and 'wildignore' */
985+ * for 'wildignore' and don't put matches for 'suffixes' at the end. */
986 if (argvars[1].v_type != VAR_UNKNOWN
987 && get_tv_number_chk(&argvars[1], &error))
988 flags |= WILD_KEEP_ALL;
989@@ -10300,7 +10362,8 @@
990 s = get_tv_string(&argvars[0]);
991 if (s == NULL || *s == NUL || VIM_ISDIGIT(*s))
992 EMSG2(_(e_invarg2), s);
993- else if (!function_exists(s))
994+ /* Don't check an autoload name for existence here. */
995+ else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s))
996 EMSG2(_("E700: Unknown function: %s"), s);
997 else
998 {
999@@ -10602,7 +10665,7 @@
1000 # ifdef FEAT_WINDOWS
1001 win_T *wp;
1002 # endif
1003- int n = 1;
1004+ int winnr = 1;
1005
1006 if (row >= 0 && col >= 0)
1007 {
1008@@ -10612,9 +10675,9 @@
1009 (void)mouse_comp_pos(win, &row, &col, &lnum);
1010 # ifdef FEAT_WINDOWS
1011 for (wp = firstwin; wp != win; wp = wp->w_next)
1012- ++n;
1013+ ++winnr;
1014 # endif
1015- vimvars[VV_MOUSE_WIN].vv_nr = n;
1016+ vimvars[VV_MOUSE_WIN].vv_nr = winnr;
1017 vimvars[VV_MOUSE_LNUM].vv_nr = lnum;
1018 vimvars[VV_MOUSE_COL].vv_nr = col + 1;
1019 }
1020@@ -11284,13 +11347,25 @@
1021 typval_T *argvars;
1022 typval_T *rettv;
1023 {
1024+ int flags = WILD_SILENT|WILD_USE_NL;
1025 expand_T xpc;
1026+ int error = FALSE;
1027
1028- ExpandInit(&xpc);
1029- xpc.xp_context = EXPAND_FILES;
1030+ /* When the optional second argument is non-zero, don't remove matches
1031+ * for 'wildignore' and don't put matches for 'suffixes' at the end. */
1032+ if (argvars[1].v_type != VAR_UNKNOWN
1033+ && get_tv_number_chk(&argvars[1], &error))
1034+ flags |= WILD_KEEP_ALL;
1035 rettv->v_type = VAR_STRING;
1036- rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
1037- NULL, WILD_USE_NL|WILD_SILENT, WILD_ALL);
1038+ if (!error)
1039+ {
1040+ ExpandInit(&xpc);
1041+ xpc.xp_context = EXPAND_FILES;
1042+ rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
1043+ NULL, flags, WILD_ALL);
1044+ }
1045+ else
1046+ rettv->vval.v_string = NULL;
1047 }
1048
1049 /*
1050@@ -11301,14 +11376,22 @@
1051 typval_T *argvars;
1052 typval_T *rettv;
1053 {
1054+ int flags = 0;
1055 char_u buf1[NUMBUFLEN];
1056 char_u *file = get_tv_string_buf_chk(&argvars[1], buf1);
1057+ int error = FALSE;
1058
1059+ /* When the optional second argument is non-zero, don't remove matches
1060+ * for 'wildignore' and don't put matches for 'suffixes' at the end. */
1061+ if (argvars[2].v_type != VAR_UNKNOWN
1062+ && get_tv_number_chk(&argvars[2], &error))
1063+ flags |= WILD_KEEP_ALL;
1064 rettv->v_type = VAR_STRING;
1065- if (file == NULL)
1066+ if (file == NULL || error)
1067 rettv->vval.v_string = NULL;
1068 else
1069- rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file);
1070+ rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file,
1071+ flags);
1072 }
1073
1074 /*
1075@@ -11782,6 +11865,10 @@
1076 n = has_patch(atoi((char *)name + 5));
1077 else if (STRICMP(name, "vim_starting") == 0)
1078 n = (starting != 0);
1079+#ifdef FEAT_MBYTE
1080+ else if (STRICMP(name, "multi_byte_encoding") == 0)
1081+ n = has_mbyte;
1082+#endif
1083 #if defined(FEAT_BEVAL) && defined(FEAT_GUI_W32)
1084 else if (STRICMP(name, "balloon_multiline") == 0)
1085 n = multiline_balloon_available();
1086@@ -15838,10 +15925,9 @@
1087 if (res == FAIL)
1088 res = ITEM_COMPARE_FAIL;
1089 else
1090- /* return value has wrong type */
1091 res = get_tv_number_chk(&rettv, &item_compare_func_err);
1092 if (item_compare_func_err)
1093- res = ITEM_COMPARE_FAIL;
1094+ res = ITEM_COMPARE_FAIL; /* return value has wrong type */
1095 clear_tv(&rettv);
1096 return res;
1097 }
1098@@ -16590,8 +16676,11 @@
1099 p = highlight_has_attr(id, HL_INVERSE, modec);
1100 break;
1101
1102- case 's': /* standout */
1103- p = highlight_has_attr(id, HL_STANDOUT, modec);
1104+ case 's':
1105+ if (TOLOWER_ASC(what[1]) == 'p') /* sp[#] */
1106+ p = highlight_color(id, what, modec);
1107+ else /* standout */
1108+ p = highlight_has_attr(id, HL_STANDOUT, modec);
1109 break;
1110
1111 case 'u':
1112@@ -16658,7 +16747,7 @@
1113 col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
1114
1115 if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
1116- && col >= 0 && col < (long)STRLEN(ml_get(lnum))
1117+ && col >= 0 && (col == 0 || col < (long)STRLEN(ml_get(lnum)))
1118 && rettv_list_alloc(rettv) != FAIL)
1119 {
1120 (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE);
1121@@ -18097,14 +18186,28 @@
1122 }
1123
1124 /*
1125- * Set v:count, v:count1 and v:prevcount.
1126+ * Get List v: variable value. Caller must take care of reference count when
1127+ * needed.
1128+ */
1129+ list_T *
1130+get_vim_var_list(idx)
1131+ int idx;
1132+{
1133+ return vimvars[idx].vv_list;
1134+}
1135+
1136+/*
1137+ * Set v:count to "count" and v:count1 to "count1".
1138+ * When "set_prevcount" is TRUE first set v:prevcount from v:count.
1139 */
1140 void
1141-set_vcount(count, count1)
1142+set_vcount(count, count1, set_prevcount)
1143 long count;
1144 long count1;
1145+ int set_prevcount;
1146 {
1147- vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
1148+ if (set_prevcount)
1149+ vimvars[VV_PREVCOUNT].vv_nr = vimvars[VV_COUNT].vv_nr;
1150 vimvars[VV_COUNT].vv_nr = count;
1151 vimvars[VV_COUNT1].vv_nr = count1;
1152 }
1153@@ -18132,6 +18235,20 @@
1154 }
1155
1156 /*
1157+ * Set List v: variable to "val".
1158+ */
1159+ void
1160+set_vim_var_list(idx, val)
1161+ int idx;
1162+ list_T *val;
1163+{
1164+ list_unref(vimvars[idx].vv_list);
1165+ vimvars[idx].vv_list = val;
1166+ if (val != NULL)
1167+ ++val->lv_refcount;
1168+}
1169+
1170+/*
1171 * Set v:register if needed.
1172 */
1173 void
1174@@ -18868,7 +18985,7 @@
1175 dictitem_T *dict_var;
1176 {
1177 hash_init(&dict->dv_hashtab);
1178- dict->dv_refcount = 99999;
1179+ dict->dv_refcount = DO_NOT_FREE_CNT;
1180 dict_var->di_tv.vval.v_dict = dict;
1181 dict_var->di_tv.v_type = VAR_DICT;
1182 dict_var->di_tv.v_lock = VAR_FIXED;
1183@@ -19205,6 +19322,8 @@
1184 * Copy the values from typval_T "from" to typval_T "to".
1185 * When needed allocates string or increases reference count.
1186 * Does not make a copy of a list or dict but copies the reference!
1187+ * It is OK for "from" and "to" to point to the same item. This is used to
1188+ * make a copy later.
1189 */
1190 static void
1191 copy_tv(from, to)
1192@@ -20590,6 +20709,9 @@
1193 int st_len = 0;
1194
1195 todo = (int)func_hashtab.ht_used;
1196+ if (todo == 0)
1197+ return; /* nothing to dump */
1198+
1199 sorttab = (ufunc_T **)alloc((unsigned)(sizeof(ufunc_T) * todo));
1200
1201 for (hi = func_hashtab.ht_array; todo > 0; ++hi)
1202@@ -20638,6 +20760,8 @@
1203 prof_self_cmp);
1204 prof_sort_list(fd, sorttab, st_len, "SELF", TRUE);
1205 }
1206+
1207+ vim_free(sorttab);
1208 }
1209
1210 static void
1211@@ -21012,7 +21136,7 @@
1212 char_u *save_sourcing_name;
1213 linenr_T save_sourcing_lnum;
1214 scid_T save_current_SID;
1215- funccall_T fc;
1216+ funccall_T *fc;
1217 int save_did_emsg;
1218 static int depth = 0;
1219 dictitem_T *v;
1220@@ -21038,36 +21162,37 @@
1221
1222 line_breakcheck(); /* check for CTRL-C hit */
1223
1224- fc.caller = current_funccal;
1225- current_funccal = &fc;
1226- fc.func = fp;
1227- fc.rettv = rettv;
1228+ fc = (funccall_T *)alloc(sizeof(funccall_T));
1229+ fc->caller = current_funccal;
1230+ current_funccal = fc;
1231+ fc->func = fp;
1232+ fc->rettv = rettv;
1233 rettv->vval.v_number = 0;
1234- fc.linenr = 0;
1235- fc.returned = FALSE;
1236- fc.level = ex_nesting_level;
1237+ fc->linenr = 0;
1238+ fc->returned = FALSE;
1239+ fc->level = ex_nesting_level;
1240 /* Check if this function has a breakpoint. */
1241- fc.breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
1242- fc.dbg_tick = debug_tick;
1243+ fc->breakpoint = dbg_find_breakpoint(FALSE, fp->uf_name, (linenr_T)0);
1244+ fc->dbg_tick = debug_tick;
1245
1246 /*
1247- * Note about using fc.fixvar[]: This is an array of FIXVAR_CNT variables
1248+ * Note about using fc->fixvar[]: This is an array of FIXVAR_CNT variables
1249 * with names up to VAR_SHORT_LEN long. This avoids having to alloc/free
1250 * each argument variable and saves a lot of time.
1251 */
1252 /*
1253 * Init l: variables.
1254 */
1255- init_var_dict(&fc.l_vars, &fc.l_vars_var);
1256+ init_var_dict(&fc->l_vars, &fc->l_vars_var);
1257 if (selfdict != NULL)
1258 {
1259 /* Set l:self to "selfdict". Use "name" to avoid a warning from
1260 * some compiler that checks the destination size. */
1261- v = &fc.fixvar[fixvar_idx++].var;
1262+ v = &fc->fixvar[fixvar_idx++].var;
1263 name = v->di_key;
1264 STRCPY(name, "self");
1265 v->di_flags = DI_FLAGS_RO + DI_FLAGS_FIX;
1266- hash_add(&fc.l_vars.dv_hashtab, DI2HIKEY(v));
1267+ hash_add(&fc->l_vars.dv_hashtab, DI2HIKEY(v));
1268 v->di_tv.v_type = VAR_DICT;
1269 v->di_tv.v_lock = 0;
1270 v->di_tv.vval.v_dict = selfdict;
1271@@ -21079,28 +21204,31 @@
1272 * Set a:0 to "argcount".
1273 * Set a:000 to a list with room for the "..." arguments.
1274 */
1275- init_var_dict(&fc.l_avars, &fc.l_avars_var);
1276- add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "0",
1277+ init_var_dict(&fc->l_avars, &fc->l_avars_var);
1278+ add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "0",
1279 (varnumber_T)(argcount - fp->uf_args.ga_len));
1280- v = &fc.fixvar[fixvar_idx++].var;
1281- STRCPY(v->di_key, "000");
1282+ /* Use "name" to avoid a warning from some compiler that checks the
1283+ * destination size. */
1284+ v = &fc->fixvar[fixvar_idx++].var;
1285+ name = v->di_key;
1286+ STRCPY(name, "000");
1287 v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
1288- hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
1289+ hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
1290 v->di_tv.v_type = VAR_LIST;
1291 v->di_tv.v_lock = VAR_FIXED;
1292- v->di_tv.vval.v_list = &fc.l_varlist;
1293- vim_memset(&fc.l_varlist, 0, sizeof(list_T));
1294- fc.l_varlist.lv_refcount = 99999;
1295- fc.l_varlist.lv_lock = VAR_FIXED;
1296+ v->di_tv.vval.v_list = &fc->l_varlist;
1297+ vim_memset(&fc->l_varlist, 0, sizeof(list_T));
1298+ fc->l_varlist.lv_refcount = DO_NOT_FREE_CNT;
1299+ fc->l_varlist.lv_lock = VAR_FIXED;
1300
1301 /*
1302 * Set a:firstline to "firstline" and a:lastline to "lastline".
1303 * Set a:name to named arguments.
1304 * Set a:N to the "..." arguments.
1305 */
1306- add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "firstline",
1307+ add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "firstline",
1308 (varnumber_T)firstline);
1309- add_nr_var(&fc.l_avars, &fc.fixvar[fixvar_idx++].var, "lastline",
1310+ add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline",
1311 (varnumber_T)lastline);
1312 for (i = 0; i < argcount; ++i)
1313 {
1314@@ -21116,7 +21244,7 @@
1315 }
1316 if (fixvar_idx < FIXVAR_CNT && STRLEN(name) <= VAR_SHORT_LEN)
1317 {
1318- v = &fc.fixvar[fixvar_idx++].var;
1319+ v = &fc->fixvar[fixvar_idx++].var;
1320 v->di_flags = DI_FLAGS_RO | DI_FLAGS_FIX;
1321 }
1322 else
1323@@ -21128,7 +21256,7 @@
1324 v->di_flags = DI_FLAGS_RO;
1325 }
1326 STRCPY(v->di_key, name);
1327- hash_add(&fc.l_avars.dv_hashtab, DI2HIKEY(v));
1328+ hash_add(&fc->l_avars.dv_hashtab, DI2HIKEY(v));
1329
1330 /* Note: the values are copied directly to avoid alloc/free.
1331 * "argvars" must have VAR_FIXED for v_lock. */
1332@@ -21137,9 +21265,9 @@
1333
1334 if (ai >= 0 && ai < MAX_FUNC_ARGS)
1335 {
1336- list_append(&fc.l_varlist, &fc.l_listitems[ai]);
1337- fc.l_listitems[ai].li_tv = argvars[i];
1338- fc.l_listitems[ai].li_tv.v_lock = VAR_FIXED;
1339+ list_append(&fc->l_varlist, &fc->l_listitems[ai]);
1340+ fc->l_listitems[ai].li_tv = argvars[i];
1341+ fc->l_listitems[ai].li_tv.v_lock = VAR_FIXED;
1342 }
1343 }
1344
1345@@ -21204,7 +21332,7 @@
1346 if (!fp->uf_profiling && has_profiling(FALSE, fp->uf_name, NULL))
1347 func_do_profile(fp);
1348 if (fp->uf_profiling
1349- || (fc.caller != NULL && &fc.caller->func->uf_profiling))
1350+ || (fc->caller != NULL && fc->caller->func->uf_profiling))
1351 {
1352 ++fp->uf_tm_count;
1353 profile_start(&call_start);
1354@@ -21220,7 +21348,7 @@
1355 did_emsg = FALSE;
1356
1357 /* call do_cmdline() to execute the lines */
1358- do_cmdline(NULL, get_func_line, (void *)&fc,
1359+ do_cmdline(NULL, get_func_line, (void *)fc,
1360 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
1361
1362 --RedrawingDisabled;
1363@@ -21235,16 +21363,16 @@
1364
1365 #ifdef FEAT_PROFILE
1366 if (do_profiling == PROF_YES && (fp->uf_profiling
1367- || (fc.caller != NULL && &fc.caller->func->uf_profiling)))
1368+ || (fc->caller != NULL && fc->caller->func->uf_profiling)))
1369 {
1370 profile_end(&call_start);
1371 profile_sub_wait(&wait_start, &call_start);
1372 profile_add(&fp->uf_tm_total, &call_start);
1373 profile_self(&fp->uf_tm_self, &call_start, &fp->uf_tm_children);
1374- if (fc.caller != NULL && &fc.caller->func->uf_profiling)
1375+ if (fc->caller != NULL && fc->caller->func->uf_profiling)
1376 {
1377- profile_add(&fc.caller->func->uf_tm_children, &call_start);
1378- profile_add(&fc.caller->func->uf_tml_children, &call_start);
1379+ profile_add(&fc->caller->func->uf_tm_children, &call_start);
1380+ profile_add(&fc->caller->func->uf_tml_children, &call_start);
1381 }
1382 }
1383 #endif
1384@@ -21257,9 +21385,9 @@
1385
1386 if (aborting())
1387 smsg((char_u *)_("%s aborted"), sourcing_name);
1388- else if (fc.rettv->v_type == VAR_NUMBER)
1389+ else if (fc->rettv->v_type == VAR_NUMBER)
1390 smsg((char_u *)_("%s returning #%ld"), sourcing_name,
1391- (long)fc.rettv->vval.v_number);
1392+ (long)fc->rettv->vval.v_number);
1393 else
1394 {
1395 char_u buf[MSG_BUF_LEN];
1396@@ -21270,7 +21398,7 @@
1397 /* The value may be very long. Skip the middle part, so that we
1398 * have some idea how it starts and ends. smsg() would always
1399 * truncate it at the end. */
1400- s = tv2string(fc.rettv, &tofree, numbuf2, 0);
1401+ s = tv2string(fc->rettv, &tofree, numbuf2, 0);
1402 if (s != NULL)
1403 {
1404 trunc_string(s, buf, MSG_BUF_CLEN);
1405@@ -21306,14 +21434,84 @@
1406 }
1407
1408 did_emsg |= save_did_emsg;
1409- current_funccal = fc.caller;
1410+ current_funccal = fc->caller;
1411+ --depth;
1412
1413- /* The a: variables typevals were not allocated, only free the allocated
1414- * variables. */
1415- vars_clear_ext(&fc.l_avars.dv_hashtab, FALSE);
1416+ /* if the a:000 list and the a: dict are not referenced we can free the
1417+ * funccall_T and what's in it. */
1418+ if (fc->l_varlist.lv_refcount == DO_NOT_FREE_CNT
1419+ && fc->l_vars.dv_refcount == DO_NOT_FREE_CNT
1420+ && fc->l_avars.dv_refcount == DO_NOT_FREE_CNT)
1421+ {
1422+ free_funccal(fc, FALSE);
1423+ }
1424+ else
1425+ {
1426+ hashitem_T *hi;
1427+ listitem_T *li;
1428+ int todo;
1429
1430- vars_clear(&fc.l_vars.dv_hashtab); /* free all l: variables */
1431- --depth;
1432+ /* "fc" is still in use. This can happen when returning "a:000" or
1433+ * assigning "l:" to a global variable.
1434+ * Link "fc" in the list for garbage collection later. */
1435+ fc->caller = previous_funccal;
1436+ previous_funccal = fc;
1437+
1438+ /* Make a copy of the a: variables, since we didn't do that above. */
1439+ todo = (int)fc->l_avars.dv_hashtab.ht_used;
1440+ for (hi = fc->l_avars.dv_hashtab.ht_array; todo > 0; ++hi)
1441+ {
1442+ if (!HASHITEM_EMPTY(hi))
1443+ {
1444+ --todo;
1445+ v = HI2DI(hi);
1446+ copy_tv(&v->di_tv, &v->di_tv);
1447+ }
1448+ }
1449+
1450+ /* Make a copy of the a:000 items, since we didn't do that above. */
1451+ for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
1452+ copy_tv(&li->li_tv, &li->li_tv);
1453+ }
1454+}
1455+
1456+/*
1457+ * Return TRUE if items in "fc" do not have "copyID". That means they are not
1458+ * referenced from anywyere.
1459+ */
1460+ static int
1461+can_free_funccal(fc, copyID)
1462+ funccall_T *fc;
1463+ int copyID;
1464+{
1465+ return (fc->l_varlist.lv_copyID != copyID
1466+ && fc->l_vars.dv_copyID != copyID
1467+ && fc->l_avars.dv_copyID != copyID);
1468+}
1469+
1470+/*
1471+ * Free "fc" and what it contains.
1472+ */
1473+ static void
1474+free_funccal(fc, free_val)
1475+ funccall_T *fc;
1476+ int free_val; /* a: vars were allocated */
1477+{
1478+ listitem_T *li;
1479+
1480+ /* The a: variables typevals may not have been allocated, only free the
1481+ * allocated variables. */
1482+ vars_clear_ext(&fc->l_avars.dv_hashtab, free_val);
1483+
1484+ /* free all l: variables */
1485+ vars_clear(&fc->l_vars.dv_hashtab);
1486+
1487+ /* Free the a:000 variables if they were allocated. */
1488+ if (free_val)
1489+ for (li = fc->l_varlist.lv_first; li != NULL; li = li->li_next)
1490+ clear_tv(&li->li_tv);
1491+
1492+ vim_free(fc);
1493 }
1494
1495 /*
1496@@ -21886,6 +22084,62 @@
1497 }
1498 }
1499
1500+/*
1501+ * List v:oldfiles in a nice way.
1502+ */
1503+/*ARGSUSED*/
1504+ void
1505+ex_oldfiles(eap)
1506+ exarg_T *eap;
1507+{
1508+ list_T *l = vimvars[VV_OLDFILES].vv_list;
1509+ listitem_T *li;
1510+ int nr = 0;
1511+
1512+ if (l == NULL)
1513+ msg((char_u *)_("No old files"));
1514+ else
1515+ {
1516+ msg_start();
1517+ msg_scroll = TRUE;
1518+ for (li = l->lv_first; li != NULL && !got_int; li = li->li_next)
1519+ {
1520+ msg_outnum((long)++nr);
1521+ MSG_PUTS(": ");
1522+ msg_outtrans(get_tv_string(&li->li_tv));
1523+ msg_putchar('\n');
1524+ out_flush(); /* output one line at a time */
1525+ ui_breakcheck();
1526+ }
1527+ /* Assume "got_int" was set to truncate the listing. */
1528+ got_int = FALSE;
1529+
1530+#ifdef FEAT_BROWSE_CMD
1531+ if (cmdmod.browse)
1532+ {
1533+ quit_more = FALSE;
1534+ nr = prompt_for_number(FALSE);
1535+ msg_starthere();
1536+ if (nr > 0)
1537+ {
1538+ char_u *p = list_find_str(get_vim_var_list(VV_OLDFILES),
1539+ (long)nr);
1540+
1541+ if (p != NULL)
1542+ {
1543+ p = expand_env_save(p);
1544+ eap->arg = p;
1545+ eap->cmdidx = CMD_edit;
1546+ cmdmod.browse = FALSE;
1547+ do_exedit(eap, NULL);
1548+ vim_free(p);
1549+ }
1550+ }
1551+ }
1552+#endif
1553+ }
1554+}
1555+
1556 #endif /* FEAT_EVAL */
1557
1558
1559diff -Naur vim72.orig/src/ex_cmds.c vim72/src/ex_cmds.c
1560--- vim72.orig/src/ex_cmds.c 2008-08-04 12:15:00.000000000 -0700
1561+++ vim72/src/ex_cmds.c 2008-12-30 16:17:03.000000000 -0800
1562@@ -24,7 +24,7 @@
1563 static void do_filter __ARGS((linenr_T line1, linenr_T line2, exarg_T *eap, char_u *cmd, int do_in, int do_out));
1564 #ifdef FEAT_VIMINFO
1565 static char_u *viminfo_filename __ARGS((char_u *));
1566-static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int want_info, int want_marks, int force_read));
1567+static void do_viminfo __ARGS((FILE *fp_in, FILE *fp_out, int flags));
1568 static int viminfo_encoding __ARGS((vir_T *virp));
1569 static int read_viminfo_up_to_marks __ARGS((vir_T *virp, int forceit, int writing));
1570 #endif
1571@@ -1676,14 +1676,12 @@
1572
1573 /*
1574 * read_viminfo() -- Read the viminfo file. Registers etc. which are already
1575- * set are not over-written unless force is TRUE. -- webb
1576+ * set are not over-written unless "flags" includes VIF_FORCEIT. -- webb
1577 */
1578 int
1579-read_viminfo(file, want_info, want_marks, forceit)
1580- char_u *file;
1581- int want_info;
1582- int want_marks;
1583- int forceit;
1584+read_viminfo(file, flags)
1585+ char_u *file; /* file name or NULL to use default name */
1586+ int flags; /* VIF_WANT_INFO et al. */
1587 {
1588 FILE *fp;
1589 char_u *fname;
1590@@ -1691,7 +1689,7 @@
1591 if (no_viminfo())
1592 return FAIL;
1593
1594- fname = viminfo_filename(file); /* may set to default if NULL */
1595+ fname = viminfo_filename(file); /* get file name in allocated buffer */
1596 if (fname == NULL)
1597 return FAIL;
1598 fp = mch_fopen((char *)fname, READBIN);
1599@@ -1701,8 +1699,9 @@
1600 verbose_enter();
1601 smsg((char_u *)_("Reading viminfo file \"%s\"%s%s%s"),
1602 fname,
1603- want_info ? _(" info") : "",
1604- want_marks ? _(" marks") : "",
1605+ (flags & VIF_WANT_INFO) ? _(" info") : "",
1606+ (flags & VIF_WANT_MARKS) ? _(" marks") : "",
1607+ (flags & VIF_GET_OLDFILES) ? _(" oldfiles") : "",
1608 fp == NULL ? _(" FAILED") : "");
1609 verbose_leave();
1610 }
1611@@ -1712,10 +1711,9 @@
1612 return FAIL;
1613
1614 viminfo_errcnt = 0;
1615- do_viminfo(fp, NULL, want_info, want_marks, forceit);
1616+ do_viminfo(fp, NULL, flags);
1617
1618 fclose(fp);
1619-
1620 return OK;
1621 }
1622
1623@@ -1943,7 +1941,7 @@
1624 * root.
1625 */
1626 if (fp_out != NULL)
1627- (void)fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);
1628+ ignored = fchown(fileno(fp_out), st_old.st_uid, st_old.st_gid);
1629 #endif
1630 }
1631 }
1632@@ -1968,7 +1966,7 @@
1633 }
1634
1635 viminfo_errcnt = 0;
1636- do_viminfo(fp_in, fp_out, !forceit, !forceit, FALSE);
1637+ do_viminfo(fp_in, fp_out, forceit ? 0 : (VIF_WANT_INFO | VIF_WANT_MARKS));
1638
1639 fclose(fp_out); /* errors are ignored !? */
1640 if (fp_in != NULL)
1641@@ -2041,12 +2039,10 @@
1642 * do_viminfo() -- Should only be called from read_viminfo() & write_viminfo().
1643 */
1644 static void
1645-do_viminfo(fp_in, fp_out, want_info, want_marks, force_read)
1646+do_viminfo(fp_in, fp_out, flags)
1647 FILE *fp_in;
1648 FILE *fp_out;
1649- int want_info;
1650- int want_marks;
1651- int force_read;
1652+ int flags;
1653 {
1654 int count = 0;
1655 int eof = FALSE;
1656@@ -2061,8 +2057,9 @@
1657
1658 if (fp_in != NULL)
1659 {
1660- if (want_info)
1661- eof = read_viminfo_up_to_marks(&vir, force_read, fp_out != NULL);
1662+ if (flags & VIF_WANT_INFO)
1663+ eof = read_viminfo_up_to_marks(&vir,
1664+ flags & VIF_FORCEIT, fp_out != NULL);
1665 else
1666 /* Skip info, find start of marks */
1667 while (!(eof = viminfo_readline(&vir))
1668@@ -2092,8 +2089,9 @@
1669 write_viminfo_bufferlist(fp_out);
1670 count = write_viminfo_marks(fp_out);
1671 }
1672- if (fp_in != NULL && want_marks)
1673- copy_viminfo_marks(&vir, fp_out, count, eof);
1674+ if (fp_in != NULL
1675+ && (flags & (VIF_WANT_MARKS | VIF_GET_OLDFILES | VIF_FORCEIT)))
1676+ copy_viminfo_marks(&vir, fp_out, count, eof, flags);
1677
1678 vim_free(vir.vir_line);
1679 #ifdef FEAT_MBYTE
1680@@ -5059,6 +5057,7 @@
1681
1682 if (did_sub)
1683 ++sub_nlines;
1684+ vim_free(new_start); /* for when substitute was cancelled */
1685 vim_free(sub_firstline); /* free the copy of the original line */
1686 sub_firstline = NULL;
1687 }
1688diff -Naur vim72.orig/src/ex_cmds.h vim72/src/ex_cmds.h
1689--- vim72.orig/src/ex_cmds.h 2008-06-21 11:47:57.000000000 -0700
1690+++ vim72/src/ex_cmds.h 2008-12-30 16:15:47.000000000 -0800
1691@@ -278,7 +278,7 @@
1692 EX(CMD_crewind, "crewind", ex_cc,
1693 RANGE|NOTADR|COUNT|TRLBAR|BANG),
1694 EX(CMD_cscope, "cscope", do_cscope,
1695- EXTRA|NOTRLCOM|SBOXOK|XFILE),
1696+ EXTRA|NOTRLCOM|XFILE),
1697 EX(CMD_cstag, "cstag", do_cstag,
1698 BANG|TRLBAR|WORD1),
1699 EX(CMD_cunmap, "cunmap", ex_unmap,
1700@@ -506,7 +506,7 @@
1701 EX(CMD_lclose, "lclose", ex_cclose,
1702 RANGE|NOTADR|COUNT|TRLBAR),
1703 EX(CMD_lcscope, "lcscope", do_cscope,
1704- EXTRA|NOTRLCOM|SBOXOK|XFILE),
1705+ EXTRA|NOTRLCOM|XFILE),
1706 EX(CMD_left, "left", ex_align,
1707 TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY),
1708 EX(CMD_leftabove, "leftabove", ex_wrongmodifier,
1709@@ -635,6 +635,8 @@
1710 RANGE|NOTADR|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
1711 EX(CMD_noremap, "noremap", ex_map,
1712 BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
1713+EX(CMD_noautocmd, "noautocmd", ex_wrongmodifier,
1714+ NEEDARG|EXTRA|NOTRLCOM),
1715 EX(CMD_nohlsearch, "nohlsearch", ex_nohlsearch,
1716 TRLBAR|SBOXOK|CMDWIN),
1717 EX(CMD_noreabbrev, "noreabbrev", ex_abbreviate,
1718@@ -651,6 +653,8 @@
1719 EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
1720 EX(CMD_open, "open", ex_open,
1721 RANGE|EXTRA),
1722+EX(CMD_oldfiles, "oldfiles", ex_oldfiles,
1723+ BANG|TRLBAR|SBOXOK|CMDWIN),
1724 EX(CMD_omap, "omap", ex_map,
1725 EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
1726 EX(CMD_omapclear, "omapclear", ex_mapclear,
1727@@ -802,7 +806,7 @@
1728 EX(CMD_scriptencoding, "scriptencoding", ex_scriptencoding,
1729 WORD1|TRLBAR|CMDWIN),
1730 EX(CMD_scscope, "scscope", do_scscope,
1731- EXTRA|NOTRLCOM|SBOXOK),
1732+ EXTRA|NOTRLCOM),
1733 EX(CMD_set, "set", ex_set,
1734 TRLBAR|EXTRA|CMDWIN|SBOXOK),
1735 EX(CMD_setfiletype, "setfiletype", ex_setfiletype,
1736diff -Naur vim72.orig/src/ex_cmds2.c vim72/src/ex_cmds2.c
1737--- vim72.orig/src/ex_cmds2.c 2008-07-13 09:18:22.000000000 -0700
1738+++ vim72/src/ex_cmds2.c 2008-12-30 16:14:45.000000000 -0800
1739@@ -3145,8 +3145,8 @@
1740 verbose_leave();
1741 }
1742 #ifdef STARTUPTIME
1743- vim_snprintf(IObuff, IOSIZE, "sourcing %s", fname);
1744- time_msg(IObuff, &tv_start);
1745+ vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname);
1746+ time_msg((char *)IObuff, &tv_start);
1747 time_pop(&tv_rel);
1748 #endif
1749
1750diff -Naur vim72.orig/src/ex_docmd.c vim72/src/ex_docmd.c
1751--- vim72.orig/src/ex_docmd.c 2008-07-26 04:51:05.000000000 -0700
1752+++ vim72/src/ex_docmd.c 2008-12-30 16:17:40.000000000 -0800
1753@@ -364,6 +364,7 @@
1754 # define ex_function ex_ni
1755 # define ex_delfunction ex_ni
1756 # define ex_return ex_ni
1757+# define ex_oldfiles ex_ni
1758 #endif
1759 static char_u *arg_all __ARGS((void));
1760 #ifdef FEAT_SESSION
1761@@ -1770,7 +1771,7 @@
1762 }
1763 if (checkforcmd(&ea.cmd, "browse", 3))
1764 {
1765-#ifdef FEAT_BROWSE
1766+#ifdef FEAT_BROWSE_CMD
1767 cmdmod.browse = TRUE;
1768 #endif
1769 continue;
1770@@ -2978,6 +2979,7 @@
1771 {"keepmarks", 3, FALSE},
1772 {"leftabove", 5, FALSE},
1773 {"lockmarks", 3, FALSE},
1774+ {"noautocmd", 3, FALSE},
1775 {"rightbelow", 6, FALSE},
1776 {"sandbox", 3, FALSE},
1777 {"silent", 3, FALSE},
1778@@ -3608,6 +3610,7 @@
1779 return set_context_in_autocmd(xp, arg, FALSE);
1780
1781 case CMD_doautocmd:
1782+ case CMD_doautoall:
1783 return set_context_in_autocmd(xp, arg, TRUE);
1784 #endif
1785 case CMD_set:
1786@@ -8749,8 +8752,8 @@
1787 else if (*dirnow != NUL
1788 && (ssop_flags & SSOP_CURDIR) && globaldir != NULL)
1789 {
1790- (void)mch_chdir((char *)globaldir);
1791- shorten_fnames(TRUE);
1792+ if (mch_chdir((char *)globaldir) == OK)
1793+ shorten_fnames(TRUE);
1794 }
1795
1796 failed |= (makeopens(fd, dirnow) == FAIL);
1797@@ -9506,24 +9509,50 @@
1798 break;
1799 }
1800 s = src + 1;
1801+ if (*s == '<') /* "#<99" uses v:oldfiles */
1802+ ++s;
1803 i = (int)getdigits(&s);
1804 *usedlen = (int)(s - src); /* length of what we expand */
1805
1806- buf = buflist_findnr(i);
1807- if (buf == NULL)
1808+ if (src[1] == '<')
1809 {
1810- *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
1811+ if (*usedlen < 2)
1812+ {
1813+ /* Should we give an error message for #<text? */
1814+ *usedlen = 1;
1815+ return NULL;
1816+ }
1817+#ifdef FEAT_EVAL
1818+ result = list_find_str(get_vim_var_list(VV_OLDFILES),
1819+ (long)i);
1820+ if (result == NULL)
1821+ {
1822+ *errormsg = (char_u *)"";
1823+ return NULL;
1824+ }
1825+#else
1826+ *errormsg = (char_u *)_("E809: #< is not available without the +eval feature");
1827 return NULL;
1828+#endif
1829 }
1830- if (lnump != NULL)
1831- *lnump = ECMD_LAST;
1832- if (buf->b_fname == NULL)
1833+ else
1834 {
1835- result = (char_u *)"";
1836- valid = 0; /* Must have ":p:h" to be valid */
1837+ buf = buflist_findnr(i);
1838+ if (buf == NULL)
1839+ {
1840+ *errormsg = (char_u *)_("E194: No alternate file name to substitute for '#'");
1841+ return NULL;
1842+ }
1843+ if (lnump != NULL)
1844+ *lnump = ECMD_LAST;
1845+ if (buf->b_fname == NULL)
1846+ {
1847+ result = (char_u *)"";
1848+ valid = 0; /* Must have ":p:h" to be valid */
1849+ }
1850+ else
1851+ result = buf->b_fname;
1852 }
1853- else
1854- result = buf->b_fname;
1855 break;
1856
1857 #ifdef FEAT_SEARCHPATH
1858@@ -9541,6 +9570,15 @@
1859 #ifdef FEAT_AUTOCMD
1860 case SPEC_AFILE: /* file name for autocommand */
1861 result = autocmd_fname;
1862+ if (result != NULL && !autocmd_fname_full)
1863+ {
1864+ /* Still need to turn the fname into a full path. It is
1865+ * postponed to avoid a delay when <afile> is not used. */
1866+ autocmd_fname_full = TRUE;
1867+ result = FullName_save(autocmd_fname, FALSE);
1868+ vim_free(autocmd_fname);
1869+ autocmd_fname = result;
1870+ }
1871 if (result == NULL)
1872 {
1873 *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"<afile>\"");
1874@@ -10067,7 +10105,7 @@
1875 */
1876 if (put_line(fd, "let s:sx = expand(\"<sfile>:p:r\").\"x.vim\"") == FAIL
1877 || put_line(fd, "if file_readable(s:sx)") == FAIL
1878- || put_line(fd, " exe \"source \" . s:sx") == FAIL
1879+ || put_line(fd, " exe \"source \" . fnameescape(s:sx)") == FAIL
1880 || put_line(fd, "endif") == FAIL)
1881 return FAIL;
1882
1883@@ -10689,7 +10727,8 @@
1884 p_viminfo = (char_u *)"'100";
1885 if (eap->cmdidx == CMD_rviminfo)
1886 {
1887- if (read_viminfo(eap->arg, TRUE, TRUE, eap->forceit) == FAIL)
1888+ if (read_viminfo(eap->arg, VIF_WANT_INFO | VIF_WANT_MARKS
1889+ | (eap->forceit ? VIF_FORCEIT : 0)) == FAIL)
1890 EMSG(_("E195: Cannot open viminfo file for reading"));
1891 }
1892 else
1893diff -Naur vim72.orig/src/ex_getln.c vim72/src/ex_getln.c
1894--- vim72.orig/src/ex_getln.c 2008-08-08 02:31:33.000000000 -0700
1895+++ vim72/src/ex_getln.c 2008-12-30 16:16:50.000000000 -0800
1896@@ -31,6 +31,8 @@
1897 int cmdattr; /* attributes for prompt */
1898 int overstrike; /* Typing mode on the command line. Shared by
1899 getcmdline() and put_on_cmdline(). */
1900+ expand_T *xpc; /* struct being used for expansion, xp_pattern
1901+ may point into cmdbuff */
1902 int xp_context; /* type of expansion */
1903 # ifdef FEAT_EVAL
1904 char_u *xp_arg; /* user-defined expansion arg */
1905@@ -38,7 +40,11 @@
1906 # endif
1907 };
1908
1909-static struct cmdline_info ccline; /* current cmdline_info */
1910+/* The current cmdline_info. It is initialized in getcmdline() and after that
1911+ * used by other functions. When invoking getcmdline() recursively it needs
1912+ * to be saved with save_cmdline() and restored with restore_cmdline().
1913+ * TODO: make it local to getcmdline() and pass it around. */
1914+static struct cmdline_info ccline;
1915
1916 static int cmd_showtail; /* Only show path tail in lists ? */
1917
1918@@ -238,6 +244,7 @@
1919 }
1920
1921 ExpandInit(&xpc);
1922+ ccline.xpc = &xpc;
1923
1924 #ifdef FEAT_RIGHTLEFT
1925 if (curwin->w_p_rl && *curwin->w_p_rlc == 's'
1926@@ -408,9 +415,10 @@
1927 #endif
1928
1929 /*
1930- * <S-Tab> works like CTRL-P (unless 'wc' is <S-Tab>).
1931+ * When there are matching completions to select <S-Tab> works like
1932+ * CTRL-P (unless 'wc' is <S-Tab>).
1933 */
1934- if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles != -1)
1935+ if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0)
1936 c = Ctrl_P;
1937
1938 #ifdef FEAT_WILDMENU
1939@@ -1513,6 +1521,7 @@
1940 int old_firstc;
1941
1942 vim_free(ccline.cmdbuff);
1943+ xpc.xp_context = EXPAND_NOTHING;
1944 if (hiscnt == hislen)
1945 p = lookfor; /* back to the old one */
1946 else
1947@@ -1839,6 +1848,7 @@
1948 #endif
1949
1950 ExpandCleanup(&xpc);
1951+ ccline.xpc = NULL;
1952
1953 #ifdef FEAT_SEARCH_EXTRA
1954 if (did_incsearch)
1955@@ -2508,6 +2518,20 @@
1956 }
1957 mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen + 1);
1958 vim_free(p);
1959+
1960+ if (ccline.xpc != NULL
1961+ && ccline.xpc->xp_pattern != NULL
1962+ && ccline.xpc->xp_context != EXPAND_NOTHING
1963+ && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL)
1964+ {
1965+ int i = (int)(ccline.xpc->xp_pattern - p);
1966+
1967+ /* If xp_pattern points inside the old cmdbuff it needs to be adjusted
1968+ * to point into the newly allocated memory. */
1969+ if (i >= 0 && i <= ccline.cmdlen)
1970+ ccline.xpc->xp_pattern = ccline.cmdbuff + i;
1971+ }
1972+
1973 return OK;
1974 }
1975
1976@@ -2875,6 +2899,7 @@
1977 prev_ccline = ccline;
1978 ccline.cmdbuff = NULL;
1979 ccline.cmdprompt = NULL;
1980+ ccline.xpc = NULL;
1981 }
1982
1983 /*
1984@@ -3582,6 +3607,7 @@
1985 ExpandInit(xp)
1986 expand_T *xp;
1987 {
1988+ xp->xp_pattern = NULL;
1989 xp->xp_backslash = XP_BS_NONE;
1990 #ifndef BACKSLASH_IN_FILENAME
1991 xp->xp_shell = FALSE;
1992@@ -4871,7 +4897,7 @@
1993 if (s == NULL)
1994 return FAIL;
1995 sprintf((char *)s, "%s/%s*.vim", dirname, pat);
1996- all = globpath(p_rtp, s);
1997+ all = globpath(p_rtp, s, 0);
1998 vim_free(s);
1999 if (all == NULL)
2000 return FAIL;
2001@@ -4912,9 +4938,10 @@
2002 * newlines. Returns NULL for an error or no matches.
2003 */
2004 char_u *
2005-globpath(path, file)
2006+globpath(path, file, expand_options)
2007 char_u *path;
2008 char_u *file;
2009+ int expand_options;
2010 {
2011 expand_T xpc;
2012 char_u *buf;
2013@@ -4943,10 +4970,10 @@
2014 {
2015 add_pathsep(buf);
2016 STRCAT(buf, file);
2017- if (ExpandFromContext(&xpc, buf, &num_p, &p, WILD_SILENT) != FAIL
2018- && num_p > 0)
2019+ if (ExpandFromContext(&xpc, buf, &num_p, &p,
2020+ WILD_SILENT|expand_options) != FAIL && num_p > 0)
2021 {
2022- ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT);
2023+ ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options);
2024 for (len = 0, i = 0; i < num_p; ++i)
2025 len += (int)STRLEN(p[i]) + 1;
2026
2027diff -Naur vim72.orig/src/feature.h vim72/src/feature.h
2028--- vim72.orig/src/feature.h 2008-08-06 04:00:39.000000000 -0700
2029+++ vim72/src/feature.h 2008-12-30 16:15:47.000000000 -0800
2030@@ -767,9 +767,13 @@
2031
2032 /*
2033 * +browse ":browse" command.
2034+ * or just the ":browse" command modifier
2035 */
2036-#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC))
2037-# define FEAT_BROWSE
2038+#if defined(FEAT_NORMAL)
2039+# define FEAT_BROWSE_CMD
2040+# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
2041+# define FEAT_BROWSE
2042+# endif
2043 #endif
2044
2045 /*
2046diff -Naur vim72.orig/src/fileio.c vim72/src/fileio.c
2047--- vim72.orig/src/fileio.c 2008-08-06 04:01:03.000000000 -0700
2048+++ vim72/src/fileio.c 2008-12-30 16:18:07.000000000 -0800
2049@@ -932,7 +932,10 @@
2050 else
2051 {
2052 if (eap != NULL && eap->force_ff != 0)
2053+ {
2054 fileformat = get_fileformat_force(curbuf, eap);
2055+ try_unix = try_dos = try_mac = FALSE;
2056+ }
2057 else if (curbuf->b_p_bin)
2058 fileformat = EOL_UNIX; /* binary: use Unix format */
2059 else if (*p_ffs == NUL)
2060@@ -2211,7 +2214,7 @@
2061 {
2062 /* Use stderr for stdin, makes shell commands work. */
2063 close(0);
2064- dup(2);
2065+ ignored = dup(2);
2066 }
2067 #endif
2068
2069@@ -2341,11 +2344,6 @@
2070 STRCAT(IObuff, _("[CR missing]"));
2071 c = TRUE;
2072 }
2073- if (ff_error == EOL_MAC)
2074- {
2075- STRCAT(IObuff, _("[NL found]"));
2076- c = TRUE;
2077- }
2078 if (split)
2079 {
2080 STRCAT(IObuff, _("[long lines split]"));
2081@@ -2711,7 +2709,7 @@
2082 {
2083 if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
2084 && curbuf->b_ffname != NULL)
2085- read_viminfo(NULL, FALSE, TRUE, FALSE);
2086+ read_viminfo(NULL, VIF_WANT_MARKS);
2087
2088 /* Always set b_marks_read; needed when 'viminfo' is changed to include
2089 * the ' parameter after opening a buffer. */
2090@@ -3451,7 +3449,7 @@
2091 {
2092 # ifdef UNIX
2093 # ifdef HAVE_FCHOWN
2094- fchown(fd, st_old.st_uid, st_old.st_gid);
2095+ ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
2096 # endif
2097 if (mch_stat((char *)IObuff, &st) < 0
2098 || st.st_uid != st_old.st_uid
2099@@ -4367,7 +4365,7 @@
2100 || st.st_uid != st_old.st_uid
2101 || st.st_gid != st_old.st_gid)
2102 {
2103- fchown(fd, st_old.st_uid, st_old.st_gid);
2104+ ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
2105 if (perm >= 0) /* set permission again, may have changed */
2106 (void)mch_setperm(wfname, perm);
2107 }
2108@@ -5550,9 +5548,10 @@
2109 name = "ucs-4le"; /* FF FE 00 00 */
2110 len = 4;
2111 }
2112- else if (flags == FIO_ALL || flags == (FIO_UCS2 | FIO_ENDIAN_L))
2113+ else if (flags == (FIO_UCS2 | FIO_ENDIAN_L))
2114 name = "ucs-2le"; /* FF FE */
2115- else if (flags == (FIO_UTF16 | FIO_ENDIAN_L))
2116+ else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L))
2117+ /* utf-16le is preferred, it also works for ucs-2le text */
2118 name = "utf-16le"; /* FF FE */
2119 }
2120 else if (p[0] == 0xfe && p[1] == 0xff
2121@@ -6031,9 +6030,9 @@
2122 {
2123 tbuf[FGETS_SIZE - 2] = NUL;
2124 #ifdef USE_CR
2125- fgets_cr((char *)tbuf, FGETS_SIZE, fp);
2126+ ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp);
2127 #else
2128- fgets((char *)tbuf, FGETS_SIZE, fp);
2129+ ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
2130 #endif
2131 } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
2132 }
2133@@ -6120,6 +6119,47 @@
2134 if (mch_stat((char *)from, &st) < 0)
2135 return -1;
2136
2137+#ifdef UNIX
2138+ {
2139+ struct stat st_to;
2140+ char tempname[MAXPATHL + 1];
2141+
2142+ /* It's possible for the source and destination to be the same file.
2143+ * This happens when "from" and "to" differ in case and are on a FAT32
2144+ * filesystem. In that case go through a temp file name. */
2145+ if (mch_stat((char *)to, &st_to) >= 0
2146+ && st.st_dev == st_to.st_dev
2147+ && st.st_ino == st_to.st_ino)
2148+ {
2149+ /* Find a name that doesn't exist and is in the same directory.
2150+ * Move "from" to "tempname" and then to "to". */
2151+ if (STRLEN(from) >= MAXPATHL - 5)
2152+ return -1;
2153+ STRCPY(tempname, from);
2154+ for (n = 123; n < 99999; ++n)
2155+ {
2156+ sprintf(gettail(tempname), "%d", n);
2157+ if (mch_stat(tempname, &st_to) < 0)
2158+ {
2159+ if (mch_rename((char *)from, tempname) == 0)
2160+ {
2161+ if (mch_rename(tempname, (char *)to) == 0)
2162+ return 0;
2163+ /* Strange, the second step failed. Try moving the
2164+ * file back and return failure. */
2165+ mch_rename(tempname, (char *)from);
2166+ return -1;
2167+ }
2168+ /* If it fails for one temp name it will most likely fail
2169+ * for any temp name, give up. */
2170+ return -1;
2171+ }
2172+ }
2173+ return -1;
2174+ }
2175+ }
2176+#endif
2177+
2178 /*
2179 * Delete the "to" file, this is required on some systems to make the
2180 * mch_rename() work, on other systems it makes sure that we don't have
2181@@ -8523,6 +8563,7 @@
2182 char_u *save_sourcing_name;
2183 linenr_T save_sourcing_lnum;
2184 char_u *save_autocmd_fname;
2185+ int save_autocmd_fname_full;
2186 int save_autocmd_bufnr;
2187 char_u *save_autocmd_match;
2188 int save_autocmd_busy;
2189@@ -8601,6 +8642,7 @@
2190 * Save the autocmd_* variables and info about the current buffer.
2191 */
2192 save_autocmd_fname = autocmd_fname;
2193+ save_autocmd_fname_full = autocmd_fname_full;
2194 save_autocmd_bufnr = autocmd_bufnr;
2195 save_autocmd_match = autocmd_match;
2196 save_autocmd_busy = autocmd_busy;
2197@@ -8618,14 +8660,15 @@
2198 if (fname != NULL && *fname != NUL)
2199 autocmd_fname = fname;
2200 else if (buf != NULL)
2201- autocmd_fname = buf->b_fname;
2202+ autocmd_fname = buf->b_ffname;
2203 else
2204 autocmd_fname = NULL;
2205 }
2206 else
2207 autocmd_fname = fname_io;
2208 if (autocmd_fname != NULL)
2209- autocmd_fname = FullName_save(autocmd_fname, FALSE);
2210+ autocmd_fname = vim_strsave(autocmd_fname);
2211+ autocmd_fname_full = FALSE; /* call FullName_save() later */
2212
2213 /*
2214 * Set the buffer number to be used for <abuf>.
2215@@ -8810,6 +8853,7 @@
2216 sourcing_lnum = save_sourcing_lnum;
2217 vim_free(autocmd_fname);
2218 autocmd_fname = save_autocmd_fname;
2219+ autocmd_fname_full = save_autocmd_fname_full;
2220 autocmd_bufnr = save_autocmd_bufnr;
2221 autocmd_match = save_autocmd_match;
2222 #ifdef FEAT_EVAL
2223@@ -8918,7 +8962,7 @@
2224 {
2225 apc->curpat = NULL;
2226
2227- /* only use a pattern when it has not been removed, has commands and
2228+ /* Only use a pattern when it has not been removed, has commands and
2229 * the group matches. For buffer-local autocommands only check the
2230 * buffer number. */
2231 if (ap->pat != NULL && ap->cmds != NULL
2232@@ -9104,7 +9148,7 @@
2233 set_context_in_autocmd(xp, arg, doautocmd)
2234 expand_T *xp;
2235 char_u *arg;
2236- int doautocmd; /* TRUE for :doautocmd, FALSE for :autocmd */
2237+ int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */
2238 {
2239 char_u *p;
2240 int group;
2241diff -Naur vim72.orig/src/fold.c vim72/src/fold.c
2242--- vim72.orig/src/fold.c 2008-08-06 04:01:12.000000000 -0700
2243+++ vim72/src/fold.c 2008-12-30 16:17:03.000000000 -0800
2244@@ -48,7 +48,7 @@
2245 static int foldFind __ARGS((garray_T *gap, linenr_T lnum, fold_T **fpp));
2246 static int foldLevelWin __ARGS((win_T *wp, linenr_T lnum));
2247 static void checkupdate __ARGS((win_T *wp));
2248-static void setFoldRepeat __ARGS((linenr_T lnum, long count, int open));
2249+static void setFoldRepeat __ARGS((linenr_T lnum, long count, int do_open));
2250 static linenr_T setManualFold __ARGS((linenr_T lnum, int opening, int recurse, int *donep));
2251 static linenr_T setManualFoldWin __ARGS((win_T *wp, linenr_T lnum, int opening, int recurse, int *donep));
2252 static void foldOpenNested __ARGS((fold_T *fpr));
2253@@ -1241,10 +1241,10 @@
2254 * Repeat "count" times.
2255 */
2256 static void
2257-setFoldRepeat(lnum, count, open)
2258+setFoldRepeat(lnum, count, do_open)
2259 linenr_T lnum;
2260 long count;
2261- int open;
2262+ int do_open;
2263 {
2264 int done;
2265 long n;
2266@@ -1252,7 +1252,7 @@
2267 for (n = 0; n < count; ++n)
2268 {
2269 done = DONE_NOTHING;
2270- (void)setManualFold(lnum, open, FALSE, &done);
2271+ (void)setManualFold(lnum, do_open, FALSE, &done);
2272 if (!(done & DONE_ACTION))
2273 {
2274 /* Only give an error message when no fold could be opened. */
2275diff -Naur vim72.orig/src/getchar.c vim72/src/getchar.c
2276--- vim72.orig/src/getchar.c 2008-07-22 09:57:48.000000000 -0700
2277+++ vim72/src/getchar.c 2008-12-30 16:16:59.000000000 -0800
2278@@ -4702,7 +4702,7 @@
2279 return FAIL;
2280 if (mp->m_noremap != REMAP_YES && fprintf(fd, "nore") < 0)
2281 return FAIL;
2282- if (fprintf(fd, cmd) < 0)
2283+ if (fputs(cmd, fd) < 0)
2284 return FAIL;
2285 if (buf != NULL && fputs(" <buffer>", fd) < 0)
2286 return FAIL;
2287@@ -4801,7 +4801,7 @@
2288 }
2289 if (IS_SPECIAL(c) || modifiers) /* special key */
2290 {
2291- if (fprintf(fd, (char *)get_special_key_name(c, modifiers)) < 0)
2292+ if (fputs((char *)get_special_key_name(c, modifiers), fd) < 0)
2293 return FAIL;
2294 continue;
2295 }
2296diff -Naur vim72.orig/src/globals.h vim72/src/globals.h
2297--- vim72.orig/src/globals.h 2008-07-26 04:53:29.000000000 -0700
2298+++ vim72/src/globals.h 2008-12-30 16:17:03.000000000 -0800
2299@@ -1022,6 +1022,7 @@
2300 #endif
2301 #ifdef FEAT_AUTOCMD
2302 EXTERN char_u *autocmd_fname INIT(= NULL); /* fname for <afile> on cmdline */
2303+EXTERN int autocmd_fname_full; /* autocmd_fname is full path */
2304 EXTERN int autocmd_bufnr INIT(= 0); /* fnum for <abuf> on cmdline */
2305 EXTERN char_u *autocmd_match INIT(= NULL); /* name for <amatch> on cmdline */
2306 EXTERN int did_cursorhold INIT(= FALSE); /* set when CursorHold t'gerd */
2307@@ -1548,6 +1549,14 @@
2308 EXTERN time_t starttime;
2309
2310 /*
2311+ * Some compilers warn for not using a return value, but in some situations we
2312+ * can't do anything useful with the value. Assign to this variable to avoid
2313+ * the warning.
2314+ */
2315+EXTERN int ignored;
2316+EXTERN char *ignoredp;
2317+
2318+/*
2319 * Optional Farsi support. Include it here, so EXTERN and INIT are defined.
2320 */
2321 #ifdef FEAT_FKMAP
2322diff -Naur vim72.orig/src/gui.c vim72/src/gui.c
2323--- vim72.orig/src/gui.c 2008-07-27 12:32:14.000000000 -0700
2324+++ vim72/src/gui.c 2008-12-30 16:17:34.000000000 -0800
2325@@ -139,7 +139,7 @@
2326 /* The read returns when the child closes the pipe (or when
2327 * the child dies for some reason). */
2328 close(pipefd[1]);
2329- (void)read(pipefd[0], &dummy, (size_t)1);
2330+ ignored = (int)read(pipefd[0], &dummy, (size_t)1);
2331 close(pipefd[0]);
2332 }
2333
2334@@ -3241,7 +3241,7 @@
2335 i = Rows;
2336 gui_update_tabline();
2337 Rows = i;
2338- need_set_size = RESIZE_VERT;
2339+ need_set_size |= RESIZE_VERT;
2340 if (using_tabline)
2341 fix_size = TRUE;
2342 if (!gui_use_tabline())
2343@@ -3275,9 +3275,9 @@
2344 if (gui.which_scrollbars[i] != prev_which_scrollbars[i])
2345 {
2346 if (i == SBAR_BOTTOM)
2347- need_set_size = RESIZE_VERT;
2348+ need_set_size |= RESIZE_VERT;
2349 else
2350- need_set_size = RESIZE_HOR;
2351+ need_set_size |= RESIZE_HOR;
2352 if (gui.which_scrollbars[i])
2353 fix_size = TRUE;
2354 }
2355@@ -3297,7 +3297,7 @@
2356 gui_mch_enable_menu(gui.menu_is_active);
2357 Rows = i;
2358 prev_menu_is_active = gui.menu_is_active;
2359- need_set_size = RESIZE_VERT;
2360+ need_set_size |= RESIZE_VERT;
2361 if (gui.menu_is_active)
2362 fix_size = TRUE;
2363 }
2364@@ -3308,7 +3308,7 @@
2365 {
2366 gui_mch_show_toolbar(using_toolbar);
2367 prev_toolbar = using_toolbar;
2368- need_set_size = RESIZE_VERT;
2369+ need_set_size |= RESIZE_VERT;
2370 if (using_toolbar)
2371 fix_size = TRUE;
2372 }
2373@@ -3318,7 +3318,7 @@
2374 {
2375 gui_mch_enable_footer(using_footer);
2376 prev_footer = using_footer;
2377- need_set_size = RESIZE_VERT;
2378+ need_set_size |= RESIZE_VERT;
2379 if (using_footer)
2380 fix_size = TRUE;
2381 }
2382@@ -3330,10 +3330,11 @@
2383 prev_tearoff = using_tearoff;
2384 }
2385 #endif
2386- if (need_set_size)
2387+ if (need_set_size != 0)
2388 {
2389 #ifdef FEAT_GUI_GTK
2390- long c = Columns;
2391+ long prev_Columns = Columns;
2392+ long prev_Rows = Rows;
2393 #endif
2394 /* Adjust the size of the window to make the text area keep the
2395 * same size and to avoid that part of our window is off-screen
2396@@ -3349,11 +3350,14 @@
2397 * If you remove this, please test this command for resizing
2398 * effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q".
2399 * Don't do this while starting up though.
2400- * And don't change Rows, it may have be reduced intentionally
2401- * when adding menu/toolbar/tabline. */
2402- if (!gui.starting)
2403+ * Don't change Rows when adding menu/toolbar/tabline.
2404+ * Don't change Columns when adding vertical toolbar. */
2405+ if (!gui.starting && need_set_size != (RESIZE_VERT | RESIZE_HOR))
2406 (void)char_avail();
2407- Columns = c;
2408+ if ((need_set_size & RESIZE_VERT) == 0)
2409+ Rows = prev_Rows;
2410+ if ((need_set_size & RESIZE_HOR) == 0)
2411+ Columns = prev_Columns;
2412 #endif
2413 }
2414 #ifdef FEAT_WINDOWS
2415diff -Naur vim72.orig/src/gui_at_sb.c vim72/src/gui_at_sb.c
2416--- vim72.orig/src/gui_at_sb.c 2004-06-07 07:32:25.000000000 -0700
2417+++ vim72/src/gui_at_sb.c 2008-12-30 16:17:03.000000000 -0800
2418@@ -1078,6 +1078,12 @@
2419 Cardinal *num_params; /* unused */
2420 {
2421 ScrollbarWidget sbw = (ScrollbarWidget)w;
2422+ /* Use a union to avoid a warning for the weird conversion from float to
2423+ * XtPointer. Comes from Xaw/Scrollbar.c. */
2424+ union {
2425+ XtPointer xtp;
2426+ float xtf;
2427+ } xtpf;
2428
2429 if (LookAhead(w, event))
2430 return;
2431@@ -1085,7 +1091,8 @@
2432 /* thumbProc is not pretty, but is necessary for backwards
2433 compatibility on those architectures for which it work{s,ed};
2434 the intent is to pass a (truncated) float by value. */
2435- XtCallCallbacks(w, XtNthumbProc, *(XtPointer*)&sbw->scrollbar.top);
2436+ xtpf.xtf = sbw->scrollbar.top;
2437+ XtCallCallbacks(w, XtNthumbProc, xtpf.xtp);
2438 XtCallCallbacks(w, XtNjumpProc, (XtPointer)&sbw->scrollbar.top);
2439 }
2440
2441diff -Naur vim72.orig/src/gui_gtk_x11.c vim72/src/gui_gtk_x11.c
2442--- vim72.orig/src/gui_gtk_x11.c 2008-07-04 03:46:24.000000000 -0700
2443+++ vim72/src/gui_gtk_x11.c 2008-12-30 16:17:03.000000000 -0800
2444@@ -4070,14 +4070,14 @@
2445
2446 if (mask & (XValue | YValue))
2447 {
2448- int w, h;
2449- gui_mch_get_screen_dimensions(&w, &h);
2450- h += p_ghr + get_menu_tool_height();
2451- w += get_menu_tool_width();
2452+ int ww, hh;
2453+ gui_mch_get_screen_dimensions(&ww, &hh);
2454+ hh += p_ghr + get_menu_tool_height();
2455+ ww += get_menu_tool_width();
2456 if (mask & XNegative)
2457- x += w - pixel_width;
2458+ x += ww - pixel_width;
2459 if (mask & YNegative)
2460- y += h - pixel_height;
2461+ y += hh - pixel_height;
2462 #ifdef HAVE_GTK2
2463 gtk_window_move(GTK_WINDOW(gui.mainwin), x, y);
2464 #else
2465diff -Naur vim72.orig/src/gui_x11.c vim72/src/gui_x11.c
2466--- vim72.orig/src/gui_x11.c 2008-06-08 08:13:45.000000000 -0700
2467+++ vim72/src/gui_x11.c 2008-12-30 16:15:59.000000000 -0800
2468@@ -2450,7 +2450,7 @@
2469 *colorPtr = colortable[closest];
2470 }
2471
2472- free(colortable);
2473+ vim_free(colortable);
2474 return OK;
2475 }
2476
2477diff -Naur vim72.orig/src/gui_xmdlg.c vim72/src/gui_xmdlg.c
2478--- vim72.orig/src/gui_xmdlg.c 2008-06-21 09:05:32.000000000 -0700
2479+++ vim72/src/gui_xmdlg.c 2008-12-30 16:17:03.000000000 -0800
2480@@ -369,10 +369,10 @@
2481 char buf[TEMP_BUF_SIZE];
2482 XmString items[MAX_ENTRIES_IN_LIST];
2483 int i;
2484- int index;
2485+ int idx;
2486
2487- for (index = (int)ENCODING; index < (int)NONE; ++index)
2488- count[index] = 0;
2489+ for (idx = (int)ENCODING; idx < (int)NONE; ++idx)
2490+ count[idx] = 0;
2491
2492 /* First we insert the wild char into every single list. */
2493 if (fix != ENCODING)
2494@@ -503,14 +503,14 @@
2495 /*
2496 * Now loop trough the remaining lists and set them up.
2497 */
2498- for (index = (int)NAME; index < (int)NONE; ++index)
2499+ for (idx = (int)NAME; idx < (int)NONE; ++idx)
2500 {
2501 Widget w;
2502
2503- if (fix == (enum ListSpecifier)index)
2504+ if (fix == (enum ListSpecifier)idx)
2505 continue;
2506
2507- switch ((enum ListSpecifier)index)
2508+ switch ((enum ListSpecifier)idx)
2509 {
2510 case NAME:
2511 w = data->list[NAME];
2512@@ -525,21 +525,21 @@
2513 w = (Widget)0; /* for lint */
2514 }
2515
2516- for (i = 0; i < count[index]; ++i)
2517+ for (i = 0; i < count[idx]; ++i)
2518 {
2519- items[i] = XmStringCreateLocalized(list[index][i]);
2520- XtFree(list[index][i]);
2521+ items[i] = XmStringCreateLocalized(list[idx][i]);
2522+ XtFree(list[idx][i]);
2523 }
2524 XmListDeleteAllItems(w);
2525- XmListAddItems(w, items, count[index], 1);
2526- if (data->sel[index])
2527+ XmListAddItems(w, items, count[idx], 1);
2528+ if (data->sel[idx])
2529 {
2530 XmStringFree(items[0]);
2531- items[0] = XmStringCreateLocalized(data->sel[index]);
2532+ items[0] = XmStringCreateLocalized(data->sel[idx]);
2533 XmListSelectItem(w, items[0], False);
2534 XmListSetBottomItem(w, items[0]);
2535 }
2536- for (i = 0; i < count[index]; ++i)
2537+ for (i = 0; i < count[idx]; ++i)
2538 XmStringFree(items[i]);
2539 }
2540 }
2541@@ -695,14 +695,14 @@
2542 int n;
2543 XmString str;
2544 Arg args[4];
2545- char *msg = _("no specific match");
2546+ char *nomatch_msg = _("no specific match");
2547
2548 n = 0;
2549- str = XmStringCreateLocalized(msg);
2550+ str = XmStringCreateLocalized(nomatch_msg);
2551 XtSetArg(args[n], XmNlabelString, str); ++n;
2552 XtSetValues(data->sample, args, n);
2553 apply_fontlist(data->sample);
2554- XmTextSetString(data->name, msg);
2555+ XmTextSetString(data->name, nomatch_msg);
2556 XmStringFree(str);
2557
2558 return False;
2559@@ -886,21 +886,21 @@
2560 {
2561 int i;
2562 int max;
2563- int index = 0;
2564+ int idx = 0;
2565 int size;
2566- char str[128];
2567+ char buf[128];
2568
2569 for (i = 0, max = 0; i < data->num; i++)
2570 {
2571- get_part(fn(data, i), 7, str);
2572- size = atoi(str);
2573+ get_part(fn(data, i), 7, buf);
2574+ size = atoi(buf);
2575 if ((size > max) && (size < MAX_DISPLAY_SIZE))
2576 {
2577- index = i;
2578+ idx = i;
2579 max = size;
2580 }
2581 }
2582- strcpy(big_font, fn(data, index));
2583+ strcpy(big_font, fn(data, idx));
2584 }
2585 data->old = XLoadQueryFont(XtDisplay(parent), big_font);
2586 data->old_list = gui_motif_create_fontlist(data->old);
2587@@ -1217,28 +1217,28 @@
2588
2589 if (i != 0)
2590 {
2591- char name[TEMP_BUF_SIZE];
2592- char style[TEMP_BUF_SIZE];
2593- char size[TEMP_BUF_SIZE];
2594- char encoding[TEMP_BUF_SIZE];
2595+ char namebuf[TEMP_BUF_SIZE];
2596+ char stylebuf[TEMP_BUF_SIZE];
2597+ char sizebuf[TEMP_BUF_SIZE];
2598+ char encodingbuf[TEMP_BUF_SIZE];
2599 char *found;
2600
2601 found = names[0];
2602
2603- name_part(found, name);
2604- style_part(found, style);
2605- size_part(found, size, data->in_pixels);
2606- encoding_part(found, encoding);
2607-
2608- if (strlen(name) > 0
2609- && strlen(style) > 0
2610- && strlen(size) > 0
2611- && strlen(encoding) > 0)
2612+ name_part(found, namebuf);
2613+ style_part(found, stylebuf);
2614+ size_part(found, sizebuf, data->in_pixels);
2615+ encoding_part(found, encodingbuf);
2616+
2617+ if (strlen(namebuf) > 0
2618+ && strlen(stylebuf) > 0
2619+ && strlen(sizebuf) > 0
2620+ && strlen(encodingbuf) > 0)
2621 {
2622- data->sel[NAME] = XtNewString(name);
2623- data->sel[STYLE] = XtNewString(style);
2624- data->sel[SIZE] = XtNewString(size);
2625- data->sel[ENCODING] = XtNewString(encoding);
2626+ data->sel[NAME] = XtNewString(namebuf);
2627+ data->sel[STYLE] = XtNewString(stylebuf);
2628+ data->sel[SIZE] = XtNewString(sizebuf);
2629+ data->sel[ENCODING] = XtNewString(encodingbuf);
2630 data->font_name = XtNewString(names[0]);
2631 display_sample(data);
2632 XmTextSetString(data->name, data->font_name);
2633diff -Naur vim72.orig/src/gui_xmebw.c vim72/src/gui_xmebw.c
2634--- vim72.orig/src/gui_xmebw.c 2007-09-06 03:57:51.000000000 -0700
2635+++ vim72/src/gui_xmebw.c 2008-12-30 16:17:03.000000000 -0800
2636@@ -1256,7 +1256,7 @@
2637 }
2638 else
2639 {
2640- int adjust = 0;
2641+ adjust = 0;
2642
2643 #if !defined(LESSTIF_VERSION) && (XmVersion > 1002)
2644 /*
2645@@ -1268,12 +1268,11 @@
2646 {
2647 case XmEXTERNAL_HIGHLIGHT:
2648 adjust = (eb->primitive.highlight_thickness -
2649- (eb->pushbutton.default_button_shadow_thickness ?
2650- Xm3D_ENHANCE_PIXEL : 0));
2651+ (eb->pushbutton.default_button_shadow_thickness
2652+ ? Xm3D_ENHANCE_PIXEL : 0));
2653 break;
2654
2655 case XmINTERNAL_HIGHLIGHT:
2656- adjust = 0;
2657 break;
2658
2659 default:
2660diff -Naur vim72.orig/src/if_cscope.c vim72/src/if_cscope.c
2661--- vim72.orig/src/if_cscope.c 2008-06-24 09:32:34.000000000 -0700
2662+++ vim72/src/if_cscope.c 2008-12-30 16:14:15.000000000 -0800
2663@@ -74,7 +74,7 @@
2664 { "add", cs_add,
2665 N_("Add a new database"), "add file|dir [pre-path] [flags]", 0 },
2666 { "find", cs_find,
2667- N_("Query for a pattern"), FIND_USAGE, 1 },
2668+ N_("Query for a pattern"), "find c|d|e|f|g|i|s|t name", 1 },
2669 { "help", cs_help,
2670 N_("Show this message"), "help", 0 },
2671 { "kill", cs_kill,
2672@@ -1180,7 +1180,16 @@
2673 (void)smsg((char_u *)_("%-5s: %-30s (Usage: %s)"),
2674 cmdp->name, _(cmdp->help), cmdp->usage);
2675 if (strcmp(cmdp->name, "find") == 0)
2676- MSG_PUTS(FIND_HELP);
2677+ MSG_PUTS(_("\n"
2678+ " c: Find functions calling this function\n"
2679+ " d: Find functions called by this function\n"
2680+ " e: Find this egrep pattern\n"
2681+ " f: Find this file\n"
2682+ " g: Find this definition\n"
2683+ " i: Find files #including this file\n"
2684+ " s: Find this C symbol\n"
2685+ " t: Find assignments to\n"));
2686+
2687 cmdp++;
2688 }
2689
2690diff -Naur vim72.orig/src/if_cscope.h vim72/src/if_cscope.h
2691--- vim72.orig/src/if_cscope.h 2007-09-02 07:51:08.000000000 -0700
2692+++ vim72/src/if_cscope.h 2008-12-30 16:14:15.000000000 -0800
2693@@ -42,17 +42,6 @@
2694 * f 7name Find this file
2695 * i 8name Find files #including this file
2696 */
2697-#define FIND_USAGE "find c|d|e|f|g|i|s|t name"
2698-#define FIND_HELP "\n\
2699- c: Find functions calling this function\n\
2700- d: Find functions called by this function\n\
2701- e: Find this egrep pattern\n\
2702- f: Find this file\n\
2703- g: Find this definition\n\
2704- i: Find files #including this file\n\
2705- s: Find this C symbol\n\
2706- t: Find assignments to\n"
2707-
2708
2709 typedef struct {
2710 char * name;
2711diff -Naur vim72.orig/src/if_perl.xs vim72/src/if_perl.xs
2712--- vim72.orig/src/if_perl.xs 2008-07-17 13:55:09.000000000 -0700
2713+++ vim72/src/if_perl.xs 2008-12-30 16:17:28.000000000 -0800
2714@@ -136,6 +136,9 @@
2715 # define Perl_newXS_flags dll_Perl_newXS_flags
2716 #endif
2717 # define Perl_sv_free dll_Perl_sv_free
2718+# if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
2719+# define Perl_sv_free2 dll_Perl_sv_free2
2720+# endif
2721 # define Perl_sv_isa dll_Perl_sv_isa
2722 # define Perl_sv_magic dll_Perl_sv_magic
2723 # define Perl_sv_setiv dll_Perl_sv_setiv
2724@@ -163,7 +166,7 @@
2725 # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr
2726 # define boot_DynaLoader dll_boot_DynaLoader
2727
2728-# define Perl_sys_init3 dll_Perl_sys_init3
2729+# define Perl_sys_init dll_Perl_sys_init
2730 # define Perl_sys_term dll_Perl_sys_term
2731 # define Perl_ISv_ptr dll_Perl_ISv_ptr
2732 # define Perl_Istack_max_ptr dll_Perl_Istack_max_ptr
2733@@ -268,7 +271,8 @@
2734 static void (*boot_DynaLoader)_((pTHX_ CV*));
2735
2736 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
2737-static void (*Perl_sys_init3)(int* argc, char*** argv, char*** env);
2738+static void (*Perl_sv_free2)(pTHX_ SV*);
2739+static void (*Perl_sys_init)(int* argc, char*** argv);
2740 static void (*Perl_sys_term)(void);
2741 static SV** (*Perl_ISv_ptr)(register PerlInterpreter*);
2742 static SV*** (*Perl_Istack_max_ptr)(register PerlInterpreter*);
2743@@ -367,7 +371,8 @@
2744 {"Perl_TXpv_ptr", (PERL_PROC*)&Perl_TXpv_ptr},
2745 {"Perl_Tna_ptr", (PERL_PROC*)&Perl_Tna_ptr},
2746 #else
2747- {"Perl_sys_init3", (PERL_PROC*)&Perl_sys_init3},
2748+ {"Perl_sv_free2", (PERL_PROC*)&Perl_sv_free2},
2749+ {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init},
2750 {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term},
2751 {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr},
2752 {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr},
2753@@ -455,7 +460,7 @@
2754 static char *argv[] = { "", "-e", "" };
2755
2756 #if (PERL_REVISION == 5) && (PERL_VERSION >= 10)
2757- Perl_sys_init3(&argc, (char***)&argv, NULL);
2758+ Perl_sys_init(&argc, (char***)&argv);
2759 #endif
2760 perl_interp = perl_alloc();
2761 perl_construct(perl_interp);
2762diff -Naur vim72.orig/src/if_python.c vim72/src/if_python.c
2763--- vim72.orig/src/if_python.c 2008-07-17 14:09:32.000000000 -0700
2764+++ vim72/src/if_python.c 2008-12-30 16:16:31.000000000 -0800
2765@@ -531,6 +531,12 @@
2766 if (PythonMod_Init())
2767 goto fail;
2768
2769+ /* Remove the element from sys.path that was added because of our
2770+ * argv[0] value in PythonMod_Init(). Previously we used an empty
2771+ * string, but dependinding on the OS we then get an empty entry or
2772+ * the current directory in sys.path. */
2773+ PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)");
2774+
2775 /* the first python thread is vim's, release the lock */
2776 Python_SaveThread();
2777
2778@@ -2345,7 +2351,8 @@
2779 {
2780 PyObject *mod;
2781 PyObject *dict;
2782- static char *(argv[2]) = {"", NULL};
2783+ /* The special value is removed from sys.path in Python_Init(). */
2784+ static char *(argv[2]) = {"/must>not&exist/foo", NULL};
2785
2786 /* Fixups... */
2787 BufferType.ob_type = &PyType_Type;
2788diff -Naur vim72.orig/src/if_xcmdsrv.c vim72/src/if_xcmdsrv.c
2789--- vim72.orig/src/if_xcmdsrv.c 2008-07-18 06:05:03.000000000 -0700
2790+++ vim72/src/if_xcmdsrv.c 2008-12-30 16:16:09.000000000 -0800
2791@@ -736,7 +736,7 @@
2792 + serverReply.ga_len;
2793 e.id = w;
2794 ga_init2(&e.strings, 1, 100);
2795- memcpy(p, &e, sizeof(e));
2796+ mch_memmove(p, &e, sizeof(e));
2797 serverReply.ga_len++;
2798 }
2799 }
2800@@ -1018,7 +1018,7 @@
2801 p++;
2802 count = numItems - (p - regProp);
2803 if (count > 0)
2804- memcpy(entry, p, count);
2805+ mch_memmove(entry, p, count);
2806 XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING,
2807 8, PropModeReplace, regProp,
2808 (int)(numItems - (p - entry)));
2809@@ -1072,7 +1072,7 @@
2810 p++;
2811 lastHalf = numItems - (p - regProp);
2812 if (lastHalf > 0)
2813- memcpy(entry, p, lastHalf);
2814+ mch_memmove(entry, p, lastHalf);
2815 numItems = (entry - regProp) + lastHalf;
2816 p = entry;
2817 continue;
2818diff -Naur vim72.orig/src/main.c vim72/src/main.c
2819--- vim72.orig/src/main.c 2008-07-24 01:40:56.000000000 -0700
2820+++ vim72/src/main.c 2008-12-30 16:17:03.000000000 -0800
2821@@ -645,11 +645,12 @@
2822
2823 #ifdef FEAT_VIMINFO
2824 /*
2825- * Read in registers, history etc, but not marks, from the viminfo file
2826+ * Read in registers, history etc, but not marks, from the viminfo file.
2827+ * This is where v:oldfiles gets filled.
2828 */
2829 if (*p_viminfo != NUL)
2830 {
2831- read_viminfo(NULL, TRUE, FALSE, FALSE);
2832+ read_viminfo(NULL, VIF_WANT_INFO | VIF_GET_OLDFILES);
2833 TIME_MSG("reading viminfo");
2834 }
2835 #endif
2836@@ -1457,7 +1458,8 @@
2837 ++initstr;
2838 }
2839
2840- if (TOLOWER_ASC(initstr[0]) == 'g' || initstr[0] == 'k')
2841+ /* "gvim" starts the GUI. Also accept "Gvim" for MS-Windows. */
2842+ if (TOLOWER_ASC(initstr[0]) == 'g')
2843 {
2844 main_start_gui();
2845 #ifdef FEAT_GUI
2846@@ -1508,7 +1510,8 @@
2847 early_arg_scan(parmp)
2848 mparm_T *parmp;
2849 {
2850-#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER)
2851+#if defined(FEAT_XCLIPBOARD) || defined(FEAT_CLIENTSERVER) \
2852+ || !defined(FEAT_NETBEANS_INTG)
2853 int argc = parmp->argc;
2854 char **argv = parmp->argv;
2855 int i;
2856@@ -1580,6 +1583,14 @@
2857 else if (STRICMP(argv[i], "--echo-wid") == 0)
2858 echo_wid_arg = TRUE;
2859 # endif
2860+# ifndef FEAT_NETBEANS_INTG
2861+ else if (strncmp(argv[i], "-nb", (size_t)3) == 0)
2862+ {
2863+ mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n"));
2864+ mch_exit(2);
2865+ }
2866+# endif
2867+
2868 }
2869 #endif
2870 }
2871@@ -2361,7 +2372,7 @@
2872 * Is there any other system that cannot do this?
2873 */
2874 close(0);
2875- dup(2);
2876+ ignored = dup(2);
2877 #endif
2878 }
2879
2880diff -Naur vim72.orig/src/mark.c vim72/src/mark.c
2881--- vim72.orig/src/mark.c 2008-08-08 15:06:49.000000000 -0700
2882+++ vim72/src/mark.c 2008-12-30 16:15:47.000000000 -0800
2883@@ -1627,15 +1627,17 @@
2884
2885 /*
2886 * Handle marks in the viminfo file:
2887- * fp_out == NULL read marks for current buffer only
2888- * fp_out != NULL copy marks for buffers not in buffer list
2889+ * fp_out != NULL: copy marks for buffers not in buffer list
2890+ * fp_out == NULL && (flags & VIF_WANT_MARKS): read marks for curbuf only
2891+ * fp_out == NULL && (flags & VIF_GET_OLDFILES | VIF_FORCEIT): fill v:oldfiles
2892 */
2893 void
2894-copy_viminfo_marks(virp, fp_out, count, eof)
2895+copy_viminfo_marks(virp, fp_out, count, eof, flags)
2896 vir_T *virp;
2897 FILE *fp_out;
2898 int count;
2899 int eof;
2900+ int flags;
2901 {
2902 char_u *line = virp->vir_line;
2903 buf_T *buf;
2904@@ -1647,10 +1649,23 @@
2905 char_u *p;
2906 char_u *name_buf;
2907 pos_T pos;
2908+#ifdef FEAT_EVAL
2909+ list_T *list = NULL;
2910+#endif
2911
2912 if ((name_buf = alloc(LSIZE)) == NULL)
2913 return;
2914 *name_buf = NUL;
2915+
2916+#ifdef FEAT_EVAL
2917+ if (fp_out == NULL && (flags & (VIF_GET_OLDFILES | VIF_FORCEIT)))
2918+ {
2919+ list = list_alloc();
2920+ if (list != NULL)
2921+ set_vim_var_list(VV_OLDFILES, list);
2922+ }
2923+#endif
2924+
2925 num_marked_files = get_viminfo_parameter('\'');
2926 while (!eof && (count < num_marked_files || fp_out == NULL))
2927 {
2928@@ -1681,6 +1696,11 @@
2929 p++;
2930 *p = NUL;
2931
2932+#ifdef FEAT_EVAL
2933+ if (list != NULL)
2934+ list_append_string(list, str, -1);
2935+#endif
2936+
2937 /*
2938 * If fp_out == NULL, load marks for current buffer.
2939 * If fp_out != NULL, copy marks for buffers not in buflist.
2940@@ -1688,7 +1708,7 @@
2941 load_marks = copy_marks_out = FALSE;
2942 if (fp_out == NULL)
2943 {
2944- if (curbuf->b_ffname != NULL)
2945+ if ((flags & VIF_WANT_MARKS) && curbuf->b_ffname != NULL)
2946 {
2947 if (*name_buf == NUL) /* only need to do this once */
2948 home_replace(NULL, curbuf->b_ffname, name_buf, LSIZE, TRUE);
2949diff -Naur vim72.orig/src/mbyte.c vim72/src/mbyte.c
2950--- vim72.orig/src/mbyte.c 2008-07-14 05:38:05.000000000 -0700
2951+++ vim72/src/mbyte.c 2008-12-30 16:17:03.000000000 -0800
2952@@ -717,7 +717,7 @@
2953 * where mblen() returns 0 for invalid character.
2954 * Therefore, following condition includes 0.
2955 */
2956- (void)mblen(NULL, 0); /* First reset the state. */
2957+ ignored = mblen(NULL, 0); /* First reset the state. */
2958 if (mblen(buf, (size_t)1) <= 0)
2959 n = 2;
2960 else
2961@@ -2540,7 +2540,6 @@
2962 return (int)(p - q);
2963 }
2964
2965-#if defined(FEAT_EVAL) || defined(PROTO)
2966 /*
2967 * Copy a character from "*fp" to "*tp" and advance the pointers.
2968 */
2969@@ -2555,7 +2554,6 @@
2970 *tp += l;
2971 *fp += l;
2972 }
2973-#endif
2974
2975 /*
2976 * Return the offset from "p" to the first byte of a character. When "p" is
2977@@ -3133,7 +3131,7 @@
2978 else
2979 s = p + 1;
2980 }
2981- for (i = 0; s[i] != NUL && s + i < buf + sizeof(buf) - 1; ++i)
2982+ for (i = 0; s[i] != NUL && i < sizeof(buf) - 1; ++i)
2983 {
2984 if (s[i] == '_' || s[i] == '-')
2985 buf[i] = '-';
2986@@ -5280,7 +5278,7 @@
2987
2988 /*ARGSUSED*/
2989 static void
2990-preedit_start_cbproc(XIC xic, XPointer client_data, XPointer call_data)
2991+preedit_start_cbproc(XIC thexic, XPointer client_data, XPointer call_data)
2992 {
2993 #ifdef XIM_DEBUG
2994 xim_log("xim_decide_input_style()\n");
2995@@ -5314,7 +5312,7 @@
2996
2997 /*ARGSUSED*/
2998 static void
2999-preedit_draw_cbproc(XIC xic, XPointer client_data, XPointer call_data)
3000+preedit_draw_cbproc(XIC thexic, XPointer client_data, XPointer call_data)
3001 {
3002 XIMPreeditDrawCallbackStruct *draw_data;
3003 XIMText *text;
3004@@ -5386,7 +5384,7 @@
3005 draw_feedback = (char *)alloc(draw_data->chg_first
3006 + text->length);
3007 else
3008- draw_feedback = realloc(draw_feedback,
3009+ draw_feedback = vim_realloc(draw_feedback,
3010 draw_data->chg_first + text->length);
3011 if (draw_feedback != NULL)
3012 {
3013@@ -5455,7 +5453,7 @@
3014
3015 /*ARGSUSED*/
3016 static void
3017-preedit_caret_cbproc(XIC xic, XPointer client_data, XPointer call_data)
3018+preedit_caret_cbproc(XIC thexic, XPointer client_data, XPointer call_data)
3019 {
3020 #ifdef XIM_DEBUG
3021 xim_log("preedit_caret_cbproc()\n");
3022@@ -5464,7 +5462,7 @@
3023
3024 /*ARGSUSED*/
3025 static void
3026-preedit_done_cbproc(XIC xic, XPointer client_data, XPointer call_data)
3027+preedit_done_cbproc(XIC thexic, XPointer client_data, XPointer call_data)
3028 {
3029 #ifdef XIM_DEBUG
3030 xim_log("preedit_done_cbproc()\n");
3031diff -Naur vim72.orig/src/menu.c vim72/src/menu.c
3032--- vim72.orig/src/menu.c 2008-06-21 12:53:43.000000000 -0700
3033+++ vim72/src/menu.c 2008-12-30 16:14:07.000000000 -0800
3034@@ -1120,6 +1120,7 @@
3035 parent = menu;
3036 menu = menu->children;
3037 }
3038+ vim_free(path_name);
3039
3040 /* Now we have found the matching menu, and we list the mappings */
3041 /* Highlight title */
3042diff -Naur vim72.orig/src/message.c vim72/src/message.c
3043--- vim72.orig/src/message.c 2008-07-09 11:24:55.000000000 -0700
3044+++ vim72/src/message.c 2008-12-30 16:17:03.000000000 -0800
3045@@ -4585,61 +4585,62 @@
3046 if (remove_trailing_zeroes)
3047 {
3048 int i;
3049- char *p;
3050+ char *tp;
3051
3052 /* Using %g or %G: remove superfluous zeroes. */
3053 if (fmt_spec == 'f')
3054- p = tmp + str_arg_l - 1;
3055+ tp = tmp + str_arg_l - 1;
3056 else
3057 {
3058- p = (char *)vim_strchr((char_u *)tmp,
3059+ tp = (char *)vim_strchr((char_u *)tmp,
3060 fmt_spec == 'e' ? 'e' : 'E');
3061- if (p != NULL)
3062+ if (tp != NULL)
3063 {
3064 /* Remove superfluous '+' and leading
3065 * zeroes from the exponent. */
3066- if (p[1] == '+')
3067+ if (tp[1] == '+')
3068 {
3069 /* Change "1.0e+07" to "1.0e07" */
3070- STRMOVE(p + 1, p + 2);
3071+ STRMOVE(tp + 1, tp + 2);
3072 --str_arg_l;
3073 }
3074- i = (p[1] == '-') ? 2 : 1;
3075- while (p[i] == '0')
3076+ i = (tp[1] == '-') ? 2 : 1;
3077+ while (tp[i] == '0')
3078 {
3079 /* Change "1.0e07" to "1.0e7" */
3080- STRMOVE(p + i, p + i + 1);
3081+ STRMOVE(tp + i, tp + i + 1);
3082 --str_arg_l;
3083 }
3084- --p;
3085+ --tp;
3086 }
3087 }
3088
3089- if (p != NULL && !precision_specified)
3090+ if (tp != NULL && !precision_specified)
3091 /* Remove trailing zeroes, but keep the one
3092 * just after a dot. */
3093- while (p > tmp + 2 && *p == '0' && p[-1] != '.')
3094+ while (tp > tmp + 2 && *tp == '0'
3095+ && tp[-1] != '.')
3096 {
3097- STRMOVE(p, p + 1);
3098- --p;
3099+ STRMOVE(tp, tp + 1);
3100+ --tp;
3101 --str_arg_l;
3102 }
3103 }
3104 else
3105 {
3106- char *p;
3107+ char *tp;
3108
3109 /* Be consistent: some printf("%e") use 1.0e+12
3110 * and some 1.0e+012. Remove one zero in the last
3111 * case. */
3112- p = (char *)vim_strchr((char_u *)tmp,
3113+ tp = (char *)vim_strchr((char_u *)tmp,
3114 fmt_spec == 'e' ? 'e' : 'E');
3115- if (p != NULL && (p[1] == '+' || p[1] == '-')
3116- && p[2] == '0'
3117- && vim_isdigit(p[3])
3118- && vim_isdigit(p[4]))
3119+ if (tp != NULL && (tp[1] == '+' || tp[1] == '-')
3120+ && tp[2] == '0'
3121+ && vim_isdigit(tp[3])
3122+ && vim_isdigit(tp[4]))
3123 {
3124- STRMOVE(p + 2, p + 3);
3125+ STRMOVE(tp + 2, tp + 3);
3126 --str_arg_l;
3127 }
3128 }
3129diff -Naur vim72.orig/src/misc1.c vim72/src/misc1.c
3130--- vim72.orig/src/misc1.c 2008-07-12 12:20:53.000000000 -0700
3131+++ vim72/src/misc1.c 2008-12-30 16:15:47.000000000 -0800
3132@@ -3245,9 +3245,9 @@
3133
3134 /* When using ":silent" assume that <CR> was entered. */
3135 if (mouse_used != NULL)
3136- MSG_PUTS(_("Type number or click with mouse (<Enter> cancels): "));
3137+ MSG_PUTS(_("Type number and <Enter> or click with mouse (empty cancels): "));
3138 else
3139- MSG_PUTS(_("Choice number (<Enter> cancels): "));
3140+ MSG_PUTS(_("Type number and <Enter> (empty cancels): "));
3141
3142 /* Set the state such that text can be selected/copied/pasted and we still
3143 * get mouse events. */
3144diff -Naur vim72.orig/src/misc2.c vim72/src/misc2.c
3145--- vim72.orig/src/misc2.c 2008-07-23 12:12:56.000000000 -0700
3146+++ vim72/src/misc2.c 2008-12-30 16:17:58.000000000 -0800
3147@@ -873,7 +873,7 @@
3148 /* 3. check for available memory: call mch_avail_mem() */
3149 if (mch_avail_mem(TRUE) < KEEP_ROOM && !releasing)
3150 {
3151- vim_free((char *)p); /* System is low... no go! */
3152+ free((char *)p); /* System is low... no go! */
3153 p = NULL;
3154 }
3155 else
3156@@ -1257,7 +1257,6 @@
3157 return escaped_string;
3158 }
3159
3160-#if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO)
3161 /*
3162 * Return TRUE when 'shell' has "csh" in the tail.
3163 */
3164@@ -1266,9 +1265,7 @@
3165 {
3166 return (strstr((char *)gettail(p_sh), "csh") != NULL);
3167 }
3168-#endif
3169
3170-#if defined(FEAT_EVAL) || defined(PROTO)
3171 /*
3172 * Escape "string" for use as a shell argument with system().
3173 * This uses single quotes, except when we know we need to use double qoutes
3174@@ -1391,7 +1388,6 @@
3175
3176 return escaped_string;
3177 }
3178-#endif
3179
3180 /*
3181 * Like vim_strsave(), but make all characters uppercase.
3182@@ -2565,7 +2561,7 @@
3183 int key;
3184 int dlen = 0;
3185
3186- key = find_special_key(srcp, &modifiers, keycode);
3187+ key = find_special_key(srcp, &modifiers, keycode, FALSE);
3188 if (key == 0)
3189 return 0;
3190
3191@@ -2601,10 +2597,11 @@
3192 * returns 0 if there is no match.
3193 */
3194 int
3195-find_special_key(srcp, modp, keycode)
3196+find_special_key(srcp, modp, keycode, keep_x_key)
3197 char_u **srcp;
3198 int *modp;
3199- int keycode; /* prefer key code, e.g. K_DEL instead of DEL */
3200+ int keycode; /* prefer key code, e.g. K_DEL instead of DEL */
3201+ int keep_x_key; /* don't translate xHome to Home key */
3202 {
3203 char_u *last_dash;
3204 char_u *end_of_name;
3205@@ -2672,7 +2669,8 @@
3206 else
3207 {
3208 key = get_special_key_code(last_dash + 1);
3209- key = handle_x_keys(key);
3210+ if (!keep_x_key)
3211+ key = handle_x_keys(key);
3212 }
3213
3214 /*
3215diff -Naur vim72.orig/src/move.c vim72/src/move.c
3216--- vim72.orig/src/move.c 2008-07-12 09:26:47.000000000 -0700
3217+++ vim72/src/move.c 2008-12-30 16:16:21.000000000 -0800
3218@@ -280,18 +280,20 @@
3219
3220 if (curwin->w_botline <= curbuf->b_ml.ml_line_count)
3221 {
3222- if (curwin->w_cursor.lnum < curwin->w_botline
3223- && ((long)curwin->w_cursor.lnum
3224+ if (curwin->w_cursor.lnum < curwin->w_botline)
3225+ {
3226+ if (((long)curwin->w_cursor.lnum
3227 >= (long)curwin->w_botline - p_so
3228 #ifdef FEAT_FOLDING
3229 || hasAnyFolding(curwin)
3230 #endif
3231 ))
3232- {
3233+ {
3234 lineoff_T loff;
3235
3236- /* Cursor is above botline, check if there are 'scrolloff'
3237- * window lines below the cursor. If not, need to scroll. */
3238+ /* Cursor is (a few lines) above botline, check if there are
3239+ * 'scrolloff' window lines below the cursor. If not, need to
3240+ * scroll. */
3241 n = curwin->w_empty_rows;
3242 loff.lnum = curwin->w_cursor.lnum;
3243 #ifdef FEAT_FOLDING
3244@@ -317,6 +319,10 @@
3245 if (n >= p_so)
3246 /* sufficient context, no need to scroll */
3247 check_botline = FALSE;
3248+ }
3249+ else
3250+ /* sufficient context, no need to scroll */
3251+ check_botline = FALSE;
3252 }
3253 if (check_botline)
3254 {
3255@@ -509,6 +515,9 @@
3256 /* Approximate the value of w_botline */
3257 wp->w_botline += lnum - wp->w_topline;
3258 wp->w_topline = lnum;
3259+#ifdef FEAT_AUTOCMD
3260+ wp->w_topline_was_set = TRUE;
3261+#endif
3262 #ifdef FEAT_DIFF
3263 wp->w_topfill = 0;
3264 #endif
3265diff -Naur vim72.orig/src/netbeans.c vim72/src/netbeans.c
3266--- vim72.orig/src/netbeans.c 2008-07-13 09:19:54.000000000 -0700
3267+++ vim72/src/netbeans.c 2008-12-30 16:17:03.000000000 -0800
3268@@ -1043,7 +1043,7 @@
3269 nbdebug(("EVT: %s", buf));
3270 /* nb_send(buf, "netbeans_end"); avoid "write failed" messages */
3271 if (sd >= 0)
3272- sock_write(sd, buf, (int)STRLEN(buf)); /* ignore errors */
3273+ ignored = sock_write(sd, buf, (int)STRLEN(buf));
3274 }
3275 }
3276
3277@@ -2277,9 +2277,6 @@
3278 int serNum;
3279 int localTypeNum;
3280 int typeNum;
3281-# ifdef NBDEBUG
3282- int len;
3283-# endif
3284 pos_T *pos;
3285
3286 if (buf == NULL || buf->bufp == NULL)
3287@@ -2303,13 +2300,10 @@
3288 pos = get_off_or_lnum(buf->bufp, &args);
3289
3290 cp = (char *)args;
3291-# ifdef NBDEBUG
3292- len =
3293-# endif
3294- strtol(cp, &cp, 10);
3295+ ignored = (int)strtol(cp, &cp, 10);
3296 args = (char_u *)cp;
3297 # ifdef NBDEBUG
3298- if (len != -1)
3299+ if (ignored != -1)
3300 {
3301 nbdebug((" partial line annotation -- Not Yet Implemented!\n"));
3302 }
3303diff -Naur vim72.orig/src/normal.c vim72/src/normal.c
3304--- vim72.orig/src/normal.c 2008-07-31 13:03:08.000000000 -0700
3305+++ vim72/src/normal.c 2008-12-30 16:16:40.000000000 -0800
3306@@ -183,6 +183,8 @@
3307 static void nv_cursorhold __ARGS((cmdarg_T *cap));
3308 #endif
3309
3310+static char *e_noident = N_("E349: No identifier under cursor");
3311+
3312 /*
3313 * Function to be called for a Normal or Visual mode command.
3314 * The argument is a cmdarg_T.
3315@@ -578,6 +580,9 @@
3316 static int old_mapped_len = 0;
3317 #endif
3318 int idx;
3319+#ifdef FEAT_EVAL
3320+ int set_prevcount = FALSE;
3321+#endif
3322
3323 vim_memset(&ca, 0, sizeof(ca)); /* also resets ca.retval */
3324 ca.oap = oap;
3325@@ -613,7 +618,12 @@
3326 /* When not finishing an operator and no register name typed, reset the
3327 * count. */
3328 if (!finish_op && !oap->regname)
3329+ {
3330 ca.opcount = 0;
3331+#ifdef FEAT_EVAL
3332+ set_prevcount = TRUE;
3333+#endif
3334+ }
3335
3336 #ifdef FEAT_AUTOCMD
3337 /* Restore counts from before receiving K_CURSORHOLD. This means after
3338@@ -717,7 +727,15 @@
3339 * command, so that v:count can be used in an expression mapping
3340 * right after the count. */
3341 if (toplevel && stuff_empty())
3342- set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0);
3343+ {
3344+ long count = ca.count0;
3345+
3346+ /* multiply with ca.opcount the same way as below */
3347+ if (ca.opcount != 0)
3348+ count = ca.opcount * (count == 0 ? 1 : count);
3349+ set_vcount(count, count == 0 ? 1 : count, set_prevcount);
3350+ set_prevcount = FALSE; /* only set v:prevcount once */
3351+ }
3352 #endif
3353 if (ctrl_w)
3354 {
3355@@ -804,7 +822,7 @@
3356 * Only set v:count when called from main() and not a stuffed command.
3357 */
3358 if (toplevel && stuff_empty())
3359- set_vcount(ca.count0, ca.count1);
3360+ set_vcount(ca.count0, ca.count1, set_prevcount);
3361 #endif
3362
3363 /*
3364@@ -1132,7 +1150,8 @@
3365 out_flush();
3366 #endif
3367 #ifdef FEAT_AUTOCMD
3368- did_cursorhold = FALSE;
3369+ if (ca.cmdchar != K_IGNORE)
3370+ did_cursorhold = FALSE;
3371 #endif
3372
3373 State = NORMAL;
3374@@ -3509,7 +3528,7 @@
3375 if (find_type & FIND_STRING)
3376 EMSG(_("E348: No string under cursor"));
3377 else
3378- EMSG(_("E349: No identifier under cursor"));
3379+ EMSG(_(e_noident));
3380 return 0;
3381 }
3382 ptr += col;
3383@@ -5469,6 +5488,20 @@
3384 STRCPY(buf, "he! ");
3385 else
3386 {
3387+ /* An external command will probably use an argument starting
3388+ * with "-" as an option. To avoid trouble we skip the "-". */
3389+ while (*ptr == '-' && n > 0)
3390+ {
3391+ ++ptr;
3392+ --n;
3393+ }
3394+ if (n == 0)
3395+ {
3396+ EMSG(_(e_noident)); /* found dashes only */
3397+ vim_free(buf);
3398+ return;
3399+ }
3400+
3401 /* When a count is given, turn it into a range. Is this
3402 * really what we want? */
3403 isman = (STRCMP(kp, "man") == 0);
3404@@ -5511,37 +5544,59 @@
3405 /*
3406 * Now grab the chars in the identifier
3407 */
3408- if (cmdchar == '*')
3409- aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
3410- else if (cmdchar == '#')
3411- aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
3412- else if (cmdchar == 'K' && !kp_help)
3413- aux_ptr = (char_u *)" \t\\\"|!";
3414- else
3415- /* Don't escape spaces and Tabs in a tag with a backslash */
3416- aux_ptr = (char_u *)"\\|\"";
3417-
3418- p = buf + STRLEN(buf);
3419- while (n-- > 0)
3420- {
3421- /* put a backslash before \ and some others */
3422- if (vim_strchr(aux_ptr, *ptr) != NULL)
3423- *p++ = '\\';
3424-#ifdef FEAT_MBYTE
3425- /* When current byte is a part of multibyte character, copy all bytes
3426- * of that character. */
3427- if (has_mbyte)
3428+ if (cmdchar == 'K' && !kp_help)
3429+ {
3430+ /* Escape the argument properly for a shell command */
3431+ ptr = vim_strnsave(ptr, n);
3432+ p = vim_strsave_shellescape(ptr, TRUE);
3433+ vim_free(ptr);
3434+ if (p == NULL)
3435 {
3436- int i;
3437- int len = (*mb_ptr2len)(ptr) - 1;
3438-
3439- for (i = 0; i < len && n >= 1; ++i, --n)
3440- *p++ = *ptr++;
3441+ vim_free(buf);
3442+ return;
3443 }
3444+ buf = (char_u *)vim_realloc(buf, STRLEN(buf) + STRLEN(p) + 1);
3445+ if (buf == NULL)
3446+ {
3447+ vim_free(buf);
3448+ vim_free(p);
3449+ return;
3450+ }
3451+ STRCAT(buf, p);
3452+ vim_free(p);
3453+ }
3454+ else
3455+ {
3456+ if (cmdchar == '*')
3457+ aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
3458+ else if (cmdchar == '#')
3459+ aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
3460+ else
3461+ /* Don't escape spaces and Tabs in a tag with a backslash */
3462+ aux_ptr = (char_u *)"\\|\"\n*?[";
3463+
3464+ p = buf + STRLEN(buf);
3465+ while (n-- > 0)
3466+ {
3467+ /* put a backslash before \ and some others */
3468+ if (vim_strchr(aux_ptr, *ptr) != NULL)
3469+ *p++ = '\\';
3470+#ifdef FEAT_MBYTE
3471+ /* When current byte is a part of multibyte character, copy all
3472+ * bytes of that character. */
3473+ if (has_mbyte)
3474+ {
3475+ int i;
3476+ int len = (*mb_ptr2len)(ptr) - 1;
3477+
3478+ for (i = 0; i < len && n >= 1; ++i, --n)
3479+ *p++ = *ptr++;
3480+ }
3481 #endif
3482- *p++ = *ptr++;
3483+ *p++ = *ptr++;
3484+ }
3485+ *p = NUL;
3486 }
3487- *p = NUL;
3488
3489 /*
3490 * Execute the command.
3491diff -Naur vim72.orig/src/ops.c vim72/src/ops.c
3492--- vim72.orig/src/ops.c 2008-06-21 13:08:59.000000000 -0700
3493+++ vim72/src/ops.c 2008-12-30 16:17:30.000000000 -0800
3494@@ -2209,12 +2209,15 @@
3495 {
3496 for (; pos.lnum <= oap->end.lnum; ++pos.lnum)
3497 {
3498+ int one_change;
3499+
3500 block_prep(oap, &bd, pos.lnum, FALSE);
3501 pos.col = bd.textcol;
3502- did_change = swapchars(oap->op_type, &pos, bd.textlen);
3503+ one_change = swapchars(oap->op_type, &pos, bd.textlen);
3504+ did_change |= one_change;
3505
3506 # ifdef FEAT_NETBEANS_INTG
3507- if (usingNetbeans && did_change)
3508+ if (usingNetbeans && one_change)
3509 {
3510 char_u *ptr = ml_get_buf(curbuf, pos.lnum, FALSE);
3511
3512diff -Naur vim72.orig/src/option.c vim72/src/option.c
3513--- vim72.orig/src/option.c 2008-07-18 06:05:33.000000000 -0700
3514+++ vim72/src/option.c 2008-12-30 16:17:58.000000000 -0800
3515@@ -2593,13 +2593,13 @@
3516 #ifdef FEAT_VIMINFO
3517 (char_u *)&p_viminfo, PV_NONE,
3518 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
3519- {(char_u *)"", (char_u *)"'20,<50,s10,h,rA:,rB:"}
3520+ {(char_u *)"", (char_u *)"'100,<50,s10,h,rA:,rB:"}
3521 #else
3522 # ifdef AMIGA
3523 {(char_u *)"",
3524- (char_u *)"'20,<50,s10,h,rdf0:,rdf1:,rdf2:"}
3525+ (char_u *)"'100,<50,s10,h,rdf0:,rdf1:,rdf2:"}
3526 # else
3527- {(char_u *)"", (char_u *)"'20,<50,s10,h"}
3528+ {(char_u *)"", (char_u *)"'100,<50,s10,h"}
3529 # endif
3530 #endif
3531 #else
3532@@ -7974,6 +7974,11 @@
3533 else /* curwin->w_p_scr > curwin->w_height */
3534 curwin->w_p_scr = curwin->w_height;
3535 }
3536+ if (p_hi < 0)
3537+ {
3538+ errmsg = e_positive;
3539+ p_hi = 0;
3540+ }
3541 if (p_report < 0)
3542 {
3543 errmsg = e_positive;
3544@@ -8227,13 +8232,13 @@
3545 {
3546 if (number == 0 && string != NULL)
3547 {
3548- int index;
3549+ int idx;
3550
3551 /* Either we are given a string or we are setting option
3552 * to zero. */
3553- for (index = 0; string[index] == '0'; ++index)
3554+ for (idx = 0; string[idx] == '0'; ++idx)
3555 ;
3556- if (string[index] != NUL || index == 0)
3557+ if (string[idx] != NUL || idx == 0)
3558 {
3559 /* There's another character after zeros or the string
3560 * is empty. In both cases, we are trying to set a
3561@@ -8323,7 +8328,7 @@
3562 {
3563 --arg; /* put arg at the '<' */
3564 modifiers = 0;
3565- key = find_special_key(&arg, &modifiers, TRUE);
3566+ key = find_special_key(&arg, &modifiers, TRUE, TRUE);
3567 if (modifiers) /* can't handle modifiers here */
3568 key = 0;
3569 }
3570diff -Naur vim72.orig/src/os_unix.c vim72/src/os_unix.c
3571--- vim72.orig/src/os_unix.c 2008-08-06 04:01:40.000000000 -0700
3572+++ vim72/src/os_unix.c 2008-12-30 16:17:03.000000000 -0800
3573@@ -315,12 +315,15 @@
3574 {-1, "Unknown!", FALSE}
3575 };
3576
3577+/*
3578+ * Write s[len] to the screen.
3579+ */
3580 void
3581 mch_write(s, len)
3582 char_u *s;
3583 int len;
3584 {
3585- write(1, (char *)s, len);
3586+ ignored = (int)write(1, (char *)s, len);
3587 if (p_wd) /* Unix is too fast, slow down a bit more */
3588 RealWaitForChar(read_cmd_fd, p_wd, NULL);
3589 }
3590@@ -2905,7 +2908,7 @@
3591 * Ignore any errors.
3592 */
3593 #if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
3594- signal_stack = malloc(SIGSTKSZ);
3595+ signal_stack = (char *)alloc(SIGSTKSZ);
3596 init_signal_stack();
3597 #endif
3598 }
3599@@ -2936,7 +2939,8 @@
3600 }
3601 # endif
3602 # endif
3603-# ifdef FEAT_X11
3604+ /* Don't close the display for GTK 1, it is done in exit(). */
3605+# if defined(FEAT_X11) && (!defined(FEAT_GUI_GTK) || defined(HAVE_GTK2))
3606 if (x11_display != NULL
3607 # ifdef FEAT_XCLIPBOARD
3608 && x11_display != xterm_dpy
3609@@ -3926,9 +3930,9 @@
3610 */
3611 if (fd >= 0)
3612 {
3613- dup(fd); /* To replace stdin (file descriptor 0) */
3614- dup(fd); /* To replace stdout (file descriptor 1) */
3615- dup(fd); /* To replace stderr (file descriptor 2) */
3616+ ignored = dup(fd); /* To replace stdin (fd 0) */
3617+ ignored = dup(fd); /* To replace stdout (fd 1) */
3618+ ignored = dup(fd); /* To replace stderr (fd 2) */
3619
3620 /* Don't need this now that we've duplicated it */
3621 close(fd);
3622@@ -3996,13 +4000,13 @@
3623
3624 /* set up stdin/stdout/stderr for the child */
3625 close(0);
3626- dup(pty_slave_fd);
3627+ ignored = dup(pty_slave_fd);
3628 close(1);
3629- dup(pty_slave_fd);
3630+ ignored = dup(pty_slave_fd);
3631 if (gui.in_use)
3632 {
3633 close(2);
3634- dup(pty_slave_fd);
3635+ ignored = dup(pty_slave_fd);
3636 }
3637
3638 close(pty_slave_fd); /* has been dupped, close it now */
3639@@ -4013,13 +4017,13 @@
3640 /* set up stdin for the child */
3641 close(fd_toshell[1]);
3642 close(0);
3643- dup(fd_toshell[0]);
3644+ ignored = dup(fd_toshell[0]);
3645 close(fd_toshell[0]);
3646
3647 /* set up stdout for the child */
3648 close(fd_fromshell[0]);
3649 close(1);
3650- dup(fd_fromshell[1]);
3651+ ignored = dup(fd_fromshell[1]);
3652 close(fd_fromshell[1]);
3653
3654 # ifdef FEAT_GUI
3655@@ -4027,7 +4031,7 @@
3656 {
3657 /* set up stderr for the child */
3658 close(2);
3659- dup(1);
3660+ ignored = dup(1);
3661 }
3662 # endif
3663 }
3664@@ -4158,7 +4162,8 @@
3665 && (lnum !=
3666 curbuf->b_ml.ml_line_count
3667 || curbuf->b_p_eol)))
3668- write(toshell_fd, "\n", (size_t)1);
3669+ ignored = write(toshell_fd, "\n",
3670+ (size_t)1);
3671 ++lnum;
3672 if (lnum > curbuf->b_op_end.lnum)
3673 {
3674@@ -6814,7 +6819,8 @@
3675 if (xsmp_icefd != -1)
3676 {
3677 SmcCloseConnection(xsmp.smcconn, 0, NULL);
3678- vim_free(xsmp.clientid);
3679+ if (xsmp.clientid != NULL)
3680+ free(xsmp.clientid);
3681 xsmp.clientid = NULL;
3682 xsmp_icefd = -1;
3683 }
3684diff -Naur vim72.orig/src/proto/eval.pro vim72/src/proto/eval.pro
3685--- vim72.orig/src/proto/eval.pro 2008-08-09 07:31:25.000000000 -0700
3686+++ vim72/src/proto/eval.pro 2008-12-30 16:16:40.000000000 -0800
3687@@ -17,7 +17,7 @@
3688 int eval_to_bool __ARGS((char_u *arg, int *error, char_u **nextcmd, int skip));
3689 char_u *eval_to_string_skip __ARGS((char_u *arg, char_u **nextcmd, int skip));
3690 int skip_expr __ARGS((char_u **pp));
3691-char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int dolist));
3692+char_u *eval_to_string __ARGS((char_u *arg, char_u **nextcmd, int convert));
3693 char_u *eval_to_string_safe __ARGS((char_u *arg, char_u **nextcmd, int use_sandbox));
3694 int eval_to_number __ARGS((char_u *expr));
3695 list_T *eval_spell_expr __ARGS((char_u *badword, char_u *expr));
3696@@ -46,7 +46,9 @@
3697 void list_unref __ARGS((list_T *l));
3698 void list_free __ARGS((list_T *l, int recurse));
3699 dictitem_T *dict_lookup __ARGS((hashitem_T *hi));
3700+char_u *list_find_str __ARGS((list_T *l, long idx));
3701 int list_append_dict __ARGS((list_T *list, dict_T *dict));
3702+int list_append_string __ARGS((list_T *l, char_u *str, int len));
3703 int garbage_collect __ARGS((void));
3704 dict_T *dict_alloc __ARGS((void));
3705 int dict_add_nr_str __ARGS((dict_T *d, char *key, long nr, char_u *str));
3706@@ -58,8 +60,10 @@
3707 void set_vim_var_nr __ARGS((int idx, long val));
3708 long get_vim_var_nr __ARGS((int idx));
3709 char_u *get_vim_var_str __ARGS((int idx));
3710-void set_vcount __ARGS((long count, long count1));
3711+list_T *get_vim_var_list __ARGS((int idx));
3712+void set_vcount __ARGS((long count, long count1, int set_prevcount));
3713 void set_vim_var_string __ARGS((int idx, char_u *val, int len));
3714+void set_vim_var_list __ARGS((int idx, list_T *val));
3715 void set_reg_var __ARGS((int c));
3716 char_u *v_exception __ARGS((char_u *oldval));
3717 char_u *v_throwpoint __ARGS((char_u *oldval));
3718@@ -94,6 +98,7 @@
3719 void write_viminfo_varlist __ARGS((FILE *fp));
3720 int store_session_globals __ARGS((FILE *fd));
3721 void last_set_msg __ARGS((scid_T scriptID));
3722+void ex_oldfiles __ARGS((exarg_T *eap));
3723 int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen));
3724 char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags));
3725 /* vim: set ft=c : */
3726diff -Naur vim72.orig/src/proto/ex_cmds.pro vim72/src/proto/ex_cmds.pro
3727--- vim72.orig/src/proto/ex_cmds.pro 2008-08-09 07:31:25.000000000 -0700
3728+++ vim72/src/proto/ex_cmds.pro 2008-12-30 16:15:47.000000000 -0800
3729@@ -11,7 +11,7 @@
3730 char_u *make_filter_cmd __ARGS((char_u *cmd, char_u *itmp, char_u *otmp));
3731 void append_redir __ARGS((char_u *buf, char_u *opt, char_u *fname));
3732 int viminfo_error __ARGS((char *errnum, char *message, char_u *line));
3733-int read_viminfo __ARGS((char_u *file, int want_info, int want_marks, int forceit));
3734+int read_viminfo __ARGS((char_u *file, int flags));
3735 void write_viminfo __ARGS((char_u *file, int forceit));
3736 int viminfo_readline __ARGS((vir_T *virp));
3737 char_u *viminfo_readstring __ARGS((vir_T *virp, int off, int convert));
3738diff -Naur vim72.orig/src/proto/ex_getln.pro vim72/src/proto/ex_getln.pro
3739--- vim72.orig/src/proto/ex_getln.pro 2008-08-09 07:31:28.000000000 -0700
3740+++ vim72/src/proto/ex_getln.pro 2008-12-30 16:16:50.000000000 -0800
3741@@ -31,7 +31,7 @@
3742 void set_cmd_context __ARGS((expand_T *xp, char_u *str, int len, int col));
3743 int expand_cmdline __ARGS((expand_T *xp, char_u *str, int col, int *matchcount, char_u ***matches));
3744 int ExpandGeneric __ARGS((expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file, char_u *((*func)(expand_T *, int))));
3745-char_u *globpath __ARGS((char_u *path, char_u *file));
3746+char_u *globpath __ARGS((char_u *path, char_u *file, int expand_options));
3747 void init_history __ARGS((void));
3748 int get_histtype __ARGS((char_u *name));
3749 void add_to_history __ARGS((int histype, char_u *new_entry, int in_map, int sep));
3750diff -Naur vim72.orig/src/proto/mark.pro vim72/src/proto/mark.pro
3751--- vim72.orig/src/proto/mark.pro 2008-08-09 07:31:36.000000000 -0700
3752+++ vim72/src/proto/mark.pro 2008-12-30 16:15:47.000000000 -0800
3753@@ -26,5 +26,5 @@
3754 void write_viminfo_filemarks __ARGS((FILE *fp));
3755 int removable __ARGS((char_u *name));
3756 int write_viminfo_marks __ARGS((FILE *fp_out));
3757-void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof));
3758+void copy_viminfo_marks __ARGS((vir_T *virp, FILE *fp_out, int count, int eof, int flags));
3759 /* vim: set ft=c : */
3760diff -Naur vim72.orig/src/proto/misc2.pro vim72/src/proto/misc2.pro
3761--- vim72.orig/src/proto/misc2.pro 2008-08-09 07:31:40.000000000 -0700
3762+++ vim72/src/proto/misc2.pro 2008-12-30 16:17:58.000000000 -0800
3763@@ -59,7 +59,7 @@
3764 int handle_x_keys __ARGS((int key));
3765 char_u *get_special_key_name __ARGS((int c, int modifiers));
3766 int trans_special __ARGS((char_u **srcp, char_u *dst, int keycode));
3767-int find_special_key __ARGS((char_u **srcp, int *modp, int keycode));
3768+int find_special_key __ARGS((char_u **srcp, int *modp, int keycode, int keep_x_key));
3769 int extract_modifiers __ARGS((int key, int *modp));
3770 int find_special_key_in_table __ARGS((int c));
3771 int get_special_key_code __ARGS((char_u *name));
3772diff -Naur vim72.orig/src/pty.c vim72/src/pty.c
3773--- vim72.orig/src/pty.c 2008-06-21 11:52:58.000000000 -0700
3774+++ vim72/src/pty.c 2008-12-30 16:14:03.000000000 -0800
3775@@ -270,9 +270,10 @@
3776 }
3777 #endif
3778
3779-#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux)
3780+#if defined(HAVE_SVR4_PTYS) && !defined(PTY_DONE) && !defined(hpux) && !defined(MACOS_X)
3781
3782-/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work! */
3783+/* NOTE: Even though HPUX can have /dev/ptmx, the code below doesn't work!
3784+ * Same for Mac OS X Leopard. */
3785 #define PTY_DONE
3786 int
3787 OpenPTY(ttyn)
3788diff -Naur vim72.orig/src/screen.c vim72/src/screen.c
3789--- vim72.orig/src/screen.c 2008-07-24 07:45:07.000000000 -0700
3790+++ vim72/src/screen.c 2008-12-30 16:15:21.000000000 -0800
3791@@ -2439,9 +2439,17 @@
3792
3793 #ifdef FEAT_SYN_HL
3794 /* Show 'cursorcolumn' in the fold line. */
3795- if (wp->w_p_cuc && (int)wp->w_virtcol + txtcol < W_WIDTH(wp))
3796- ScreenAttrs[off + wp->w_virtcol + txtcol] = hl_combine_attr(
3797- ScreenAttrs[off + wp->w_virtcol + txtcol], hl_attr(HLF_CUC));
3798+ if (wp->w_p_cuc)
3799+ {
3800+ txtcol += wp->w_virtcol;
3801+ if (wp->w_p_wrap)
3802+ txtcol -= wp->w_skipcol;
3803+ else
3804+ txtcol -= wp->w_leftcol;
3805+ if (txtcol >= 0 && txtcol < W_WIDTH(wp))
3806+ ScreenAttrs[off + txtcol] = hl_combine_attr(
3807+ ScreenAttrs[off + txtcol], hl_attr(HLF_CUC));
3808+ }
3809 #endif
3810
3811 SCREEN_LINE(row + W_WINROW(wp), W_WINCOL(wp), (int)W_WIDTH(wp),
3812diff -Naur vim72.orig/src/spell.c vim72/src/spell.c
3813--- vim72.orig/src/spell.c 2008-07-12 12:20:55.000000000 -0700
3814+++ vim72/src/spell.c 2008-12-30 16:17:46.000000000 -0800
3815@@ -77,7 +77,7 @@
3816
3817 /*
3818 * Do the opposite: based on a maximum end score and a known sound score,
3819- * compute the the maximum word score that can be used.
3820+ * compute the maximum word score that can be used.
3821 */
3822 #define MAXSCORE(word_score, sound_score) ((4 * word_score - sound_score) / 3)
3823
3824@@ -469,6 +469,7 @@
3825 garray_T sl_comppat; /* CHECKCOMPOUNDPATTERN items */
3826 regprog_T *sl_compprog; /* COMPOUNDRULE turned into a regexp progrm
3827 * (NULL when no compounding) */
3828+ char_u *sl_comprules; /* all COMPOUNDRULE concatenated (or NULL) */
3829 char_u *sl_compstartflags; /* flags for first compound word */
3830 char_u *sl_compallflags; /* all flags for compound words */
3831 char_u sl_nobreak; /* When TRUE: no spaces between words */
3832@@ -625,7 +626,7 @@
3833 /* TRUE if a word appears in the list of banned words. */
3834 #define WAS_BANNED(su, word) (!HASHITEM_EMPTY(hash_find(&su->su_banned, word)))
3835
3836-/* Number of suggestions kept when cleaning up. we need to keep more than
3837+/* Number of suggestions kept when cleaning up. We need to keep more than
3838 * what is displayed, because when rescore_suggestions() is called the score
3839 * may change and wrong suggestions may be removed later. */
3840 #define SUG_CLEAN_COUNT(su) ((su)->su_maxcount < 130 ? 150 : (su)->su_maxcount + 20)
3841@@ -839,7 +840,10 @@
3842 static void slang_clear __ARGS((slang_T *lp));
3843 static void slang_clear_sug __ARGS((slang_T *lp));
3844 static void find_word __ARGS((matchinf_T *mip, int mode));
3845+static int match_checkcompoundpattern __ARGS((char_u *ptr, int wlen, garray_T *gap));
3846 static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags));
3847+static int can_be_compound __ARGS((trystate_T *sp, slang_T *slang, char_u *compflags, int flag));
3848+static int match_compoundrule __ARGS((slang_T *slang, char_u *compflags));
3849 static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req));
3850 static void find_prefix __ARGS((matchinf_T *mip, int mode));
3851 static int fold_more __ARGS((matchinf_T *mip));
3852@@ -1519,6 +1523,11 @@
3853 ((unsigned)flags >> 24)))
3854 continue;
3855
3856+ /* If there is a match with a CHECKCOMPOUNDPATTERN rule
3857+ * discard the compound word. */
3858+ if (match_checkcompoundpattern(ptr, wlen, &slang->sl_comppat))
3859+ continue;
3860+
3861 if (mode == FIND_COMPOUND)
3862 {
3863 int capflags;
3864@@ -1577,6 +1586,11 @@
3865 if (!can_compound(slang, fword, mip->mi_compflags))
3866 continue;
3867 }
3868+ else if (slang->sl_comprules != NULL
3869+ && !match_compoundrule(slang, mip->mi_compflags))
3870+ /* The compound flags collected so far do not match any
3871+ * COMPOUNDRULE, discard the compounded word. */
3872+ continue;
3873 }
3874
3875 /* Check NEEDCOMPOUND: can't use word without compounding. */
3876@@ -1727,6 +1741,39 @@
3877 }
3878
3879 /*
3880+ * Return TRUE if there is a match between the word ptr[wlen] and
3881+ * CHECKCOMPOUNDPATTERN rules, assuming that we will concatenate with another
3882+ * word.
3883+ * A match means that the first part of CHECKCOMPOUNDPATTERN matches at the
3884+ * end of ptr[wlen] and the second part matches after it.
3885+ */
3886+ static int
3887+match_checkcompoundpattern(ptr, wlen, gap)
3888+ char_u *ptr;
3889+ int wlen;
3890+ garray_T *gap; /* &sl_comppat */
3891+{
3892+ int i;
3893+ char_u *p;
3894+ int len;
3895+
3896+ for (i = 0; i + 1 < gap->ga_len; i += 2)
3897+ {
3898+ p = ((char_u **)gap->ga_data)[i + 1];
3899+ if (STRNCMP(ptr + wlen, p, STRLEN(p)) == 0)
3900+ {
3901+ /* Second part matches at start of following compound word, now
3902+ * check if first part matches at end of previous word. */
3903+ p = ((char_u **)gap->ga_data)[i];
3904+ len = (int)STRLEN(p);
3905+ if (len <= wlen && STRNCMP(ptr + wlen - len, p, len) == 0)
3906+ return TRUE;
3907+ }
3908+ }
3909+ return FALSE;
3910+}
3911+
3912+/*
3913 * Return TRUE if "flags" is a valid sequence of compound flags and "word"
3914 * does not have too many syllables.
3915 */
3916@@ -1773,6 +1820,98 @@
3917 }
3918
3919 /*
3920+ * Return TRUE when the sequence of flags in "compflags" plus "flag" can
3921+ * possibly form a valid compounded word. This also checks the COMPOUNDRULE
3922+ * lines if they don't contain wildcards.
3923+ */
3924+ static int
3925+can_be_compound(sp, slang, compflags, flag)
3926+ trystate_T *sp;
3927+ slang_T *slang;
3928+ char_u *compflags;
3929+ int flag;
3930+{
3931+ /* If the flag doesn't appear in sl_compstartflags or sl_compallflags
3932+ * then it can't possibly compound. */
3933+ if (!byte_in_str(sp->ts_complen == sp->ts_compsplit
3934+ ? slang->sl_compstartflags : slang->sl_compallflags, flag))
3935+ return FALSE;
3936+
3937+ /* If there are no wildcards, we can check if the flags collected so far
3938+ * possibly can form a match with COMPOUNDRULE patterns. This only
3939+ * makes sense when we have two or more words. */
3940+ if (slang->sl_comprules != NULL && sp->ts_complen > sp->ts_compsplit)
3941+ {
3942+ int v;
3943+
3944+ compflags[sp->ts_complen] = flag;
3945+ compflags[sp->ts_complen + 1] = NUL;
3946+ v = match_compoundrule(slang, compflags + sp->ts_compsplit);
3947+ compflags[sp->ts_complen] = NUL;
3948+ return v;
3949+ }
3950+
3951+ return TRUE;
3952+}
3953+
3954+
3955+/*
3956+ * Return TRUE if the compound flags in compflags[] match the start of any
3957+ * compound rule. This is used to stop trying a compound if the flags
3958+ * collected so far can't possibly match any compound rule.
3959+ * Caller must check that slang->sl_comprules is not NULL.
3960+ */
3961+ static int
3962+match_compoundrule(slang, compflags)
3963+ slang_T *slang;
3964+ char_u *compflags;
3965+{
3966+ char_u *p;
3967+ int i;
3968+ int c;
3969+
3970+ /* loop over all the COMPOUNDRULE entries */
3971+ for (p = slang->sl_comprules; *p != NUL; ++p)
3972+ {
3973+ /* loop over the flags in the compound word we have made, match
3974+ * them against the current rule entry */
3975+ for (i = 0; ; ++i)
3976+ {
3977+ c = compflags[i];
3978+ if (c == NUL)
3979+ /* found a rule that matches for the flags we have so far */
3980+ return TRUE;
3981+ if (*p == '/' || *p == NUL)
3982+ break; /* end of rule, it's too short */
3983+ if (*p == '[')
3984+ {
3985+ int match = FALSE;
3986+
3987+ /* compare against all the flags in [] */
3988+ ++p;
3989+ while (*p != ']' && *p != NUL)
3990+ if (*p++ == c)
3991+ match = TRUE;
3992+ if (!match)
3993+ break; /* none matches */
3994+ }
3995+ else if (*p != c)
3996+ break; /* flag of word doesn't match flag in pattern */
3997+ ++p;
3998+ }
3999+
4000+ /* Skip to the next "/", where the next pattern starts. */
4001+ p = vim_strchr(p, '/');
4002+ if (p == NULL)
4003+ break;
4004+ }
4005+
4006+ /* Checked all the rules and none of them match the flags, so there
4007+ * can't possibly be a compound starting with these flags. */
4008+ return FALSE;
4009+}
4010+
4011+/*
4012 * Return non-zero if the prefix indicated by "arridx" matches with the prefix
4013 * ID in "flags" for the word "word".
4014 * The WF_RAREPFX flag is included in the return value for a rare prefix.
4015@@ -2513,9 +2652,11 @@
4016 lp->sl_midword = NULL;
4017
4018 vim_free(lp->sl_compprog);
4019+ vim_free(lp->sl_comprules);
4020 vim_free(lp->sl_compstartflags);
4021 vim_free(lp->sl_compallflags);
4022 lp->sl_compprog = NULL;
4023+ lp->sl_comprules = NULL;
4024 lp->sl_compstartflags = NULL;
4025 lp->sl_compallflags = NULL;
4026
4027@@ -3460,6 +3601,7 @@
4028 char_u *pp;
4029 char_u *cp;
4030 char_u *ap;
4031+ char_u *crp;
4032 int cnt;
4033 garray_T *gap;
4034
4035@@ -3545,6 +3687,12 @@
4036 slang->sl_compallflags = ap;
4037 *ap = NUL;
4038
4039+ /* And a list of all patterns in their original form, for checking whether
4040+ * compounding may work in match_compoundrule(). This is freed when we
4041+ * encounter a wildcard, the check doesn't work then. */
4042+ crp = alloc(todo + 1);
4043+ slang->sl_comprules = crp;
4044+
4045 pp = pat;
4046 *pp++ = '^';
4047 *pp++ = '\\';
4048@@ -3587,6 +3735,20 @@
4049 atstart = 0;
4050 }
4051 }
4052+
4053+ /* Copy flag to "sl_comprules", unless we run into a wildcard. */
4054+ if (crp != NULL)
4055+ {
4056+ if (c == '+' || c == '*')
4057+ {
4058+ vim_free(slang->sl_comprules);
4059+ slang->sl_comprules = NULL;
4060+ crp = NULL;
4061+ }
4062+ else
4063+ *crp++ = c;
4064+ }
4065+
4066 if (c == '/') /* slash separates two items */
4067 {
4068 *pp++ = '\\';
4069@@ -3611,6 +3773,9 @@
4070 *pp++ = '$';
4071 *pp = NUL;
4072
4073+ if (crp != NULL)
4074+ *crp = NUL;
4075+
4076 slang->sl_compprog = vim_regcomp(pat, RE_MAGIC + RE_STRING + RE_STRICT);
4077 vim_free(pat);
4078 if (slang->sl_compprog == NULL)
4079@@ -4915,6 +5080,7 @@
4080 } spellinfo_T;
4081
4082 static afffile_T *spell_read_aff __ARGS((spellinfo_T *spin, char_u *fname));
4083+static int is_aff_rule __ARGS((char_u **items, int itemcnt, char *rulename, int mincount));
4084 static void aff_process_flags __ARGS((afffile_T *affile, affentry_T *entry));
4085 static int spell_info_item __ARGS((char_u *s));
4086 static unsigned affitem2flag __ARGS((int flagtype, char_u *item, char_u *fname, int lnum));
4087@@ -4950,7 +5116,7 @@
4088 static void put_sugtime __ARGS((spellinfo_T *spin, FILE *fd));
4089 static int write_vim_spell __ARGS((spellinfo_T *spin, char_u *fname));
4090 static void clear_node __ARGS((wordnode_T *node));
4091-static int put_node __ARGS((FILE *fd, wordnode_T *node, int index, int regionmask, int prefixtree));
4092+static int put_node __ARGS((FILE *fd, wordnode_T *node, int idx, int regionmask, int prefixtree));
4093 static void spell_make_sugfile __ARGS((spellinfo_T *spin, char_u *wfname));
4094 static int sug_filltree __ARGS((spellinfo_T *spin, slang_T *slang));
4095 static int sug_maketable __ARGS((spellinfo_T *spin));
4096@@ -5223,8 +5389,7 @@
4097 /* Handle non-empty lines. */
4098 if (itemcnt > 0)
4099 {
4100- if (STRCMP(items[0], "SET") == 0 && itemcnt == 2
4101- && aff->af_enc == NULL)
4102+ if (is_aff_rule(items, itemcnt, "SET", 2) && aff->af_enc == NULL)
4103 {
4104 #ifdef FEAT_MBYTE
4105 /* Setup for conversion from "ENC" to 'encoding'. */
4106@@ -5239,7 +5404,7 @@
4107 smsg((char_u *)_("Conversion in %s not supported"), fname);
4108 #endif
4109 }
4110- else if (STRCMP(items[0], "FLAG") == 0 && itemcnt == 2
4111+ else if (is_aff_rule(items, itemcnt, "FLAG", 2)
4112 && aff->af_flagtype == AFT_CHAR)
4113 {
4114 if (STRCMP(items[1], "long") == 0)
4115@@ -5284,69 +5449,71 @@
4116 spin->si_info = p;
4117 }
4118 }
4119- else if (STRCMP(items[0], "MIDWORD") == 0 && itemcnt == 2
4120+ else if (is_aff_rule(items, itemcnt, "MIDWORD", 2)
4121 && midword == NULL)
4122 {
4123 midword = getroom_save(spin, items[1]);
4124 }
4125- else if (STRCMP(items[0], "TRY") == 0 && itemcnt == 2)
4126+ else if (is_aff_rule(items, itemcnt, "TRY", 2))
4127 {
4128 /* ignored, we look in the tree for what chars may appear */
4129 }
4130 /* TODO: remove "RAR" later */
4131- else if ((STRCMP(items[0], "RAR") == 0
4132- || STRCMP(items[0], "RARE") == 0) && itemcnt == 2
4133- && aff->af_rare == 0)
4134+ else if ((is_aff_rule(items, itemcnt, "RAR", 2)
4135+ || is_aff_rule(items, itemcnt, "RARE", 2))
4136+ && aff->af_rare == 0)
4137 {
4138 aff->af_rare = affitem2flag(aff->af_flagtype, items[1],
4139 fname, lnum);
4140 }
4141 /* TODO: remove "KEP" later */
4142- else if ((STRCMP(items[0], "KEP") == 0
4143- || STRCMP(items[0], "KEEPCASE") == 0) && itemcnt == 2
4144+ else if ((is_aff_rule(items, itemcnt, "KEP", 2)
4145+ || is_aff_rule(items, itemcnt, "KEEPCASE", 2))
4146 && aff->af_keepcase == 0)
4147 {
4148 aff->af_keepcase = affitem2flag(aff->af_flagtype, items[1],
4149 fname, lnum);
4150 }
4151- else if (STRCMP(items[0], "BAD") == 0 && itemcnt == 2
4152- && aff->af_bad == 0)
4153+ else if ((is_aff_rule(items, itemcnt, "BAD", 2)
4154+ || is_aff_rule(items, itemcnt, "FORBIDDENWORD", 2))
4155+ && aff->af_bad == 0)
4156 {
4157 aff->af_bad = affitem2flag(aff->af_flagtype, items[1],
4158 fname, lnum);
4159 }
4160- else if (STRCMP(items[0], "NEEDAFFIX") == 0 && itemcnt == 2
4161+ else if (is_aff_rule(items, itemcnt, "NEEDAFFIX", 2)
4162 && aff->af_needaffix == 0)
4163 {
4164 aff->af_needaffix = affitem2flag(aff->af_flagtype, items[1],
4165 fname, lnum);
4166 }
4167- else if (STRCMP(items[0], "CIRCUMFIX") == 0 && itemcnt == 2
4168+ else if (is_aff_rule(items, itemcnt, "CIRCUMFIX", 2)
4169 && aff->af_circumfix == 0)
4170 {
4171 aff->af_circumfix = affitem2flag(aff->af_flagtype, items[1],
4172 fname, lnum);
4173 }
4174- else if (STRCMP(items[0], "NOSUGGEST") == 0 && itemcnt == 2
4175+ else if (is_aff_rule(items, itemcnt, "NOSUGGEST", 2)
4176 && aff->af_nosuggest == 0)
4177 {
4178 aff->af_nosuggest = affitem2flag(aff->af_flagtype, items[1],
4179 fname, lnum);
4180 }
4181- else if (STRCMP(items[0], "NEEDCOMPOUND") == 0 && itemcnt == 2
4182+ else if ((is_aff_rule(items, itemcnt, "NEEDCOMPOUND", 2)
4183+ || is_aff_rule(items, itemcnt, "ONLYINCOMPOUND", 2))
4184 && aff->af_needcomp == 0)
4185 {
4186 aff->af_needcomp = affitem2flag(aff->af_flagtype, items[1],
4187 fname, lnum);
4188 }
4189- else if (STRCMP(items[0], "COMPOUNDROOT") == 0 && itemcnt == 2
4190+ else if (is_aff_rule(items, itemcnt, "COMPOUNDROOT", 2)
4191 && aff->af_comproot == 0)
4192 {
4193 aff->af_comproot = affitem2flag(aff->af_flagtype, items[1],
4194 fname, lnum);
4195 }
4196- else if (STRCMP(items[0], "COMPOUNDFORBIDFLAG") == 0
4197- && itemcnt == 2 && aff->af_compforbid == 0)
4198+ else if (is_aff_rule(items, itemcnt, "COMPOUNDFORBIDFLAG", 2)
4199+ && aff->af_compforbid == 0)
4200 {
4201 aff->af_compforbid = affitem2flag(aff->af_flagtype, items[1],
4202 fname, lnum);
4203@@ -5354,8 +5521,8 @@
4204 smsg((char_u *)_("Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in %s line %d"),
4205 fname, lnum);
4206 }
4207- else if (STRCMP(items[0], "COMPOUNDPERMITFLAG") == 0
4208- && itemcnt == 2 && aff->af_comppermit == 0)
4209+ else if (is_aff_rule(items, itemcnt, "COMPOUNDPERMITFLAG", 2)
4210+ && aff->af_comppermit == 0)
4211 {
4212 aff->af_comppermit = affitem2flag(aff->af_flagtype, items[1],
4213 fname, lnum);
4214@@ -5363,7 +5530,7 @@
4215 smsg((char_u *)_("Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in %s line %d"),
4216 fname, lnum);
4217 }
4218- else if (STRCMP(items[0], "COMPOUNDFLAG") == 0 && itemcnt == 2
4219+ else if (is_aff_rule(items, itemcnt, "COMPOUNDFLAG", 2)
4220 && compflags == NULL)
4221 {
4222 /* Turn flag "c" into COMPOUNDRULE compatible string "c+",
4223@@ -5376,7 +5543,15 @@
4224 compflags = p;
4225 }
4226 }
4227- else if (STRCMP(items[0], "COMPOUNDRULE") == 0 && itemcnt == 2)
4228+ else if (is_aff_rule(items, itemcnt, "COMPOUNDRULES", 2))
4229+ {
4230+ /* We don't use the count, but do check that it's a number and
4231+ * not COMPOUNDRULE mistyped. */
4232+ if (atoi((char *)items[1]) == 0)
4233+ smsg((char_u *)_("Wrong COMPOUNDRULES value in %s line %d: %s"),
4234+ fname, lnum, items[1]);
4235+ }
4236+ else if (is_aff_rule(items, itemcnt, "COMPOUNDRULE", 2))
4237 {
4238 /* Concatenate this string to previously defined ones, using a
4239 * slash to separate them. */
4240@@ -5395,7 +5570,7 @@
4241 compflags = p;
4242 }
4243 }
4244- else if (STRCMP(items[0], "COMPOUNDWORDMAX") == 0 && itemcnt == 2
4245+ else if (is_aff_rule(items, itemcnt, "COMPOUNDWORDMAX", 2)
4246 && compmax == 0)
4247 {
4248 compmax = atoi((char *)items[1]);
4249@@ -5403,7 +5578,7 @@
4250 smsg((char_u *)_("Wrong COMPOUNDWORDMAX value in %s line %d: %s"),
4251 fname, lnum, items[1]);
4252 }
4253- else if (STRCMP(items[0], "COMPOUNDMIN") == 0 && itemcnt == 2
4254+ else if (is_aff_rule(items, itemcnt, "COMPOUNDMIN", 2)
4255 && compminlen == 0)
4256 {
4257 compminlen = atoi((char *)items[1]);
4258@@ -5411,7 +5586,7 @@
4259 smsg((char_u *)_("Wrong COMPOUNDMIN value in %s line %d: %s"),
4260 fname, lnum, items[1]);
4261 }
4262- else if (STRCMP(items[0], "COMPOUNDSYLMAX") == 0 && itemcnt == 2
4263+ else if (is_aff_rule(items, itemcnt, "COMPOUNDSYLMAX", 2)
4264 && compsylmax == 0)
4265 {
4266 compsylmax = atoi((char *)items[1]);
4267@@ -5419,32 +5594,29 @@
4268 smsg((char_u *)_("Wrong COMPOUNDSYLMAX value in %s line %d: %s"),
4269 fname, lnum, items[1]);
4270 }
4271- else if (STRCMP(items[0], "CHECKCOMPOUNDDUP") == 0 && itemcnt == 1)
4272+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDDUP", 1))
4273 {
4274 compoptions |= COMP_CHECKDUP;
4275 }
4276- else if (STRCMP(items[0], "CHECKCOMPOUNDREP") == 0 && itemcnt == 1)
4277+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDREP", 1))
4278 {
4279 compoptions |= COMP_CHECKREP;
4280 }
4281- else if (STRCMP(items[0], "CHECKCOMPOUNDCASE") == 0 && itemcnt == 1)
4282+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDCASE", 1))
4283 {
4284 compoptions |= COMP_CHECKCASE;
4285 }
4286- else if (STRCMP(items[0], "CHECKCOMPOUNDTRIPLE") == 0
4287- && itemcnt == 1)
4288+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDTRIPLE", 1))
4289 {
4290 compoptions |= COMP_CHECKTRIPLE;
4291 }
4292- else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0
4293- && itemcnt == 2)
4294+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 2))
4295 {
4296 if (atoi((char *)items[1]) == 0)
4297 smsg((char_u *)_("Wrong CHECKCOMPOUNDPATTERN value in %s line %d: %s"),
4298 fname, lnum, items[1]);
4299 }
4300- else if (STRCMP(items[0], "CHECKCOMPOUNDPATTERN") == 0
4301- && itemcnt == 3)
4302+ else if (is_aff_rule(items, itemcnt, "CHECKCOMPOUNDPATTERN", 3))
4303 {
4304 garray_T *gap = &spin->si_comppat;
4305 int i;
4306@@ -5463,24 +5635,24 @@
4307 = getroom_save(spin, items[2]);
4308 }
4309 }
4310- else if (STRCMP(items[0], "SYLLABLE") == 0 && itemcnt == 2
4311+ else if (is_aff_rule(items, itemcnt, "SYLLABLE", 2)
4312 && syllable == NULL)
4313 {
4314 syllable = getroom_save(spin, items[1]);
4315 }
4316- else if (STRCMP(items[0], "NOBREAK") == 0 && itemcnt == 1)
4317+ else if (is_aff_rule(items, itemcnt, "NOBREAK", 1))
4318 {
4319 spin->si_nobreak = TRUE;
4320 }
4321- else if (STRCMP(items[0], "NOSPLITSUGS") == 0 && itemcnt == 1)
4322+ else if (is_aff_rule(items, itemcnt, "NOSPLITSUGS", 1))
4323 {
4324 spin->si_nosplitsugs = TRUE;
4325 }
4326- else if (STRCMP(items[0], "NOSUGFILE") == 0 && itemcnt == 1)
4327+ else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1))
4328 {
4329 spin->si_nosugfile = TRUE;
4330 }
4331- else if (STRCMP(items[0], "PFXPOSTPONE") == 0 && itemcnt == 1)
4332+ else if (is_aff_rule(items, itemcnt, "PFXPOSTPONE", 1))
4333 {
4334 aff->af_pfxpostpone = TRUE;
4335 }
4336@@ -5771,24 +5943,20 @@
4337 }
4338 }
4339 }
4340- else if (STRCMP(items[0], "FOL") == 0 && itemcnt == 2
4341- && fol == NULL)
4342+ else if (is_aff_rule(items, itemcnt, "FOL", 2) && fol == NULL)
4343 {
4344 fol = vim_strsave(items[1]);
4345 }
4346- else if (STRCMP(items[0], "LOW") == 0 && itemcnt == 2
4347- && low == NULL)
4348+ else if (is_aff_rule(items, itemcnt, "LOW", 2) && low == NULL)
4349 {
4350 low = vim_strsave(items[1]);
4351 }
4352- else if (STRCMP(items[0], "UPP") == 0 && itemcnt == 2
4353- && upp == NULL)
4354+ else if (is_aff_rule(items, itemcnt, "UPP", 2) && upp == NULL)
4355 {
4356 upp = vim_strsave(items[1]);
4357 }
4358- else if ((STRCMP(items[0], "REP") == 0
4359- || STRCMP(items[0], "REPSAL") == 0)
4360- && itemcnt == 2)
4361+ else if (is_aff_rule(items, itemcnt, "REP", 2)
4362+ || is_aff_rule(items, itemcnt, "REPSAL", 2))
4363 {
4364 /* Ignore REP/REPSAL count */;
4365 if (!isdigit(*items[1]))
4366@@ -5819,7 +5987,7 @@
4367 : &spin->si_rep, items[1], items[2]);
4368 }
4369 }
4370- else if (STRCMP(items[0], "MAP") == 0 && itemcnt == 2)
4371+ else if (is_aff_rule(items, itemcnt, "MAP", 2))
4372 {
4373 /* MAP item or count */
4374 if (!found_map)
4375@@ -5856,9 +6024,8 @@
4376 ga_append(&spin->si_map, '/');
4377 }
4378 }
4379- /* Accept "SAL from to" and "SAL from to # comment". */
4380- else if (STRCMP(items[0], "SAL") == 0
4381- && (itemcnt == 3 || (itemcnt > 3 && items[3][0] == '#')))
4382+ /* Accept "SAL from to" and "SAL from to #comment". */
4383+ else if (is_aff_rule(items, itemcnt, "SAL", 3))
4384 {
4385 if (do_sal)
4386 {
4387@@ -5877,12 +6044,12 @@
4388 : items[2]);
4389 }
4390 }
4391- else if (STRCMP(items[0], "SOFOFROM") == 0 && itemcnt == 2
4392+ else if (is_aff_rule(items, itemcnt, "SOFOFROM", 2)
4393 && sofofrom == NULL)
4394 {
4395 sofofrom = getroom_save(spin, items[1]);
4396 }
4397- else if (STRCMP(items[0], "SOFOTO") == 0 && itemcnt == 2
4398+ else if (is_aff_rule(items, itemcnt, "SOFOTO", 2)
4399 && sofoto == NULL)
4400 {
4401 sofoto = getroom_save(spin, items[1]);
4402@@ -5980,7 +6147,7 @@
4403 else if (spin->si_newprefID == 0 || spin->si_newprefID == 127)
4404 MSG(_("Too many compound flags"));
4405 else
4406- MSG(_("Too many posponed prefixes and/or compound flags"));
4407+ MSG(_("Too many postponed prefixes and/or compound flags"));
4408 }
4409
4410 if (syllable != NULL)
4411@@ -6017,6 +6184,22 @@
4412 }
4413
4414 /*
4415+ * Return TRUE when items[0] equals "rulename", there are "mincount" items or
4416+ * a comment is following after item "mincount".
4417+ */
4418+ static int
4419+is_aff_rule(items, itemcnt, rulename, mincount)
4420+ char_u **items;
4421+ int itemcnt;
4422+ char *rulename;
4423+ int mincount;
4424+{
4425+ return (STRCMP(items[0], rulename) == 0
4426+ && (itemcnt == mincount
4427+ || (itemcnt > mincount && items[mincount][0] == '#')));
4428+}
4429+
4430+/*
4431 * For affix "entry" move COMPOUNDFORBIDFLAG and COMPOUNDPERMITFLAG from
4432 * ae_flags to ae_comppermit and ae_compforbid.
4433 */
4434@@ -7926,6 +8109,8 @@
4435 char_u *p;
4436 int rr;
4437 int retval = OK;
4438+ size_t fwv = 1; /* collect return value of fwrite() to avoid
4439+ warnings from picky compiler */
4440
4441 fd = mch_fopen((char *)fname, "w");
4442 if (fd == NULL)
4443@@ -7936,11 +8121,11 @@
4444
4445 /* <HEADER>: <fileID> <versionnr> */
4446 /* <fileID> */
4447- if (fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd) != 1)
4448- {
4449- EMSG(_(e_write));
4450- retval = FAIL;
4451- }
4452+ fwv &= fwrite(VIMSPELLMAGIC, VIMSPELLMAGICL, (size_t)1, fd);
4453+ if (fwv != (size_t)1)
4454+ /* Catch first write error, don't try writing more. */
4455+ goto theend;
4456+
4457 putc(VIMSPELLVERSION, fd); /* <versionnr> */
4458
4459 /*
4460@@ -7955,7 +8140,7 @@
4461
4462 i = (int)STRLEN(spin->si_info);
4463 put_bytes(fd, (long_u)i, 4); /* <sectionlen> */
4464- fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */
4465+ fwv &= fwrite(spin->si_info, (size_t)i, (size_t)1, fd); /* <infotext> */
4466 }
4467
4468 /* SN_REGION: <regionname> ...
4469@@ -7966,7 +8151,7 @@
4470 putc(SNF_REQUIRED, fd); /* <sectionflags> */
4471 l = spin->si_region_count * 2;
4472 put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
4473- fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd);
4474+ fwv &= fwrite(spin->si_region_name, (size_t)l, (size_t)1, fd);
4475 /* <regionname> ... */
4476 regionmask = (1 << spin->si_region_count) - 1;
4477 }
4478@@ -8016,7 +8201,7 @@
4479 }
4480
4481 put_bytes(fd, (long_u)l, 2); /* <folcharslen> */
4482- fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */
4483+ fwv &= fwrite(folchars, (size_t)l, (size_t)1, fd); /* <folchars> */
4484 }
4485
4486 /* SN_MIDWORD: <midword> */
4487@@ -8027,7 +8212,8 @@
4488
4489 i = (int)STRLEN(spin->si_midword);
4490 put_bytes(fd, (long_u)i, 4); /* <sectionlen> */
4491- fwrite(spin->si_midword, (size_t)i, (size_t)1, fd); /* <midword> */
4492+ fwv &= fwrite(spin->si_midword, (size_t)i, (size_t)1, fd);
4493+ /* <midword> */
4494 }
4495
4496 /* SN_PREFCOND: <prefcondcnt> <prefcond> ... */
4497@@ -8113,7 +8299,8 @@
4498 p = rr == 1 ? ftp->ft_from : ftp->ft_to;
4499 l = (int)STRLEN(p);
4500 putc(l, fd);
4501- fwrite(p, l, (size_t)1, fd);
4502+ if (l > 0)
4503+ fwv &= fwrite(p, l, (size_t)1, fd);
4504 }
4505 }
4506
4507@@ -8131,11 +8318,11 @@
4508 /* <sectionlen> */
4509
4510 put_bytes(fd, (long_u)l, 2); /* <sofofromlen> */
4511- fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */
4512+ fwv &= fwrite(spin->si_sofofr, l, (size_t)1, fd); /* <sofofrom> */
4513
4514 l = (int)STRLEN(spin->si_sofoto);
4515 put_bytes(fd, (long_u)l, 2); /* <sofotolen> */
4516- fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */
4517+ fwv &= fwrite(spin->si_sofoto, l, (size_t)1, fd); /* <sofoto> */
4518 }
4519
4520 /* SN_WORDS: <word> ...
4521@@ -8160,7 +8347,7 @@
4522 l = (int)STRLEN(hi->hi_key) + 1;
4523 len += l;
4524 if (round == 2) /* <word> */
4525- fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
4526+ fwv &= fwrite(hi->hi_key, (size_t)l, (size_t)1, fd);
4527 --todo;
4528 }
4529 if (round == 1)
4530@@ -8176,7 +8363,7 @@
4531 putc(0, fd); /* <sectionflags> */
4532 l = spin->si_map.ga_len;
4533 put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
4534- fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);
4535+ fwv &= fwrite(spin->si_map.ga_data, (size_t)l, (size_t)1, fd);
4536 /* <mapstr> */
4537 }
4538
4539@@ -8232,10 +8419,11 @@
4540 {
4541 p = ((char_u **)(spin->si_comppat.ga_data))[i];
4542 putc((int)STRLEN(p), fd); /* <comppatlen> */
4543- fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);/* <comppattext> */
4544+ fwv &= fwrite(p, (size_t)STRLEN(p), (size_t)1, fd);
4545+ /* <comppattext> */
4546 }
4547 /* <compflags> */
4548- fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),
4549+ fwv &= fwrite(spin->si_compflags, (size_t)STRLEN(spin->si_compflags),
4550 (size_t)1, fd);
4551 }
4552
4553@@ -8259,7 +8447,8 @@
4554
4555 l = (int)STRLEN(spin->si_syllable);
4556 put_bytes(fd, (long_u)l, 4); /* <sectionlen> */
4557- fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd); /* <syllable> */
4558+ fwv &= fwrite(spin->si_syllable, (size_t)l, (size_t)1, fd);
4559+ /* <syllable> */
4560 }
4561
4562 /* end of <SECTIONS> */
4563@@ -8295,13 +8484,18 @@
4564 (void)put_node(fd, tree, 0, regionmask, round == 3);
4565 }
4566
4567- /* Write another byte to check for errors. */
4568+ /* Write another byte to check for errors (file system full). */
4569 if (putc(0, fd) == EOF)
4570 retval = FAIL;
4571-
4572+theend:
4573 if (fclose(fd) == EOF)
4574 retval = FAIL;
4575
4576+ if (fwv != (size_t)1)
4577+ retval = FAIL;
4578+ if (retval == FAIL)
4579+ EMSG(_(e_write));
4580+
4581 return retval;
4582 }
4583
4584@@ -9890,6 +10084,7 @@
4585 char_u *p;
4586 int len;
4587 int totlen;
4588+ size_t x = 1; /* collect return value of fwrite() */
4589
4590 if (fd != NULL)
4591 put_bytes(fd, (long_u)gap->ga_len, 2); /* <prefcondcnt> */
4592@@ -9906,7 +10101,7 @@
4593 if (fd != NULL)
4594 {
4595 fputc(len, fd);
4596- fwrite(p, (size_t)len, (size_t)1, fd);
4597+ x &= fwrite(p, (size_t)len, (size_t)1, fd);
4598 }
4599 totlen += len;
4600 }
4601@@ -11480,15 +11675,24 @@
4602 vim_strncpy(preword + sp->ts_prewordlen,
4603 tword + sp->ts_splitoff,
4604 sp->ts_twordlen - sp->ts_splitoff);
4605- p = preword;
4606- while (*skiptowhite(p) != NUL)
4607- p = skipwhite(skiptowhite(p));
4608- if (fword_ends && !can_compound(slang, p,
4609- compflags + sp->ts_compsplit))
4610- /* Compound is not allowed. But it may still be
4611- * possible if we add another (short) word. */
4612+
4613+ /* Verify CHECKCOMPOUNDPATTERN rules. */
4614+ if (match_checkcompoundpattern(preword, sp->ts_prewordlen,
4615+ &slang->sl_comppat))
4616 compound_ok = FALSE;
4617
4618+ if (compound_ok)
4619+ {
4620+ p = preword;
4621+ while (*skiptowhite(p) != NUL)
4622+ p = skipwhite(skiptowhite(p));
4623+ if (fword_ends && !can_compound(slang, p,
4624+ compflags + sp->ts_compsplit))
4625+ /* Compound is not allowed. But it may still be
4626+ * possible if we add another (short) word. */
4627+ compound_ok = FALSE;
4628+ }
4629+
4630 /* Get pointer to last char of previous word. */
4631 p = preword + sp->ts_prewordlen;
4632 mb_ptr_back(preword, p);
4633@@ -11685,10 +11889,9 @@
4634 && (slang->sl_compsylmax < MAXWLEN
4635 || sp->ts_complen + 1 - sp->ts_compsplit
4636 < slang->sl_compmax)
4637- && (byte_in_str(sp->ts_complen == sp->ts_compsplit
4638- ? slang->sl_compstartflags
4639- : slang->sl_compallflags,
4640- ((unsigned)flags >> 24))))
4641+ && (can_be_compound(sp, slang,
4642+ compflags, ((unsigned)flags >> 24))))
4643+
4644 {
4645 try_compound = TRUE;
4646 compflags[sp->ts_complen] = ((unsigned)flags >> 24);
4647diff -Naur vim72.orig/src/structs.h vim72/src/structs.h
4648--- vim72.orig/src/structs.h 2008-07-30 13:02:50.000000000 -0700
4649+++ vim72/src/structs.h 2008-12-30 16:16:21.000000000 -0800
4650@@ -459,7 +459,7 @@
4651 typedef struct
4652 {
4653 int hide; /* TRUE when ":hide" was used */
4654-# ifdef FEAT_BROWSE
4655+# ifdef FEAT_BROWSE_CMD
4656 int browse; /* TRUE to invoke file dialog */
4657 # endif
4658 # ifdef FEAT_WINDOWS
4659@@ -1784,10 +1784,15 @@
4660 #endif
4661
4662 /*
4663- * The next three specify the offsets for displaying the buffer:
4664+ * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for
4665+ * displaying the buffer.
4666 */
4667 linenr_T w_topline; /* buffer line number of the line at the
4668 top of the window */
4669+#ifdef FEAT_AUTOCMD
4670+ char w_topline_was_set; /* flag set to TRUE when topline is set,
4671+ e.g. by winrestview() */
4672+#endif
4673 #ifdef FEAT_DIFF
4674 int w_topfill; /* number of filler lines above w_topline */
4675 int w_old_topfill; /* w_topfill at last redraw */
4676diff -Naur vim72.orig/src/tag.c vim72/src/tag.c
4677--- vim72.orig/src/tag.c 2008-07-16 14:31:30.000000000 -0700
4678+++ vim72/src/tag.c 2008-12-30 16:17:42.000000000 -0800
4679@@ -2725,7 +2725,24 @@
4680 */
4681 p_7f = vim_strchr(lbuf, 0x7f);
4682 if (p_7f == NULL)
4683+ {
4684+etag_fail:
4685+ if (vim_strchr(lbuf, '\n') == NULL)
4686+ {
4687+ /* Truncated line. Ignore it. */
4688+ if (p_verbose >= 5)
4689+ {
4690+ verbose_enter();
4691+ MSG(_("Ignoring long line in tags file"));
4692+ verbose_leave();
4693+ }
4694+ tagp->command = lbuf;
4695+ tagp->tagname = lbuf;
4696+ tagp->tagname_end = lbuf;
4697+ return OK;
4698+ }
4699 return FAIL;
4700+ }
4701
4702 /* Find ^A. If not found the line number is after the 0x7f */
4703 p = vim_strchr(p_7f, Ctrl_A);
4704@@ -2735,7 +2752,7 @@
4705 ++p;
4706
4707 if (!VIM_ISDIGIT(*p)) /* check for start of line number */
4708- return FAIL;
4709+ goto etag_fail;
4710 tagp->command = p;
4711
4712
4713@@ -2749,7 +2766,7 @@
4714 /* find end of tagname */
4715 for (p = p_7f - 1; !vim_iswordc(*p); --p)
4716 if (p == lbuf)
4717- return FAIL;
4718+ goto etag_fail;
4719 tagp->tagname_end = p + 1;
4720 while (p >= lbuf && vim_iswordc(*p))
4721 --p;
4722diff -Naur vim72.orig/src/testdir/Make_ming.mak vim72/src/testdir/Make_ming.mak
4723--- vim72.orig/src/testdir/Make_ming.mak 1969-12-31 16:00:00.000000000 -0800
4724+++ vim72/src/testdir/Make_ming.mak 2008-12-30 16:15:18.000000000 -0800
4725@@ -0,0 +1,91 @@
4726+# Makefile to run tests for Vim, on Dos-like machines
4727+# with sh.exe or zsh.exe in the path or not.
4728+#
4729+# Author: Bill McCarthy
4730+#
4731+# Note that test54 has been removed until it is fixed.
4732+#
4733+# Requires a set of Unix tools: echo, diff, etc.
4734+
4735+ifneq (sh.exe, $(SHELL))
4736+DEL = rm -f
4737+MV = mv
4738+CP = cp
4739+DIRSLASH = /
4740+else
4741+DEL = del
4742+MV = rename
4743+CP = copy
4744+DIRSLASH = \\
4745+endif
4746+
4747+VIMPROG = ..$(DIRSLASH)vim
4748+
4749+# Omitted:
4750+# test2 "\\tmp" doesn't work.
4751+# test10 'errorformat' is different
4752+# test12 can't unlink a swap file
4753+# test25 uses symbolic link
4754+# test27 can't edit file with "*" in file name
4755+# test31 16 bit version runs out of memory...
4756+
4757+SCRIPTS16 = test1.out test19.out test20.out test22.out \
4758+ test23.out test24.out test28.out test29.out \
4759+ test35.out test36.out test43.out \
4760+ test44.out test45.out test46.out test47.out \
4761+ test48.out test51.out test53.out \
4762+ test55.out test56.out test57.out test58.out test59.out \
4763+ test60.out test61.out test62.out test63.out test64.out
4764+
4765+# Had to remove test54 which doesn't work yet.
4766+# test54.out
4767+
4768+SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
4769+ test8.out test9.out test11.out test13.out test14.out \
4770+ test15.out test17.out test18.out test21.out test26.out \
4771+ test30.out test31.out test32.out test33.out test34.out \
4772+ test37.out test38.out test39.out test40.out test41.out \
4773+ test42.out test52.out test65.out
4774+
4775+SCRIPTS32 = test50.out
4776+
4777+SCRIPTS_GUI = test16.out
4778+
4779+.SUFFIXES: .in .out
4780+
4781+vimall: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS32)
4782+ echo ALL DONE
4783+
4784+nongui: fixff $(SCRIPTS16) $(SCRIPTS)
4785+ echo ALL DONE
4786+
4787+small:
4788+ echo ALL DONE
4789+
4790+gui: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI)
4791+ echo ALL DONE
4792+
4793+win32: fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS32)
4794+ echo ALL DONE
4795+
4796+fixff:
4797+ -$(VIMPROG) -u dos.vim --noplugin "+argdo set ff=dos|upd" +q *.in *.ok
4798+
4799+clean:
4800+ -$(DEL) *.out
4801+ -$(DEL) test.ok
4802+ -$(DEL) small.vim
4803+ -$(DEL) tiny.vim
4804+ -$(DEL) mbyte.vim
4805+ -$(DEL) X*
4806+ -$(DEL) viminfo
4807+
4808+.in.out:
4809+ $(CP) $*.ok test.ok
4810+ $(VIMPROG) -u dos.vim -U NONE --noplugin -s dotest.in $*.in
4811+ diff test.out $*.ok
4812+ -$(DEL) $*.out
4813+ $(MV) test.out $*.out
4814+ -$(DEL) X*
4815+ -$(DEL) test.ok
4816+ -$(DEL) viminfo
4817diff -Naur vim72.orig/src/testdir/Makefile vim72/src/testdir/Makefile
4818--- vim72.orig/src/testdir/Makefile 2008-06-19 13:29:46.000000000 -0700
4819+++ vim72/src/testdir/Makefile 2008-12-30 16:14:55.000000000 -0800
4820@@ -26,15 +26,17 @@
4821
4822 .SUFFIXES: .in .out
4823
4824-nongui: nolog $(SCRIPTS)
4825- @echo
4826- @cat test.log
4827- @echo ALL DONE
4828+nongui: nolog $(SCRIPTS) report
4829+
4830+gui: nolog $(SCRIPTS) $(SCRIPTS_GUI) report
4831
4832-gui: nolog $(SCRIPTS) $(SCRIPTS_GUI)
4833+report:
4834 @echo
4835- @cat test.log
4836- @echo ALL DONE
4837+ @echo 'Test results:'
4838+ @/bin/sh -c "if test -f test.log; \
4839+ then cat test.log; echo TEST FAILURE; exit 1; \
4840+ else echo ALL DONE; \
4841+ fi"
4842
4843 $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
4844
4845@@ -71,4 +73,4 @@
4846 test60.out: test60.vim
4847
4848 nolog:
4849- -echo Test results: >test.log
4850+ -rm -f test.log
4851diff -Naur vim72.orig/src/testdir/test42.ok vim72/src/testdir/test42.ok
4852--- vim72.orig/src/testdir/test42.ok 2008-02-20 04:27:37.000000000 -0800
4853+++ vim72/src/testdir/test42.ok 2008-12-30 16:15:53.000000000 -0800
4854@@ -20,7 +20,7 @@
4855 ucs-2
4856
4857
4858- fileencoding=ucs-2le
4859+ fileencoding=utf-16le
4860 bomb
4861 ucs-2le
4862
4863diff -Naur vim72.orig/src/ui.c vim72/src/ui.c
4864--- vim72.orig/src/ui.c 2008-07-14 11:14:56.000000000 -0700
4865+++ vim72/src/ui.c 2008-12-30 16:17:03.000000000 -0800
4866@@ -1820,7 +1820,7 @@
4867 #ifdef HAVE_DUP
4868 /* Use stderr for stdin, also works for shell commands. */
4869 close(0);
4870- dup(2);
4871+ ignored = dup(2);
4872 #else
4873 read_cmd_fd = 2; /* read from stderr instead of stdin */
4874 #endif
4875@@ -2020,7 +2020,7 @@
4876
4877 if (value == NULL || *length == 0)
4878 {
4879- clip_free_selection(cbd); /* ??? [what's the query?] */
4880+ clip_free_selection(cbd); /* nothing received, clear register */
4881 *(int *)success = FALSE;
4882 return;
4883 }
4884@@ -2076,7 +2076,7 @@
4885 text_prop.value = (unsigned char *)value;
4886 text_prop.encoding = *type;
4887 text_prop.format = *format;
4888- text_prop.nitems = STRLEN(value);
4889+ text_prop.nitems = len;
4890 status = XmbTextPropertyToTextList(X_DISPLAY, &text_prop,
4891 &text_list, &n_text);
4892 if (status != Success || n_text < 1)
4893@@ -2110,6 +2110,8 @@
4894 int i;
4895 int nbytes = 0;
4896 char_u *buffer;
4897+ time_t start_time;
4898+ int timed_out = FALSE;
4899
4900 for (i =
4901 #ifdef FEAT_MBYTE
4902@@ -2129,6 +2131,7 @@
4903 case 3: type = text_atom; break;
4904 default: type = XA_STRING;
4905 }
4906+ success = MAYBE;
4907 XtGetSelectionValue(myShell, cbd->sel_atom, type,
4908 clip_x11_request_selection_cb, (XtPointer)&success, CurrentTime);
4909
4910@@ -2141,27 +2144,48 @@
4911 * characters, then they will appear before the one that requested the
4912 * paste! Don't worry, we will catch up with any other events later.
4913 */
4914- for (;;)
4915+ start_time = time(NULL);
4916+ while (success == MAYBE)
4917 {
4918- if (XCheckTypedEvent(dpy, SelectionNotify, &event))
4919- break;
4920- if (XCheckTypedEvent(dpy, SelectionRequest, &event))
4921- /* We may get a SelectionRequest here and if we don't handle
4922- * it we hang. KDE klipper does this, for example. */
4923+ if (XCheckTypedEvent(dpy, SelectionNotify, &event)
4924+ || XCheckTypedEvent(dpy, SelectionRequest, &event)
4925+ || XCheckTypedEvent(dpy, PropertyNotify, &event))
4926+ {
4927+ /* This is where clip_x11_request_selection_cb() should be
4928+ * called. It may actually happen a bit later, so we loop
4929+ * until "success" changes.
4930+ * We may get a SelectionRequest here and if we don't handle
4931+ * it we hang. KDE klipper does this, for example.
4932+ * We need to handle a PropertyNotify for large selections. */
4933 XtDispatchEvent(&event);
4934+ continue;
4935+ }
4936+
4937+ /* Time out after 2 to 3 seconds to avoid that we hang when the
4938+ * other process doesn't respond. Note that the SelectionNotify
4939+ * event may still come later when the selection owner comes back
4940+ * to life and the text gets inserted unexpectedly. Don't know
4941+ * why that happens or how to avoid that :-(. */
4942+ if (time(NULL) > start_time + 2)
4943+ {
4944+ timed_out = TRUE;
4945+ break;
4946+ }
4947
4948 /* Do we need this? Probably not. */
4949 XSync(dpy, False);
4950
4951- /* Bernhard Walle solved a slow paste response in an X terminal by
4952- * adding: usleep(10000); here. */
4953+ /* Wait for 1 msec to avoid that we eat up all CPU time. */
4954+ ui_delay(1L, TRUE);
4955 }
4956
4957- /* this is where clip_x11_request_selection_cb() is actually called */
4958- XtDispatchEvent(&event);
4959-
4960- if (success)
4961+ if (success == TRUE)
4962 return;
4963+
4964+ /* don't do a retry with another type after timing out, otherwise we
4965+ * hang for 15 seconds. */
4966+ if (timed_out)
4967+ break;
4968 }
4969
4970 /* Final fallback position - use the X CUT_BUFFER0 store */
4971diff -Naur vim72.orig/src/version.c vim72/src/version.c
4972--- vim72.orig/src/version.c 2008-08-09 07:24:52.000000000 -0700
4973+++ vim72/src/version.c 2008-12-30 16:18:07.000000000 -0800
4974@@ -677,9 +677,160 @@
4975 static int included_patches[] =
4976 { /* Add new patch number below this line */
4977 /**/
4978+ 76,
4979+/**/
4980+ 75,
4981+/**/
4982+ 73,
4983+/**/
4984+ 70,
4985+/**/
4986+ 69,
4987+/**/
4988+ 68,
4989+/**/
4990+ 67,
4991+/**/
4992+ 66,
4993+/**/
4994+ 65,
4995+/**/
4996+ 64,
4997+/**/
4998+ 63,
4999+/**/
5000+ 62,
5001+/**/
5002+ 61,
5003+/**/
5004+ 60,
5005+/**/
5006+ 59,
5007+/**/
5008+ 58,
5009+/**/
5010+ 57,
5011+/**/
5012+ 56,
5013+/**/
5014+ 55,
5015+/**/
5016+ 54,
5017+/**/
5018+ 53,
5019+/**/
5020+ 52,
5021+/**/
5022+ 51,
5023+/**/
5024+ 50,
5025+/**/
5026+ 48,
5027+/**/
5028+ 47,
5029+/**/
5030+ 46,
5031+/**/
5032+ 45,
5033+/**/
5034+ 44,
5035+/**/
5036+ 43,
5037+/**/
5038+ 42,
5039+/**/
5040+ 40,
5041+/**/
5042+ 39,
5043+/**/
5044+ 38,
5045+/**/
5046+ 37,
5047+/**/
5048+ 35,
5049+/**/
5050+ 34,
5051+/**/
5052+ 33,
5053+/**/
5054+ 32,
5055+/**/
5056+ 31,
5057+/**/
5058+ 30,
5059+/**/
5060+ 29,
5061+/**/
5062+ 28,
5063+/**/
5064+ 27,
5065+/**/
5066+ 26,
5067+/**/
5068+ 25,
5069+/**/
5070+ 24,
5071+/**/
5072+ 23,
5073+/**/
5074+ 22,
5075+/**/
5076+ 21,
5077+/**/
5078+ 20,
5079+/**/
5080+ 19,
5081+/**/
5082+ 18,
5083+/**/
5084+ 17,
5085+/**/
5086+ 16,
5087+/**/
5088+ 15,
5089+/**/
5090+ 14,
5091+/**/
5092+ 13,
5093+/**/
5094+ 12,
5095+/**/
5096+ 11,
5097+/**/
5098+ 10,
5099+/**/
5100+ 9,
5101+/**/
5102+ 8,
5103+/**/
5104+ 6,
5105+/**/
5106+ 5,
5107+/**/
5108+ 4,
5109+/**/
5110+ 3,
5111+/**/
5112+ 2,
5113+/**/
5114+ 1,
5115+/**/
5116 0
5117 };
5118
5119+/*
5120+ * Place to put a short description when adding a feature with a patch.
5121+ * Keep it short, e.g.,: "relative numbers", "persistent undo".
5122+ * Also add a comment marker to separate the lines.
5123+ * See the official Vim patches for the diff format: It must use a context of
5124+ * one line only. Create it by hand or use "diff -C2" and edit the patch.
5125+ */
5126+static char *(extra_patches[]) =
5127+{ /* Add your patch description below this line */
5128+/**/
5129+ NULL
5130+};
5131+
5132 int
5133 highest_patch()
5134 {
5135@@ -786,7 +937,7 @@
5136 MSG_PUTS(_("\nRISC OS version"));
5137 #endif
5138 #ifdef VMS
5139- MSG_PUTS("\nOpenVMS version");
5140+ MSG_PUTS(_("\nOpenVMS version"));
5141 # ifdef HAVE_PATHDEF
5142 if (*compiled_arch != NUL)
5143 {
5144@@ -825,6 +976,19 @@
5145 }
5146 }
5147
5148+ /* Print the list of extra patch descriptions if there is at least one. */
5149+ if (extra_patches[0] != NULL)
5150+ {
5151+ MSG_PUTS(_("\nExtra patches: "));
5152+ s = "";
5153+ for (i = 0; extra_patches[i] != NULL; ++i)
5154+ {
5155+ MSG_PUTS(s);
5156+ s = ", ";
5157+ MSG_PUTS(extra_patches[i]);
5158+ }
5159+ }
5160+
5161 #ifdef MODIFIED_BY
5162 MSG_PUTS("\n");
5163 MSG_PUTS(_("Modified by "));
5164diff -Naur vim72.orig/src/vim.h vim72/src/vim.h
5165--- vim72.orig/src/vim.h 2008-08-09 09:03:38.000000000 -0700
5166+++ vim72/src/vim.h 2008-12-30 16:16:37.000000000 -0800
5167@@ -341,8 +341,14 @@
5168 #ifdef BACKSLASH_IN_FILENAME
5169 # define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`%#'\"|!<")
5170 #else
5171-# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
5172-# define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
5173+# ifdef VMS
5174+ /* VMS allows a lot of characters in the file name */
5175+# define PATH_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'\"|!")
5176+# define SHELL_ESC_CHARS ((char_u *)" \t\n*?{`\\%#'|!()&")
5177+# else
5178+# define PATH_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<")
5179+# define SHELL_ESC_CHARS ((char_u *)" \t\n*?[{`$\\%#'\"|!<>();&")
5180+# endif
5181 #endif
5182
5183 #define NUMBUFLEN 30 /* length of a buffer to store a number in ASCII */
5184@@ -370,7 +376,7 @@
5185 * Define __w64 as an empty token for everything but MSVC 7.x or later.
5186 */
5187 # if !defined(_MSC_VER) || (_MSC_VER < 1300)
5188-# define __w64
5189+# define __w64
5190 # endif
5191 typedef unsigned long __w64 long_u;
5192 typedef long __w64 long_i;
5193@@ -1728,7 +1734,8 @@
5194 #define VV_MOUSE_COL 51
5195 #define VV_OP 52
5196 #define VV_SEARCHFORWARD 53
5197-#define VV_LEN 54 /* number of v: vars */
5198+#define VV_OLDFILES 54
5199+#define VV_LEN 55 /* number of v: vars */
5200
5201 #ifdef FEAT_CLIPBOARD
5202
5203@@ -1979,6 +1986,9 @@
5204 # endif
5205 #endif
5206
5207+#ifndef FEAT_NETBEANS_INTG
5208+# undef NBDEBUG
5209+#endif
5210 #ifdef NBDEBUG /* Netbeans debugging. */
5211 # include "nbdebug.h"
5212 #else
5213@@ -2054,4 +2064,10 @@
5214 #define DOSO_VIMRC 1 /* loading vimrc file */
5215 #define DOSO_GVIMRC 2 /* loading gvimrc file */
5216
5217+/* flags for read_viminfo() and children */
5218+#define VIF_WANT_INFO 1 /* load non-mark info */
5219+#define VIF_WANT_MARKS 2 /* load file marks */
5220+#define VIF_FORCEIT 4 /* overwrite info already read */
5221+#define VIF_GET_OLDFILES 8 /* load v:oldfiles */
5222+
5223 #endif /* VIM__H */
5224diff -Naur vim72.orig/src/window.c vim72/src/window.c
5225--- vim72.orig/src/window.c 2008-08-06 04:00:30.000000000 -0700
5226+++ vim72/src/window.c 2008-12-30 16:17:03.000000000 -0800
5227@@ -4028,14 +4028,14 @@
5228 if (mch_dirname(cwd, MAXPATHL) == OK)
5229 globaldir = vim_strsave(cwd);
5230 }
5231- mch_chdir((char *)curwin->w_localdir);
5232- shorten_fnames(TRUE);
5233+ if (mch_chdir((char *)curwin->w_localdir) == 0)
5234+ shorten_fnames(TRUE);
5235 }
5236 else if (globaldir != NULL)
5237 {
5238 /* Window doesn't have a local directory and we are not in the global
5239 * directory: Change to the global directory. */
5240- mch_chdir((char *)globaldir);
5241+ ignored = mch_chdir((char *)globaldir);
5242 vim_free(globaldir);
5243 globaldir = NULL;
5244 shorten_fnames(TRUE);
5245diff -Naur vim72.orig/src/workshop.c vim72/src/workshop.c
5246--- vim72.orig/src/workshop.c 2008-06-21 11:53:26.000000000 -0700
5247+++ vim72/src/workshop.c 2008-12-30 16:16:56.000000000 -0800
5248@@ -1121,8 +1121,12 @@
5249 ? (char *)curbuf->b_sfname : "<None>");
5250 #endif
5251
5252- strcpy(ffname, (char *) curbuf->b_ffname);
5253- *filename = ffname; /* copy so nobody can change b_ffname */
5254+ if (curbuf->b_ffname == NULL)
5255+ ffname[0] = NUL;
5256+ else
5257+ /* copy so nobody can change b_ffname */
5258+ strcpy(ffname, (char *) curbuf->b_ffname);
5259+ *filename = ffname;
5260 *curLine = curwin->w_cursor.lnum;
5261 *curCol = curwin->w_cursor.col;
5262
Note: See TracBrowser for help on using the repository browser.