source: patches/vim-7.2-branch_update-5.patch@ a9a7398

clfs-1.2 clfs-2.1 clfs-3.0.0-systemd clfs-3.0.0-sysvinit systemd sysvinit
Last change on this file since a9a7398 was 7352c10, checked in by Jim Gifford <clfs@…>, 16 years ago

Added: vim-7.2-branch_update-5.patch

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