source: patches/vim-7.3-branch_update-1.patch@ d10f81a

Last change on this file since d10f81a was 6c5a343, checked in by Joe Ciccone <jciccone@…>, 14 years ago

Update Vim to 7.3.

  • Property mode set to 100644
File size: 216.7 KB
RevLine 
[6c5a343]1Submitted By: Joe Ciccone <jciccone@gmail.com>
2Date: 01-08-2010
3Initial Package Version: 7.3
4Origin: Upstream
5Upstream Status: From Upstream
6Description: Contains all upstream patches between 7.3.001 and 7.3.099
7
8diff -Naur vim73.orig/runtime/doc/eval.txt vim73/runtime/doc/eval.txt
9--- vim73.orig/runtime/doc/eval.txt 2010-08-15 08:23:20.000000000 -0400
10+++ vim73/runtime/doc/eval.txt 2011-01-08 21:01:18.986656145 -0500
11@@ -1657,6 +1657,15 @@
12 *v:warningmsg* *warningmsg-variable*
13 v:warningmsg Last given warning message. It's allowed to set this variable.
14
15+ *v:windowid* *windowid-variable*
16+v:windowid When any X11 based GUI is running or when running in a
17+ terminal and Vim connects to the X server (|-X|) this will be
18+ set to the window ID.
19+ When an MS-Windows GUI is running this will be set to the
20+ window handle.
21+ Otherwise the value is zero.
22+ Note: for windows inside Vim use |winnr()|.
23+
24 ==============================================================================
25 4. Builtin Functions *functions*
26
27@@ -1822,7 +1831,7 @@
28 log( {expr}) Float natural logarithm (base e) of {expr}
29 log10( {expr}) Float logarithm of Float {expr} to base 10
30 map( {expr}, {string}) List/Dict change each item in {expr} to {expr}
31-maparg( {name}[, {mode} [, {abbr}]])
32+maparg( {name}[, {mode} [, {abbr} [, {dict}]]])
33 String rhs of mapping {name} in mode {mode}
34 mapcheck( {name}[, {mode} [, {abbr}]])
35 String check for mappings matching {name}
36@@ -3966,23 +3975,51 @@
37 further items in {expr} are processed.
38
39
40-maparg({name}[, {mode} [, {abbr}]]) *maparg()*
41- Return the rhs of mapping {name} in mode {mode}. When there
42- is no mapping for {name}, an empty String is returned.
43+maparg({name}[, {mode} [, {abbr} [, {dict}]]]) *maparg()*
44+ When {dict} is omitted or zero: Return the rhs of mapping
45+ {name} in mode {mode}. The returned String has special
46+ characters translated like in the output of the ":map" command
47+ listing.
48+
49+ When there is no mapping for {name}, an empty String is
50+ returned.
51+
52+ The {name} can have special key names, like in the ":map"
53+ command.
54+
55 {mode} can be one of these strings:
56 "n" Normal
57- "v" Visual
58+ "v" Visual (including Select)
59 "o" Operator-pending
60 "i" Insert
61 "c" Cmd-line
62+ "s" Select
63+ "x" Visual
64 "l" langmap |language-mapping|
65 "" Normal, Visual and Operator-pending
66 When {mode} is omitted, the modes for "" are used.
67+
68 When {abbr} is there and it is non-zero use abbreviations
69 instead of mappings.
70- The {name} can have special key names, like in the ":map"
71- command. The returned String has special characters
72- translated like in the output of the ":map" command listing.
73+
74+ When {dict} is there and it is non-zero return a dictionary
75+ containing all the information of the mapping with the
76+ following items:
77+ "lhs" The {lhs} of the mapping.
78+ "rhs" The {rhs} of the mapping as typed.
79+ "silent" 1 for a |:map-silent| mapping, else 0.
80+ "noremap" 1 if the {rhs} of the mapping is remappable.
81+ "expr" 1 for an expression mapping (|:map-<expr>|).
82+ "buffer" 1 for a buffer local mapping (|:map-local|).
83+ "mode" Modes for which the mapping is defined. In
84+ addition to the modes mentioned above, these
85+ characters will be used:
86+ " " Normal, Visual and Operator-pending
87+ "!" Insert and Commandline mode
88+ (|mapmpde-ic|)
89+ "sid" the Script local ID, used for <sid> mappings
90+ (|<SID>|)
91+
92 The mappings local to the current buffer are checked first,
93 then the global mappings.
94 This function can be used to map a key even when it's already
95diff -Naur vim73.orig/runtime/doc/netbeans.txt vim73/runtime/doc/netbeans.txt
96--- vim73.orig/runtime/doc/netbeans.txt 2010-08-15 08:23:21.000000000 -0400
97+++ vim73/runtime/doc/netbeans.txt 2011-01-08 21:01:18.782656702 -0500
98@@ -1,4 +1,4 @@
99-*netbeans.txt* For Vim version 7.3. Last change: 2010 Jul 20
100+*netbeans.txt* For Vim version 7.3. Last change: 2010 Aug 20
101
102
103 VIM REFERENCE MANUAL by Gordon Prieur et al.
104@@ -118,7 +118,8 @@
105 uncommenting a line with "--disable-netbeans" in the Makefile.
106
107 Currently the NetBeans interface is supported by Vim running in a terminal and
108-by GVim when it is run with one of the following GUIs: GTK, GNOME, and Motif.
109+by GVim when it is run with one of the following GUIs: GTK, GNOME, Windows,
110+Athena and Motif.
111
112 If Motif support is required the user must supply XPM libraries. See
113 |workshop-xpm| for details on obtaining the latest version of XPM.
114diff -Naur vim73.orig/runtime/doc/options.txt vim73/runtime/doc/options.txt
115--- vim73.orig/runtime/doc/options.txt 2010-08-15 08:23:21.000000000 -0400
116+++ vim73/runtime/doc/options.txt 2011-01-08 21:01:19.258656350 -0500
117@@ -1434,6 +1434,15 @@
118 explicitly accessed using the "* notation. Also see
119 |gui-clipboard|.
120
121+ unnamedplus A variant of "unnamed" flag which uses the clipboard
122+ register '+' (|quoteplus|) instead of register '*' for
123+ all operations except yank. Yank shall copy the text
124+ into register '+' and also into '*' when "unnamed" is
125+ included.
126+ Only available with the |+x11| feature.
127+ Availability can be checked with: >
128+ if has('unnamedplus')
129+<
130 autoselect Works like the 'a' flag in 'guioptions': If present,
131 then whenever Visual mode is started, or the Visual
132 area extended, Vim tries to become the owner of the
133@@ -7530,8 +7539,9 @@
134 ! When included, save and restore global variables that start
135 with an uppercase letter, and don't contain a lowercase
136 letter. Thus "KEEPTHIS and "K_L_M" are stored, but "KeepThis"
137- and "_K_L_M" are not. Only String and Number types are
138- stored.
139+ and "_K_L_M" are not. Nested List and Dict items may not be
140+ read back correctly, you end up with a string representation
141+ instead.
142 " Maximum number of lines saved for each register. Old name of
143 the '<' item, with the disadvantage that you need to put a
144 backslash before the ", otherwise it will be recognized as the
145@@ -7747,6 +7757,17 @@
146 a pattern from the list. This avoids problems when a future version
147 uses another default.
148
149+
150+ *'wildignorecase* *'wic'* *'nowildignorecase* *'nowic'*
151+'wildignorecase' 'wic' boolean (default off)
152+ global
153+ {not in Vi}
154+ When set case is ignored when completing file names and directories.
155+ Has no effect on systems where file name case is generally ignored.
156+ Does not apply when the shell is used to expand wildcards, which
157+ happens when there are special characters.
158+
159+
160 *'wildmenu'* *'wmnu'* *'nowildmenu'* *'nowmnu'*
161 'wildmenu' 'wmnu' boolean (default off)
162 global
163diff -Naur vim73.orig/src/GvimExt/Make_ming.mak vim73/src/GvimExt/Make_ming.mak
164--- vim73.orig/src/GvimExt/Make_ming.mak 2010-05-15 07:04:10.000000000 -0400
165+++ vim73/src/GvimExt/Make_ming.mak 2011-01-08 21:01:19.490656530 -0500
166@@ -17,6 +17,17 @@
167 # check also the executables
168 MINGWOLD = no
169
170+# Link against the shared versions of libgcc/libstdc++ by default. Set
171+# STATIC_STDCPLUS to "yes" to link against static versions instead.
172+STATIC_STDCPLUS=no
173+#STATIC_STDCPLUS=yes
174+
175+# Note: -static-libstdc++ is not available until gcc 4.5.x.
176+LDFLAGS += -shared
177+ifeq (yes, $(STATIC_STDCPLUS))
178+LDFLAGS += -static-libgcc -static-libstdc++
179+endif
180+
181 ifeq ($(CROSS),yes)
182 DEL = rm
183 ifeq ($(MINGWOLD),yes)
184@@ -34,6 +45,8 @@
185 endif
186 CXX := $(CROSS_COMPILE)g++
187 WINDRES := $(CROSS_COMPILE)windres
188+WINDRES_CXX = $(CXX)
189+WINDRES_FLAGS = --preprocessor="$(WINDRES_CXX) -E -xc" -DRC_INVOKED
190 LIBS := -luuid
191 RES := gvimext.res
192 DEFFILE = gvimext_ming.def
193@@ -46,7 +59,7 @@
194 all: all-before $(DLL) all-after
195
196 $(DLL): $(OBJ) $(RES) $(DEFFILE)
197- $(CXX) -shared $(CXXFLAGS) -s -o $@ \
198+ $(CXX) $(LDFLAGS) $(CXXFLAGS) -s -o $@ \
199 -Wl,--enable-auto-image-base \
200 -Wl,--enable-auto-import \
201 -Wl,--whole-archive \
202@@ -58,7 +71,7 @@
203 $(CXX) $(CXXFLAGS) -DFEAT_GETTEXT -c $? -o $@
204
205 $(RES): gvimext_ming.rc
206- $(WINDRES) --input-format=rc --output-format=coff -DMING $? -o $@
207+ $(WINDRES) $(WINDRES_FLAGS) --input-format=rc --output-format=coff -DMING $? -o $@
208
209 clean: clean-custom
210 -$(DEL) $(OBJ) $(RES) $(DLL)
211diff -Naur vim73.orig/src/Make_cyg.mak vim73/src/Make_cyg.mak
212--- vim73.orig/src/Make_cyg.mak 2010-08-02 15:09:22.000000000 -0400
213+++ vim73/src/Make_cyg.mak 2011-01-08 21:01:19.102656144 -0500
214@@ -1,6 +1,6 @@
215 #
216 # Makefile for VIM on Win32, using Cygnus gcc
217-# Last updated by Dan Sharp. Last Change: 2010 Feb 24
218+# Last updated by Dan Sharp. Last Change: 2010 Nov 03
219 #
220 # Also read INSTALLpc.txt!
221 #
222@@ -27,6 +27,7 @@
223 # MZSCHEME_VER define to version of MzScheme being used (209_000)
224 # DYNAMIC_MZSCHEME no or yes: use yes to load the MzScheme DLLs dynamically (yes)
225 # MZSCHEME_DLLS path to MzScheme DLLs (libmzgc and libmzsch), for "static" build.
226+# MZSCHEME_USE_RACKET define to use "racket" instead of "mzsch".
227 # LUA define to path to Lua dir to get Lua support (not defined)
228 # LUA_VER define to version of Lua being used (51)
229 # DYNAMIC_LUA no or yes: use yes to load the Lua DLL dynamically (yes)
230@@ -254,16 +255,22 @@
231 MZSCHEME_GENERATE_BASE=no
232 endif
233
234+ifndef MZSCHEME_USE_RACKET
235+MZSCHEME_MAIN_LIB=mzsch
236+else
237+MZSCHEME_MAIN_LIB=racket
238+endif
239+
240 ifeq (yes, $(DYNAMIC_MZSCHEME))
241-DEFINES += -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
242+DEFINES += -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).dll\" -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
243 else
244 ifndef MZSCHEME_DLLS
245 MZSCHEME_DLLS = $(MZSCHEME)
246 endif
247 ifeq (yes,$(MZSCHEME_PRECISE_GC))
248-MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER)
249+MZSCHEME_LIB=-l$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER)
250 else
251-MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
252+MZSCHEME_LIB = -l$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
253 endif
254 EXTRA_LIBS += -L$(MZSCHEME_DLLS) -L$(MZSCHEME_DLLS)/lib $(MZSCHEME_LIB)
255 endif
256diff -Naur vim73.orig/src/Make_ming.mak vim73/src/Make_ming.mak
257--- vim73.orig/src/Make_ming.mak 2010-08-02 15:09:43.000000000 -0400
258+++ vim73/src/Make_ming.mak 2011-01-08 21:01:19.490656530 -0500
259@@ -56,6 +56,12 @@
260 NETBEANS=$(GUI)
261
262
263+# Link against the shared version of libstdc++ by default. Set
264+# STATIC_STDCPLUS to "yes" to link against static version instead.
265+ifndef STATIC_STDCPLUS
266+STATIC_STDCPLUS=no
267+endif
268+
269 # If the user doesn't want gettext, undefine it.
270 ifeq (no, $(GETTEXT))
271 GETTEXT=
272@@ -141,11 +147,17 @@
273 MZSCHEME_GENERATE_BASE=no
274 endif
275
276+ifndef MZSCHEME_USE_RACKET
277+MZSCHEME_MAIN_LIB=mzsch
278+else
279+MZSCHEME_MAIN_LIB=racket
280+endif
281+
282 ifeq (no,$(DYNAMIC_MZSCHEME))
283 ifeq (yes,$(MZSCHEME_PRECISE_GC))
284-MZSCHEME_LIB=-lmzsch$(MZSCHEME_VER)
285+MZSCHEME_LIB=-l$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER)
286 else
287-MZSCHEME_LIB = -lmzsch$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
288+MZSCHEME_LIB = -l$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER) -lmzgc$(MZSCHEME_VER)
289 endif
290 # the modern MinGW can dynamically link to dlls directly.
291 # point MZSCHEME_DLLS to where you put libmzschXXXXXXX.dll and libgcXXXXXXX.dll
292@@ -304,11 +316,13 @@
293 endif
294 CC := $(CROSS_COMPILE)gcc
295 WINDRES := $(CROSS_COMPILE)windres
296+WINDRES_CC = $(CC)
297
298 #>>>>> end of choices
299 ###########################################################################
300
301 CFLAGS = -Iproto $(DEFINES) -pipe -w -march=$(ARCH) -Wall
302+WINDRES_FLAGS = --preprocessor="$(WINDRES_CC) -E -xc" -DRC_INVOKED
303
304 ifdef GETTEXT
305 DEFINES += -DHAVE_GETTEXT -DHAVE_LOCALE_H
306@@ -343,7 +357,7 @@
307 ifdef MZSCHEME
308 CFLAGS += -I$(MZSCHEME)/include -DFEAT_MZSCHEME -DMZSCHEME_COLLECTS=\"$(MZSCHEME)/collects\"
309 ifeq (yes, $(DYNAMIC_MZSCHEME))
310-CFLAGS += -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
311+CFLAGS += -DDYNAMIC_MZSCHEME -DDYNAMIC_MZSCH_DLL=\"lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).dll\" -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
312 endif
313 endif
314
315@@ -571,8 +585,13 @@
316 endif
317
318 ifeq (yes, $(OLE))
319-LIB += -loleaut32 -lstdc++
320+LIB += -loleaut32
321 OBJ += $(OUTDIR)/if_ole.o
322+ifeq (yes, $(STATIC_STDCPLUS))
323+LIB += -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
324+else
325+LIB += -lstdc++
326+endif
327 endif
328
329 ifeq (yes, $(MBYTE))
330@@ -650,10 +669,10 @@
331 $(CC) -c $(CFLAGS) $< -o $@
332
333 $(OUTDIR)/vimres.res: vim.rc version.h gui_w32_rc.h
334- $(WINDRES) $(DEFINES) vim.rc $(OUTDIR)/vimres.res
335+ $(WINDRES) $(WINDRES_FLAGS) $(DEFINES) vim.rc $(OUTDIR)/vimres.res
336
337 $(OUTDIR)/vimrc.o: $(OUTDIR)/vimres.res
338- $(WINDRES) $(OUTDIR)/vimres.res $(OUTDIR)/vimrc.o
339+ $(WINDRES) $(WINDRES_FLAGS) $(OUTDIR)/vimres.res $(OUTDIR)/vimrc.o
340
341 $(OUTDIR):
342 $(MKDIR) $(OUTDIR)
343diff -Naur vim73.orig/src/Make_mvc.mak vim73/src/Make_mvc.mak
344--- vim73.orig/src/Make_mvc.mak 2010-07-18 15:24:20.000000000 -0400
345+++ vim73/src/Make_mvc.mak 2011-01-08 21:01:19.314657721 -0500
346@@ -380,9 +380,6 @@
347 !if "$(_NMAKE_VER)" == "10.00.30319.01"
348 MSVCVER = 10.0
349 !endif
350-!if "$(_NMAKE_VER)" == "9.00.30729.01"
351-MSVCVER = 9.0
352-!endif
353 !endif
354
355 # Abort bulding VIM if version of VC is unrecognised.
356@@ -705,12 +702,18 @@
357 MZSCHEME_VER = 205_000
358 !endif
359 CFLAGS = $(CFLAGS) -DFEAT_MZSCHEME -I $(MZSCHEME)\include
360-!if EXIST("$(MZSCHEME)\collects\scheme\base.ss")
361-# for MzScheme 4.x we need to include byte code for basic Scheme stuff
362+!if EXIST("$(MZSCHEME)\collects\scheme\base.ss") \
363+ || EXIST("$(MZSCHEME)\collects\scheme\base.rkt")
364+# for MzScheme >= 4 we need to include byte code for basic Scheme stuff
365 MZSCHEME_EXTRA_DEP = mzscheme_base.c
366 CFLAGS = $(CFLAGS) -DINCLUDE_MZSCHEME_BASE
367 !endif
368-!if EXIST("$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib") \
369+!if EXIST("$(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib")
370+MZSCHEME_MAIN_LIB=mzsch
371+!else
372+MZSCHEME_MAIN_LIB=racket
373+!endif
374+!if EXIST("$(MZSCHEME)\lib\msvc\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib") \
375 && !EXIST("$(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib")
376 !message Building with Precise GC
377 MZSCHEME_PRECISE_GC = yes
378@@ -722,7 +725,7 @@
379 !endif
380 !message MzScheme DLLs will be loaded dynamically
381 CFLAGS = $(CFLAGS) -DDYNAMIC_MZSCHEME \
382- -DDYNAMIC_MZSCH_DLL=\"libmzsch$(MZSCHEME_VER).dll\" \
383+ -DDYNAMIC_MZSCH_DLL=\"lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).dll\" \
384 -DDYNAMIC_MZGC_DLL=\"libmzgc$(MZSCHEME_VER).dll\"
385 !else
386 !if "$(MZSCHEME_DEBUG)" == "yes"
387@@ -730,10 +733,10 @@
388 !endif
389 !if "$(MZSCHEME_PRECISE_GC)" == "yes"
390 # Precise GC does not use separate dll
391-MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
392+MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib
393 !else
394 MZSCHEME_LIB = $(MZSCHEME)\lib\msvc\libmzgc$(MZSCHEME_VER).lib \
395- $(MZSCHEME)\lib\msvc\libmzsch$(MZSCHEME_VER).lib
396+ $(MZSCHEME)\lib\msvc\lib$(MZSCHEME_MAIN_LIB)$(MZSCHEME_VER).lib
397 !endif
398 !endif
399 MZSCHEME_OBJ = $(OUTDIR)\if_mzsch.obj
400diff -Naur vim73.orig/src/Makefile vim73/src/Makefile
401--- vim73.orig/src/Makefile 2010-08-15 08:56:15.000000000 -0400
402+++ vim73/src/Makefile 2011-01-08 21:01:19.114655467 -0500
403@@ -414,12 +414,16 @@
404 # However, this may still cause problems, such as "import termios" failing.
405 # Build two separate versions of Vim in that case.
406 #CONF_OPT_PYTHON = --enable-pythoninterp
407+#CONF_OPT_PYTHON = --enable-pythoninterp=dynamic
408 #CONF_OPT_PYTHON3 = --enable-python3interp
409+#CONF_OPT_PYTHON3 = --enable-python3interp=dynamic
410
411 # RUBY
412 # Uncomment this when you want to include the Ruby interface.
413+# First one for static linking, second one for loading when used.
414 # Note: you need the development package (e.g., ruby1.9.1-dev on Ubuntu).
415 #CONF_OPT_RUBY = --enable-rubyinterp
416+#CONF_OPT_RUBY = --enable-rubyinterp=dynamic
417 #CONF_OPT_RUBY = --enable-rubyinterp --with-ruby-command=ruby1.9.1
418
419 # TCL
420@@ -1047,8 +1051,9 @@
421 INSTALL_DATA = cp
422 INSTALL_DATA_R = cp -r
423
424-### Program to run on installed binary
425+### Program to run on installed binary. Use the second one to disable strip.
426 #STRIP = strip
427+#STRIP = /bin/true
428
429 ### Permissions for binaries {{{1
430 BINMOD = 755
431@@ -1321,7 +1326,7 @@
432 .SUFFIXES: .c .o .pro
433
434 PRE_DEFS = -Iproto $(DEFS) $(GUI_DEFS) $(GUI_IPATH) $(CPPFLAGS) $(EXTRA_IPATHS)
435-POST_DEFS = $(X_CFLAGS) $(MZSCHEME_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS)
436+POST_DEFS = $(X_CFLAGS) $(MZSCHEME_CFLAGS) $(TCL_CFLAGS) $(EXTRA_DEFS)
437
438 ALL_CFLAGS = $(PRE_DEFS) $(CFLAGS) $(PROFILE_CFLAGS) $(POST_DEFS)
439
440@@ -1329,7 +1334,7 @@
441 # with "-E".
442 OSDEF_CFLAGS = $(PRE_DEFS) $(POST_DEFS)
443
444-LINT_CFLAGS = -DLINT -I. $(PRE_DEFS) $(POST_DEFS) $(LUA_CFLAGS) $(PERL_CFLAGS) $(PYTHON_CFLAGS) -Dinline= -D__extension__= -Dalloca=alloca
445+LINT_CFLAGS = -DLINT -I. $(PRE_DEFS) $(POST_DEFS) $(RUBY_CFLAGS) $(LUA_CFLAGS) $(PERL_CFLAGS) $(PYTHON_CFLAGS) -Dinline= -D__extension__= -Dalloca=alloca
446
447 LINT_EXTRA = -DUSE_SNIFF -DHANGUL_INPUT -D"__attribute__(x)="
448
449@@ -1695,7 +1700,8 @@
450 $(CCC) version.c -o objects/version.o
451 @LINK="$(PURIFY) $(SHRPENV) $(CClink) $(ALL_LIB_DIRS) $(LDFLAGS) \
452 -o $(VIMTARGET) $(OBJ) objects/version.o $(ALL_LIBS)" \
453- MAKE="$(MAKE)" sh $(srcdir)/link.sh
454+ MAKE="$(MAKE)" LINK_AS_NEEDED=$(LINK_AS_NEEDED) \
455+ sh $(srcdir)/link.sh
456
457 xxd/xxd$(EXEEXT): xxd/xxd.c
458 cd xxd; CC="$(CC)" CFLAGS="$(CPPFLAGS) $(CFLAGS)" \
459@@ -2532,7 +2538,7 @@
460 $(CCC) $(PYTHON3_CFLAGS) $(PYTHON3_CFLAGS_EXTRA) -o $@ if_python3.c
461
462 objects/if_ruby.o: if_ruby.c
463- $(CCC) -o $@ if_ruby.c
464+ $(CCC) $(RUBY_CFLAGS) -o $@ if_ruby.c
465
466 objects/if_sniff.o: if_sniff.c
467 $(CCC) -o $@ if_sniff.c
468diff -Naur vim73.orig/src/auto/configure vim73/src/auto/configure
469--- vim73.orig/src/auto/configure 2010-08-13 10:17:15.000000000 -0400
470+++ vim73/src/auto/configure 2011-01-08 21:01:19.190656939 -0500
471@@ -593,6 +593,7 @@
472
473 ac_subst_vars='LTLIBOBJS
474 LIBOBJS
475+LINK_AS_NEEDED
476 DEPEND_CFLAGS_FILTER
477 MAKEMO
478 MSGFMT
479@@ -1427,7 +1428,7 @@
480 --enable-pythoninterp=OPTS Include Python interpreter. default=no OPTS=no/yes/dynamic
481 --enable-python3interp=OPTS Include Python3 interpreter. default=no OPTS=no/yes/dynamic
482 --enable-tclinterp Include Tcl interpreter.
483- --enable-rubyinterp Include Ruby interpreter.
484+ --enable-rubyinterp=OPTS Include Ruby interpreter. default=no OPTS=no/yes/dynamic
485 --enable-cscope Include cscope interface.
486 --enable-workshop Include Sun Visual Workshop support.
487 --disable-netbeans Disable NetBeans integration support.
488@@ -4862,16 +4863,36 @@
489 else
490 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
491 $as_echo "no" >&6; }
492- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if scheme.h can be found in /usr/include/plt/" >&5
493-$as_echo_n "checking if scheme.h can be found in /usr/include/plt/... " >&6; }
494- if test -f /usr/include/plt/scheme.h; then
495+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/racket" >&5
496+$as_echo_n "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/racket... " >&6; }
497+ if test -f $vi_cv_path_mzscheme_pfx/include/racket/scheme.h; then
498 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
499 $as_echo "yes" >&6; }
500- SCHEME_INC=/usr/include/plt
501+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/racket
502 else
503 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
504 $as_echo "no" >&6; }
505- vi_cv_path_mzscheme_pfx=
506+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if scheme.h can be found in /usr/include/plt/" >&5
507+$as_echo_n "checking if scheme.h can be found in /usr/include/plt/... " >&6; }
508+ if test -f /usr/include/plt/scheme.h; then
509+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
510+$as_echo "yes" >&6; }
511+ SCHEME_INC=/usr/include/plt
512+ else
513+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
514+$as_echo "no" >&6; }
515+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if scheme.h can be found in /usr/include/racket/" >&5
516+$as_echo_n "checking if scheme.h can be found in /usr/include/racket/... " >&6; }
517+ if test -f /usr/include/racket/scheme.h; then
518+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
519+$as_echo "yes" >&6; }
520+ SCHEME_INC=/usr/include/racket
521+ else
522+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
523+$as_echo "no" >&6; }
524+ vi_cv_path_mzscheme_pfx=
525+ fi
526+ fi
527 fi
528 fi
529 fi
530@@ -4883,12 +4904,22 @@
531 elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
532 MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
533 MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
534- elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
535+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket3m.a"; then
536+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libracket3m.a"
537+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
538+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket.a"; then
539+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libracket.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
540+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a"; then
541 MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
542 else
543 if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
544 MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
545 MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
546+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket3m.so"; then
547+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lracket3m"
548+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
549+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket.so"; then
550+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lracket -lmzgc"
551 else
552 MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
553 fi
554@@ -4901,10 +4932,20 @@
555 fi
556 if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
557 SCHEME_COLLECTS=lib/plt/
558+ else
559+ if test -d $vi_cv_path_mzscheme_pfx/lib/racket/collects; then
560+ SCHEME_COLLECTS=lib/racket/
561+ fi
562 fi
563 if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
564- MZSCHEME_EXTRA="mzscheme_base.c"
565- MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
566+ MZSCHEME_EXTRA="mzscheme_base.c"
567+ else
568+ if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.rkt" ; then
569+ MZSCHEME_EXTRA="mzscheme_base.c"
570+ fi
571+ fi
572+ if test "X$MZSCHEME_EXTRA" != "X" ; then
573+ MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
574 MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
575 fi
576 MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -I${SCHEME_INC} \
577@@ -5285,9 +5326,9 @@
578
579 PYTHON_LIBS="${vi_cv_path_python_plibs}"
580 if test "${vi_cv_path_python_pfx}" = "${vi_cv_path_python_epfx}"; then
581- PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version}"
582+ PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -DPYTHON_HOME=\\\"${vi_cv_path_python_pfx}\\\""
583 else
584- PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -I${vi_cv_path_python_epfx}/include/python${vi_cv_var_python_version}"
585+ PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -I${vi_cv_path_python_epfx}/include/python${vi_cv_var_python_version} -DPYTHON_HOME=\\\"${vi_cv_path_python_pfx}\\\""
586 fi
587 PYTHON_SRC="if_python.c"
588 if test "x$MACOSX" = "xyes"; then
589@@ -5298,7 +5339,7 @@
590 if test "${vi_cv_var_python_version}" = "1.4"; then
591 PYTHON_OBJ="$PYTHON_OBJ objects/py_getpath.o"
592 fi
593- PYTHON_GETPATH_CFLAGS="-DPYTHONPATH='\"${vi_cv_path_pythonpath}\"' -DPREFIX='\"${vi_cv_path_python_pfx}\"' -DEXEC_PREFIX='\"${vi_cv_path_python_epfx}\"'"
594+ PYTHON_GETPATH_CFLAGS="-DPYTHONPATH='\"${vi_cv_path_pythonpath}\"' -DPREFIX='\"${vi_cv_path_python_pfx}\"' -DEXEC_PREFIX='\"${vi_cv_path_python_epfx}\"'"
595
596 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -pthread should be used" >&5
597 $as_echo_n "checking if -pthread should be used... " >&6; }
598@@ -5560,9 +5601,9 @@
599
600 PYTHON3_LIBS="${vi_cv_path_python3_plibs}"
601 if test "${vi_cv_path_python3_pfx}" = "${vi_cv_path_python3_epfx}"; then
602- PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version}"
603+ PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version} -DPYTHON3_HOME=L\\\"${vi_cv_path_python3_pfx}\\\""
604 else
605- PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version} -I${vi_cv_path_python3_epfx}/include/python${vi_cv_var_python3_version}"
606+ PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version} -I${vi_cv_path_python3_epfx}/include/python${vi_cv_var_python3_version} -DPYTHON3_HOME=L\\\"${vi_cv_path_python3_pfx}\\\""
607 fi
608 PYTHON3_SRC="if_python3.c"
609 if test "x$MACOSX" = "xyes"; then
610@@ -5667,10 +5708,10 @@
611
612 $as_echo "#define DYNAMIC_PYTHON3 1" >>confdefs.h
613
614- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can do without RTLD_GLOBAL" >&5
615-$as_echo_n "checking whether we can do without RTLD_GLOBAL... " >&6; }
616+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can do without RTLD_GLOBAL for Python" >&5
617+$as_echo_n "checking whether we can do without RTLD_GLOBAL for Python... " >&6; }
618 cflags_save=$CFLAGS
619- CFLAGS="$CFLAGS $PYTHON3_CFLAGS"
620+ CFLAGS="$CFLAGS $PYTHON_CFLAGS"
621 ldflags_save=$LDFLAGS
622 LDFLAGS="$LDFLAGS -ldl"
623 if test "$cross_compiling" = yes; then :
624@@ -5689,15 +5730,17 @@
625 * Only the first pyhton version used will be switched on.
626 */
627
628- int no_rtl_global_needed_for(char *python_instsoname)
629+ int no_rtl_global_needed_for(char *python_instsoname, char *prefix)
630 {
631 int needed = 0;
632 void* pylib = dlopen(python_instsoname, RTLD_LAZY);
633 if (pylib != 0)
634 {
635+ void (*pfx)(char *home) = dlsym(pylib, "Py_SetPythonHome");
636 void (*init)(void) = dlsym(pylib, "Py_Initialize");
637 int (*simple)(char*) = dlsym(pylib, "PyRun_SimpleString");
638 void (*final)(void) = dlsym(pylib, "Py_Finalize");
639+ (*pfx)(prefix);
640 (*init)();
641 needed = (*simple)("import termios") == -1;
642 (*final)();
643@@ -5709,7 +5752,7 @@
644 int main(int argc, char** argv)
645 {
646 int not_needed = 0;
647- if (no_rtl_global_needed_for("libpython2.7.so.1.0") && no_rtl_global_needed_for("libpython3.1.so.1.0"))
648+ if (no_rtl_global_needed_for("${python_INSTSONAME}", "${vi_cv_path_python_pfx}"))
649 not_needed = 1;
650 return !not_needed;
651 }
652@@ -5726,8 +5769,76 @@
653 conftest.$ac_objext conftest.beam conftest.$ac_ext
654 fi
655
656+
657 CFLAGS=$cflags_save
658 LDFLAGS=$ldflags_save
659+
660+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can do without RTLD_GLOBAL for Python3" >&5
661+$as_echo_n "checking whether we can do without RTLD_GLOBAL for Python3... " >&6; }
662+ cflags_save=$CFLAGS
663+ CFLAGS="$CFLAGS $PYTHON3_CFLAGS"
664+ ldflags_save=$LDFLAGS
665+ LDFLAGS="$LDFLAGS -ldl"
666+ if test "$cross_compiling" = yes; then :
667+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
668+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
669+as_fn_error "cannot run test program while cross compiling
670+See \`config.log' for more details." "$LINENO" 5; }
671+else
672+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
673+/* end confdefs.h. */
674+
675+ #include <dlfcn.h>
676+ #include <wchar.h>
677+ /* If this program fails, then RTLD_GLOBAL is needed.
678+ * RTLD_GLOBAL will be used and then it is not possible to
679+ * have both python versions enabled in the same vim instance.
680+ * Only the first pyhton version used will be switched on.
681+ */
682+
683+ int no_rtl_global_needed_for(char *python_instsoname, wchar_t *prefix)
684+ {
685+ int needed = 0;
686+ void* pylib = dlopen(python_instsoname, RTLD_LAZY);
687+ if (pylib != 0)
688+ {
689+ void (*pfx)(wchar_t *home) = dlsym(pylib, "Py_SetPythonHome");
690+ void (*init)(void) = dlsym(pylib, "Py_Initialize");
691+ int (*simple)(char*) = dlsym(pylib, "PyRun_SimpleString");
692+ void (*final)(void) = dlsym(pylib, "Py_Finalize");
693+ (*pfx)(prefix);
694+ (*init)();
695+ needed = (*simple)("import termios") == -1;
696+ (*final)();
697+ dlclose(pylib);
698+ }
699+ return !needed;
700+ }
701+
702+ int main(int argc, char** argv)
703+ {
704+ int not_needed = 0;
705+ if (no_rtl_global_needed_for("${python3_INSTSONAME}", L"${vi_cv_path_python3_pfx}"))
706+ not_needed = 1;
707+ return !not_needed;
708+ }
709+_ACEOF
710+if ac_fn_c_try_run "$LINENO"; then :
711+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
712+$as_echo "yes" >&6; };$as_echo "#define PY3_NO_RTLD_GLOBAL 1" >>confdefs.h
713+
714+else
715+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
716+$as_echo "no" >&6; }
717+fi
718+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
719+ conftest.$ac_objext conftest.beam conftest.$ac_ext
720+fi
721+
722+
723+ CFLAGS=$cflags_save
724+ LDFLAGS=$ldflags_save
725+
726 PYTHON_SRC="if_python.c"
727 PYTHON_OBJ="objects/if_python.o"
728 PYTHON_CFLAGS="$PYTHON_CFLAGS -DDYNAMIC_PYTHON_DLL=\\\"${python_INSTSONAME}\\\""
729@@ -6103,7 +6214,7 @@
730
731 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_rubyinterp" >&5
732 $as_echo "$enable_rubyinterp" >&6; }
733-if test "$enable_rubyinterp" = "yes"; then
734+if test "$enable_rubyinterp" = "yes" -o "$enable_rubyinterp" = "dynamic"; then
735 { $as_echo "$as_me:${as_lineno-$LINENO}: checking --with-ruby-command argument" >&5
736 $as_echo_n "checking --with-ruby-command argument... " >&6; }
737
738@@ -6209,6 +6320,13 @@
739 RUBY_PRO="if_ruby.pro"
740 $as_echo "#define FEAT_RUBY 1" >>confdefs.h
741
742+ if test "$enable_rubyinterp" = "dynamic"; then
743+ libruby=`$vi_cv_path_ruby -r rbconfig -e 'printf "lib%s.%s\n", Config::CONFIG["RUBY_SO_NAME"], Config::CONFIG["DLEXT"]'`
744+ $as_echo "#define DYNAMIC_RUBY 1" >>confdefs.h
745+
746+ RUBY_CFLAGS="-DDYNAMIC_RUBY_DLL=\\\"$libruby\\\" -DDYNAMIC_RUBY_VER=$rubyversion $RUBY_CFLAGS"
747+ RUBY_LIBS=
748+ fi
749 else
750 { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found; disabling Ruby" >&5
751 $as_echo "not found; disabling Ruby" >&6; }
752@@ -12357,6 +12475,23 @@
753 fi
754
755
756+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker --as-needed support" >&5
757+$as_echo_n "checking linker --as-needed support... " >&6; }
758+LINK_AS_NEEDED=
759+# Check if linker supports --as-needed and --no-as-needed options
760+if $CC -Wl,--help 2>/dev/null | grep as-needed > /dev/null; then
761+ LDFLAGS="$LDFLAGS -Wl,--as-needed"
762+ LINK_AS_NEEDED=yes
763+fi
764+if test "$LINK_AS_NEEDED" = yes; then
765+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
766+$as_echo "yes" >&6; }
767+else
768+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
769+$as_echo "no" >&6; }
770+fi
771+
772+
773 ac_config_files="$ac_config_files auto/config.mk:config.mk.in"
774
775 cat >confcache <<\_ACEOF
776diff -Naur vim73.orig/src/buffer.c vim73/src/buffer.c
777--- vim73.orig/src/buffer.c 2010-08-13 05:14:35.000000000 -0400
778+++ vim73/src/buffer.c 2011-01-08 21:01:19.026657243 -0500
779@@ -639,6 +639,9 @@
780 {
781 clear_wininfo(buf); /* including window-local options */
782 free_buf_options(buf, TRUE);
783+#ifdef FEAT_SPELL
784+ ga_clear(&buf->b_s.b_langp);
785+#endif
786 }
787 #ifdef FEAT_EVAL
788 vars_clear(&buf->b_vars.dv_hashtab); /* free all internal variables */
789@@ -661,9 +664,6 @@
790 vim_free(buf->b_start_fenc);
791 buf->b_start_fenc = NULL;
792 #endif
793-#ifdef FEAT_SPELL
794- ga_clear(&buf->b_s.b_langp);
795-#endif
796 }
797
798 /*
799@@ -1288,9 +1288,12 @@
800 /* Go to the other buffer. */
801 set_curbuf(buf, action);
802
803-#if defined(FEAT_LISTCMDS) && defined(FEAT_SCROLLBIND)
804+#if defined(FEAT_LISTCMDS) \
805+ && (defined(FEAT_SCROLLBIND) || defined(FEAT_CURSORBIND))
806 if (action == DOBUF_SPLIT)
807- curwin->w_p_scb = FALSE; /* reset 'scrollbind' */
808+ {
809+ RESET_BINDING(curwin); /* reset 'scrollbind' and 'cursorbind' */
810+ }
811 #endif
812
813 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
814@@ -1917,9 +1920,7 @@
815 tabpage_new();
816 else if (win_split(0, 0) == FAIL) /* Open in a new window */
817 return FAIL;
818-# ifdef FEAT_SCROLLBIND
819- curwin->w_p_scb = FALSE;
820-# endif
821+ RESET_BINDING(curwin);
822 }
823 }
824 #endif
825diff -Naur vim73.orig/src/config.h.in vim73/src/config.h.in
826--- vim73.orig/src/config.h.in 2010-08-13 09:45:27.000000000 -0400
827+++ vim73/src/config.h.in 2011-01-08 21:01:19.038657206 -0500
828@@ -349,6 +349,9 @@
829 /* Define if you want to include the Ruby interpreter. */
830 #undef FEAT_RUBY
831
832+/* Define for linking via dlopen() or LoadLibrary() */
833+#undef DYNAMIC_RUBY
834+
835 /* Define if you want to include the Tcl interpreter. */
836 #undef FEAT_TCL
837
838diff -Naur vim73.orig/src/config.mk.in vim73/src/config.mk.in
839--- vim73.orig/src/config.mk.in 2010-07-17 11:28:51.000000000 -0400
840+++ vim73/src/config.mk.in 2011-01-08 21:01:19.118661627 -0500
841@@ -30,6 +30,7 @@
842 CPP = @CPP@
843 CPP_MM = @CPP_MM@
844 DEPEND_CFLAGS_FILTER = @DEPEND_CFLAGS_FILTER@
845+LINK_AS_NEEDED = @LINK_AS_NEEDED@
846 X_CFLAGS = @X_CFLAGS@
847 X_LIBS_DIR = @X_LIBS@
848 X_PRE_LIBS = @X_PRE_LIBS@
849diff -Naur vim73.orig/src/configure.in vim73/src/configure.in
850--- vim73.orig/src/configure.in 2010-08-13 10:15:17.000000000 -0400
851+++ vim73/src/configure.in 2011-01-08 21:01:19.186662333 -0500
852@@ -568,13 +568,27 @@
853 SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/plt
854 else
855 AC_MSG_RESULT(no)
856- AC_MSG_CHECKING(if scheme.h can be found in /usr/include/plt/)
857- if test -f /usr/include/plt/scheme.h; then
858+ AC_MSG_CHECKING(if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include/racket)
859+ if test -f $vi_cv_path_mzscheme_pfx/include/racket/scheme.h; then
860 AC_MSG_RESULT(yes)
861- SCHEME_INC=/usr/include/plt
862+ SCHEME_INC=${vi_cv_path_mzscheme_pfx}/include/racket
863 else
864 AC_MSG_RESULT(no)
865- vi_cv_path_mzscheme_pfx=
866+ AC_MSG_CHECKING(if scheme.h can be found in /usr/include/plt/)
867+ if test -f /usr/include/plt/scheme.h; then
868+ AC_MSG_RESULT(yes)
869+ SCHEME_INC=/usr/include/plt
870+ else
871+ AC_MSG_RESULT(no)
872+ AC_MSG_CHECKING(if scheme.h can be found in /usr/include/racket/)
873+ if test -f /usr/include/racket/scheme.h; then
874+ AC_MSG_RESULT(yes)
875+ SCHEME_INC=/usr/include/racket
876+ else
877+ AC_MSG_RESULT(no)
878+ vi_cv_path_mzscheme_pfx=
879+ fi
880+ fi
881 fi
882 fi
883 fi
884@@ -586,13 +600,23 @@
885 elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"; then
886 MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.a"
887 MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
888- elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then
889+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket3m.a"; then
890+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libracket3m.a"
891+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
892+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket.a"; then
893+ MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libracket.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
894+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a"; then
895 MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"
896 else
897 dnl Using shared objects
898 if test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzscheme3m.so"; then
899 MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme3m"
900 MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
901+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket3m.so"; then
902+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lracket3m"
903+ MZSCHEME_CFLAGS="-DMZ_PRECISE_GC"
904+ elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libracket.so"; then
905+ MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lracket -lmzgc"
906 else
907 MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc"
908 fi
909@@ -607,10 +631,20 @@
910 fi
911 if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then
912 SCHEME_COLLECTS=lib/plt/
913+ else
914+ if test -d $vi_cv_path_mzscheme_pfx/lib/racket/collects; then
915+ SCHEME_COLLECTS=lib/racket/
916+ fi
917 fi
918 if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.ss" ; then
919- dnl need to generate bytecode for MzScheme base
920 MZSCHEME_EXTRA="mzscheme_base.c"
921+ else
922+ if test -f "${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects/scheme/base.rkt" ; then
923+ MZSCHEME_EXTRA="mzscheme_base.c"
924+ fi
925+ fi
926+ if test "X$MZSCHEME_EXTRA" != "X" ; then
927+ dnl need to generate bytecode for MzScheme base
928 MZSCHEME_CFLAGS="${MZSCHEME_CFLAGS} -DINCLUDE_MZSCHEME_BASE"
929 MZSCHEME_MZC="${vi_cv_path_mzscheme_pfx}/bin/mzc"
930 fi
931@@ -857,9 +891,9 @@
932
933 PYTHON_LIBS="${vi_cv_path_python_plibs}"
934 if test "${vi_cv_path_python_pfx}" = "${vi_cv_path_python_epfx}"; then
935- PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version}"
936+ PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -DPYTHON_HOME=\\\"${vi_cv_path_python_pfx}\\\""
937 else
938- PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -I${vi_cv_path_python_epfx}/include/python${vi_cv_var_python_version}"
939+ PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -I${vi_cv_path_python_epfx}/include/python${vi_cv_var_python_version} -DPYTHON_HOME=\\\"${vi_cv_path_python_pfx}\\\""
940 fi
941 PYTHON_SRC="if_python.c"
942 dnl For Mac OSX 10.2 config.o is included in the Python library.
943@@ -871,7 +905,7 @@
944 if test "${vi_cv_var_python_version}" = "1.4"; then
945 PYTHON_OBJ="$PYTHON_OBJ objects/py_getpath.o"
946 fi
947- PYTHON_GETPATH_CFLAGS="-DPYTHONPATH='\"${vi_cv_path_pythonpath}\"' -DPREFIX='\"${vi_cv_path_python_pfx}\"' -DEXEC_PREFIX='\"${vi_cv_path_python_epfx}\"'"
948+ PYTHON_GETPATH_CFLAGS="-DPYTHONPATH='\"${vi_cv_path_pythonpath}\"' -DPREFIX='\"${vi_cv_path_python_pfx}\"' -DEXEC_PREFIX='\"${vi_cv_path_python_epfx}\"'"
949
950 dnl On FreeBSD linking with "-pthread" is required to use threads.
951 dnl _THREAD_SAFE must be used for compiling then.
952@@ -1029,9 +1063,9 @@
953
954 PYTHON3_LIBS="${vi_cv_path_python3_plibs}"
955 if test "${vi_cv_path_python3_pfx}" = "${vi_cv_path_python3_epfx}"; then
956- PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version}"
957+ PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version} -DPYTHON3_HOME=L\\\"${vi_cv_path_python3_pfx}\\\""
958 else
959- PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version} -I${vi_cv_path_python3_epfx}/include/python${vi_cv_var_python3_version}"
960+ PYTHON3_CFLAGS="-I${vi_cv_path_python3_pfx}/include/python${vi_cv_var_python3_version} -I${vi_cv_path_python3_epfx}/include/python${vi_cv_var_python3_version} -DPYTHON3_HOME=L\\\"${vi_cv_path_python3_pfx}\\\""
961 fi
962 PYTHON3_SRC="if_python3.c"
963 dnl For Mac OSX 10.2 config.o is included in the Python library.
964@@ -1109,9 +1143,9 @@
965 if test "$python_ok" = yes && test "$python3_ok" = yes; then
966 AC_DEFINE(DYNAMIC_PYTHON)
967 AC_DEFINE(DYNAMIC_PYTHON3)
968- AC_MSG_CHECKING(whether we can do without RTLD_GLOBAL)
969+ AC_MSG_CHECKING(whether we can do without RTLD_GLOBAL for Python)
970 cflags_save=$CFLAGS
971- CFLAGS="$CFLAGS $PYTHON3_CFLAGS"
972+ CFLAGS="$CFLAGS $PYTHON_CFLAGS"
973 ldflags_save=$LDFLAGS
974 LDFLAGS="$LDFLAGS -ldl"
975 AC_RUN_IFELSE([
976@@ -1122,15 +1156,17 @@
977 * Only the first pyhton version used will be switched on.
978 */
979
980- int no_rtl_global_needed_for(char *python_instsoname)
981+ int no_rtl_global_needed_for(char *python_instsoname, char *prefix)
982 {
983 int needed = 0;
984 void* pylib = dlopen(python_instsoname, RTLD_LAZY);
985 if (pylib != 0)
986 {
987+ void (*pfx)(char *home) = dlsym(pylib, "Py_SetPythonHome");
988 void (*init)(void) = dlsym(pylib, "Py_Initialize");
989 int (*simple)(char*) = dlsym(pylib, "PyRun_SimpleString");
990 void (*final)(void) = dlsym(pylib, "Py_Finalize");
991+ (*pfx)(prefix);
992 (*init)();
993 needed = (*simple)("import termios") == -1;
994 (*final)();
995@@ -1142,13 +1178,60 @@
996 int main(int argc, char** argv)
997 {
998 int not_needed = 0;
999- if (no_rtl_global_needed_for("libpython2.7.so.1.0") && no_rtl_global_needed_for("libpython3.1.so.1.0"))
1000+ if (no_rtl_global_needed_for("${python_INSTSONAME}", "${vi_cv_path_python_pfx}"))
1001 not_needed = 1;
1002 return !not_needed;
1003 }],
1004 [AC_MSG_RESULT(yes);AC_DEFINE(PY_NO_RTLD_GLOBAL)], [AC_MSG_RESULT(no)])
1005+
1006+ CFLAGS=$cflags_save
1007+ LDFLAGS=$ldflags_save
1008+
1009+ AC_MSG_CHECKING(whether we can do without RTLD_GLOBAL for Python3)
1010+ cflags_save=$CFLAGS
1011+ CFLAGS="$CFLAGS $PYTHON3_CFLAGS"
1012+ ldflags_save=$LDFLAGS
1013+ LDFLAGS="$LDFLAGS -ldl"
1014+ AC_RUN_IFELSE([
1015+ #include <dlfcn.h>
1016+ #include <wchar.h>
1017+ /* If this program fails, then RTLD_GLOBAL is needed.
1018+ * RTLD_GLOBAL will be used and then it is not possible to
1019+ * have both python versions enabled in the same vim instance.
1020+ * Only the first pyhton version used will be switched on.
1021+ */
1022+
1023+ int no_rtl_global_needed_for(char *python_instsoname, wchar_t *prefix)
1024+ {
1025+ int needed = 0;
1026+ void* pylib = dlopen(python_instsoname, RTLD_LAZY);
1027+ if (pylib != 0)
1028+ {
1029+ void (*pfx)(wchar_t *home) = dlsym(pylib, "Py_SetPythonHome");
1030+ void (*init)(void) = dlsym(pylib, "Py_Initialize");
1031+ int (*simple)(char*) = dlsym(pylib, "PyRun_SimpleString");
1032+ void (*final)(void) = dlsym(pylib, "Py_Finalize");
1033+ (*pfx)(prefix);
1034+ (*init)();
1035+ needed = (*simple)("import termios") == -1;
1036+ (*final)();
1037+ dlclose(pylib);
1038+ }
1039+ return !needed;
1040+ }
1041+
1042+ int main(int argc, char** argv)
1043+ {
1044+ int not_needed = 0;
1045+ if (no_rtl_global_needed_for("${python3_INSTSONAME}", L"${vi_cv_path_python3_pfx}"))
1046+ not_needed = 1;
1047+ return !not_needed;
1048+ }],
1049+ [AC_MSG_RESULT(yes);AC_DEFINE(PY3_NO_RTLD_GLOBAL)], [AC_MSG_RESULT(no)])
1050+
1051 CFLAGS=$cflags_save
1052 LDFLAGS=$ldflags_save
1053+
1054 PYTHON_SRC="if_python.c"
1055 PYTHON_OBJ="objects/if_python.o"
1056 PYTHON_CFLAGS="$PYTHON_CFLAGS -DDYNAMIC_PYTHON_DLL=\\\"${python_INSTSONAME}\\\""
1057@@ -1299,10 +1382,10 @@
1058
1059 AC_MSG_CHECKING(--enable-rubyinterp argument)
1060 AC_ARG_ENABLE(rubyinterp,
1061- [ --enable-rubyinterp Include Ruby interpreter.], ,
1062+ [ --enable-rubyinterp[=OPTS] Include Ruby interpreter. [default=no] [OPTS=no/yes/dynamic]], ,
1063 [enable_rubyinterp="no"])
1064 AC_MSG_RESULT($enable_rubyinterp)
1065-if test "$enable_rubyinterp" = "yes"; then
1066+if test "$enable_rubyinterp" = "yes" -o "$enable_rubyinterp" = "dynamic"; then
1067 AC_MSG_CHECKING(--with-ruby-command argument)
1068 AC_ARG_WITH(ruby-command, [ --with-ruby-command=RUBY name of the Ruby command (default: ruby)],
1069 RUBY_CMD="$withval"; AC_MSG_RESULT($RUBY_CMD),
1070@@ -1360,6 +1443,12 @@
1071 RUBY_OBJ="objects/if_ruby.o"
1072 RUBY_PRO="if_ruby.pro"
1073 AC_DEFINE(FEAT_RUBY)
1074+ if test "$enable_rubyinterp" = "dynamic"; then
1075+ libruby=`$vi_cv_path_ruby -r rbconfig -e 'printf "lib%s.%s\n", Config::CONFIG[["RUBY_SO_NAME"]], Config::CONFIG[["DLEXT"]]'`
1076+ AC_DEFINE(DYNAMIC_RUBY)
1077+ RUBY_CFLAGS="-DDYNAMIC_RUBY_DLL=\\\"$libruby\\\" -DDYNAMIC_RUBY_VER=$rubyversion $RUBY_CFLAGS"
1078+ RUBY_LIBS=
1079+ fi
1080 else
1081 AC_MSG_RESULT(not found; disabling Ruby)
1082 fi
1083@@ -3487,6 +3576,23 @@
1084 fi
1085 AC_SUBST(DEPEND_CFLAGS_FILTER)
1086
1087+dnl link.sh tries to avoid overlinking in a hackish way.
1088+dnl At least GNU ld supports --as-needed which provides the same functionality
1089+dnl at linker level. Let's use it.
1090+AC_MSG_CHECKING(linker --as-needed support)
1091+LINK_AS_NEEDED=
1092+# Check if linker supports --as-needed and --no-as-needed options
1093+if $CC -Wl,--help 2>/dev/null | grep as-needed > /dev/null; then
1094+ LDFLAGS="$LDFLAGS -Wl,--as-needed"
1095+ LINK_AS_NEEDED=yes
1096+fi
1097+if test "$LINK_AS_NEEDED" = yes; then
1098+ AC_MSG_RESULT(yes)
1099+else
1100+ AC_MSG_RESULT(no)
1101+fi
1102+AC_SUBST(LINK_AS_NEEDED)
1103+
1104 dnl write output files
1105 AC_OUTPUT(auto/config.mk:config.mk.in)
1106
1107diff -Naur vim73.orig/src/diff.c vim73/src/diff.c
1108--- vim73.orig/src/diff.c 2010-07-31 09:35:21.000000000 -0400
1109+++ vim73/src/diff.c 2011-01-08 20:59:40.994788713 -0500
1110@@ -1127,11 +1127,13 @@
1111 # endif
1112
1113 wp->w_p_diff = TRUE;
1114+ /* Use 'scrollbind' and 'cursorbind' when available */
1115+#ifdef FEAT_SCROLLBIND
1116+ wp->w_p_scb = TRUE;
1117+#endif
1118 #ifdef FEAT_CURSORBIND
1119- /* Use cursorbind if it's available */
1120 wp->w_p_crb = TRUE;
1121 #endif
1122- wp->w_p_scb = TRUE;
1123 wp->w_p_wrap = FALSE;
1124 # ifdef FEAT_FOLDING
1125 curwin = wp;
1126@@ -1177,10 +1179,7 @@
1127 {
1128 /* Set 'diff', 'scrollbind' off and 'wrap' on. */
1129 wp->w_p_diff = FALSE;
1130-#ifdef FEAT_CURSORBIND
1131- wp->w_p_crb = FALSE;
1132-#endif
1133- wp->w_p_scb = FALSE;
1134+ RESET_BINDING(wp);
1135 wp->w_p_wrap = TRUE;
1136 #ifdef FEAT_FOLDING
1137 curwin = wp;
1138diff -Naur vim73.orig/src/edit.c vim73/src/edit.c
1139--- vim73.orig/src/edit.c 2010-08-08 08:55:05.000000000 -0400
1140+++ vim73/src/edit.c 2011-01-08 21:01:19.146656810 -0500
1141@@ -58,6 +58,10 @@
1142 };
1143
1144 static char e_hitend[] = N_("Hit end of paragraph");
1145+#ifdef FEAT_COMPL_FUNC
1146+static char e_complwin[] = N_("E839: Completion function changed window");
1147+static char e_compldel[] = N_("E840: Completion function deleted text");
1148+#endif
1149
1150 /*
1151 * Structure used to store one match for insert completion.
1152@@ -2658,6 +2662,7 @@
1153 if (stop_arrow() == FAIL)
1154 return;
1155
1156+ compl_direction = FORWARD;
1157 if (startcol > curwin->w_cursor.col)
1158 startcol = curwin->w_cursor.col;
1159 compl_col = startcol;
1160@@ -3833,6 +3838,8 @@
1161 char_u *args[2];
1162 char_u *funcname;
1163 pos_T pos;
1164+ win_T *curwin_save;
1165+ buf_T *curbuf_save;
1166
1167 funcname = (type == CTRL_X_FUNCTION) ? curbuf->b_p_cfu : curbuf->b_p_ofu;
1168 if (*funcname == NUL)
1169@@ -3843,13 +3850,27 @@
1170 args[1] = base;
1171
1172 pos = curwin->w_cursor;
1173+ curwin_save = curwin;
1174+ curbuf_save = curbuf;
1175 matchlist = call_func_retlist(funcname, 2, args, FALSE);
1176+ if (curwin_save != curwin || curbuf_save != curbuf)
1177+ {
1178+ EMSG(_(e_complwin));
1179+ goto theend;
1180+ }
1181 curwin->w_cursor = pos; /* restore the cursor position */
1182- if (matchlist == NULL)
1183- return;
1184+ check_cursor();
1185+ if (!equalpos(curwin->w_cursor, pos))
1186+ {
1187+ EMSG(_(e_compldel));
1188+ goto theend;
1189+ }
1190+ if (matchlist != NULL)
1191+ ins_compl_add_list(matchlist);
1192
1193- ins_compl_add_list(matchlist);
1194- list_unref(matchlist);
1195+theend:
1196+ if (matchlist != NULL)
1197+ list_unref(matchlist);
1198 }
1199 #endif /* FEAT_COMPL_FUNC */
1200
1201@@ -3889,6 +3910,7 @@
1202 char_u *word;
1203 int icase = FALSE;
1204 int adup = FALSE;
1205+ int aempty = FALSE;
1206 char_u *(cptext[CPT_COUNT]);
1207
1208 if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL)
1209@@ -3906,13 +3928,15 @@
1210 icase = get_dict_number(tv->vval.v_dict, (char_u *)"icase");
1211 if (get_dict_string(tv->vval.v_dict, (char_u *)"dup", FALSE) != NULL)
1212 adup = get_dict_number(tv->vval.v_dict, (char_u *)"dup");
1213+ if (get_dict_string(tv->vval.v_dict, (char_u *)"empty", FALSE) != NULL)
1214+ aempty = get_dict_number(tv->vval.v_dict, (char_u *)"empty");
1215 }
1216 else
1217 {
1218 word = get_tv_string_chk(tv);
1219 vim_memset(cptext, 0, sizeof(cptext));
1220 }
1221- if (word == NULL || *word == NUL)
1222+ if (word == NULL || (!aempty && *word == NUL))
1223 return FAIL;
1224 return ins_compl_add(word, -1, icase, NULL, cptext, dir, 0, adup);
1225 }
1226@@ -4994,6 +5018,8 @@
1227 int col;
1228 char_u *funcname;
1229 pos_T pos;
1230+ win_T *curwin_save;
1231+ buf_T *curbuf_save;
1232
1233 /* Call 'completefunc' or 'omnifunc' and get pattern length as a
1234 * string */
1235@@ -5009,8 +5035,21 @@
1236 args[0] = (char_u *)"1";
1237 args[1] = NULL;
1238 pos = curwin->w_cursor;
1239+ curwin_save = curwin;
1240+ curbuf_save = curbuf;
1241 col = call_func_retnr(funcname, 2, args, FALSE);
1242+ if (curwin_save != curwin || curbuf_save != curbuf)
1243+ {
1244+ EMSG(_(e_complwin));
1245+ return FAIL;
1246+ }
1247 curwin->w_cursor = pos; /* restore the cursor position */
1248+ check_cursor();
1249+ if (!equalpos(curwin->w_cursor, pos))
1250+ {
1251+ EMSG(_(e_compldel));
1252+ return FAIL;
1253+ }
1254
1255 if (col < 0)
1256 col = curs_col;
1257diff -Naur vim73.orig/src/eval.c vim73/src/eval.c
1258--- vim73.orig/src/eval.c 2010-08-09 16:12:14.000000000 -0400
1259+++ vim73/src/eval.c 2011-01-08 21:01:19.506657797 -0500
1260@@ -10,9 +10,6 @@
1261 /*
1262 * eval.c: Expression evaluation.
1263 */
1264-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
1265-# include "vimio.h" /* for mch_open(), must be before vim.h */
1266-#endif
1267
1268 #include "vim.h"
1269
1270@@ -362,6 +359,7 @@
1271 {VV_NAME("operator", VAR_STRING), VV_RO},
1272 {VV_NAME("searchforward", VAR_NUMBER), 0},
1273 {VV_NAME("oldfiles", VAR_LIST), 0},
1274+ {VV_NAME("windowid", VAR_NUMBER), VV_RO},
1275 };
1276
1277 /* shorthand */
1278@@ -433,9 +431,9 @@
1279 static void listitem_free __ARGS((listitem_T *item));
1280 static void listitem_remove __ARGS((list_T *l, listitem_T *item));
1281 static long list_len __ARGS((list_T *l));
1282-static int list_equal __ARGS((list_T *l1, list_T *l2, int ic));
1283-static int dict_equal __ARGS((dict_T *d1, dict_T *d2, int ic));
1284-static int tv_equal __ARGS((typval_T *tv1, typval_T *tv2, int ic));
1285+static int list_equal __ARGS((list_T *l1, list_T *l2, int ic, int recursive));
1286+static int dict_equal __ARGS((dict_T *d1, dict_T *d2, int ic, int recursive));
1287+static int tv_equal __ARGS((typval_T *tv1, typval_T *tv2, int ic, int recursive));
1288 static listitem_T *list_find __ARGS((list_T *l, long n));
1289 static long list_find_nr __ARGS((list_T *l, long idx, int *errorp));
1290 static long list_idx_of_item __ARGS((list_T *l, listitem_T *item));
1291@@ -2325,7 +2323,7 @@
1292 else if (endchars != NULL
1293 && vim_strchr(endchars, *skipwhite(arg)) == NULL)
1294 EMSG(_(e_letunexp));
1295- else
1296+ else if (!check_secure())
1297 {
1298 c1 = name[len];
1299 name[len] = NUL;
1300@@ -3337,6 +3335,15 @@
1301 int failed = FALSE;
1302 funcdict_T fudi;
1303
1304+ if (eap->skip)
1305+ {
1306+ /* trans_function_name() doesn't work well when skipping, use eval0()
1307+ * instead to skip to any following command, e.g. for:
1308+ * :if 0 | call dict.foo().bar() | endif */
1309+ eval0(eap->arg, &rettv, &eap->nextcmd, FALSE);
1310+ return;
1311+ }
1312+
1313 tofree = trans_function_name(&arg, eap->skip, TFN_INT, &fudi);
1314 if (fudi.fd_newkey != NULL)
1315 {
1316@@ -4349,7 +4356,8 @@
1317 else
1318 {
1319 /* Compare two Lists for being equal or unequal. */
1320- n1 = list_equal(rettv->vval.v_list, var2.vval.v_list, ic);
1321+ n1 = list_equal(rettv->vval.v_list, var2.vval.v_list,
1322+ ic, FALSE);
1323 if (type == TYPE_NEQUAL)
1324 n1 = !n1;
1325 }
1326@@ -4378,7 +4386,8 @@
1327 else
1328 {
1329 /* Compare two Dictionaries for being equal or unequal. */
1330- n1 = dict_equal(rettv->vval.v_dict, var2.vval.v_dict, ic);
1331+ n1 = dict_equal(rettv->vval.v_dict, var2.vval.v_dict,
1332+ ic, FALSE);
1333 if (type == TYPE_NEQUAL)
1334 n1 = !n1;
1335 }
1336@@ -5913,10 +5922,11 @@
1337 * Return TRUE when two lists have exactly the same values.
1338 */
1339 static int
1340-list_equal(l1, l2, ic)
1341+list_equal(l1, l2, ic, recursive)
1342 list_T *l1;
1343 list_T *l2;
1344 int ic; /* ignore case for strings */
1345+ int recursive; /* TRUE when used recursively */
1346 {
1347 listitem_T *item1, *item2;
1348
1349@@ -5930,7 +5940,7 @@
1350 for (item1 = l1->lv_first, item2 = l2->lv_first;
1351 item1 != NULL && item2 != NULL;
1352 item1 = item1->li_next, item2 = item2->li_next)
1353- if (!tv_equal(&item1->li_tv, &item2->li_tv, ic))
1354+ if (!tv_equal(&item1->li_tv, &item2->li_tv, ic, recursive))
1355 return FALSE;
1356 return item1 == NULL && item2 == NULL;
1357 }
1358@@ -5952,10 +5962,11 @@
1359 * Return TRUE when two dictionaries have exactly the same key/values.
1360 */
1361 static int
1362-dict_equal(d1, d2, ic)
1363+dict_equal(d1, d2, ic, recursive)
1364 dict_T *d1;
1365 dict_T *d2;
1366 int ic; /* ignore case for strings */
1367+ int recursive; /* TRUE when used recursively */
1368 {
1369 hashitem_T *hi;
1370 dictitem_T *item2;
1371@@ -5976,7 +5987,7 @@
1372 item2 = dict_find(d2, hi->hi_key, -1);
1373 if (item2 == NULL)
1374 return FALSE;
1375- if (!tv_equal(&HI2DI(hi)->di_tv, &item2->di_tv, ic))
1376+ if (!tv_equal(&HI2DI(hi)->di_tv, &item2->di_tv, ic, recursive))
1377 return FALSE;
1378 --todo;
1379 }
1380@@ -5984,41 +5995,54 @@
1381 return TRUE;
1382 }
1383
1384+static int tv_equal_recurse_limit;
1385+
1386 /*
1387 * Return TRUE if "tv1" and "tv2" have the same value.
1388 * Compares the items just like "==" would compare them, but strings and
1389 * numbers are different. Floats and numbers are also different.
1390 */
1391 static int
1392-tv_equal(tv1, tv2, ic)
1393+tv_equal(tv1, tv2, ic, recursive)
1394 typval_T *tv1;
1395 typval_T *tv2;
1396- int ic; /* ignore case */
1397+ int ic; /* ignore case */
1398+ int recursive; /* TRUE when used recursively */
1399 {
1400 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN];
1401 char_u *s1, *s2;
1402- static int recursive = 0; /* cach recursive loops */
1403+ static int recursive_cnt = 0; /* catch recursive loops */
1404 int r;
1405
1406 if (tv1->v_type != tv2->v_type)
1407 return FALSE;
1408+
1409 /* Catch lists and dicts that have an endless loop by limiting
1410- * recursiveness to 1000. We guess they are equal then. */
1411- if (recursive >= 1000)
1412+ * recursiveness to a limit. We guess they are equal then.
1413+ * A fixed limit has the problem of still taking an awful long time.
1414+ * Reduce the limit every time running into it. That should work fine for
1415+ * deeply linked structures that are not recursively linked and catch
1416+ * recursiveness quickly. */
1417+ if (!recursive)
1418+ tv_equal_recurse_limit = 1000;
1419+ if (recursive_cnt >= tv_equal_recurse_limit)
1420+ {
1421+ --tv_equal_recurse_limit;
1422 return TRUE;
1423+ }
1424
1425 switch (tv1->v_type)
1426 {
1427 case VAR_LIST:
1428- ++recursive;
1429- r = list_equal(tv1->vval.v_list, tv2->vval.v_list, ic);
1430- --recursive;
1431+ ++recursive_cnt;
1432+ r = list_equal(tv1->vval.v_list, tv2->vval.v_list, ic, TRUE);
1433+ --recursive_cnt;
1434 return r;
1435
1436 case VAR_DICT:
1437- ++recursive;
1438- r = dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic);
1439- --recursive;
1440+ ++recursive_cnt;
1441+ r = dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic, TRUE);
1442+ --recursive_cnt;
1443 return r;
1444
1445 case VAR_FUNC:
1446@@ -7075,7 +7099,7 @@
1447 }
1448
1449 /*
1450- * Add a list entry to dictionary "d".
1451+ * Add a list entry to dictionary "d".
1452 * Returns FAIL when out of memory and when key already exists.
1453 */
1454 int
1455@@ -7097,6 +7121,7 @@
1456 dictitem_free(item);
1457 return FAIL;
1458 }
1459+ ++list->lv_refcount;
1460 return OK;
1461 }
1462
1463@@ -7802,7 +7827,7 @@
1464 {"log10", 1, 1, f_log10},
1465 #endif
1466 {"map", 2, 2, f_map},
1467- {"maparg", 1, 3, f_maparg},
1468+ {"maparg", 1, 4, f_maparg},
1469 {"mapcheck", 1, 3, f_mapcheck},
1470 {"match", 2, 4, f_match},
1471 {"matchadd", 2, 4, f_matchadd},
1472@@ -9389,7 +9414,7 @@
1473 }
1474
1475 for ( ; li != NULL; li = li->li_next)
1476- if (tv_equal(&li->li_tv, &argvars[1], ic))
1477+ if (tv_equal(&li->li_tv, &argvars[1], ic, FALSE))
1478 ++n;
1479 }
1480 }
1481@@ -9416,7 +9441,7 @@
1482 if (!HASHITEM_EMPTY(hi))
1483 {
1484 --todo;
1485- if (tv_equal(&HI2DI(hi)->di_tv, &argvars[1], ic))
1486+ if (tv_equal(&HI2DI(hi)->di_tv, &argvars[1], ic, FALSE))
1487 ++n;
1488 }
1489 }
1490@@ -9857,7 +9882,7 @@
1491 char_u *s;
1492 int len;
1493 char_u *errormsg;
1494- int flags = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
1495+ int options = WILD_SILENT|WILD_USE_NL|WILD_LIST_NOTFOUND;
1496 expand_T xpc;
1497 int error = FALSE;
1498
1499@@ -9875,12 +9900,14 @@
1500 * for 'wildignore' and don't put matches for 'suffixes' at the end. */
1501 if (argvars[1].v_type != VAR_UNKNOWN
1502 && get_tv_number_chk(&argvars[1], &error))
1503- flags |= WILD_KEEP_ALL;
1504+ options |= WILD_KEEP_ALL;
1505 if (!error)
1506 {
1507 ExpandInit(&xpc);
1508 xpc.xp_context = EXPAND_FILES;
1509- rettv->vval.v_string = ExpandOne(&xpc, s, NULL, flags, WILD_ALL);
1510+ if (p_wic)
1511+ options += WILD_ICASE;
1512+ rettv->vval.v_string = ExpandOne(&xpc, s, NULL, options, WILD_ALL);
1513 }
1514 else
1515 rettv->vval.v_string = NULL;
1516@@ -11653,7 +11680,7 @@
1517 typval_T *argvars;
1518 typval_T *rettv;
1519 {
1520- int flags = WILD_SILENT|WILD_USE_NL;
1521+ int options = WILD_SILENT|WILD_USE_NL;
1522 expand_T xpc;
1523 int error = FALSE;
1524
1525@@ -11661,14 +11688,16 @@
1526 * for 'wildignore' and don't put matches for 'suffixes' at the end. */
1527 if (argvars[1].v_type != VAR_UNKNOWN
1528 && get_tv_number_chk(&argvars[1], &error))
1529- flags |= WILD_KEEP_ALL;
1530+ options |= WILD_KEEP_ALL;
1531 rettv->v_type = VAR_STRING;
1532 if (!error)
1533 {
1534 ExpandInit(&xpc);
1535 xpc.xp_context = EXPAND_FILES;
1536+ if (p_wic)
1537+ options += WILD_ICASE;
1538 rettv->vval.v_string = ExpandOne(&xpc, get_tv_string(&argvars[0]),
1539- NULL, flags, WILD_ALL);
1540+ NULL, options, WILD_ALL);
1541 }
1542 else
1543 rettv->vval.v_string = NULL;
1544@@ -12116,6 +12145,9 @@
1545 #ifdef FEAT_TOOLBAR
1546 "toolbar",
1547 #endif
1548+#if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
1549+ "unnamedplus",
1550+#endif
1551 #ifdef FEAT_USR_CMDS
1552 "user-commands", /* was accidentally included in 5.4 */
1553 "user_commands",
1554@@ -12572,7 +12604,7 @@
1555 }
1556
1557 for ( ; item != NULL; item = item->li_next, ++idx)
1558- if (tv_equal(&item->li_tv, &argvars[1], ic))
1559+ if (tv_equal(&item->li_tv, &argvars[1], ic, FALSE))
1560 {
1561 rettv->vval.v_number = idx;
1562 break;
1563@@ -13290,8 +13322,10 @@
1564 char_u *keys_buf = NULL;
1565 char_u *rhs;
1566 int mode;
1567- garray_T ga;
1568 int abbr = FALSE;
1569+ int get_dict = FALSE;
1570+ mapblock_T *mp;
1571+ int buffer_local;
1572
1573 /* return empty string for failure */
1574 rettv->v_type = VAR_STRING;
1575@@ -13305,7 +13339,11 @@
1576 {
1577 which = get_tv_string_buf_chk(&argvars[1], buf);
1578 if (argvars[2].v_type != VAR_UNKNOWN)
1579+ {
1580 abbr = get_tv_number(&argvars[2]);
1581+ if (argvars[3].v_type != VAR_UNKNOWN)
1582+ get_dict = get_tv_number(&argvars[3]);
1583+ }
1584 }
1585 else
1586 which = (char_u *)"";
1587@@ -13315,19 +13353,34 @@
1588 mode = get_map_mode(&which, 0);
1589
1590 keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE, FALSE);
1591- rhs = check_map(keys, mode, exact, FALSE, abbr);
1592+ rhs = check_map(keys, mode, exact, FALSE, abbr, &mp, &buffer_local);
1593 vim_free(keys_buf);
1594- if (rhs != NULL)
1595- {
1596- ga_init(&ga);
1597- ga.ga_itemsize = 1;
1598- ga.ga_growsize = 40;
1599
1600- while (*rhs != NUL)
1601- ga_concat(&ga, str2special(&rhs, FALSE));
1602+ if (!get_dict)
1603+ {
1604+ /* Return a string. */
1605+ if (rhs != NULL)
1606+ rettv->vval.v_string = str2special_save(rhs, FALSE);
1607+
1608+ }
1609+ else if (rettv_dict_alloc(rettv) != FAIL && rhs != NULL)
1610+ {
1611+ /* Return a dictionary. */
1612+ char_u *lhs = str2special_save(mp->m_keys, TRUE);
1613+ char_u *mapmode = map_mode_to_chars(mp->m_mode);
1614+ dict_T *dict = rettv->vval.v_dict;
1615+
1616+ dict_add_nr_str(dict, "lhs", 0L, lhs);
1617+ dict_add_nr_str(dict, "rhs", 0L, mp->m_orig_str);
1618+ dict_add_nr_str(dict, "noremap", mp->m_noremap ? 1L : 0L , NULL);
1619+ dict_add_nr_str(dict, "expr", mp->m_expr ? 1L : 0L, NULL);
1620+ dict_add_nr_str(dict, "silent", mp->m_silent ? 1L : 0L, NULL);
1621+ dict_add_nr_str(dict, "sid", (long)mp->m_script_ID, NULL);
1622+ dict_add_nr_str(dict, "buffer", (long)buffer_local, NULL);
1623+ dict_add_nr_str(dict, "mode", 0L, mapmode);
1624
1625- ga_append(&ga, NUL);
1626- rettv->vval.v_string = (char_u *)ga.ga_data;
1627+ vim_free(lhs);
1628+ vim_free(mapmode);
1629 }
1630 }
1631
1632@@ -22519,18 +22572,21 @@
1633 if (tab != NULL)
1634 {
1635 *tab++ = '\0'; /* isolate the variable name */
1636- if (*tab == 'S') /* string var */
1637- type = VAR_STRING;
1638+ switch (*tab)
1639+ {
1640+ case 'S': type = VAR_STRING; break;
1641 #ifdef FEAT_FLOAT
1642- else if (*tab == 'F')
1643- type = VAR_FLOAT;
1644+ case 'F': type = VAR_FLOAT; break;
1645 #endif
1646+ case 'D': type = VAR_DICT; break;
1647+ case 'L': type = VAR_LIST; break;
1648+ }
1649
1650 tab = vim_strchr(tab, '\t');
1651 if (tab != NULL)
1652 {
1653 tv.v_type = type;
1654- if (type == VAR_STRING)
1655+ if (type == VAR_STRING || type == VAR_DICT || type == VAR_LIST)
1656 tv.vval.v_string = viminfo_readstring(virp,
1657 (int)(tab - virp->vir_line + 1), TRUE);
1658 #ifdef FEAT_FLOAT
1659@@ -22539,9 +22595,27 @@
1660 #endif
1661 else
1662 tv.vval.v_number = atol((char *)tab + 1);
1663+ if (type == VAR_DICT || type == VAR_LIST)
1664+ {
1665+ typval_T *etv = eval_expr(tv.vval.v_string, NULL);
1666+
1667+ if (etv == NULL)
1668+ /* Failed to parse back the dict or list, use it as a
1669+ * string. */
1670+ tv.v_type = VAR_STRING;
1671+ else
1672+ {
1673+ vim_free(tv.vval.v_string);
1674+ tv = *etv;
1675+ }
1676+ }
1677+
1678 set_var(virp->vir_line + 1, &tv, FALSE);
1679- if (type == VAR_STRING)
1680+
1681+ if (tv.v_type == VAR_STRING)
1682 vim_free(tv.vval.v_string);
1683+ else if (tv.v_type == VAR_DICT || tv.v_type == VAR_LIST)
1684+ clear_tv(&tv);
1685 }
1686 }
1687 }
1688@@ -22583,8 +22657,10 @@
1689 case VAR_STRING: s = "STR"; break;
1690 case VAR_NUMBER: s = "NUM"; break;
1691 #ifdef FEAT_FLOAT
1692- case VAR_FLOAT: s = "FLO"; break;
1693+ case VAR_FLOAT: s = "FLO"; break;
1694 #endif
1695+ case VAR_DICT: s = "DIC"; break;
1696+ case VAR_LIST: s = "LIS"; break;
1697 default: continue;
1698 }
1699 fprintf(fp, "!%s\t%s\t", this_var->di_key, s);
1700diff -Naur vim73.orig/src/ex_cmds.c vim73/src/ex_cmds.c
1701--- vim73.orig/src/ex_cmds.c 2010-08-13 05:14:35.000000000 -0400
1702+++ vim73/src/ex_cmds.c 2011-01-08 21:01:19.370657515 -0500
1703@@ -11,10 +11,6 @@
1704 * ex_cmds.c: some functions for command line commands
1705 */
1706
1707-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
1708-# include "vimio.h" /* for mch_open(), must be before vim.h */
1709-#endif
1710-
1711 #include "vim.h"
1712 #include "version.h"
1713
1714@@ -323,7 +319,8 @@
1715 /* When sorting numbers "start_col_nr" is the number, not the column
1716 * number. */
1717 if (sort_nr)
1718- result = l1.start_col_nr - l2.start_col_nr;
1719+ result = l1.start_col_nr == l2.start_col_nr ? 0
1720+ : l1.start_col_nr > l2.start_col_nr ? 1 : -1;
1721 else
1722 {
1723 /* We need to copy one line into "sortbuf1", because there is no
1724@@ -482,7 +479,7 @@
1725 * of the match, by temporarily terminating the string there */
1726 s2 = s + end_col;
1727 c = *s2;
1728- (*s2) = 0;
1729+ *s2 = NUL;
1730 /* Sorting on number: Store the number itself. */
1731 p = s + start_col;
1732 if (sort_hex)
1733@@ -491,9 +488,13 @@
1734 s = skiptodigit(p);
1735 if (s > p && s[-1] == '-')
1736 --s; /* include preceding negative sign */
1737- vim_str2nr(s, NULL, NULL, sort_oct, sort_hex,
1738- &nrs[lnum - eap->line1].start_col_nr, NULL);
1739- (*s2) = c;
1740+ if (*s == NUL)
1741+ /* empty line should sort before any number */
1742+ nrs[lnum - eap->line1].start_col_nr = -MAXLNUM;
1743+ else
1744+ vim_str2nr(s, NULL, NULL, sort_oct, sort_hex,
1745+ &nrs[lnum - eap->line1].start_col_nr, NULL);
1746+ *s2 = c;
1747 }
1748 else
1749 {
1750@@ -2700,6 +2701,10 @@
1751 TRUE);
1752 do_modelines(0);
1753 }
1754+
1755+ /* Autocommands may have changed buffer names, esp. when
1756+ * 'autochdir' is set. */
1757+ fname = curbuf->b_sfname;
1758 #endif
1759 }
1760
1761@@ -3498,9 +3503,7 @@
1762 curbuf->b_p_bin = FALSE; /* reset 'bin' before reading file */
1763 curwin->w_p_nu = 0; /* no line numbers */
1764 curwin->w_p_rnu = 0; /* no relative line numbers */
1765-#ifdef FEAT_SCROLLBIND
1766- curwin->w_p_scb = FALSE; /* no scroll binding */
1767-#endif
1768+ RESET_BINDING(curwin); /* no scroll or cursor binding */
1769 #ifdef FEAT_ARABIC
1770 curwin->w_p_arab = FALSE; /* no arabic mode */
1771 #endif
1772@@ -5471,9 +5474,8 @@
1773 return FALSE;
1774 curwin->w_p_pvw = TRUE;
1775 curwin->w_p_wfh = TRUE;
1776-# ifdef FEAT_SCROLLBIND
1777- curwin->w_p_scb = FALSE; /* don't take over 'scrollbind' */
1778-# endif
1779+ RESET_BINDING(curwin); /* don't take over 'scrollbind'
1780+ and 'cursorbind' */
1781 # ifdef FEAT_DIFF
1782 curwin->w_p_diff = FALSE; /* no 'diff' */
1783 # endif
1784@@ -6559,8 +6561,7 @@
1785 struct sign
1786 {
1787 sign_T *sn_next; /* next sign in list */
1788- int sn_typenr; /* type number of sign (negative if not equal
1789- to name) */
1790+ int sn_typenr; /* type number of sign */
1791 char_u *sn_name; /* name of sign */
1792 char_u *sn_icon; /* name of pixmap */
1793 #ifdef FEAT_SIGN_ICONS
1794@@ -6572,7 +6573,7 @@
1795 };
1796
1797 static sign_T *first_sign = NULL;
1798-static int last_sign_typenr = MAX_TYPENR; /* is decremented */
1799+static int next_sign_typenr = 1;
1800
1801 static int sign_cmd_idx __ARGS((char_u *begin_cmd, char_u *end_cmd));
1802 static void sign_list_defined __ARGS((sign_T *sp));
1803@@ -6654,9 +6655,14 @@
1804 EMSG(_("E156: Missing sign name"));
1805 else
1806 {
1807+ /* Isolate the sign name. If it's a number skip leading zeroes,
1808+ * so that "099" and "99" are the same sign. But keep "0". */
1809 p = skiptowhite(arg);
1810 if (*p != NUL)
1811 *p++ = NUL;
1812+ while (arg[0] == '0' && arg[1] != NUL)
1813+ ++arg;
1814+
1815 sp_prev = NULL;
1816 for (sp = first_sign; sp != NULL; sp = sp->sn_next)
1817 {
1818@@ -6669,46 +6675,52 @@
1819 /* ":sign define {name} ...": define a sign */
1820 if (sp == NULL)
1821 {
1822+ sign_T *lp;
1823+ int start = next_sign_typenr;
1824+
1825 /* Allocate a new sign. */
1826 sp = (sign_T *)alloc_clear((unsigned)sizeof(sign_T));
1827 if (sp == NULL)
1828 return;
1829- if (sp_prev == NULL)
1830- first_sign = sp;
1831- else
1832- sp_prev->sn_next = sp;
1833- sp->sn_name = vim_strnsave(arg, (int)(p - arg));
1834
1835- /* If the name is a number use that for the typenr,
1836- * otherwise use a negative number. */
1837- if (VIM_ISDIGIT(*arg))
1838- sp->sn_typenr = atoi((char *)arg);
1839- else
1840+ /* Check that next_sign_typenr is not already being used.
1841+ * This only happens after wrapping around. Hopefully
1842+ * another one got deleted and we can use its number. */
1843+ for (lp = first_sign; lp != NULL; )
1844 {
1845- sign_T *lp;
1846- int start = last_sign_typenr;
1847-
1848- for (lp = first_sign; lp != NULL; lp = lp->sn_next)
1849+ if (lp->sn_typenr == next_sign_typenr)
1850 {
1851- if (lp->sn_typenr == last_sign_typenr)
1852+ ++next_sign_typenr;
1853+ if (next_sign_typenr == MAX_TYPENR)
1854+ next_sign_typenr = 1;
1855+ if (next_sign_typenr == start)
1856 {
1857- --last_sign_typenr;
1858- if (last_sign_typenr == 0)
1859- last_sign_typenr = MAX_TYPENR;
1860- if (last_sign_typenr == start)
1861- {
1862- EMSG(_("E612: Too many signs defined"));
1863- return;
1864- }
1865- lp = first_sign;
1866- continue;
1867+ vim_free(sp);
1868+ EMSG(_("E612: Too many signs defined"));
1869+ return;
1870 }
1871+ lp = first_sign; /* start all over */
1872+ continue;
1873 }
1874+ lp = lp->sn_next;
1875+ }
1876+
1877+ sp->sn_typenr = next_sign_typenr;
1878+ if (++next_sign_typenr == MAX_TYPENR)
1879+ next_sign_typenr = 1; /* wrap around */
1880
1881- sp->sn_typenr = last_sign_typenr--;
1882- if (last_sign_typenr == 0)
1883- last_sign_typenr = MAX_TYPENR; /* wrap around */
1884+ sp->sn_name = vim_strsave(arg);
1885+ if (sp->sn_name == NULL) /* out of memory */
1886+ {
1887+ vim_free(sp);
1888+ return;
1889 }
1890+
1891+ /* add the new sign to the list of signs */
1892+ if (sp_prev == NULL)
1893+ first_sign = sp;
1894+ else
1895+ sp_prev->sn_next = sp;
1896 }
1897
1898 /* set values for a defined sign. */
1899@@ -6886,6 +6898,8 @@
1900 arg = skiptowhite(arg);
1901 if (*arg != NUL)
1902 *arg++ = NUL;
1903+ while (sign_name[0] == '0' && sign_name[1] != NUL)
1904+ ++sign_name;
1905 }
1906 else if (STRNCMP(arg, "file=", 5) == 0)
1907 {
1908diff -Naur vim73.orig/src/ex_cmds2.c vim73/src/ex_cmds2.c
1909--- vim73.orig/src/ex_cmds2.c 2010-07-27 15:43:38.000000000 -0400
1910+++ vim73/src/ex_cmds2.c 2011-01-08 21:01:19.374658068 -0500
1911@@ -11,10 +11,6 @@
1912 * ex_cmds2.c: some more functions for command line commands
1913 */
1914
1915-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
1916-# include "vimio.h" /* for mch_open(), must be before vim.h */
1917-#endif
1918-
1919 #include "vim.h"
1920 #include "version.h"
1921
1922@@ -2165,9 +2161,7 @@
1923 {
1924 if (win_split(0, 0) == FAIL)
1925 return;
1926-# ifdef FEAT_SCROLLBIND
1927- curwin->w_p_scb = FALSE;
1928-# endif
1929+ RESET_BINDING(curwin);
1930 }
1931 else
1932 #endif
1933diff -Naur vim73.orig/src/ex_docmd.c vim73/src/ex_docmd.c
1934--- vim73.orig/src/ex_docmd.c 2010-08-07 10:59:47.000000000 -0400
1935+++ vim73/src/ex_docmd.c 2011-01-08 21:01:19.234657608 -0500
1936@@ -733,7 +733,7 @@
1937 * do_cmdline(): execute one Ex command line
1938 *
1939 * 1. Execute "cmdline" when it is not NULL.
1940- * If "cmdline" is NULL, or more lines are needed, getline() is used.
1941+ * If "cmdline" is NULL, or more lines are needed, fgetline() is used.
1942 * 2. Split up in parts separated with '|'.
1943 *
1944 * This function can be called recursively!
1945@@ -741,7 +741,7 @@
1946 * flags:
1947 * DOCMD_VERBOSE - The command will be included in the error message.
1948 * DOCMD_NOWAIT - Don't call wait_return() and friends.
1949- * DOCMD_REPEAT - Repeat execution until getline() returns NULL.
1950+ * DOCMD_REPEAT - Repeat execution until fgetline() returns NULL.
1951 * DOCMD_KEYTYPED - Don't reset KeyTyped.
1952 * DOCMD_EXCRESET - Reset the exception environment (used for debugging).
1953 * DOCMD_KEEPLINE - Store first typed line (for repeating with ".").
1954@@ -749,15 +749,15 @@
1955 * return FAIL if cmdline could not be executed, OK otherwise
1956 */
1957 int
1958-do_cmdline(cmdline, getline, cookie, flags)
1959+do_cmdline(cmdline, fgetline, cookie, flags)
1960 char_u *cmdline;
1961- char_u *(*getline) __ARGS((int, void *, int));
1962- void *cookie; /* argument for getline() */
1963+ char_u *(*fgetline) __ARGS((int, void *, int));
1964+ void *cookie; /* argument for fgetline() */
1965 int flags;
1966 {
1967 char_u *next_cmdline; /* next cmd to execute */
1968 char_u *cmdline_copy = NULL; /* copy of cmd line */
1969- int used_getline = FALSE; /* used "getline" to obtain command */
1970+ int used_getline = FALSE; /* used "fgetline" to obtain command */
1971 static int recursive = 0; /* recursive depth */
1972 int msg_didout_before_start = 0;
1973 int count = 0; /* line number count */
1974@@ -775,14 +775,14 @@
1975 struct msglist **saved_msg_list = NULL;
1976 struct msglist *private_msg_list;
1977
1978- /* "getline" and "cookie" passed to do_one_cmd() */
1979+ /* "fgetline" and "cookie" passed to do_one_cmd() */
1980 char_u *(*cmd_getline) __ARGS((int, void *, int));
1981 void *cmd_cookie;
1982 struct loop_cookie cmd_loop_cookie;
1983 void *real_cookie;
1984 int getline_is_func;
1985 #else
1986-# define cmd_getline getline
1987+# define cmd_getline fgetline
1988 # define cmd_cookie cookie
1989 #endif
1990 static int call_depth = 0; /* recursiveness */
1991@@ -822,10 +822,10 @@
1992 cstack.cs_lflags = 0;
1993 ga_init2(&lines_ga, (int)sizeof(wcmd_T), 10);
1994
1995- real_cookie = getline_cookie(getline, cookie);
1996+ real_cookie = getline_cookie(fgetline, cookie);
1997
1998 /* Inside a function use a higher nesting level. */
1999- getline_is_func = getline_equal(getline, cookie, get_func_line);
2000+ getline_is_func = getline_equal(fgetline, cookie, get_func_line);
2001 if (getline_is_func && ex_nesting_level == func_level(real_cookie))
2002 ++ex_nesting_level;
2003
2004@@ -837,7 +837,7 @@
2005 breakpoint = func_breakpoint(real_cookie);
2006 dbg_tick = func_dbg_tick(real_cookie);
2007 }
2008- else if (getline_equal(getline, cookie, getsourceline))
2009+ else if (getline_equal(fgetline, cookie, getsourceline))
2010 {
2011 fname = sourcing_name;
2012 breakpoint = source_breakpoint(real_cookie);
2013@@ -881,7 +881,8 @@
2014 * KeyTyped is only set when calling vgetc(). Reset it here when not
2015 * calling vgetc() (sourced command lines).
2016 */
2017- if (!(flags & DOCMD_KEYTYPED) && !getline_equal(getline, cookie, getexline))
2018+ if (!(flags & DOCMD_KEYTYPED)
2019+ && !getline_equal(fgetline, cookie, getexline))
2020 KeyTyped = FALSE;
2021
2022 /*
2023@@ -894,7 +895,7 @@
2024 do
2025 {
2026 #ifdef FEAT_EVAL
2027- getline_is_func = getline_equal(getline, cookie, get_func_line);
2028+ getline_is_func = getline_equal(fgetline, cookie, get_func_line);
2029 #endif
2030
2031 /* stop skipping cmds for an error msg after all endif/while/for */
2032@@ -909,7 +910,7 @@
2033
2034 /*
2035 * 1. If repeating a line in a loop, get a line from lines_ga.
2036- * 2. If no line given: Get an allocated line with getline().
2037+ * 2. If no line given: Get an allocated line with fgetline().
2038 * 3. If a line is given: Make a copy, so we can mess with it.
2039 */
2040
2041@@ -938,12 +939,12 @@
2042 }
2043 #ifdef FEAT_PROFILE
2044 else if (do_profiling == PROF_YES
2045- && getline_equal(getline, cookie, getsourceline))
2046+ && getline_equal(fgetline, cookie, getsourceline))
2047 script_line_end();
2048 #endif
2049
2050 /* Check if a sourced file hit a ":finish" command. */
2051- if (source_finished(getline, cookie))
2052+ if (source_finished(fgetline, cookie))
2053 {
2054 retval = FAIL;
2055 break;
2056@@ -954,7 +955,7 @@
2057 && *dbg_tick != debug_tick)
2058 {
2059 *breakpoint = dbg_find_breakpoint(
2060- getline_equal(getline, cookie, getsourceline),
2061+ getline_equal(fgetline, cookie, getsourceline),
2062 fname, sourcing_lnum);
2063 *dbg_tick = debug_tick;
2064 }
2065@@ -969,7 +970,7 @@
2066 dbg_breakpoint(fname, sourcing_lnum);
2067 /* Find next breakpoint. */
2068 *breakpoint = dbg_find_breakpoint(
2069- getline_equal(getline, cookie, getsourceline),
2070+ getline_equal(fgetline, cookie, getsourceline),
2071 fname, sourcing_lnum);
2072 *dbg_tick = debug_tick;
2073 }
2074@@ -978,7 +979,7 @@
2075 {
2076 if (getline_is_func)
2077 func_line_start(real_cookie);
2078- else if (getline_equal(getline, cookie, getsourceline))
2079+ else if (getline_equal(fgetline, cookie, getsourceline))
2080 script_line_start();
2081 }
2082 # endif
2083@@ -987,7 +988,7 @@
2084 if (cstack.cs_looplevel > 0)
2085 {
2086 /* Inside a while/for loop we need to store the lines and use them
2087- * again. Pass a different "getline" function to do_one_cmd()
2088+ * again. Pass a different "fgetline" function to do_one_cmd()
2089 * below, so that it stores lines in or reads them from
2090 * "lines_ga". Makes it possible to define a function inside a
2091 * while/for loop. */
2092@@ -995,27 +996,27 @@
2093 cmd_cookie = (void *)&cmd_loop_cookie;
2094 cmd_loop_cookie.lines_gap = &lines_ga;
2095 cmd_loop_cookie.current_line = current_line;
2096- cmd_loop_cookie.getline = getline;
2097+ cmd_loop_cookie.getline = fgetline;
2098 cmd_loop_cookie.cookie = cookie;
2099 cmd_loop_cookie.repeating = (current_line < lines_ga.ga_len);
2100 }
2101 else
2102 {
2103- cmd_getline = getline;
2104+ cmd_getline = fgetline;
2105 cmd_cookie = cookie;
2106 }
2107 #endif
2108
2109- /* 2. If no line given, get an allocated line with getline(). */
2110+ /* 2. If no line given, get an allocated line with fgetline(). */
2111 if (next_cmdline == NULL)
2112 {
2113 /*
2114 * Need to set msg_didout for the first line after an ":if",
2115 * otherwise the ":if" will be overwritten.
2116 */
2117- if (count == 1 && getline_equal(getline, cookie, getexline))
2118+ if (count == 1 && getline_equal(fgetline, cookie, getexline))
2119 msg_didout = TRUE;
2120- if (getline == NULL || (next_cmdline = getline(':', cookie,
2121+ if (fgetline == NULL || (next_cmdline = fgetline(':', cookie,
2122 #ifdef FEAT_EVAL
2123 cstack.cs_idx < 0 ? 0 : (cstack.cs_idx + 1) * 2
2124 #else
2125@@ -1142,7 +1143,7 @@
2126 * If the command was typed, remember it for the ':' register.
2127 * Do this AFTER executing the command to make :@: work.
2128 */
2129- if (getline_equal(getline, cookie, getexline)
2130+ if (getline_equal(fgetline, cookie, getexline)
2131 && new_last_cmdline != NULL)
2132 {
2133 vim_free(last_cmdline);
2134@@ -1163,7 +1164,7 @@
2135 #ifdef FEAT_EVAL
2136 /* reset did_emsg for a function that is not aborted by an error */
2137 if (did_emsg && !force_abort
2138- && getline_equal(getline, cookie, get_func_line)
2139+ && getline_equal(fgetline, cookie, get_func_line)
2140 && !func_has_abort(real_cookie))
2141 did_emsg = FALSE;
2142
2143@@ -1202,7 +1203,7 @@
2144 if (breakpoint != NULL)
2145 {
2146 *breakpoint = dbg_find_breakpoint(
2147- getline_equal(getline, cookie, getsourceline),
2148+ getline_equal(fgetline, cookie, getsourceline),
2149 fname,
2150 ((wcmd_T *)lines_ga.ga_data)[current_line].lnum-1);
2151 *dbg_tick = debug_tick;
2152@@ -1296,8 +1297,8 @@
2153 #endif
2154 )
2155 && !(did_emsg && used_getline
2156- && (getline_equal(getline, cookie, getexmodeline)
2157- || getline_equal(getline, cookie, getexline)))
2158+ && (getline_equal(fgetline, cookie, getexmodeline)
2159+ || getline_equal(fgetline, cookie, getexline)))
2160 && (next_cmdline != NULL
2161 #ifdef FEAT_EVAL
2162 || cstack.cs_idx >= 0
2163@@ -1316,9 +1317,9 @@
2164 * unclosed conditional.
2165 */
2166 if (!got_int && !did_throw
2167- && ((getline_equal(getline, cookie, getsourceline)
2168- && !source_finished(getline, cookie))
2169- || (getline_equal(getline, cookie, get_func_line)
2170+ && ((getline_equal(fgetline, cookie, getsourceline)
2171+ && !source_finished(fgetline, cookie))
2172+ || (getline_equal(fgetline, cookie, get_func_line)
2173 && !func_has_ended(real_cookie))))
2174 {
2175 if (cstack.cs_flags[cstack.cs_idx] & CSF_TRY)
2176@@ -1354,7 +1355,7 @@
2177 /* If a missing ":endtry", ":endwhile", ":endfor", or ":endif" or a memory
2178 * lack was reported above and the error message is to be converted to an
2179 * exception, do this now after rewinding the cstack. */
2180- do_errthrow(&cstack, getline_equal(getline, cookie, get_func_line)
2181+ do_errthrow(&cstack, getline_equal(fgetline, cookie, get_func_line)
2182 ? (char_u *)"endfunction" : (char_u *)NULL);
2183
2184 if (trylevel == 0)
2185@@ -1449,9 +1450,9 @@
2186 */
2187 if (did_throw)
2188 need_rethrow = TRUE;
2189- if ((getline_equal(getline, cookie, getsourceline)
2190+ if ((getline_equal(fgetline, cookie, getsourceline)
2191 && ex_nesting_level > source_level(real_cookie))
2192- || (getline_equal(getline, cookie, get_func_line)
2193+ || (getline_equal(fgetline, cookie, get_func_line)
2194 && ex_nesting_level > func_level(real_cookie) + 1))
2195 {
2196 if (!did_throw)
2197@@ -1460,16 +1461,16 @@
2198 else
2199 {
2200 /* When leaving a function, reduce nesting level. */
2201- if (getline_equal(getline, cookie, get_func_line))
2202+ if (getline_equal(fgetline, cookie, get_func_line))
2203 --ex_nesting_level;
2204 /*
2205 * Go to debug mode when returning from a function in which we are
2206 * single-stepping.
2207 */
2208- if ((getline_equal(getline, cookie, getsourceline)
2209- || getline_equal(getline, cookie, get_func_line))
2210+ if ((getline_equal(fgetline, cookie, getsourceline)
2211+ || getline_equal(fgetline, cookie, get_func_line))
2212 && ex_nesting_level + 1 <= debug_break_level)
2213- do_debug(getline_equal(getline, cookie, getsourceline)
2214+ do_debug(getline_equal(fgetline, cookie, getsourceline)
2215 ? (char_u *)_("End of sourced file")
2216 : (char_u *)_("End of function"));
2217 }
2218@@ -2871,8 +2872,10 @@
2219 }
2220
2221 #ifdef FEAT_USR_CMDS
2222- /* Look for a user defined command as a last resort */
2223- if (eap->cmdidx == CMD_SIZE && *eap->cmd >= 'A' && *eap->cmd <= 'Z')
2224+ /* Look for a user defined command as a last resort. Let ":Print" be
2225+ * overruled by a user defined command. */
2226+ if ((eap->cmdidx == CMD_SIZE || eap->cmdidx == CMD_Print)
2227+ && *eap->cmd >= 'A' && *eap->cmd <= 'Z')
2228 {
2229 /* User defined commands may contain digits. */
2230 while (ASCII_ISALNUM(*p))
2231@@ -3465,7 +3468,8 @@
2232 case CMD_find:
2233 case CMD_sfind:
2234 case CMD_tabfind:
2235- xp->xp_context = EXPAND_FILES_IN_PATH;
2236+ if (xp->xp_context == EXPAND_FILES)
2237+ xp->xp_context = EXPAND_FILES_IN_PATH;
2238 break;
2239 case CMD_cd:
2240 case CMD_chdir:
2241@@ -4520,12 +4524,14 @@
2242 else /* n == 2 */
2243 {
2244 expand_T xpc;
2245+ int options = WILD_LIST_NOTFOUND|WILD_ADD_SLASH;
2246
2247 ExpandInit(&xpc);
2248 xpc.xp_context = EXPAND_FILES;
2249+ if (p_wic)
2250+ options += WILD_ICASE;
2251 p = ExpandOne(&xpc, eap->arg, NULL,
2252- WILD_LIST_NOTFOUND|WILD_ADD_SLASH,
2253- WILD_EXPAND_FREE);
2254+ options, WILD_EXPAND_FREE);
2255 if (p == NULL)
2256 return FAIL;
2257 }
2258@@ -5587,6 +5593,7 @@
2259 int compl = EXPAND_NOTHING;
2260 char_u *compl_arg = NULL;
2261 int has_attr = (eap->arg[0] == '-');
2262+ int name_len;
2263
2264 p = eap->arg;
2265
2266@@ -5612,6 +5619,7 @@
2267 return;
2268 }
2269 end = p;
2270+ name_len = (int)(end - name);
2271
2272 /* If there is nothing after the name, and no attributes were specified,
2273 * we are listing commands
2274@@ -5626,6 +5634,13 @@
2275 EMSG(_("E183: User defined commands must start with an uppercase letter"));
2276 return;
2277 }
2278+ else if ((name_len == 1 && *name == 'X')
2279+ || (name_len <= 4
2280+ && STRNCMP(name, "Next", name_len > 4 ? 4 : name_len) == 0))
2281+ {
2282+ EMSG(_("E841: Reserved name, cannot be used for user defined command"));
2283+ return;
2284+ }
2285 else
2286 uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg,
2287 eap->forceit);
2288@@ -6897,9 +6912,7 @@
2289 # ifdef FEAT_WINDOWS
2290 if (win_split(0, 0) == FAIL)
2291 return;
2292-# ifdef FEAT_SCROLLBIND
2293- curwin->w_p_scb = FALSE;
2294-# endif
2295+ RESET_BINDING(curwin);
2296
2297 /* When splitting the window, create a new alist. Otherwise the
2298 * existing one is overwritten. */
2299@@ -7299,7 +7312,9 @@
2300 || cmdmod.browse
2301 # endif
2302 )
2303- curwin->w_p_scb = FALSE;
2304+ {
2305+ RESET_BINDING(curwin);
2306+ }
2307 else
2308 do_check_scrollbind(FALSE);
2309 # endif
2310@@ -9393,7 +9408,7 @@
2311 ex_ptag(eap)
2312 exarg_T *eap;
2313 {
2314- g_do_tagpreview = p_pvh;
2315+ g_do_tagpreview = p_pvh; /* will be reset to 0 in ex_tag_cmd() */
2316 ex_tag_cmd(eap, cmdnames[eap->cmdidx].cmd_name + 1);
2317 }
2318
2319@@ -9525,17 +9540,23 @@
2320 #define SPEC_CFILE 4
2321 "<sfile>", /* ":so" file name */
2322 #define SPEC_SFILE 5
2323+ "<slnum>", /* ":so" file line number */
2324+#define SPEC_SLNUM 6
2325 #ifdef FEAT_AUTOCMD
2326 "<afile>", /* autocommand file name */
2327-# define SPEC_AFILE 6
2328+# define SPEC_AFILE 7
2329 "<abuf>", /* autocommand buffer number */
2330-# define SPEC_ABUF 7
2331+# define SPEC_ABUF 8
2332 "<amatch>", /* autocommand match name */
2333-# define SPEC_AMATCH 8
2334+# define SPEC_AMATCH 9
2335 #endif
2336 #ifdef FEAT_CLIENTSERVER
2337 "<client>"
2338-# define SPEC_CLIENT 9
2339+# ifdef FEAT_AUTOCMD
2340+# define SPEC_CLIENT 10
2341+# else
2342+# define SPEC_CLIENT 7
2343+# endif
2344 #endif
2345 };
2346
2347@@ -9560,6 +9581,7 @@
2348 * '<cWORD>' to WORD under the cursor
2349 * '<cfile>' to path name under the cursor
2350 * '<sfile>' to sourced file name
2351+ * '<slnum>' to sourced file line number
2352 * '<afile>' to file name for autocommand
2353 * '<abuf>' to buffer number for autocommand
2354 * '<amatch>' to matching name for autocommand
2355@@ -9591,10 +9613,7 @@
2356 #ifdef FEAT_MODIFY_FNAME
2357 int skip_mod = FALSE;
2358 #endif
2359-
2360-#if defined(FEAT_AUTOCMD) || defined(FEAT_CLIENTSERVER)
2361 char_u strbuf[30];
2362-#endif
2363
2364 *errormsg = NULL;
2365 if (escaped != NULL)
2366@@ -9783,6 +9802,15 @@
2367 return NULL;
2368 }
2369 break;
2370+ case SPEC_SLNUM: /* line in file for ":so" command */
2371+ if (sourcing_name == NULL || sourcing_lnum == 0)
2372+ {
2373+ *errormsg = (char_u *)_("E842: no line number to use for \"<slnum>\"");
2374+ return NULL;
2375+ }
2376+ sprintf((char *)strbuf, "%ld", (long)sourcing_lnum);
2377+ result = strbuf;
2378+ break;
2379 #if defined(FEAT_CLIENTSERVER)
2380 case SPEC_CLIENT: /* Source of last submitted input */
2381 sprintf((char *)strbuf, PRINTF_HEX_LONG_U,
2382@@ -10707,7 +10735,7 @@
2383 * Write a file name to the session file.
2384 * Takes care of the "slash" option in 'sessionoptions' and escapes special
2385 * characters.
2386- * Returns FAIL if writing fails.
2387+ * Returns FAIL if writing fails or out of memory.
2388 */
2389 static int
2390 ses_put_fname(fd, name, flagp)
2391@@ -10716,49 +10744,32 @@
2392 unsigned *flagp;
2393 {
2394 char_u *sname;
2395+ char_u *p;
2396 int retval = OK;
2397- int c;
2398
2399 sname = home_replace_save(NULL, name);
2400- if (sname != NULL)
2401- name = sname;
2402- while (*name != NUL)
2403- {
2404-#ifdef FEAT_MBYTE
2405- {
2406- int l;
2407+ if (sname == NULL)
2408+ return FAIL;
2409
2410- if (has_mbyte && (l = (*mb_ptr2len)(name)) > 1)
2411- {
2412- /* copy a multibyte char */
2413- while (--l >= 0)
2414- {
2415- if (putc(*name, fd) != *name)
2416- retval = FAIL;
2417- ++name;
2418- }
2419- continue;
2420- }
2421- }
2422-#endif
2423- c = *name++;
2424- if (c == '\\' && (*flagp & SSOP_SLASH))
2425- /* change a backslash to a forward slash */
2426- c = '/';
2427- else if ((vim_strchr(escape_chars, c) != NULL
2428-#ifdef BACKSLASH_IN_FILENAME
2429- && c != '\\'
2430-#endif
2431- ) || c == '#' || c == '%')
2432- {
2433- /* escape a special character with a backslash */
2434- if (putc('\\', fd) != '\\')
2435- retval = FAIL;
2436- }
2437- if (putc(c, fd) != c)
2438- retval = FAIL;
2439+ if (*flagp & SSOP_SLASH)
2440+ {
2441+ /* change all backslashes to forward slashes */
2442+ for (p = sname; *p != NUL; mb_ptr_adv(p))
2443+ if (*p == '\\')
2444+ *p = '/';
2445 }
2446+
2447+ /* escapse special characters */
2448+ p = vim_strsave_fnameescape(sname, FALSE);
2449 vim_free(sname);
2450+ if (p == NULL)
2451+ return FAIL;
2452+
2453+ /* write the result */
2454+ if (fputs((char *)p, fd) < 0)
2455+ retval = FAIL;
2456+
2457+ vim_free(p);
2458 return retval;
2459 }
2460
2461diff -Naur vim73.orig/src/ex_getln.c vim73/src/ex_getln.c
2462--- vim73.orig/src/ex_getln.c 2010-08-14 11:25:45.000000000 -0400
2463+++ vim73/src/ex_getln.c 2011-01-08 21:01:19.238657508 -0500
2464@@ -688,28 +688,35 @@
2465 p = get_expr_line();
2466 --textlock;
2467 restore_cmdline(&save_ccline);
2468- len = (int)STRLEN(p);
2469
2470- if (p != NULL && realloc_cmdbuff(len + 1) == OK)
2471+ if (p != NULL)
2472 {
2473- ccline.cmdlen = len;
2474- STRCPY(ccline.cmdbuff, p);
2475- vim_free(p);
2476-
2477- /* Restore the cursor or use the position set with
2478- * set_cmdline_pos(). */
2479- if (new_cmdpos > ccline.cmdlen)
2480- ccline.cmdpos = ccline.cmdlen;
2481- else
2482- ccline.cmdpos = new_cmdpos;
2483-
2484- KeyTyped = FALSE; /* Don't do p_wc completion. */
2485- redrawcmd();
2486- goto cmdline_changed;
2487+ len = (int)STRLEN(p);
2488+ if (realloc_cmdbuff(len + 1) == OK)
2489+ {
2490+ ccline.cmdlen = len;
2491+ STRCPY(ccline.cmdbuff, p);
2492+ vim_free(p);
2493+
2494+ /* Restore the cursor or use the position set with
2495+ * set_cmdline_pos(). */
2496+ if (new_cmdpos > ccline.cmdlen)
2497+ ccline.cmdpos = ccline.cmdlen;
2498+ else
2499+ ccline.cmdpos = new_cmdpos;
2500+
2501+ KeyTyped = FALSE; /* Don't do p_wc completion. */
2502+ redrawcmd();
2503+ goto cmdline_changed;
2504+ }
2505 }
2506 }
2507 beep_flush();
2508- c = ESC;
2509+ got_int = FALSE; /* don't abandon the command line */
2510+ did_emsg = FALSE;
2511+ emsg_on_display = FALSE;
2512+ redrawcmd();
2513+ goto cmdline_not_changed;
2514 }
2515 #endif
2516 else
2517@@ -2342,15 +2349,31 @@
2518 windgoto(msg_row, msg_col);
2519 pend = (char_u *)(line_ga.ga_data) + line_ga.ga_len;
2520
2521- /* we are done when a NL is entered, but not when it comes after a
2522- * backslash */
2523- if (line_ga.ga_len > 0 && pend[-1] == '\n'
2524- && (line_ga.ga_len <= 1 || pend[-2] != '\\'))
2525- {
2526- --line_ga.ga_len;
2527- --pend;
2528- *pend = NUL;
2529- break;
2530+ /* We are done when a NL is entered, but not when it comes after an
2531+ * odd number of backslashes, that results in a NUL. */
2532+ if (line_ga.ga_len > 0 && pend[-1] == '\n')
2533+ {
2534+ int bcount = 0;
2535+
2536+ while (line_ga.ga_len - 2 >= bcount && pend[-2 - bcount] == '\\')
2537+ ++bcount;
2538+
2539+ if (bcount > 0)
2540+ {
2541+ /* Halve the number of backslashes: "\NL" -> "NUL", "\\NL" ->
2542+ * "\NL", etc. */
2543+ line_ga.ga_len -= (bcount + 1) / 2;
2544+ pend -= (bcount + 1) / 2;
2545+ pend[-1] = '\n';
2546+ }
2547+
2548+ if ((bcount & 1) == 0)
2549+ {
2550+ --line_ga.ga_len;
2551+ --pend;
2552+ *pend = NUL;
2553+ break;
2554+ }
2555 }
2556 }
2557
2558@@ -3316,10 +3339,14 @@
2559 p2 = NULL;
2560 else
2561 {
2562+ int use_options = options |
2563+ WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT|WILD_ESCAPE;
2564+
2565+ if (p_wic)
2566+ use_options += WILD_ICASE;
2567 p2 = ExpandOne(xp, p1,
2568 vim_strnsave(&ccline.cmdbuff[i], xp->xp_pattern_len),
2569- WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT|WILD_ESCAPE
2570- |options, type);
2571+ use_options, type);
2572 vim_free(p1);
2573 /* longest match: make sure it is not shorter, happens with :help */
2574 if (p2 != NULL && type == WILD_LONGEST)
2575@@ -3405,6 +3432,7 @@
2576 * options = WILD_KEEP_ALL: don't remove 'wildignore' entries
2577 * options = WILD_SILENT: don't print warning messages
2578 * options = WILD_ESCAPE: put backslash before special chars
2579+ * options = WILD_ICASE: ignore case for files
2580 *
2581 * The variables xp->xp_context and xp->xp_backslash must have been set!
2582 */
2583@@ -4338,6 +4366,7 @@
2584 char_u ***matches; /* return: array of pointers to matches */
2585 {
2586 char_u *file_str = NULL;
2587+ int options = WILD_ADD_SLASH|WILD_SILENT;
2588
2589 if (xp->xp_context == EXPAND_UNSUCCESSFUL)
2590 {
2591@@ -4356,9 +4385,11 @@
2592 if (file_str == NULL)
2593 return EXPAND_UNSUCCESSFUL;
2594
2595+ if (p_wic)
2596+ options += WILD_ICASE;
2597+
2598 /* find all files that match the description */
2599- if (ExpandFromContext(xp, file_str, matchcount, matches,
2600- WILD_ADD_SLASH|WILD_SILENT) == FAIL)
2601+ if (ExpandFromContext(xp, file_str, matchcount, matches, options) == FAIL)
2602 {
2603 *matchcount = 0;
2604 *matches = NULL;
2605@@ -4410,7 +4441,7 @@
2606 char_u *pat;
2607 int *num_file;
2608 char_u ***file;
2609- int options;
2610+ int options; /* EW_ flags */
2611 {
2612 #ifdef FEAT_CMDL_COMPL
2613 regmatch_T regmatch;
2614@@ -4464,6 +4495,9 @@
2615 flags |= (EW_FILE | EW_PATH);
2616 else
2617 flags = (flags | EW_DIR) & ~EW_FILE;
2618+ if (options & WILD_ICASE)
2619+ flags |= EW_ICASE;
2620+
2621 /* Expand wildcards, supporting %:h and the like. */
2622 ret = expand_wildcards_eval(&pat, num_file, file, flags);
2623 if (free_pat)
2624@@ -4728,7 +4762,11 @@
2625 || (pat[1] == '.' && vim_ispathsep(pat[2])))))
2626 path = (char_u *)".";
2627 else
2628+ {
2629 path = vim_getenv((char_u *)"PATH", &mustfree);
2630+ if (path == NULL)
2631+ path = (char_u *)"";
2632+ }
2633
2634 /*
2635 * Go over all directories in $PATH. Expand matches in that directory and
2636@@ -6147,9 +6185,7 @@
2637 curwin->w_p_rl = cmdmsg_rl;
2638 cmdmsg_rl = FALSE;
2639 # endif
2640-# ifdef FEAT_SCROLLBIND
2641- curwin->w_p_scb = FALSE;
2642-# endif
2643+ RESET_BINDING(curwin);
2644
2645 # ifdef FEAT_AUTOCMD
2646 /* Do execute autocommands for setting the filetype (load syntax). */
2647diff -Naur vim73.orig/src/fileio.c vim73/src/fileio.c
2648--- vim73.orig/src/fileio.c 2010-08-14 08:20:54.000000000 -0400
2649+++ vim73/src/fileio.c 2011-01-08 21:01:19.374658068 -0500
2650@@ -11,14 +11,6 @@
2651 * fileio.c: read from and write to a file
2652 */
2653
2654-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
2655-# include "vimio.h" /* for lseek(), must be before vim.h */
2656-#endif
2657-
2658-#if defined __EMX__
2659-# include "vimio.h" /* for mktemp(), CJW 1997-12-03 */
2660-#endif
2661-
2662 #include "vim.h"
2663
2664 #if defined(__TANDEM) || defined(__MINT__)
2665@@ -918,7 +910,7 @@
2666 {
2667 /* Read the first line (and a bit more). Immediately rewind to
2668 * the start of the file. If the read() fails "len" is -1. */
2669- len = vim_read(fd, firstline, 80);
2670+ len = read_eintr(fd, firstline, 80);
2671 lseek(fd, (off_t)0L, SEEK_SET);
2672 for (p = firstline; p < firstline + len; ++p)
2673 if (*p >= 0x80)
2674@@ -1373,7 +1365,7 @@
2675 /*
2676 * Read bytes from the file.
2677 */
2678- size = vim_read(fd, ptr, size);
2679+ size = read_eintr(fd, ptr, size);
2680 }
2681
2682 if (size <= 0)
2683@@ -4000,7 +3992,7 @@
2684 #ifdef HAS_BW_FLAGS
2685 write_info.bw_flags = FIO_NOCONVERT;
2686 #endif
2687- while ((write_info.bw_len = vim_read(fd, copybuf,
2688+ while ((write_info.bw_len = read_eintr(fd, copybuf,
2689 BUFSIZE)) > 0)
2690 {
2691 if (buf_write_bytes(&write_info) == FAIL)
2692@@ -4813,7 +4805,7 @@
2693 #ifdef HAS_BW_FLAGS
2694 write_info.bw_flags = FIO_NOCONVERT;
2695 #endif
2696- while ((write_info.bw_len = vim_read(fd, smallbuf,
2697+ while ((write_info.bw_len = read_eintr(fd, smallbuf,
2698 SMBUFSIZE)) > 0)
2699 if (buf_write_bytes(&write_info) == FAIL)
2700 break;
2701@@ -5330,7 +5322,7 @@
2702
2703 /*
2704 * Call write() to write a number of bytes to the file.
2705- * Also handles encryption and 'encoding' conversion.
2706+ * Handles encryption and 'encoding' conversion.
2707 *
2708 * Return FAIL for failure, OK otherwise.
2709 */
2710@@ -5702,16 +5694,8 @@
2711 crypt_encode(buf, len, buf);
2712 #endif
2713
2714- /* Repeat the write(), it may be interrupted by a signal. */
2715- while (len > 0)
2716- {
2717- wlen = vim_write(ip->bw_fd, buf, len);
2718- if (wlen <= 0) /* error! */
2719- return FAIL;
2720- len -= wlen;
2721- buf += wlen;
2722- }
2723- return OK;
2724+ wlen = write_eintr(ip->bw_fd, buf, len);
2725+ return (wlen < len) ? FAIL : OK;
2726 }
2727
2728 #ifdef FEAT_MBYTE
2729@@ -6662,8 +6646,8 @@
2730 return -1;
2731 }
2732
2733- while ((n = vim_read(fd_in, buffer, BUFSIZE)) > 0)
2734- if (vim_write(fd_out, buffer, n) != n)
2735+ while ((n = read_eintr(fd_in, buffer, BUFSIZE)) > 0)
2736+ if (write_eintr(fd_out, buffer, n) != n)
2737 {
2738 errmsg = _("E208: Error writing to \"%s\"");
2739 break;
2740@@ -10304,3 +10288,55 @@
2741 }
2742 return reg_pat;
2743 }
2744+
2745+#if defined(EINTR) || defined(PROTO)
2746+/*
2747+ * Version of read() that retries when interrupted by EINTR (possibly
2748+ * by a SIGWINCH).
2749+ */
2750+ long
2751+read_eintr(fd, buf, bufsize)
2752+ int fd;
2753+ void *buf;
2754+ size_t bufsize;
2755+{
2756+ long ret;
2757+
2758+ for (;;)
2759+ {
2760+ ret = vim_read(fd, buf, bufsize);
2761+ if (ret >= 0 || errno != EINTR)
2762+ break;
2763+ }
2764+ return ret;
2765+}
2766+
2767+/*
2768+ * Version of write() that retries when interrupted by EINTR (possibly
2769+ * by a SIGWINCH).
2770+ */
2771+ long
2772+write_eintr(fd, buf, bufsize)
2773+ int fd;
2774+ void *buf;
2775+ size_t bufsize;
2776+{
2777+ long ret = 0;
2778+ long wlen;
2779+
2780+ /* Repeat the write() so long it didn't fail, other than being interrupted
2781+ * by a signal. */
2782+ while (ret < (long)bufsize)
2783+ {
2784+ wlen = vim_write(fd, (char *)buf + ret, bufsize - ret);
2785+ if (wlen < 0)
2786+ {
2787+ if (errno != EINTR)
2788+ break;
2789+ }
2790+ else
2791+ ret += wlen;
2792+ }
2793+ return ret;
2794+}
2795+#endif
2796diff -Naur vim73.orig/src/getchar.c vim73/src/getchar.c
2797--- vim73.orig/src/getchar.c 2010-08-08 09:00:33.000000000 -0400
2798+++ vim73/src/getchar.c 2011-01-08 21:01:19.462656564 -0500
2799@@ -1506,9 +1506,6 @@
2800 }
2801 }
2802
2803-#define KL_PART_KEY -1 /* keylen value for incomplete key-code */
2804-#define KL_PART_MAP -2 /* keylen value for incomplete mapping */
2805-
2806 /*
2807 * Get the next input character.
2808 * Can return a special key or a multi-byte character.
2809@@ -2171,7 +2168,7 @@
2810 if (!timedout)
2811 {
2812 /* break at a partly match */
2813- keylen = KL_PART_MAP;
2814+ keylen = KEYLEN_PART_MAP;
2815 break;
2816 }
2817 }
2818@@ -2192,7 +2189,7 @@
2819
2820 /* If no partly match found, use the longest full
2821 * match. */
2822- if (keylen != KL_PART_MAP)
2823+ if (keylen != KEYLEN_PART_MAP)
2824 {
2825 mp = mp_match;
2826 keylen = mp_match_len;
2827@@ -2230,7 +2227,7 @@
2828 }
2829 /* Need more chars for partly match. */
2830 if (mlen == typebuf.tb_len)
2831- keylen = KL_PART_KEY;
2832+ keylen = KEYLEN_PART_KEY;
2833 else if (max_mlen < mlen)
2834 /* no match, may have to check for termcode at
2835 * next character */
2836@@ -2238,7 +2235,7 @@
2837 }
2838
2839 if ((mp == NULL || max_mlen >= mp_match_len)
2840- && keylen != KL_PART_MAP)
2841+ && keylen != KEYLEN_PART_MAP)
2842 {
2843 int save_keylen = keylen;
2844
2845@@ -2264,8 +2261,8 @@
2846 /* If no termcode matched but 'pastetoggle'
2847 * matched partially it's like an incomplete key
2848 * sequence. */
2849- if (keylen == 0 && save_keylen == KL_PART_KEY)
2850- keylen = KL_PART_KEY;
2851+ if (keylen == 0 && save_keylen == KEYLEN_PART_KEY)
2852+ keylen = KEYLEN_PART_KEY;
2853
2854 /*
2855 * When getting a partial match, but the last
2856@@ -2302,7 +2299,7 @@
2857 continue;
2858 }
2859 if (*s == NUL) /* need more characters */
2860- keylen = KL_PART_KEY;
2861+ keylen = KEYLEN_PART_KEY;
2862 }
2863 if (keylen >= 0)
2864 #endif
2865@@ -2339,7 +2336,8 @@
2866 if (keylen > 0) /* full matching terminal code */
2867 {
2868 #if defined(FEAT_GUI) && defined(FEAT_MENU)
2869- if (typebuf.tb_buf[typebuf.tb_off] == K_SPECIAL
2870+ if (typebuf.tb_len >= 2
2871+ && typebuf.tb_buf[typebuf.tb_off] == K_SPECIAL
2872 && typebuf.tb_buf[typebuf.tb_off + 1]
2873 == KS_MENU)
2874 {
2875@@ -2381,7 +2379,7 @@
2876 /* Partial match: get some more characters. When a
2877 * matching mapping was found use that one. */
2878 if (mp == NULL || keylen < 0)
2879- keylen = KL_PART_KEY;
2880+ keylen = KEYLEN_PART_KEY;
2881 else
2882 keylen = mp_match_len;
2883 }
2884@@ -2553,7 +2551,8 @@
2885 #endif
2886 && typebuf.tb_maplen == 0
2887 && (State & INSERT)
2888- && (p_timeout || (keylen == KL_PART_KEY && p_ttimeout))
2889+ && (p_timeout
2890+ || (keylen == KEYLEN_PART_KEY && p_ttimeout))
2891 && (c = inchar(typebuf.tb_buf + typebuf.tb_off
2892 + typebuf.tb_len, 3, 25L,
2893 typebuf.tb_change_cnt)) == 0)
2894@@ -2783,9 +2782,9 @@
2895 ? 0
2896 : ((typebuf.tb_len == 0
2897 || !(p_timeout || (p_ttimeout
2898- && keylen == KL_PART_KEY)))
2899+ && keylen == KEYLEN_PART_KEY)))
2900 ? -1L
2901- : ((keylen == KL_PART_KEY && p_ttm >= 0)
2902+ : ((keylen == KEYLEN_PART_KEY && p_ttm >= 0)
2903 ? p_ttm
2904 : p_tm)), typebuf.tb_change_cnt);
2905
2906@@ -3168,6 +3167,7 @@
2907 int expr = FALSE;
2908 #endif
2909 int noremap;
2910+ char_u *orig_rhs;
2911
2912 keys = arg;
2913 map_table = maphash;
2914@@ -3266,6 +3266,7 @@
2915 }
2916 if (*p != NUL)
2917 *p++ = NUL;
2918+
2919 p = skipwhite(p);
2920 rhs = p;
2921 hasarg = (*rhs != NUL);
2922@@ -3288,6 +3289,7 @@
2923 */
2924 if (haskey)
2925 keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE, special);
2926+ orig_rhs = rhs;
2927 if (hasarg)
2928 {
2929 if (STRICMP(rhs, "<nop>") == 0) /* "<Nop>" means nothing */
2930@@ -3298,7 +3300,7 @@
2931
2932 #ifdef FEAT_FKMAP
2933 /*
2934- * when in right-to-left mode and alternate keymap option set,
2935+ * When in right-to-left mode and alternate keymap option set,
2936 * reverse the character flow in the rhs in Farsi.
2937 */
2938 if (p_altkeymap && curwin->w_p_rl)
2939@@ -3556,6 +3558,8 @@
2940 }
2941 vim_free(mp->m_str);
2942 mp->m_str = newstr;
2943+ vim_free(mp->m_orig_str);
2944+ mp->m_orig_str = vim_strsave(orig_rhs);
2945 mp->m_noremap = noremap;
2946 mp->m_silent = silent;
2947 mp->m_mode = mode;
2948@@ -3633,10 +3637,12 @@
2949
2950 mp->m_keys = vim_strsave(keys);
2951 mp->m_str = vim_strsave(rhs);
2952+ mp->m_orig_str = vim_strsave(orig_rhs);
2953 if (mp->m_keys == NULL || mp->m_str == NULL)
2954 {
2955 vim_free(mp->m_keys);
2956 vim_free(mp->m_str);
2957+ vim_free(mp->m_orig_str);
2958 vim_free(mp);
2959 retval = 4; /* no mem */
2960 goto theend;
2961@@ -3682,6 +3688,7 @@
2962 mp = *mpp;
2963 vim_free(mp->m_keys);
2964 vim_free(mp->m_str);
2965+ vim_free(mp->m_orig_str);
2966 *mpp = mp->m_next;
2967 vim_free(mp);
2968 }
2969@@ -3851,12 +3858,57 @@
2970 }
2971 }
2972
2973+/*
2974+ * Return characters to represent the map mode in an allocated string.
2975+ * Returns NULL when out of memory.
2976+ */
2977+ char_u *
2978+map_mode_to_chars(mode)
2979+ int mode;
2980+{
2981+ garray_T mapmode;
2982+
2983+ ga_init2(&mapmode, 1, 7);
2984+
2985+ if ((mode & (INSERT + CMDLINE)) == INSERT + CMDLINE)
2986+ ga_append(&mapmode, '!'); /* :map! */
2987+ else if (mode & INSERT)
2988+ ga_append(&mapmode, 'i'); /* :imap */
2989+ else if (mode & LANGMAP)
2990+ ga_append(&mapmode, 'l'); /* :lmap */
2991+ else if (mode & CMDLINE)
2992+ ga_append(&mapmode, 'c'); /* :cmap */
2993+ else if ((mode & (NORMAL + VISUAL + SELECTMODE + OP_PENDING))
2994+ == NORMAL + VISUAL + SELECTMODE + OP_PENDING)
2995+ ga_append(&mapmode, ' '); /* :map */
2996+ else
2997+ {
2998+ if (mode & NORMAL)
2999+ ga_append(&mapmode, 'n'); /* :nmap */
3000+ if (mode & OP_PENDING)
3001+ ga_append(&mapmode, 'o'); /* :omap */
3002+ if ((mode & (VISUAL + SELECTMODE)) == VISUAL + SELECTMODE)
3003+ ga_append(&mapmode, 'v'); /* :vmap */
3004+ else
3005+ {
3006+ if (mode & VISUAL)
3007+ ga_append(&mapmode, 'x'); /* :xmap */
3008+ if (mode & SELECTMODE)
3009+ ga_append(&mapmode, 's'); /* :smap */
3010+ }
3011+ }
3012+
3013+ ga_append(&mapmode, NUL);
3014+ return (char_u *)mapmode.ga_data;
3015+}
3016+
3017 static void
3018 showmap(mp, local)
3019 mapblock_T *mp;
3020 int local; /* TRUE for buffer-local map */
3021 {
3022- int len = 1;
3023+ int len = 1;
3024+ char_u *mapchars;
3025
3026 if (msg_didout || msg_silent != 0)
3027 {
3028@@ -3864,49 +3916,15 @@
3029 if (got_int) /* 'q' typed at MORE prompt */
3030 return;
3031 }
3032- if ((mp->m_mode & (INSERT + CMDLINE)) == INSERT + CMDLINE)
3033- msg_putchar('!'); /* :map! */
3034- else if (mp->m_mode & INSERT)
3035- msg_putchar('i'); /* :imap */
3036- else if (mp->m_mode & LANGMAP)
3037- msg_putchar('l'); /* :lmap */
3038- else if (mp->m_mode & CMDLINE)
3039- msg_putchar('c'); /* :cmap */
3040- else if ((mp->m_mode & (NORMAL + VISUAL + SELECTMODE + OP_PENDING))
3041- == NORMAL + VISUAL + SELECTMODE + OP_PENDING)
3042- msg_putchar(' '); /* :map */
3043- else
3044+
3045+ mapchars = map_mode_to_chars(mp->m_mode);
3046+ if (mapchars != NULL)
3047 {
3048- len = 0;
3049- if (mp->m_mode & NORMAL)
3050- {
3051- msg_putchar('n'); /* :nmap */
3052- ++len;
3053- }
3054- if (mp->m_mode & OP_PENDING)
3055- {
3056- msg_putchar('o'); /* :omap */
3057- ++len;
3058- }
3059- if ((mp->m_mode & (VISUAL + SELECTMODE)) == VISUAL + SELECTMODE)
3060- {
3061- msg_putchar('v'); /* :vmap */
3062- ++len;
3063- }
3064- else
3065- {
3066- if (mp->m_mode & VISUAL)
3067- {
3068- msg_putchar('x'); /* :xmap */
3069- ++len;
3070- }
3071- if (mp->m_mode & SELECTMODE)
3072- {
3073- msg_putchar('s'); /* :smap */
3074- ++len;
3075- }
3076- }
3077+ msg_puts(mapchars);
3078+ len = (int)STRLEN(mapchars);
3079+ vim_free(mapchars);
3080 }
3081+
3082 while (++len <= 3)
3083 msg_putchar(' ');
3084
3085@@ -3931,8 +3949,7 @@
3086 msg_putchar(' ');
3087
3088 /* Use FALSE below if we only want things like <Up> to show up as such on
3089- * the rhs, and not M-x etc, TRUE gets both -- webb
3090- */
3091+ * the rhs, and not M-x etc, TRUE gets both -- webb */
3092 if (*mp->m_str == NUL)
3093 msg_puts_attr((char_u *)"<Nop>", hl_attr(HLF_8));
3094 else
3095@@ -4995,19 +5012,21 @@
3096 sourcing_name = save_name;
3097 }
3098
3099-#ifdef FEAT_EVAL
3100+#if defined(FEAT_EVAL) || defined(PROTO)
3101 /*
3102- * Check the string "keys" against the lhs of all mappings
3103- * Return pointer to rhs of mapping (mapblock->m_str)
3104- * NULL otherwise
3105+ * Check the string "keys" against the lhs of all mappings.
3106+ * Return pointer to rhs of mapping (mapblock->m_str).
3107+ * NULL when no mapping found.
3108 */
3109 char_u *
3110-check_map(keys, mode, exact, ign_mod, abbr)
3111+check_map(keys, mode, exact, ign_mod, abbr, mp_ptr, local_ptr)
3112 char_u *keys;
3113 int mode;
3114 int exact; /* require exact match */
3115 int ign_mod; /* ignore preceding modifier */
3116 int abbr; /* do abbreviations */
3117+ mapblock_T **mp_ptr; /* return: pointer to mapblock or NULL */
3118+ int *local_ptr; /* return: buffer-local mapping or NULL */
3119 {
3120 int hash;
3121 int len, minlen;
3122@@ -5062,7 +5081,17 @@
3123 minlen = mp->m_keylen - 3;
3124 }
3125 if (STRNCMP(s, keys, minlen) == 0)
3126+ {
3127+ if (mp_ptr != NULL)
3128+ *mp_ptr = mp;
3129+ if (local_ptr != NULL)
3130+#ifdef FEAT_LOCALMAP
3131+ *local_ptr = local;
3132+#else
3133+ *local_ptr = 0;
3134+#endif
3135 return mp->m_str;
3136+ }
3137 }
3138 }
3139 }
3140diff -Naur vim73.orig/src/globals.h vim73/src/globals.h
3141--- vim73.orig/src/globals.h 2010-07-23 15:20:45.000000000 -0400
3142+++ vim73/src/globals.h 2011-01-08 21:01:19.278656842 -0500
3143@@ -510,8 +510,13 @@
3144 EXTERN VimClipboard clip_plus; /* CLIPBOARD selection in X11 */
3145 # else
3146 # define clip_plus clip_star /* there is only one clipboard */
3147+# define ONE_CLIPBOARD
3148 # endif
3149-EXTERN int clip_unnamed INIT(= FALSE);
3150+
3151+#define CLIP_UNNAMED 1
3152+#define CLIP_UNNAMED_PLUS 2
3153+EXTERN int clip_unnamed INIT(= 0); /* above two values or'ed */
3154+
3155 EXTERN int clip_autoselect INIT(= FALSE);
3156 EXTERN int clip_autoselectml INIT(= FALSE);
3157 EXTERN int clip_html INIT(= FALSE);
3158diff -Naur vim73.orig/src/gui.c vim73/src/gui.c
3159--- vim73.orig/src/gui.c 2010-08-08 09:01:18.000000000 -0400
3160+++ vim73/src/gui.c 2011-01-08 21:01:18.886656411 -0500
3161@@ -105,8 +105,18 @@
3162
3163 #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11)
3164 if (gui.in_use)
3165+ {
3166+# ifdef FEAT_EVAL
3167+ Window x11_window;
3168+ Display *x11_display;
3169+
3170+ if (gui_get_x11_windis(&x11_window, &x11_display) == OK)
3171+ set_vim_var_nr(VV_WINDOWID, (long)x11_window);
3172+# endif
3173+
3174 /* Display error messages in a dialog now. */
3175 display_errors();
3176+ }
3177 #endif
3178
3179 #if defined(MAY_FORK) && !defined(__QNXNTO__)
3180@@ -2352,7 +2362,7 @@
3181 if (draw_sign)
3182 /* Draw the sign on top of the spaces. */
3183 gui_mch_drawsign(gui.row, col, gui.highlight_mask);
3184-# if defined(FEAT_NETBEANS_INTG) && (defined(FEAT_GUI_MOTIF) \
3185+# if defined(FEAT_NETBEANS_INTG) && (defined(FEAT_GUI_X11) \
3186 || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32))
3187 if (multi_sign)
3188 netbeans_draw_multisign_indicator(gui.row);
3189diff -Naur vim73.orig/src/gui_gtk.c vim73/src/gui_gtk.c
3190--- vim73.orig/src/gui_gtk.c 2010-07-20 07:15:22.000000000 -0400
3191+++ vim73/src/gui_gtk.c 2011-01-08 21:01:19.298658878 -0500
3192@@ -1287,6 +1287,9 @@
3193 entry = gtk_entry_new();
3194 gtk_widget_show(entry);
3195
3196+ /* Make Enter work like pressing OK. */
3197+ gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
3198+
3199 text = CONVERT_TO_UTF8(textfield);
3200 gtk_entry_set_text(GTK_ENTRY(entry), (const char *)text);
3201 CONVERT_TO_UTF8_FREE(text);
3202@@ -1795,7 +1798,6 @@
3203 char_u *repl_text;
3204 gboolean direction_down;
3205 SharedFindReplace *sfr;
3206- int rc;
3207
3208 flags = (int)(long)data; /* avoid a lint warning here */
3209
3210@@ -1821,7 +1823,7 @@
3211
3212 repl_text = CONVERT_FROM_UTF8(repl_text);
3213 find_text = CONVERT_FROM_UTF8(find_text);
3214- rc = gui_do_findrepl(flags, find_text, repl_text, direction_down);
3215+ gui_do_findrepl(flags, find_text, repl_text, direction_down);
3216 CONVERT_FROM_UTF8_FREE(repl_text);
3217 CONVERT_FROM_UTF8_FREE(find_text);
3218 }
3219diff -Naur vim73.orig/src/gui_mac.c vim73/src/gui_mac.c
3220--- vim73.orig/src/gui_mac.c 2010-08-14 15:39:54.000000000 -0400
3221+++ vim73/src/gui_mac.c 2011-01-08 21:01:18.766656221 -0500
3222@@ -1480,7 +1480,7 @@
3223 *
3224 * Returns the index inside the menu wher
3225 */
3226- short /* Shoulde we return MenuItemIndex? */
3227+ short /* Should we return MenuItemIndex? */
3228 gui_mac_get_menu_item_index(vimmenu_T *pMenu)
3229 {
3230 short index;
3231@@ -1823,7 +1823,7 @@
3232 p.h += gui.scrollbar_width;
3233 if (gui.which_scrollbars[SBAR_RIGHT])
3234 p.h += gui.scrollbar_width;
3235- /* ideal height is as heigh as we can get */
3236+ /* ideal height is as high as we can get */
3237 p.v = 15 * 1024;
3238
3239 thePart = IsWindowInStandardState(whichWindow, &p, &r)
3240@@ -4481,7 +4481,7 @@
3241 * event arrives. No need to check for input_buf_full because we are
3242 * returning as soon as it contains a single char.
3243 */
3244- /* TODO: reduce wtime accordinly??? */
3245+ /* TODO: reduce wtime accordingly??? */
3246 if (wtime > -1)
3247 sleeppyTick = 60 * wtime / 1000;
3248 else
3249@@ -5723,13 +5723,13 @@
3250 iconDITL = GetResource('DITL', 131);
3251 switch (type)
3252 {
3253- case VIM_GENERIC: useIcon = kNoteIcon;
3254- case VIM_ERROR: useIcon = kStopIcon;
3255- case VIM_WARNING: useIcon = kCautionIcon;
3256- case VIM_INFO: useIcon = kNoteIcon;
3257- case VIM_QUESTION: useIcon = kNoteIcon;
3258- default: useIcon = kStopIcon;
3259- };
3260+ case VIM_GENERIC:
3261+ case VIM_INFO:
3262+ case VIM_QUESTION: useIcon = kNoteIcon; break;
3263+ case VIM_WARNING: useIcon = kCautionIcon; break;
3264+ case VIM_ERROR: useIcon = kStopIcon; break;
3265+ default: useIcon = kStopIcon;
3266+ }
3267 AppendDITL(theDialog, iconDITL, overlayDITL);
3268 ReleaseResource(iconDITL);
3269 GetDialogItem(theDialog, iconItm.idx, &itemType, &itemHandle, &box);
3270@@ -5892,7 +5892,7 @@
3271
3272 return itemHit;
3273 /*
3274- * Usefull thing which could be used
3275+ * Useful thing which could be used
3276 * SetDialogTimeout(): Auto click a button after timeout
3277 * SetDialogTracksCursor() : Get the I-beam cursor over input box
3278 * MoveDialogItem(): Probably better than SetDialogItem
3279@@ -6100,7 +6100,7 @@
3280 #endif
3281
3282 /*
3283- * Transfered from os_mac.c for MacOS X using os_unix.c prep work
3284+ * Transferred from os_mac.c for MacOS X using os_unix.c prep work
3285 */
3286
3287 int
3288@@ -6543,7 +6543,7 @@
3289 static ControlRef dataBrowser = NULL;
3290
3291 // when the tabline is hidden, vim doesn't call update_tabline(). When
3292-// the tabline is shown again, show_tabline() is called before upate_tabline(),
3293+// the tabline is shown again, show_tabline() is called before update_tabline(),
3294 // and because of this, the tab labels and vims internal tabs are out of sync
3295 // for a very short time. to prevent inconsistent state, we store the labels
3296 // of the tabs, not pointers to the tabs (which are invalid for a short time).
3297diff -Naur vim73.orig/src/gui_w32.c vim73/src/gui_w32.c
3298--- vim73.orig/src/gui_w32.c 2010-08-08 09:05:26.000000000 -0400
3299+++ vim73/src/gui_w32.c 2011-01-08 21:01:18.990656516 -0500
3300@@ -289,13 +289,13 @@
3301
3302 #ifdef FEAT_MENU
3303 static UINT s_menu_id = 100;
3304+#endif
3305
3306 /*
3307 * Use the system font for dialogs and tear-off menus. Remove this line to
3308 * use DLG_FONT_NAME.
3309 */
3310-# define USE_SYSMENU_FONT
3311-#endif
3312+#define USE_SYSMENU_FONT
3313
3314 #define VIM_NAME "vim"
3315 #define VIM_CLASS "Vim"
3316@@ -1260,7 +1260,7 @@
3317
3318 /* try and load the user32.dll library and get the entry points for
3319 * multi-monitor-support. */
3320- if ((user32_lib = LoadLibrary("User32.dll")) != NULL)
3321+ if ((user32_lib = vimLoadLib("User32.dll")) != NULL)
3322 {
3323 pMonitorFromWindow = (TMonitorFromWindow)GetProcAddress(user32_lib,
3324 "MonitorFromWindow");
3325@@ -1573,6 +1573,11 @@
3326 # endif
3327 #endif
3328
3329+#ifdef FEAT_EVAL
3330+ /* set the v:windowid variable */
3331+ set_vim_var_nr(VV_WINDOWID, (long)s_hwnd);
3332+#endif
3333+
3334 theend:
3335 /* Display any pending error messages */
3336 display_errors();
3337@@ -4188,7 +4193,7 @@
3338 static void
3339 dyn_imm_load(void)
3340 {
3341- hLibImm = LoadLibrary("imm32.dll");
3342+ hLibImm = vimLoadLib("imm32.dll");
3343 if (hLibImm == NULL)
3344 return;
3345
3346diff -Naur vim73.orig/src/gui_w48.c vim73/src/gui_w48.c
3347--- vim73.orig/src/gui_w48.c 2010-07-27 15:46:04.000000000 -0400
3348+++ vim73/src/gui_w48.c 2011-01-08 21:01:18.918658776 -0500
3349@@ -1810,7 +1810,8 @@
3350 * mapped we want to use the mapping instead. */
3351 if (vk == VK_F10
3352 && gui.menu_is_active
3353- && check_map(k10, State, FALSE, TRUE, FALSE) == NULL)
3354+ && check_map(k10, State, FALSE, TRUE, FALSE,
3355+ NULL, NULL) == NULL)
3356 break;
3357 #endif
3358 if (GetKeyState(VK_SHIFT) & 0x8000)
3359@@ -1924,7 +1925,8 @@
3360 /* Check for <F10>: Default effect is to select the menu. When <F10> is
3361 * mapped we need to stop it here to avoid strange effects (e.g., for the
3362 * key-up event) */
3363- if (vk != VK_F10 || check_map(k10, State, FALSE, TRUE, FALSE) == NULL)
3364+ if (vk != VK_F10 || check_map(k10, State, FALSE, TRUE, FALSE,
3365+ NULL, NULL) == NULL)
3366 #endif
3367 DispatchMessage(&msg);
3368 }
3369diff -Naur vim73.orig/src/gui_x11.c vim73/src/gui_x11.c
3370--- vim73.orig/src/gui_x11.c 2010-08-08 09:05:45.000000000 -0400
3371+++ vim73/src/gui_x11.c 2011-01-08 21:01:19.178657868 -0500
3372@@ -2895,6 +2895,11 @@
3373 focus = gui.in_focus;
3374 }
3375
3376+#if defined(FEAT_NETBEANS_INTG)
3377+ /* Process any queued netbeans messages. */
3378+ netbeans_parse_messages();
3379+#endif
3380+
3381 /*
3382 * Don't use gui_mch_update() because then we will spin-lock until a
3383 * char arrives, instead we use XtAppProcessEvent() to hang until an
3384diff -Naur vim73.orig/src/if_cscope.c vim73/src/if_cscope.c
3385--- vim73.orig/src/if_cscope.c 2010-07-25 10:32:31.000000000 -0400
3386+++ vim73/src/if_cscope.c 2011-01-08 21:01:19.458660505 -0500
3387@@ -13,16 +13,11 @@
3388
3389 #if defined(FEAT_CSCOPE) || defined(PROTO)
3390
3391-#include <string.h>
3392-#include <errno.h>
3393 #include <assert.h>
3394 #include <sys/types.h>
3395 #include <sys/stat.h>
3396 #if defined(UNIX)
3397 # include <sys/wait.h>
3398-#else
3399- /* not UNIX, must be WIN32 */
3400-# include "vimio.h"
3401 #endif
3402 #include "if_cscope.h"
3403
3404@@ -1274,9 +1269,7 @@
3405 {
3406 win_split(postponed_split > 0 ? postponed_split : 0,
3407 postponed_split_flags);
3408-# ifdef FEAT_SCROLLBIND
3409- curwin->w_p_scb = FALSE;
3410-# endif
3411+ RESET_BINDING(curwin);
3412 postponed_split = 0;
3413 }
3414 # endif
3415@@ -1353,7 +1346,7 @@
3416 " g: Find this definition\n"
3417 " i: Find files #including this file\n"
3418 " s: Find this C symbol\n"
3419- " t: Find assignments to\n"));
3420+ " t: Find this text string\n"));
3421
3422 cmdp++;
3423 }
3424@@ -1664,7 +1657,7 @@
3425 /*
3426 * PRIVATE: cs_make_vim_style_matches
3427 *
3428- * convert the cscope output into into a ctags style entry (as might be found
3429+ * convert the cscope output into a ctags style entry (as might be found
3430 * in a ctags tags file). there's one catch though: cscope doesn't tell you
3431 * the type of the tag you are looking for. for example, in Darren Hiebert's
3432 * ctags (the one that comes with vim), #define's use a line number to find the
3433diff -Naur vim73.orig/src/if_lua.c vim73/src/if_lua.c
3434--- vim73.orig/src/if_lua.c 2010-08-12 16:12:04.000000000 -0400
3435+++ vim73/src/if_lua.c 2011-01-08 21:01:18.922656581 -0500
3436@@ -49,7 +49,7 @@
3437 # define symbol_from_dll dlsym
3438 # define close_dll dlclose
3439 #else
3440-# define load_dll LoadLibrary
3441+# define load_dll vimLoadLib
3442 # define symbol_from_dll GetProcAddress
3443 # define close_dll FreeLibrary
3444 #endif
3445diff -Naur vim73.orig/src/if_mzsch.c vim73/src/if_mzsch.c
3446--- vim73.orig/src/if_mzsch.c 2010-06-25 23:56:17.000000000 -0400
3447+++ vim73/src/if_mzsch.c 2011-01-08 21:01:19.114655467 -0500
3448@@ -556,8 +556,8 @@
3449
3450 if (hMzGC && hMzSch)
3451 return OK;
3452- hMzSch = LoadLibrary(sch_dll);
3453- hMzGC = LoadLibrary(gc_dll);
3454+ hMzSch = vimLoadLib(sch_dll);
3455+ hMzGC = vimLoadLib(gc_dll);
3456
3457 if (!hMzSch)
3458 {
3459@@ -794,9 +794,16 @@
3460 #endif
3461 }
3462
3463+#if MZSCHEME_VERSION_MAJOR >= 500 && defined(WIN32) && defined(USE_THREAD_LOCAL)
3464+static __declspec(thread) void *tls_space;
3465+#endif
3466+
3467 void
3468 mzscheme_main(void)
3469 {
3470+#if MZSCHEME_VERSION_MAJOR >= 500 && defined(WIN32) && defined(USE_THREAD_LOCAL)
3471+ scheme_register_tls_space(&tls_space, 0);
3472+#endif
3473 #if defined(MZ_PRECISE_GC) && MZSCHEME_VERSION_MAJOR >= 400
3474 /* use trampoline for precise GC in MzScheme >= 4.x */
3475 scheme_main_setup(TRUE, mzscheme_env_main, 0, NULL);
3476diff -Naur vim73.orig/src/if_perl.xs vim73/src/if_perl.xs
3477--- vim73.orig/src/if_perl.xs 2010-07-22 05:33:37.000000000 -0400
3478+++ vim73/src/if_perl.xs 2011-01-08 21:01:18.926655661 -0500
3479@@ -106,7 +106,7 @@
3480 #define close_dll dlclose
3481 #else
3482 #define PERL_PROC FARPROC
3483-#define load_dll LoadLibrary
3484+#define load_dll vimLoadLib
3485 #define symbol_from_dll GetProcAddress
3486 #define close_dll FreeLibrary
3487 #endif
3488diff -Naur vim73.orig/src/if_py_both.h vim73/src/if_py_both.h
3489--- vim73.orig/src/if_py_both.h 2010-08-08 07:06:29.000000000 -0400
3490+++ vim73/src/if_py_both.h 2011-01-08 21:01:18.982656784 -0500
3491@@ -34,6 +34,7 @@
3492 static PyObject *OutputWrite(PyObject *, PyObject *);
3493 static PyObject *OutputWritelines(PyObject *, PyObject *);
3494
3495+/* Function to write a line, points to either msg() or emsg(). */
3496 typedef void (*writefn)(char_u *);
3497 static void writer(writefn fn, char_u *str, PyInt n);
3498
3499@@ -122,52 +123,19 @@
3500 return Py_None;
3501 }
3502
3503-static char_u *buffer = NULL;
3504-static PyInt buffer_len = 0;
3505-static PyInt buffer_size = 0;
3506-
3507+/* Buffer IO, we write one whole line at a time. */
3508+static garray_T io_ga = {0, 0, 1, 80, NULL};
3509 static writefn old_fn = NULL;
3510
3511 static void
3512-buffer_ensure(PyInt n)
3513-{
3514- PyInt new_size;
3515- char_u *new_buffer;
3516-
3517- if (n < buffer_size)
3518- return;
3519-
3520- new_size = buffer_size;
3521- while (new_size < n)
3522- new_size += 80;
3523-
3524- if (new_size != buffer_size)
3525- {
3526- new_buffer = alloc((unsigned)new_size);
3527- if (new_buffer == NULL)
3528- return;
3529-
3530- if (buffer)
3531- {
3532- memcpy(new_buffer, buffer, buffer_len);
3533- vim_free(buffer);
3534- }
3535-
3536- buffer = new_buffer;
3537- buffer_size = new_size;
3538- }
3539-}
3540-
3541- static void
3542 PythonIO_Flush(void)
3543 {
3544- if (old_fn && buffer_len)
3545+ if (old_fn != NULL && io_ga.ga_len > 0)
3546 {
3547- buffer[buffer_len] = 0;
3548- old_fn(buffer);
3549+ ((char_u *)io_ga.ga_data)[io_ga.ga_len] = NUL;
3550+ old_fn((char_u *)io_ga.ga_data);
3551 }
3552-
3553- buffer_len = 0;
3554+ io_ga.ga_len = 0;
3555 }
3556
3557 static void
3558@@ -175,30 +143,34 @@
3559 {
3560 char_u *ptr;
3561
3562- if (fn != old_fn && old_fn != NULL)
3563+ /* Flush when switching output function. */
3564+ if (fn != old_fn)
3565 PythonIO_Flush();
3566-
3567 old_fn = fn;
3568
3569+ /* Write each NL separated line. Text after the last NL is kept for
3570+ * writing later. */
3571 while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL)
3572 {
3573 PyInt len = ptr - str;
3574
3575- buffer_ensure(buffer_len + len + 1);
3576+ if (ga_grow(&io_ga, (int)(len + 1)) == FAIL)
3577+ break;
3578
3579- memcpy(buffer + buffer_len, str, len);
3580- buffer_len += len;
3581- buffer[buffer_len] = 0;
3582- fn(buffer);
3583+ mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)len);
3584+ ((char *)io_ga.ga_data)[io_ga.ga_len + len] = NUL;
3585+ fn((char_u *)io_ga.ga_data);
3586 str = ptr + 1;
3587 n -= len + 1;
3588- buffer_len = 0;
3589+ io_ga.ga_len = 0;
3590 }
3591
3592- /* Put the remaining text into the buffer for later printing */
3593- buffer_ensure(buffer_len + n + 1);
3594- memcpy(buffer + buffer_len, str, n);
3595- buffer_len += n;
3596+ /* Put the remaining text into io_ga for later printing. */
3597+ if (n > 0 && ga_grow(&io_ga, (int)(n + 1)) == OK)
3598+ {
3599+ mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)n);
3600+ io_ga.ga_len += (int)n;
3601+ }
3602 }
3603
3604 /***************/
3605diff -Naur vim73.orig/src/if_python.c vim73/src/if_python.c
3606--- vim73.orig/src/if_python.c 2010-08-13 09:59:41.000000000 -0400
3607+++ vim73/src/if_python.c 2011-01-08 21:01:19.190656939 -0500
3608@@ -102,7 +102,7 @@
3609 # include <dlfcn.h>
3610 # define FARPROC void*
3611 # define HINSTANCE void*
3612-# ifdef PY_NO_RTLD_GLOBAL
3613+# if defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)
3614 # define load_dll(n) dlopen((n), RTLD_LAZY)
3615 # else
3616 # define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
3617@@ -110,7 +110,7 @@
3618 # define close_dll dlclose
3619 # define symbol_from_dll dlsym
3620 # else
3621-# define load_dll LoadLibrary
3622+# define load_dll vimLoadLib
3623 # define close_dll FreeLibrary
3624 # define symbol_from_dll GetProcAddress
3625 # endif
3626@@ -168,6 +168,7 @@
3627 # define Py_BuildValue dll_Py_BuildValue
3628 # define Py_FindMethod dll_Py_FindMethod
3629 # define Py_InitModule4 dll_Py_InitModule4
3630+# define Py_SetPythonHome dll_Py_SetPythonHome
3631 # define Py_Initialize dll_Py_Initialize
3632 # define Py_Finalize dll_Py_Finalize
3633 # define Py_IsInitialized dll_Py_IsInitialized
3634@@ -226,6 +227,7 @@
3635 static PyObject*(*dll_Py_BuildValue)(char *, ...);
3636 static PyObject*(*dll_Py_FindMethod)(struct PyMethodDef[], PyObject *, char *);
3637 static PyObject*(*dll_Py_InitModule4)(char *, struct PyMethodDef *, char *, PyObject *, int);
3638+static void(*dll_Py_SetPythonHome)(char *home);
3639 static void(*dll_Py_Initialize)(void);
3640 static void(*dll_Py_Finalize)(void);
3641 static int(*dll_Py_IsInitialized)(void);
3642@@ -310,6 +312,7 @@
3643 # else
3644 {"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4},
3645 # endif
3646+ {"Py_SetPythonHome", (PYTHON_PROC*)&dll_Py_SetPythonHome},
3647 {"Py_Initialize", (PYTHON_PROC*)&dll_Py_Initialize},
3648 {"Py_Finalize", (PYTHON_PROC*)&dll_Py_Finalize},
3649 {"Py_IsInitialized", (PYTHON_PROC*)&dll_Py_IsInitialized},
3650@@ -349,7 +352,7 @@
3651 {
3652 int i;
3653
3654-#if !defined(PY_NO_RTLD_GLOBAL) && defined(UNIX) && defined(FEAT_PYTHON3)
3655+#if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON3)
3656 /* Can't have Python and Python3 loaded at the same time.
3657 * It cause a crash, because RTLD_GLOBAL is needed for
3658 * standard C extension libraries of one or both python versions. */
3659@@ -543,6 +546,10 @@
3660 }
3661 #endif
3662
3663+#ifdef PYTHON_HOME
3664+ Py_SetPythonHome(PYTHON_HOME);
3665+#endif
3666+
3667 init_structs();
3668
3669 #if !defined(MACOS) || defined(MACOS_X_UNIX)
3670diff -Naur vim73.orig/src/if_python3.c vim73/src/if_python3.c
3671--- vim73.orig/src/if_python3.c 2010-08-13 09:59:40.000000000 -0400
3672+++ vim73/src/if_python3.c 2011-01-08 21:01:19.190656939 -0500
3673@@ -80,7 +80,7 @@
3674 # include <dlfcn.h>
3675 # define FARPROC void*
3676 # define HINSTANCE void*
3677-# ifdef PY_NO_RTLD_GLOBAL
3678+# if defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)
3679 # define load_dll(n) dlopen((n), RTLD_LAZY)
3680 # else
3681 # define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
3682@@ -88,7 +88,7 @@
3683 # define close_dll dlclose
3684 # define symbol_from_dll dlsym
3685 # else
3686-# define load_dll LoadLibrary
3687+# define load_dll vimLoadLib
3688 # define close_dll FreeLibrary
3689 # define symbol_from_dll GetProcAddress
3690 # endif
3691@@ -132,6 +132,7 @@
3692 # define PyType_Ready py3_PyType_Ready
3693 #undef Py_BuildValue
3694 # define Py_BuildValue py3_Py_BuildValue
3695+# define Py_SetPythonHome py3_Py_SetPythonHome
3696 # define Py_Initialize py3_Py_Initialize
3697 # define Py_Finalize py3_Py_Finalize
3698 # define Py_IsInitialized py3_Py_IsInitialized
3699@@ -170,6 +171,7 @@
3700 * Pointers for dynamic link
3701 */
3702 static int (*py3_PySys_SetArgv)(int, wchar_t **);
3703+static void (*py3_Py_SetPythonHome)(wchar_t *home);
3704 static void (*py3_Py_Initialize)(void);
3705 static PyObject* (*py3_PyList_New)(Py_ssize_t size);
3706 static PyGILState_STATE (*py3_PyGILState_Ensure)(void);
3707@@ -254,6 +256,7 @@
3708 } py3_funcname_table[] =
3709 {
3710 {"PySys_SetArgv", (PYTHON_PROC*)&py3_PySys_SetArgv},
3711+ {"Py_SetPythonHome", (PYTHON_PROC*)&py3_Py_SetPythonHome},
3712 {"Py_Initialize", (PYTHON_PROC*)&py3_Py_Initialize},
3713 {"PyArg_ParseTuple", (PYTHON_PROC*)&py3_PyArg_ParseTuple},
3714 {"PyList_New", (PYTHON_PROC*)&py3_PyList_New},
3715@@ -336,7 +339,7 @@
3716 int i;
3717 void *ucs_from_string, *ucs_from_string_and_size;
3718
3719-# if !defined(PY_NO_RTLD_GLOBAL) && defined(UNIX) && defined(FEAT_PYTHON)
3720+# if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON)
3721 /* Can't have Python and Python3 loaded at the same time.
3722 * It cause a crash, because RTLD_GLOBAL is needed for
3723 * standard C extension libraries of one or both python versions. */
3724@@ -539,6 +542,11 @@
3725
3726 init_structs();
3727
3728+
3729+#ifdef PYTHON3_HOME
3730+ Py_SetPythonHome(PYTHON3_HOME);
3731+#endif
3732+
3733 /* initialise threads */
3734 PyEval_InitThreads();
3735
3736diff -Naur vim73.orig/src/if_ruby.c vim73/src/if_ruby.c
3737--- vim73.orig/src/if_ruby.c 2010-06-30 15:33:12.000000000 -0400
3738+++ vim73/src/if_ruby.c 2011-01-08 21:01:19.442657935 -0500
3739@@ -4,6 +4,7 @@
3740 *
3741 * Ruby interface by Shugo Maeda
3742 * with improvements by SegPhault (Ryan Paul)
3743+ * with improvements by Jon Maken
3744 *
3745 * Do ":help uganda" in Vim to read copying and usage conditions.
3746 * Do ":help credits" in Vim to see a list of people who contributed.
3747@@ -13,6 +14,10 @@
3748 #include <stdio.h>
3749 #include <string.h>
3750
3751+#ifdef HAVE_CONFIG_H
3752+# include "auto/config.h"
3753+#endif
3754+
3755 #ifdef _WIN32
3756 # if !defined(DYNAMIC_RUBY_VER) || (DYNAMIC_RUBY_VER < 18)
3757 # define NT
3758@@ -26,12 +31,12 @@
3759 # define RUBYEXTERN extern
3760 #endif
3761
3762+#ifdef DYNAMIC_RUBY
3763 /*
3764 * This is tricky. In ruby.h there is (inline) function rb_class_of()
3765 * definition. This function use these variables. But we want function to
3766 * use dll_* variables.
3767 */
3768-#ifdef DYNAMIC_RUBY
3769 # define rb_cFalseClass (*dll_rb_cFalseClass)
3770 # define rb_cFixnum (*dll_rb_cFixnum)
3771 # define rb_cNilClass (*dll_rb_cNilClass)
3772@@ -46,8 +51,23 @@
3773 */
3774 # define RUBY_EXPORT
3775 # endif
3776+
3777+#if !(defined(WIN32) || defined(_WIN64))
3778+# include <dlfcn.h>
3779+# define HINSTANCE void*
3780+# define RUBY_PROC void*
3781+# define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
3782+# define symbol_from_dll dlsym
3783+# define close_dll dlclose
3784+#else
3785+# define RUBY_PROC FARPROC
3786+# define load_dll vimLoadLib
3787+# define symbol_from_dll GetProcAddress
3788+# define close_dll FreeLibrary
3789 #endif
3790
3791+#endif /* ifdef DYNAMIC_RUBY */
3792+
3793 /* suggested by Ariya Mizutani */
3794 #if (_MSC_VER == 1200)
3795 # undef _WIN32_WINNT
3796@@ -70,6 +90,7 @@
3797 # include <ruby/encoding.h>
3798 #endif
3799
3800+#undef off_t /* ruby defines off_t as _int64, Mingw uses long */
3801 #undef EXTERN
3802 #undef _
3803
3804@@ -160,28 +181,35 @@
3805 #define rb_lastline_get dll_rb_lastline_get
3806 #define rb_lastline_set dll_rb_lastline_set
3807 #define rb_load_protect dll_rb_load_protect
3808+#ifndef RUBY19_OR_LATER
3809 #define rb_num2long dll_rb_num2long
3810+#endif
3811 #define rb_num2ulong dll_rb_num2ulong
3812 #define rb_obj_alloc dll_rb_obj_alloc
3813 #define rb_obj_as_string dll_rb_obj_as_string
3814 #define rb_obj_id dll_rb_obj_id
3815 #define rb_raise dll_rb_raise
3816-#define rb_str2cstr dll_rb_str2cstr
3817 #define rb_str_cat dll_rb_str_cat
3818 #define rb_str_concat dll_rb_str_concat
3819 #define rb_str_new dll_rb_str_new
3820 #ifdef rb_str_new2
3821 /* Ruby may #define rb_str_new2 to use rb_str_new_cstr. */
3822 # define need_rb_str_new_cstr 1
3823+/* Ruby's headers #define rb_str_new_cstr to make use of GCC's
3824+ * __builtin_constant_p extension. */
3825+# undef rb_str_new_cstr
3826 # define rb_str_new_cstr dll_rb_str_new_cstr
3827 #else
3828 # define rb_str_new2 dll_rb_str_new2
3829 #endif
3830 #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3831+# define rb_string_value dll_rb_string_value
3832 # define rb_string_value_ptr dll_rb_string_value_ptr
3833 # define rb_float_new dll_rb_float_new
3834 # define rb_ary_new dll_rb_ary_new
3835 # define rb_ary_push dll_rb_ary_push
3836+#else
3837+# define rb_str2cstr dll_rb_str2cstr
3838 #endif
3839 #ifdef RUBY19_OR_LATER
3840 # define rb_errinfo dll_rb_errinfo
3841@@ -190,9 +218,11 @@
3842 #endif
3843 #define ruby_init dll_ruby_init
3844 #define ruby_init_loadpath dll_ruby_init_loadpath
3845-#define NtInitialize dll_NtInitialize
3846-#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3847-# define rb_w32_snprintf dll_rb_w32_snprintf
3848+#ifdef WIN3264
3849+# define NtInitialize dll_NtInitialize
3850+# if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3851+# define rb_w32_snprintf dll_rb_w32_snprintf
3852+# endif
3853 #endif
3854
3855 #ifdef RUBY19_OR_LATER
3856@@ -201,7 +231,9 @@
3857 # define rb_enc_find dll_rb_enc_find
3858 # define rb_enc_str_new dll_rb_enc_str_new
3859 # define rb_sprintf dll_rb_sprintf
3860+# define rb_require dll_rb_require
3861 # define ruby_init_stack dll_ruby_init_stack
3862+# define ruby_process_options dll_ruby_process_options
3863 #endif
3864
3865 /*
3866@@ -246,7 +278,11 @@
3867 static VALUE (*dll_rb_obj_as_string) (VALUE);
3868 static VALUE (*dll_rb_obj_id) (VALUE);
3869 static void (*dll_rb_raise) (VALUE, const char*, ...);
3870+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3871+static VALUE (*dll_rb_string_value) (volatile VALUE*);
3872+#else
3873 static char *(*dll_rb_str2cstr) (VALUE,int*);
3874+#endif
3875 static VALUE (*dll_rb_str_cat) (VALUE, const char*, long);
3876 static VALUE (*dll_rb_str_concat) (VALUE, VALUE);
3877 static VALUE (*dll_rb_str_new) (const char*, long);
3878@@ -263,7 +299,12 @@
3879 #endif
3880 static void (*dll_ruby_init) (void);
3881 static void (*dll_ruby_init_loadpath) (void);
3882+#ifdef WIN3264
3883 static void (*dll_NtInitialize) (int*, char***);
3884+# if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3885+static int (*dll_rb_w32_snprintf)(char*, size_t, const char*, ...);
3886+# endif
3887+#endif
3888 #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3889 static char * (*dll_rb_string_value_ptr) (volatile VALUE*);
3890 static VALUE (*dll_rb_float_new) (double);
3891@@ -273,9 +314,6 @@
3892 #ifdef RUBY19_OR_LATER
3893 static VALUE (*dll_rb_int2big)(SIGNED_VALUE);
3894 #endif
3895-#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3896-static int (*dll_rb_w32_snprintf)(char*, size_t, const char*, ...);
3897-#endif
3898
3899 #ifdef RUBY19_OR_LATER
3900 static void (*dll_ruby_script) (const char*);
3901@@ -283,7 +321,9 @@
3902 static rb_encoding* (*dll_rb_enc_find) (const char*);
3903 static VALUE (*dll_rb_enc_str_new) (const char*, long, rb_encoding*);
3904 static VALUE (*dll_rb_sprintf) (const char*, ...);
3905+static VALUE (*dll_rb_require) (const char*);
3906 static void (*ruby_init_stack)(VALUE*);
3907+static void* (*ruby_process_options)(int, char**);
3908 #endif
3909
3910 #ifdef RUBY19_OR_LATER
3911@@ -297,12 +337,11 @@
3912 }
3913 #endif
3914
3915-static HINSTANCE hinstRuby = 0; /* Instance of ruby.dll */
3916+static HINSTANCE hinstRuby = NULL; /* Instance of ruby.dll */
3917
3918 /*
3919 * Table of name to function pointer of ruby.
3920 */
3921-#define RUBY_PROC FARPROC
3922 static struct
3923 {
3924 char *name;
3925@@ -347,7 +386,11 @@
3926 {"rb_obj_as_string", (RUBY_PROC*)&dll_rb_obj_as_string},
3927 {"rb_obj_id", (RUBY_PROC*)&dll_rb_obj_id},
3928 {"rb_raise", (RUBY_PROC*)&dll_rb_raise},
3929+#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3930+ {"rb_string_value", (RUBY_PROC*)&dll_rb_string_value},
3931+#else
3932 {"rb_str2cstr", (RUBY_PROC*)&dll_rb_str2cstr},
3933+#endif
3934 {"rb_str_cat", (RUBY_PROC*)&dll_rb_str_cat},
3935 {"rb_str_concat", (RUBY_PROC*)&dll_rb_str_concat},
3936 {"rb_str_new", (RUBY_PROC*)&dll_rb_str_new},
3937@@ -363,15 +406,17 @@
3938 #endif
3939 {"ruby_init", (RUBY_PROC*)&dll_ruby_init},
3940 {"ruby_init_loadpath", (RUBY_PROC*)&dll_ruby_init_loadpath},
3941+#ifdef WIN3264
3942 {
3943-#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER < 19
3944+# if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER < 19
3945 "NtInitialize",
3946-#else
3947+# else
3948 "ruby_sysinit",
3949-#endif
3950+# endif
3951 (RUBY_PROC*)&dll_NtInitialize},
3952-#if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3953+# if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3954 {"rb_w32_snprintf", (RUBY_PROC*)&dll_rb_w32_snprintf},
3955+# endif
3956 #endif
3957 #if defined(DYNAMIC_RUBY_VER) && DYNAMIC_RUBY_VER >= 18
3958 {"rb_string_value_ptr", (RUBY_PROC*)&dll_rb_string_value_ptr},
3959@@ -386,7 +431,9 @@
3960 {"rb_enc_find", (RUBY_PROC*)&dll_rb_enc_find},
3961 {"rb_enc_str_new", (RUBY_PROC*)&dll_rb_enc_str_new},
3962 {"rb_sprintf", (RUBY_PROC*)&dll_rb_sprintf},
3963+ {"rb_require", (RUBY_PROC*)&dll_rb_require},
3964 {"ruby_init_stack", (RUBY_PROC*)&dll_ruby_init_stack},
3965+ {"ruby_process_options", (RUBY_PROC*)&dll_ruby_process_options},
3966 #endif
3967 {"", NULL},
3968 };
3969@@ -399,8 +446,8 @@
3970 {
3971 if (hinstRuby)
3972 {
3973- FreeLibrary(hinstRuby);
3974- hinstRuby = 0;
3975+ close_dll(hinstRuby);
3976+ hinstRuby = NULL;
3977 }
3978 }
3979
3980@@ -416,7 +463,7 @@
3981
3982 if (hinstRuby)
3983 return OK;
3984- hinstRuby = LoadLibrary(libname);
3985+ hinstRuby = load_dll(libname);
3986 if (!hinstRuby)
3987 {
3988 if (verbose)
3989@@ -426,11 +473,11 @@
3990
3991 for (i = 0; ruby_funcname_table[i].ptr; ++i)
3992 {
3993- if (!(*ruby_funcname_table[i].ptr = GetProcAddress(hinstRuby,
3994+ if (!(*ruby_funcname_table[i].ptr = symbol_from_dll(hinstRuby,
3995 ruby_funcname_table[i].name)))
3996 {
3997- FreeLibrary(hinstRuby);
3998- hinstRuby = 0;
3999+ close_dll(hinstRuby);
4000+ hinstRuby = NULL;
4001 if (verbose)
4002 EMSG2(_(e_loadfunc), ruby_funcname_table[i].name);
4003 return FAIL;
4004@@ -539,9 +586,9 @@
4005 if (u_save(eap->line1 - 1, eap->line2 + 1) != OK)
4006 return;
4007 for (i = eap->line1; i <= eap->line2; i++) {
4008- VALUE line, oldline;
4009+ VALUE line;
4010
4011- line = oldline = vim_str2rb_enc_str((char *)ml_get(i));
4012+ line = vim_str2rb_enc_str((char *)ml_get(i));
4013 rb_lastline_set(line);
4014 eval_enc_string_protect((char *) eap->arg, &state);
4015 if (state) {
4016@@ -616,13 +663,16 @@
4017 ruby_init();
4018 }
4019 #ifdef RUBY19_OR_LATER
4020+ {
4021+ int dummy_argc = 2;
4022+ char *dummy_argv[] = {"vim-ruby", "-e0"};
4023+ ruby_process_options(dummy_argc, dummy_argv);
4024+ }
4025 ruby_script("vim-ruby");
4026-#endif
4027+#else
4028 ruby_init_loadpath();
4029- ruby_io_init();
4030-#ifdef RUBY19_OR_LATER
4031- rb_enc_find_index("encdb");
4032 #endif
4033+ ruby_io_init();
4034 ruby_vim_init();
4035 ruby_initialized = 1;
4036 #ifdef DYNAMIC_RUBY
4037@@ -906,15 +956,9 @@
4038
4039 static VALUE get_buffer_line(buf_T *buf, linenr_T n)
4040 {
4041- if (n > 0 && n <= buf->b_ml.ml_line_count)
4042- {
4043- char *line = (char *)ml_get_buf(buf, n, FALSE);
4044- return line ? vim_str2rb_enc_str(line) : Qnil;
4045- }
4046- rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
4047-#ifndef __GNUC__
4048- return Qnil; /* For stop warning */
4049-#endif
4050+ if (n <= 0 || n > buf->b_ml.ml_line_count)
4051+ rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
4052+ return vim_str2rb_enc_str((char *)ml_get_buf(buf, n, FALSE));
4053 }
4054
4055 static VALUE buffer_aref(VALUE self, VALUE num)
4056@@ -953,9 +997,6 @@
4057 else
4058 {
4059 rb_raise(rb_eIndexError, "line number %ld out of range", (long)n);
4060-#ifndef __GNUC__
4061- return Qnil; /* For stop warning */
4062-#endif
4063 }
4064 return str;
4065 }
4066@@ -1010,7 +1051,8 @@
4067 long n = NUM2LONG(num);
4068 aco_save_T aco;
4069
4070- if (line == NULL) {
4071+ if (line == NULL)
4072+ {
4073 rb_raise(rb_eIndexError, "NULL line");
4074 }
4075 else if (n >= 0 && n <= buf->b_ml.ml_line_count)
4076@@ -1034,7 +1076,8 @@
4077
4078 update_curbuf(NOT_VALID);
4079 }
4080- else {
4081+ else
4082+ {
4083 rb_raise(rb_eIndexError, "line number %ld out of range", n);
4084 }
4085 return str;
4086diff -Naur vim73.orig/src/if_sniff.c vim73/src/if_sniff.c
4087--- vim73.orig/src/if_sniff.c 2010-05-15 07:04:06.000000000 -0400
4088+++ vim73/src/if_sniff.c 2011-01-08 21:01:19.378657342 -0500
4089@@ -9,7 +9,6 @@
4090
4091 #ifdef WIN32
4092 # include <stdio.h>
4093-# include "vimio.h"
4094 # include <process.h>
4095 # include <string.h>
4096 # include <assert.h>
4097diff -Naur vim73.orig/src/if_tcl.c vim73/src/if_tcl.c
4098--- vim73.orig/src/if_tcl.c 2010-08-08 09:07:25.000000000 -0400
4099+++ vim73/src/if_tcl.c 2011-01-08 21:01:19.434656677 -0500
4100@@ -74,7 +74,6 @@
4101 #endif
4102
4103 #include <tcl.h>
4104-#include <errno.h>
4105 #include <string.h>
4106
4107 typedef struct
4108diff -Naur vim73.orig/src/integration.c vim73/src/integration.c
4109--- vim73.orig/src/integration.c 2010-08-08 09:09:21.000000000 -0400
4110+++ vim73/src/integration.c 2011-01-08 21:01:19.434656677 -0500
4111@@ -33,7 +33,6 @@
4112 #include <sys/un.h>
4113 #endif
4114
4115-#include <errno.h>
4116 #include <sys/types.h>
4117 #include <sys/socket.h>
4118 #include <sys/param.h>
4119diff -Naur vim73.orig/src/link.sh vim73/src/link.sh
4120--- vim73.orig/src/link.sh 2010-07-21 15:43:29.000000000 -0400
4121+++ vim73/src/link.sh 2011-01-08 21:01:19.122658259 -0500
4122@@ -5,7 +5,7 @@
4123 # libraries when they exist, but this doesn't mean they are needed for Vim.
4124 #
4125 # Author: Bram Moolenaar
4126-# Last change: 2006 Sep 26
4127+# Last change: 2010 Nov 03
4128 # License: Public domain
4129 #
4130 # Warning: This fails miserably if the linker doesn't return an error code!
4131@@ -16,11 +16,23 @@
4132 echo "$LINK " >link.cmd
4133 exit_value=0
4134
4135+if test "$LINK_AS_NEEDED" = yes; then
4136+ echo "link.sh: \$LINK_AS_NEEDED set to 'yes': invoking linker directly."
4137+ cat link.cmd
4138+ if sh link.cmd; then
4139+ exit_value=0
4140+ echo "link.sh: Linked fine"
4141+ else
4142+ exit_value=$?
4143+ echo "link.sh: Linking failed"
4144+ fi
4145+else
4146+ if test -f auto/link.sed; then
4147+
4148 #
4149 # If auto/link.sed already exists, use it. We assume a previous run of
4150 # link.sh has found the correct set of libraries.
4151 #
4152-if test -f auto/link.sed; then
4153 echo "link.sh: The file 'auto/link.sed' exists, which is going to be used now."
4154 echo "link.sh: If linking fails, try deleting the auto/link.sed file."
4155 echo "link.sh: If this fails too, try creating an empty auto/link.sed file."
4156@@ -124,6 +136,8 @@
4157 fi
4158 fi
4159
4160+fi
4161+
4162 #
4163 # cleanup
4164 #
4165diff -Naur vim73.orig/src/macros.h vim73/src/macros.h
4166--- vim73.orig/src/macros.h 2010-07-17 15:41:21.000000000 -0400
4167+++ vim73/src/macros.h 2011-01-08 20:59:41.002656834 -0500
4168@@ -285,3 +285,17 @@
4169 #else
4170 # define DO_AUTOCHDIR
4171 #endif
4172+
4173+#if defined(FEAT_SCROLLBIND) && defined(FEAT_CURSORBIND)
4174+# define RESET_BINDING(wp) (wp)->w_p_scb = FALSE; (wp)->w_p_crb = FALSE
4175+#else
4176+# if defined(FEAT_SCROLLBIND)
4177+# define RESET_BINDING(wp) (wp)->w_p_scb = FALSE
4178+# else
4179+# if defined(FEAT_CURSORBIND)
4180+# define RESET_BINDING(wp) (wp)->w_p_crb = FALSE
4181+# else
4182+# define RESET_BINDING(wp)
4183+# endif
4184+# endif
4185+#endif
4186diff -Naur vim73.orig/src/main.c vim73/src/main.c
4187--- vim73.orig/src/main.c 2010-08-08 09:09:55.000000000 -0400
4188+++ vim73/src/main.c 2011-01-08 21:01:19.378657342 -0500
4189@@ -7,10 +7,6 @@
4190 * See README.txt for an overview of the Vim source code.
4191 */
4192
4193-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
4194-# include "vimio.h" /* for close() and dup() */
4195-#endif
4196-
4197 #define EXTERN
4198 #include "vim.h"
4199
4200@@ -940,7 +936,7 @@
4201 if (netbeansArg != NULL && strncmp("-nb", netbeansArg, 3) == 0)
4202 {
4203 # ifdef FEAT_GUI
4204-# if !defined(FEAT_GUI_MOTIF) && !defined(FEAT_GUI_GTK) \
4205+# if !defined(FEAT_GUI_X11) && !defined(FEAT_GUI_GTK) \
4206 && !defined(FEAT_GUI_W32)
4207 if (gui.in_use)
4208 {
4209@@ -3817,6 +3813,8 @@
4210 /* Check if we have at least one argument. */
4211 if (filec <= 0)
4212 mainerr_arg_missing((char_u *)filev[-1]);
4213+
4214+ /* Temporarily cd to the current directory to handle relative file names. */
4215 if (mch_dirname(cwd, MAXPATHL) != OK)
4216 return NULL;
4217 if ((p = vim_strsave_escaped_ext(cwd,
4218@@ -3858,13 +3856,20 @@
4219 ga_concat(&ga, p);
4220 vim_free(p);
4221 }
4222+ ga_concat(&ga, (char_u *)"|if exists('*inputrestore')|call inputrestore()|endif<CR>");
4223+
4224 /* The :drop commands goes to Insert mode when 'insertmode' is set, use
4225 * CTRL-\ CTRL-N again. */
4226- ga_concat(&ga, (char_u *)"|if exists('*inputrestore')|call inputrestore()|endif<CR>");
4227- ga_concat(&ga, (char_u *)"<C-\\><C-N>:cd -");
4228+ ga_concat(&ga, (char_u *)"<C-\\><C-N>");
4229+
4230+ /* Switch back to the correct current directory (prior to temporary path
4231+ * switch) unless 'autochdir' is set, in which case it will already be
4232+ * correct after the :drop command. */
4233+ ga_concat(&ga, (char_u *)":if !exists('+acd')||!&acd|cd -|endif<CR>");
4234+
4235 if (sendReply)
4236- ga_concat(&ga, (char_u *)"<CR>:call SetupRemoteReplies()");
4237- ga_concat(&ga, (char_u *)"<CR>:");
4238+ ga_concat(&ga, (char_u *)":call SetupRemoteReplies()<CR>");
4239+ ga_concat(&ga, (char_u *)":");
4240 if (inicmd != NULL)
4241 {
4242 /* Can't use <CR> after "inicmd", because an "startinsert" would cause
4243diff -Naur vim73.orig/src/mbyte.c vim73/src/mbyte.c
4244--- vim73.orig/src/mbyte.c 2010-07-18 09:05:44.000000000 -0400
4245+++ vim73/src/mbyte.c 2011-01-08 21:01:19.006657043 -0500
4246@@ -3124,6 +3124,9 @@
4247 /* If one of the two characters is incomplete return -1. */
4248 if (incomplete || i + utf_byte2len(s2[i]) > n)
4249 return -1;
4250+ /* Don't case-fold illegal bytes or truncated characters. */
4251+ if (utf_ptr2len(s1 + i) < l || utf_ptr2len(s2 + i) < l)
4252+ return -1;
4253 cdiff = utf_fold(utf_ptr2char(s1 + i))
4254 - utf_fold(utf_ptr2char(s2 + i));
4255 if (cdiff != 0)
4256@@ -4159,11 +4162,11 @@
4257 {
4258 if (hIconvDLL != 0 && hMsvcrtDLL != 0)
4259 return TRUE;
4260- hIconvDLL = LoadLibrary(DYNAMIC_ICONV_DLL);
4261+ hIconvDLL = vimLoadLib(DYNAMIC_ICONV_DLL);
4262 if (hIconvDLL == 0) /* sometimes it's called libiconv.dll */
4263- hIconvDLL = LoadLibrary(DYNAMIC_ICONV_DLL_ALT);
4264+ hIconvDLL = vimLoadLib(DYNAMIC_ICONV_DLL_ALT);
4265 if (hIconvDLL != 0)
4266- hMsvcrtDLL = LoadLibrary(DYNAMIC_MSVCRT_DLL);
4267+ hMsvcrtDLL = vimLoadLib(DYNAMIC_MSVCRT_DLL);
4268 if (hIconvDLL == 0 || hMsvcrtDLL == 0)
4269 {
4270 /* Only give the message when 'verbose' is set, otherwise it might be
4271@@ -5167,16 +5170,16 @@
4272 void
4273 xim_set_preedit()
4274 {
4275- if (xic == NULL)
4276- return;
4277-
4278- xim_set_focus(TRUE);
4279-
4280 XVaNestedList attr_list;
4281 XRectangle spot_area;
4282 XPoint over_spot;
4283 int line_space;
4284
4285+ if (xic == NULL)
4286+ return;
4287+
4288+ xim_set_focus(TRUE);
4289+
4290 if (!xim_has_focus)
4291 {
4292 /* hide XIM cursor */
4293@@ -5554,12 +5557,12 @@
4294 void
4295 xim_set_status_area()
4296 {
4297- if (xic == NULL)
4298- return;
4299-
4300 XVaNestedList preedit_list = 0, status_list = 0, list = 0;
4301 XRectangle pre_area, status_area;
4302
4303+ if (xic == NULL)
4304+ return;
4305+
4306 if (input_style & XIMStatusArea)
4307 {
4308 if (input_style & XIMPreeditArea)
4309diff -Naur vim73.orig/src/memfile.c vim73/src/memfile.c
4310--- vim73.orig/src/memfile.c 2010-06-20 22:59:57.000000000 -0400
4311+++ vim73/src/memfile.c 2011-01-08 21:01:19.378657342 -0500
4312@@ -32,10 +32,6 @@
4313 * file is opened.
4314 */
4315
4316-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
4317-# include "vimio.h" /* for lseek(), must be before vim.h */
4318-#endif
4319-
4320 #include "vim.h"
4321
4322 /*
4323@@ -1049,7 +1045,7 @@
4324 PERROR(_("E294: Seek error in swap file read"));
4325 return FAIL;
4326 }
4327- if ((unsigned)vim_read(mfp->mf_fd, hp->bh_data, size) != size)
4328+ if ((unsigned)read_eintr(mfp->mf_fd, hp->bh_data, size) != size)
4329 {
4330 PERROR(_("E295: Read error in swap file"));
4331 return FAIL;
4332@@ -1168,7 +1164,7 @@
4333 }
4334 #endif
4335
4336- if ((unsigned)vim_write(mfp->mf_fd, data, size) != size)
4337+ if ((unsigned)write_eintr(mfp->mf_fd, data, size) != size)
4338 result = FAIL;
4339
4340 #ifdef FEAT_CRYPT
4341diff -Naur vim73.orig/src/memline.c vim73/src/memline.c
4342--- vim73.orig/src/memline.c 2010-08-08 09:11:46.000000000 -0400
4343+++ vim73/src/memline.c 2011-01-08 21:01:19.434656677 -0500
4344@@ -42,10 +42,6 @@
4345 * mf_get().
4346 */
4347
4348-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
4349-# include "vimio.h" /* for mch_open(), must be before vim.h */
4350-#endif
4351-
4352 #include "vim.h"
4353
4354 #ifndef UNIX /* it's in os_unix.h for Unix */
4355@@ -56,10 +52,6 @@
4356 # include <proto/dos.h> /* for Open() and Close() */
4357 #endif
4358
4359-#ifdef HAVE_ERRNO_H
4360-# include <errno.h>
4361-#endif
4362-
4363 typedef struct block0 ZERO_BL; /* contents of the first block */
4364 typedef struct pointer_block PTR_BL; /* contents of a pointer block */
4365 typedef struct data_block DATA_BL; /* contents of a data block */
4366@@ -582,6 +574,9 @@
4367 idx = ip->ip_index + 1; /* go to next index */
4368 page_count = 1;
4369 }
4370+
4371+ if (error > 0)
4372+ EMSG(_("E843: Error while updating swap file crypt"));
4373 }
4374
4375 mfp->mf_old_key = NULL;
4376@@ -2059,7 +2054,7 @@
4377 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
4378 if (fd >= 0)
4379 {
4380- if (read(fd, (char *)&b0, sizeof(b0)) == sizeof(b0))
4381+ if (read_eintr(fd, &b0, sizeof(b0)) == sizeof(b0))
4382 {
4383 if (STRNCMP(b0.b0_version, "VIM 3.0", 7) == 0)
4384 {
4385@@ -2384,7 +2379,7 @@
4386 * Make a copy of the line if necessary.
4387 */
4388 /*
4389- * get a pointer to a (read-only copy of a) line
4390+ * Return a pointer to a (read-only copy of a) line.
4391 *
4392 * On failure an error message is given and IObuff is returned (to avoid
4393 * having to check for error everywhere).
4394@@ -2397,7 +2392,7 @@
4395 }
4396
4397 /*
4398- * ml_get_pos: get pointer to position 'pos'
4399+ * Return pointer to position "pos".
4400 */
4401 char_u *
4402 ml_get_pos(pos)
4403@@ -2407,7 +2402,7 @@
4404 }
4405
4406 /*
4407- * ml_get_curline: get pointer to cursor line.
4408+ * Return pointer to cursor line.
4409 */
4410 char_u *
4411 ml_get_curline()
4412@@ -2416,7 +2411,7 @@
4413 }
4414
4415 /*
4416- * ml_get_cursor: get pointer to cursor position
4417+ * Return pointer to cursor position.
4418 */
4419 char_u *
4420 ml_get_cursor()
4421@@ -2426,7 +2421,7 @@
4422 }
4423
4424 /*
4425- * get a pointer to a line in a specific buffer
4426+ * Return a pointer to a line in a specific buffer
4427 *
4428 * "will_change": if TRUE mark the buffer dirty (chars in the line will be
4429 * changed)
4430@@ -4389,7 +4384,7 @@
4431 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
4432 if (fd >= 0)
4433 {
4434- if (read(fd, (char *)&b0, sizeof(b0)) == sizeof(b0))
4435+ if (read_eintr(fd, &b0, sizeof(b0)) == sizeof(b0))
4436 {
4437 /*
4438 * If the swapfile has the same directory as the
4439diff -Naur vim73.orig/src/menu.c vim73/src/menu.c
4440--- vim73.orig/src/menu.c 2010-07-14 10:49:01.000000000 -0400
4441+++ vim73/src/menu.c 2011-01-08 21:01:19.494656637 -0500
4442@@ -1512,8 +1512,8 @@
4443 {
4444 #ifdef FEAT_MULTI_LANG
4445 if (menu->en_name != NULL
4446- && (menu_namecmp(name,menu->en_name)
4447- || menu_namecmp(name,menu->en_dname)))
4448+ && (menu_namecmp(name, menu->en_name)
4449+ || menu_namecmp(name, menu->en_dname)))
4450 return TRUE;
4451 #endif
4452 return menu_namecmp(name, menu->name) || menu_namecmp(name, menu->dname);
4453@@ -2342,7 +2342,7 @@
4454
4455 while (menu != NULL)
4456 {
4457- if (STRCMP(name, menu->name) == 0 || STRCMP(name, menu->dname) == 0)
4458+ if (menu_name_equal(name, menu))
4459 {
4460 if (menu->children == NULL)
4461 {
4462diff -Naur vim73.orig/src/message.c vim73/src/message.c
4463--- vim73.orig/src/message.c 2010-08-04 14:10:02.000000000 -0400
4464+++ vim73/src/message.c 2011-01-08 21:01:19.510657932 -0500
4465@@ -569,6 +569,10 @@
4466 int severe;
4467 #endif
4468
4469+ /* Skip this if not giving error messages at the moment. */
4470+ if (emsg_not_now())
4471+ return TRUE;
4472+
4473 called_emsg = TRUE;
4474 ex_exitval = 1;
4475
4476@@ -581,10 +585,6 @@
4477 emsg_severe = FALSE;
4478 #endif
4479
4480- /* Skip this if not giving error messages at the moment. */
4481- if (emsg_not_now())
4482- return TRUE;
4483-
4484 if (!emsg_off || vim_strchr(p_debug, 't') != NULL)
4485 {
4486 #ifdef FEAT_EVAL
4487@@ -1477,6 +1477,27 @@
4488 return retval;
4489 }
4490
4491+#if defined(FEAT_EVAL) || defined(PROTO)
4492+/*
4493+ * Return the lhs or rhs of a mapping, with the key codes turned into printable
4494+ * strings, in an allocated string.
4495+ */
4496+ char_u *
4497+str2special_save(str, is_lhs)
4498+ char_u *str;
4499+ int is_lhs; /* TRUE for lhs, FALSE for rhs */
4500+{
4501+ garray_T ga;
4502+ char_u *p = str;
4503+
4504+ ga_init2(&ga, 1, 40);
4505+ while (*p != NUL)
4506+ ga_concat(&ga, str2special(&p, is_lhs));
4507+ ga_append(&ga, NUL);
4508+ return (char_u *)ga.ga_data;
4509+}
4510+#endif
4511+
4512 /*
4513 * Return the printable string for the key codes at "*sp".
4514 * Used for translating the lhs or rhs of a mapping to printable chars.
4515diff -Naur vim73.orig/src/misc1.c vim73/src/misc1.c
4516--- vim73.orig/src/misc1.c 2010-08-15 07:24:05.000000000 -0400
4517+++ vim73/src/misc1.c 2011-01-08 21:01:19.466658112 -0500
4518@@ -3114,10 +3114,11 @@
4519 && (!p_ttimeout || waited * 100L < (p_ttm < 0 ? p_tm : p_ttm)))
4520 continue;
4521
4522- /* found a termcode: adjust length */
4523- if (n > 0)
4524+ if (n == KEYLEN_REMOVED) /* key code removed */
4525+ continue;
4526+ if (n > 0) /* found a termcode: adjust length */
4527 len = n;
4528- if (len == 0) /* nothing typed yet */
4529+ if (len == 0) /* nothing typed yet */
4530 continue;
4531
4532 /* Handle modifier and/or special key code. */
4533@@ -9161,7 +9162,10 @@
4534 #ifdef CASE_INSENSITIVE_FILENAME
4535 regmatch.rm_ic = TRUE; /* Behave like Terminal.app */
4536 #else
4537- regmatch.rm_ic = FALSE; /* Don't ever ignore case */
4538+ if (flags & EW_ICASE)
4539+ regmatch.rm_ic = TRUE; /* 'wildignorecase' set */
4540+ else
4541+ regmatch.rm_ic = FALSE; /* Don't ignore case */
4542 #endif
4543 regmatch.regprog = vim_regcomp(pat, RE_MAGIC);
4544 vim_free(pat);
4545@@ -9317,7 +9321,8 @@
4546 continue; /* it's different when it's shorter */
4547
4548 rival = other_paths[j] + other_path_len - candidate_len;
4549- if (fnamecmp(maybe_unique, rival) == 0)
4550+ if (fnamecmp(maybe_unique, rival) == 0
4551+ && (rival == other_paths[j] || vim_ispathsep(*(rival - 1))))
4552 return FALSE; /* match */
4553 }
4554
4555@@ -9642,7 +9647,7 @@
4556 if (paths == NULL)
4557 return 0;
4558
4559- files = globpath(paths, pattern, 0);
4560+ files = globpath(paths, pattern, (flags & EW_ICASE) ? WILD_ICASE : 0);
4561 vim_free(paths);
4562 if (files == NULL)
4563 return 0;
4564diff -Naur vim73.orig/src/misc2.c vim73/src/misc2.c
4565--- vim73.orig/src/misc2.c 2010-08-13 05:14:35.000000000 -0400
4566+++ vim73/src/misc2.c 2011-01-08 21:01:19.302660568 -0500
4567@@ -200,7 +200,6 @@
4568 }
4569 #endif
4570
4571- idx = -1;
4572 ptr = line;
4573 while (col <= wcol && *ptr != NUL)
4574 {
4575@@ -1223,7 +1222,7 @@
4576 #endif
4577
4578 /*
4579- * copy a string into newly allocated memory
4580+ * Copy "string" into newly allocated memory.
4581 */
4582 char_u *
4583 vim_strsave(string)
4584@@ -1239,6 +1238,12 @@
4585 return p;
4586 }
4587
4588+/*
4589+ * Copy up to "len" bytes of "string" into newly allocated memory and
4590+ * terminate with a NUL.
4591+ * The allocated memory always has size "len + 1", also when "string" is
4592+ * shorter.
4593+ */
4594 char_u *
4595 vim_strnsave(string, len)
4596 char_u *string;
4597diff -Naur vim73.orig/src/netbeans.c vim73/src/netbeans.c
4598--- vim73.orig/src/netbeans.c 2010-08-09 16:48:09.000000000 -0400
4599+++ vim73/src/netbeans.c 2011-01-08 21:01:19.498658408 -0500
4600@@ -16,10 +16,6 @@
4601 * See ":help netbeans-protocol" for explanation.
4602 */
4603
4604-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
4605-# include "vimio.h" /* for mch_open(), must be before vim.h */
4606-#endif
4607-
4608 #include "vim.h"
4609
4610 #if defined(FEAT_NETBEANS_INTG) || defined(PROTO)
4611@@ -87,7 +83,7 @@
4612 static void nb_init_graphics __ARGS((void));
4613 static void coloncmd __ARGS((char *cmd, ...));
4614 static void nb_set_curbuf __ARGS((buf_T *buf));
4615-#ifdef FEAT_GUI_MOTIF
4616+#ifdef FEAT_GUI_X11
4617 static void messageFromNetbeans __ARGS((XtPointer, int *, XtInputId *));
4618 #endif
4619 #ifdef FEAT_GUI_GTK
4620@@ -112,7 +108,7 @@
4621 static NBSOCK nbsock = -1; /* socket fd for Netbeans connection */
4622 #define NETBEANS_OPEN (nbsock != -1)
4623
4624-#ifdef FEAT_GUI_MOTIF
4625+#ifdef FEAT_GUI_X11
4626 static XtInputId inputHandler = (XtInputId)NULL; /* Cookie for input */
4627 #endif
4628 #ifdef FEAT_GUI_GTK
4629@@ -135,15 +131,13 @@
4630 static int needupdate = 0;
4631 static int inAtomic = 0;
4632
4633+/*
4634+ * Close the socket and remove the input handlers.
4635+ */
4636 static void
4637-netbeans_close(void)
4638+nb_close_socket(void)
4639 {
4640- if (!NETBEANS_OPEN)
4641- return;
4642-
4643- netbeans_send_disconnect();
4644-
4645-#ifdef FEAT_GUI_MOTIF
4646+#ifdef FEAT_GUI_X11
4647 if (inputHandler != (XtInputId)NULL)
4648 {
4649 XtRemoveInput(inputHandler);
4650@@ -167,13 +161,27 @@
4651 # endif
4652 #endif
4653
4654+ sock_close(nbsock);
4655+ nbsock = -1;
4656+}
4657+
4658+/*
4659+ * Close the connection and cleanup.
4660+ * May be called when nb_close_socket() was called earlier.
4661+ */
4662+ static void
4663+netbeans_close(void)
4664+{
4665+ if (NETBEANS_OPEN)
4666+ {
4667+ netbeans_send_disconnect();
4668+ nb_close_socket();
4669+ }
4670+
4671 #ifdef FEAT_BEVAL
4672 bevalServers &= ~BEVAL_NETBEANS;
4673 #endif
4674
4675- sock_close(nbsock);
4676- nbsock = -1;
4677-
4678 needupdate = 0;
4679 inAtomic = 0;
4680 nb_free();
4681@@ -311,14 +319,9 @@
4682 server.sin_port = htons(port);
4683 if ((host = gethostbyname(hostname)) == NULL)
4684 {
4685- if (mch_access(hostname, R_OK) >= 0)
4686- {
4687- /* DEBUG: input file */
4688- sd = mch_open(hostname, O_RDONLY, 0);
4689- goto theend;
4690- }
4691 nbdebug(("error in gethostbyname() in netbeans_connect()\n"));
4692 PERROR("gethostbyname() in netbeans_connect()");
4693+ sock_close(sd);
4694 goto theend;
4695 }
4696 memcpy((char *)&server.sin_addr, host->h_addr, host->h_length);
4697@@ -368,15 +371,12 @@
4698 || (errno == EINTR)))
4699 {
4700 nbdebug(("retrying...\n"));
4701- sleep(5);
4702- if (!doabort)
4703+ mch_delay(3000L, TRUE);
4704+ ui_breakcheck();
4705+ if (got_int)
4706 {
4707- ui_breakcheck();
4708- if (got_int)
4709- {
4710- errno = EINTR;
4711- break;
4712- }
4713+ errno = EINTR;
4714+ break;
4715 }
4716 if (connect(sd, (struct sockaddr *)&server,
4717 sizeof(server)) == 0)
4718@@ -391,6 +391,7 @@
4719 /* Get here when the server can't be found. */
4720 nbdebug(("Cannot connect to Netbeans #2\n"));
4721 PERROR(_("Cannot connect to Netbeans #2"));
4722+ sock_close(sd);
4723 if (doabort)
4724 getout(1);
4725 goto theend;
4726@@ -401,6 +402,7 @@
4727 {
4728 nbdebug(("Cannot connect to Netbeans\n"));
4729 PERROR(_("Cannot connect to Netbeans"));
4730+ sock_close(sd);
4731 if (doabort)
4732 getout(1);
4733 goto theend;
4734@@ -631,9 +633,7 @@
4735 {
4736 char_u *p;
4737 queue_T *node;
4738-
4739- if (!NETBEANS_OPEN)
4740- return;
4741+ int own_node;
4742
4743 while (head.next != NULL && head.next != &head)
4744 {
4745@@ -672,20 +672,25 @@
4746 *p++ = NUL;
4747 if (*p == NUL)
4748 {
4749+ own_node = TRUE;
4750 head.next = node->next;
4751 node->next->prev = node->prev;
4752 }
4753+ else
4754+ own_node = FALSE;
4755
4756 /* now, parse and execute the commands */
4757 nb_parse_cmd(node->buffer);
4758
4759- if (*p == NUL)
4760+ if (own_node)
4761 {
4762 /* buffer finished, dispose of the node and buffer */
4763 vim_free(node->buffer);
4764 vim_free(node);
4765 }
4766- else
4767+ /* Check that "head" wasn't changed under our fingers, e.g. when a
4768+ * DETACH command was handled. */
4769+ else if (head.next == node)
4770 {
4771 /* more follows, move to the start */
4772 STRMOVE(node->buffer, p);
4773@@ -700,7 +705,7 @@
4774 /*
4775 * Read a command from netbeans.
4776 */
4777-#ifdef FEAT_GUI_MOTIF
4778+#ifdef FEAT_GUI_X11
4779 static void
4780 messageFromNetbeans(XtPointer clientData UNUSED,
4781 int *unused1 UNUSED,
4782@@ -720,15 +725,14 @@
4783 }
4784 #endif
4785
4786+#define DETACH_MSG "DETACH\n"
4787+
4788 void
4789 netbeans_read()
4790 {
4791 static char_u *buf = NULL;
4792 int len = 0;
4793 int readlen = 0;
4794-#if defined(NB_HAS_GUI) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_W32)
4795- static int level = 0;
4796-#endif
4797 #ifdef HAVE_SELECT
4798 struct timeval tval;
4799 fd_set rfds;
4800@@ -744,13 +748,6 @@
4801 return;
4802 }
4803
4804-#if defined(NB_HAS_GUI) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_W32)
4805- /* recursion guard; this will be called from the X event loop at unknown
4806- * moments */
4807- if (NB_HAS_GUI)
4808- ++level;
4809-#endif
4810-
4811 /* Allocate a buffer to read into. */
4812 if (buf == NULL)
4813 {
4814@@ -790,34 +787,32 @@
4815 break; /* did read everything that's available */
4816 }
4817
4818+ /* Reading a socket disconnection (readlen == 0), or a socket error. */
4819 if (readlen <= 0)
4820 {
4821- /* read error or didn't read anything */
4822- netbeans_close();
4823- nbdebug(("messageFromNetbeans: Error in read() from socket\n"));
4824+ /* Queue a "DETACH" netbeans message in the command queue in order to
4825+ * terminate the netbeans session later. Do not end the session here
4826+ * directly as we may be running in the context of a call to
4827+ * netbeans_parse_messages():
4828+ * netbeans_parse_messages
4829+ * -> autocmd triggered while processing the netbeans cmd
4830+ * -> ui_breakcheck
4831+ * -> gui event loop or select loop
4832+ * -> netbeans_read()
4833+ */
4834+ save((char_u *)DETACH_MSG, (int)strlen(DETACH_MSG));
4835+ nb_close_socket();
4836+
4837 if (len < 0)
4838 {
4839 nbdebug(("read from Netbeans socket\n"));
4840 PERROR(_("read from Netbeans socket"));
4841 }
4842- return; /* don't try to parse it */
4843 }
4844
4845-#if defined(NB_HAS_GUI) && !defined(FEAT_GUI_W32)
4846- /* Let the main loop handle messages. */
4847- if (NB_HAS_GUI)
4848- {
4849-# ifdef FEAT_GUI_GTK
4850- if (gtk_main_level() > 0)
4851- gtk_main_quit();
4852-# else
4853- /* Parse the messages now, but avoid recursion. */
4854- if (level == 1)
4855- netbeans_parse_messages();
4856-
4857- --level;
4858-# endif
4859- }
4860+#if defined(NB_HAS_GUI) && defined(FEAT_GUI_GTK)
4861+ if (NB_HAS_GUI && gtk_main_level() > 0)
4862+ gtk_main_quit();
4863 #endif
4864 }
4865
4866@@ -955,7 +950,6 @@
4867 keyQ_T *key_node = keyHead.next;
4868 queue_T *cmd_node = head.next;
4869 nbbuf_T buf;
4870- buf_T *bufp;
4871 int i;
4872
4873 /* free the netbeans buffer list */
4874@@ -964,7 +958,7 @@
4875 buf = buf_list[i];
4876 vim_free(buf.displayname);
4877 vim_free(buf.signmap);
4878- if ((bufp=buf.bufp) != NULL)
4879+ if (buf.bufp != NULL)
4880 {
4881 buf.bufp->b_netbeans_file = FALSE;
4882 buf.bufp->b_was_netbeans_file = FALSE;
4883@@ -1186,6 +1180,10 @@
4884
4885 nbdebug(("REP %d: <none>\n", cmdno));
4886
4887+ /* Avoid printing an annoying error message. */
4888+ if (!NETBEANS_OPEN)
4889+ return;
4890+
4891 sprintf(reply, "%d\n", cmdno);
4892 nb_send(reply, "nb_reply_nil");
4893 }
4894@@ -2773,6 +2771,16 @@
4895 ex_nbstart(eap)
4896 exarg_T *eap;
4897 {
4898+#ifdef FEAT_GUI
4899+# if !defined(FEAT_GUI_X11) && !defined(FEAT_GUI_GTK) \
4900+ && !defined(FEAT_GUI_W32)
4901+ if (gui.in_use)
4902+ {
4903+ EMSG(_("E838: netbeans is not supported with this GUI"));
4904+ return;
4905+ }
4906+# endif
4907+#endif
4908 netbeans_open((char *)eap->arg, FALSE);
4909 }
4910
4911@@ -2937,7 +2945,7 @@
4912 if (!NB_HAS_GUI || !NETBEANS_OPEN)
4913 return;
4914
4915-# ifdef FEAT_GUI_MOTIF
4916+# ifdef FEAT_GUI_X11
4917 /* tell notifier we are interested in being called
4918 * when there is input on the editor connection socket
4919 */
4920@@ -3027,7 +3035,7 @@
4921 }
4922 }
4923
4924-#if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_W32) || defined(PROTO)
4925+#if defined(FEAT_GUI_X11) || defined(FEAT_GUI_W32) || defined(PROTO)
4926 /*
4927 * Tell netbeans that the window was moved or resized.
4928 */
4929@@ -3458,7 +3466,7 @@
4930 return FALSE;
4931 }
4932
4933-#if defined(FEAT_GUI_MOTIF) || defined(PROTO)
4934+#if defined(FEAT_GUI_X11) || defined(PROTO)
4935 /*
4936 * We have multiple signs to draw at the same location. Draw the
4937 * multi-sign indicator instead. This is the Motif version.
4938@@ -3487,7 +3495,7 @@
4939 XDrawPoint(gui.dpy, gui.wid, gui.text_gc, x+3, y++);
4940 XDrawPoint(gui.dpy, gui.wid, gui.text_gc, x+2, y);
4941 }
4942-#endif /* FEAT_GUI_MOTIF */
4943+#endif /* FEAT_GUI_X11 */
4944
4945 #if defined(FEAT_GUI_GTK) && !defined(PROTO)
4946 /*
4947diff -Naur vim73.orig/src/normal.c vim73/src/normal.c
4948--- vim73.orig/src/normal.c 2010-07-31 09:25:19.000000000 -0400
4949+++ vim73/src/normal.c 2011-01-08 21:01:19.390656741 -0500
4950@@ -25,6 +25,9 @@
4951 static int restart_VIsual_select = 0;
4952 #endif
4953
4954+#ifdef FEAT_EVAL
4955+static void set_vcount_ca __ARGS((cmdarg_T *cap, int *set_prevcount));
4956+#endif
4957 static int
4958 # ifdef __BORLANDC__
4959 _RTLENTRYF
4960@@ -648,6 +651,14 @@
4961 dont_scroll = FALSE; /* allow scrolling here */
4962 #endif
4963
4964+#ifdef FEAT_EVAL
4965+ /* Set v:count here, when called from main() and not a stuffed
4966+ * command, so that v:count can be used in an expression mapping
4967+ * when there is no count. */
4968+ if (toplevel && stuff_empty())
4969+ set_vcount_ca(&ca, &set_prevcount);
4970+#endif
4971+
4972 /*
4973 * Get the command character from the user.
4974 */
4975@@ -725,15 +736,7 @@
4976 * command, so that v:count can be used in an expression mapping
4977 * right after the count. */
4978 if (toplevel && stuff_empty())
4979- {
4980- long count = ca.count0;
4981-
4982- /* multiply with ca.opcount the same way as below */
4983- if (ca.opcount != 0)
4984- count = ca.opcount * (count == 0 ? 1 : count);
4985- set_vcount(count, count == 0 ? 1 : count, set_prevcount);
4986- set_prevcount = FALSE; /* only set v:prevcount once */
4987- }
4988+ set_vcount_ca(&ca, &set_prevcount);
4989 #endif
4990 if (ctrl_w)
4991 {
4992@@ -1386,6 +1389,26 @@
4993 opcount = ca.opcount;
4994 }
4995
4996+#ifdef FEAT_EVAL
4997+/*
4998+ * Set v:count and v:count1 according to "cap".
4999+ * Set v:prevcount only when "set_prevcount" is TRUE.
5000+ */
5001+ static void
5002+set_vcount_ca(cap, set_prevcount)
5003+ cmdarg_T *cap;
5004+ int *set_prevcount;
5005+{
5006+ long count = cap->count0;
5007+
5008+ /* multiply with cap->opcount the same way as above */
5009+ if (cap->opcount != 0)
5010+ count = cap->opcount * (count == 0 ? 1 : count);
5011+ set_vcount(count, count == 0 ? 1 : count, *set_prevcount);
5012+ *set_prevcount = FALSE; /* only set v:prevcount once */
5013+}
5014+#endif
5015+
5016 /*
5017 * Handle an operator after visual mode or when the movement is finished
5018 */
5019@@ -5666,8 +5689,13 @@
5020 else if (cmdchar == '#')
5021 aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
5022 else if (tag_cmd)
5023- /* Don't escape spaces and Tabs in a tag with a backslash */
5024- aux_ptr = (char_u *)"\\|\"\n[";
5025+ {
5026+ if (curbuf->b_help)
5027+ /* ":help" handles unescaped argument */
5028+ aux_ptr = (char_u *)"";
5029+ else
5030+ aux_ptr = (char_u *)"\\|\"\n[";
5031+ }
5032 else
5033 aux_ptr = (char_u *)"\\|\"\n*?[";
5034
5035@@ -8524,7 +8552,7 @@
5036 else
5037 curwin->w_curswant = 0;
5038 /* keep curswant at the column where we wanted to go, not where
5039- we ended; differs if line is too short */
5040+ * we ended; differs if line is too short */
5041 curwin->w_set_curswant = FALSE;
5042 }
5043
5044diff -Naur vim73.orig/src/ops.c vim73/src/ops.c
5045--- vim73.orig/src/ops.c 2010-08-01 08:16:08.000000000 -0400
5046+++ vim73/src/ops.c 2011-01-08 21:01:19.314657721 -0500
5047@@ -1584,9 +1584,11 @@
5048 adjust_clip_reg(rp)
5049 int *rp;
5050 {
5051- /* If no reg. specified, and "unnamed" is in 'clipboard', use '*' reg. */
5052- if (*rp == 0 && clip_unnamed)
5053- *rp = '*';
5054+ /* If no reg. specified, and "unnamed" or "unnamedplus" is in 'clipboard',
5055+ * use '*' or '+' reg, respectively. "unnamedplus" prevails. */
5056+ if (*rp == 0 && clip_unnamed != 0)
5057+ *rp = ((clip_unnamed & CLIP_UNNAMED_PLUS) && clip_plus.available)
5058+ ? '+' : '*';
5059 if (!clip_star.available && *rp == '*')
5060 *rp = 0;
5061 if (!clip_plus.available && *rp == '+')
5062@@ -2842,6 +2844,9 @@
5063 char_u *p;
5064 char_u *pnew;
5065 struct block_def bd;
5066+#if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
5067+ int did_star = FALSE;
5068+#endif
5069
5070 /* check for read-only register */
5071 if (oap->regname != 0 && !valid_yank_reg(oap->regname, TRUE))
5072@@ -3115,7 +3120,8 @@
5073 */
5074 if (clip_star.available
5075 && (curr == &(y_regs[STAR_REGISTER])
5076- || (!deleting && oap->regname == 0 && clip_unnamed)))
5077+ || (!deleting && oap->regname == 0
5078+ && (clip_unnamed & CLIP_UNNAMED))))
5079 {
5080 if (curr != &(y_regs[STAR_REGISTER]))
5081 /* Copy the text from register 0 to the clipboard register. */
5082@@ -3123,6 +3129,9 @@
5083
5084 clip_own_selection(&clip_star);
5085 clip_gen_set_selection(&clip_star);
5086+# ifdef FEAT_X11
5087+ did_star = TRUE;
5088+# endif
5089 }
5090
5091 # ifdef FEAT_X11
5092@@ -3130,12 +3139,19 @@
5093 * If we were yanking to the '+' register, send result to selection.
5094 * Also copy to the '*' register, in case auto-select is off.
5095 */
5096- else if (clip_plus.available && curr == &(y_regs[PLUS_REGISTER]))
5097+ if (clip_plus.available
5098+ && (curr == &(y_regs[PLUS_REGISTER])
5099+ || (!deleting && oap->regname == 0
5100+ && (clip_unnamed & CLIP_UNNAMED_PLUS))))
5101 {
5102+ if (curr != &(y_regs[PLUS_REGISTER]))
5103+ /* Copy the text from register 0 to the clipboard register. */
5104+ copy_yank_reg(&(y_regs[PLUS_REGISTER]));
5105+
5106 /* No need to copy to * register upon 'unnamed' now - see below */
5107 clip_own_selection(&clip_plus);
5108 clip_gen_set_selection(&clip_plus);
5109- if (!clip_isautosel())
5110+ if (!clip_isautosel() && !did_star)
5111 {
5112 copy_yank_reg(&(y_regs[STAR_REGISTER]));
5113 clip_own_selection(&clip_star);
5114@@ -3979,7 +3995,12 @@
5115 for (i = -1; i < NUM_REGISTERS && !got_int; ++i)
5116 {
5117 name = get_register_name(i);
5118- if (arg != NULL && vim_strchr(arg, name) == NULL)
5119+ if (arg != NULL && vim_strchr(arg, name) == NULL
5120+#ifdef ONE_CLIPBOARD
5121+ /* Star register and plus register contain the same thing. */
5122+ && (name != '*' || vim_strchr(arg, '+') == NULL)
5123+#endif
5124+ )
5125 continue; /* did not ask for this register */
5126
5127 #ifdef FEAT_CLIPBOARD
5128@@ -4153,9 +4174,10 @@
5129 int save_undo;
5130 {
5131 char_u *curr = NULL;
5132+ char_u *curr_start = NULL;
5133 char_u *cend;
5134 char_u *newp;
5135- char_u *spaces; /* number of spaces inserte before a line */
5136+ char_u *spaces; /* number of spaces inserted before a line */
5137 int endcurr1 = NUL;
5138 int endcurr2 = NUL;
5139 int currsize = 0; /* size of the current line */
5140@@ -4181,7 +4203,7 @@
5141 */
5142 for (t = 0; t < count; ++t)
5143 {
5144- curr = ml_get((linenr_T)(curwin->w_cursor.lnum + t));
5145+ curr = curr_start = ml_get((linenr_T)(curwin->w_cursor.lnum + t));
5146 if (insert_space && t > 0)
5147 {
5148 curr = skipwhite(curr);
5149@@ -4265,10 +4287,10 @@
5150 copy_spaces(cend, (size_t)(spaces[t]));
5151 }
5152 mark_col_adjust(curwin->w_cursor.lnum + t, (colnr_T)0, (linenr_T)-t,
5153- (long)(cend - newp + spaces[t]));
5154+ (long)(cend - newp + spaces[t] - (curr - curr_start)));
5155 if (t == 0)
5156 break;
5157- curr = ml_get((linenr_T)(curwin->w_cursor.lnum + t - 1));
5158+ curr = curr_start = ml_get((linenr_T)(curwin->w_cursor.lnum + t - 1));
5159 if (insert_space && t > 1)
5160 curr = skipwhite(curr);
5161 currsize = (int)STRLEN(curr);
5162diff -Naur vim73.orig/src/option.c vim73/src/option.c
5163--- vim73.orig/src/option.c 2010-08-04 14:49:18.000000000 -0400
5164+++ vim73/src/option.c 2011-01-08 21:01:19.282656400 -0500
5165@@ -2740,7 +2740,7 @@
5166 (char_u *)&p_wc, PV_NONE,
5167 {(char_u *)(long)Ctrl_E, (char_u *)(long)TAB}
5168 SCRIPTID_INIT},
5169- {"wildcharm", "wcm", P_NUM|P_VI_DEF,
5170+ {"wildcharm", "wcm", P_NUM|P_VI_DEF,
5171 (char_u *)&p_wcm, PV_NONE,
5172 {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
5173 {"wildignore", "wig", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
5174@@ -2750,6 +2750,9 @@
5175 (char_u *)NULL, PV_NONE,
5176 #endif
5177 {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
5178+ {"wildignorecase", "wic", P_BOOL|P_VI_DEF,
5179+ (char_u *)&p_wic, PV_NONE,
5180+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
5181 {"wildmenu", "wmnu", P_BOOL|P_VI_DEF,
5182 #ifdef FEAT_WILDMENU
5183 (char_u *)&p_wmnu, PV_NONE,
5184@@ -7304,7 +7307,7 @@
5185 static char_u *
5186 check_clipboard_option()
5187 {
5188- int new_unnamed = FALSE;
5189+ int new_unnamed = 0;
5190 int new_autoselect = FALSE;
5191 int new_autoselectml = FALSE;
5192 int new_html = FALSE;
5193@@ -7316,9 +7319,15 @@
5194 {
5195 if (STRNCMP(p, "unnamed", 7) == 0 && (p[7] == ',' || p[7] == NUL))
5196 {
5197- new_unnamed = TRUE;
5198+ new_unnamed |= CLIP_UNNAMED;
5199 p += 7;
5200 }
5201+ else if (STRNCMP(p, "unnamedplus", 11) == 0
5202+ && (p[11] == ',' || p[11] == NUL))
5203+ {
5204+ new_unnamed |= CLIP_UNNAMED_PLUS;
5205+ p += 11;
5206+ }
5207 else if (STRNCMP(p, "autoselect", 10) == 0
5208 && (p[10] == ',' || p[10] == NUL))
5209 {
5210@@ -9756,6 +9765,9 @@
5211 #ifdef FEAT_SCROLLBIND
5212 to->wo_scb = from->wo_scb;
5213 #endif
5214+#ifdef FEAT_CURSORBIND
5215+ to->wo_crb = from->wo_crb;
5216+#endif
5217 #ifdef FEAT_SPELL
5218 to->wo_spell = from->wo_spell;
5219 #endif
5220@@ -10011,7 +10023,7 @@
5221 buf->b_p_smc = p_smc;
5222 #endif
5223 #ifdef FEAT_SPELL
5224- buf->b_s.b_p_spc = vim_strsave(p_spf);
5225+ buf->b_s.b_p_spc = vim_strsave(p_spc);
5226 (void)compile_cap_prog(&buf->b_s);
5227 buf->b_s.b_p_spf = vim_strsave(p_spf);
5228 buf->b_s.b_p_spl = vim_strsave(p_spl);
5229diff -Naur vim73.orig/src/option.h vim73/src/option.h
5230--- vim73.orig/src/option.h 2010-07-25 10:15:02.000000000 -0400
5231+++ vim73/src/option.h 2011-01-08 21:01:19.246657477 -0500
5232@@ -872,6 +872,7 @@
5233 EXTERN char_u *p_ww; /* 'whichwrap' */
5234 EXTERN long p_wc; /* 'wildchar' */
5235 EXTERN long p_wcm; /* 'wildcharm' */
5236+EXTERN long p_wic; /* 'wildignorecase' */
5237 EXTERN char_u *p_wim; /* 'wildmode' */
5238 #ifdef FEAT_WILDMENU
5239 EXTERN int p_wmnu; /* 'wildmenu' */
5240diff -Naur vim73.orig/src/os_macosx.m vim73/src/os_macosx.m
5241--- vim73.orig/src/os_macosx.m 2010-08-15 06:56:50.000000000 -0400
5242+++ vim73/src/os_macosx.m 2011-01-08 21:01:18.806655841 -0500
5243@@ -15,6 +15,10 @@
5244 Error: MACOS 9 is no longer supported in Vim 7
5245 #endif
5246
5247+/* Avoid a conflict for the definition of Boolean between Mac header files and
5248+ * X11 header files. */
5249+#define NO_X11_INCLUDES
5250+
5251 #include "vim.h"
5252 #import <Cocoa/Cocoa.h>
5253
5254diff -Naur vim73.orig/src/os_msdos.c vim73/src/os_msdos.c
5255--- vim73.orig/src/os_msdos.c 2010-05-15 07:04:07.000000000 -0400
5256+++ vim73/src/os_msdos.c 2011-01-08 21:01:19.382657751 -0500
5257@@ -21,7 +21,6 @@
5258 * Some functions are also used for Win16 (MS-Windows 3.1).
5259 */
5260
5261-#include "vimio.h"
5262 #include "vim.h"
5263
5264 #include <conio.h>
5265diff -Naur vim73.orig/src/os_mswin.c vim73/src/os_mswin.c
5266--- vim73.orig/src/os_mswin.c 2010-07-27 15:39:05.000000000 -0400
5267+++ vim73/src/os_mswin.c 2011-01-08 21:01:19.434656677 -0500
5268@@ -22,7 +22,6 @@
5269 # endif
5270 #endif
5271
5272-#include "vimio.h"
5273 #include "vim.h"
5274
5275 #ifdef WIN16
5276@@ -31,7 +30,6 @@
5277 # include <string.h>
5278 #endif
5279 #include <sys/types.h>
5280-#include <errno.h>
5281 #include <signal.h>
5282 #include <limits.h>
5283 #include <process.h>
5284@@ -817,7 +815,11 @@
5285 BOOL fRunTimeLinkSuccess = FALSE;
5286
5287 // Get a handle to the DLL module.
5288+# ifdef WIN16
5289 hinstLib = LoadLibrary(libname);
5290+# else
5291+ hinstLib = vimLoadLib(libname);
5292+# endif
5293
5294 // If the handle is valid, try to get the function address.
5295 if (hinstLib != NULL)
5296diff -Naur vim73.orig/src/os_unix.c vim73/src/os_unix.c
5297--- vim73.orig/src/os_unix.c 2010-08-08 09:14:04.000000000 -0400
5298+++ vim73/src/os_unix.c 2011-01-08 21:01:19.358658475 -0500
5299@@ -1123,6 +1123,30 @@
5300 }
5301 #endif
5302
5303+# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
5304+static void loose_clipboard __ARGS((void));
5305+
5306+/*
5307+ * Called when Vim is going to sleep or execute a shell command.
5308+ * We can't respond to requests for the X selections. Lose them, otherwise
5309+ * other applications will hang. But first copy the text to cut buffer 0.
5310+ */
5311+ static void
5312+loose_clipboard()
5313+{
5314+ if (clip_star.owned || clip_plus.owned)
5315+ {
5316+ x11_export_final_selection();
5317+ if (clip_star.owned)
5318+ clip_lose_selection(&clip_star);
5319+ if (clip_plus.owned)
5320+ clip_lose_selection(&clip_plus);
5321+ if (x11_display != NULL)
5322+ XFlush(x11_display);
5323+ }
5324+}
5325+#endif
5326+
5327 /*
5328 * If the machine has job control, use it to suspend the program,
5329 * otherwise fake it by starting a new shell.
5330@@ -1137,19 +1161,7 @@
5331 out_flush(); /* needed to disable mouse on some systems */
5332
5333 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
5334- /* Since we are going to sleep, we can't respond to requests for the X
5335- * selections. Lose them, otherwise other applications will hang. But
5336- * first copy the text to cut buffer 0. */
5337- if (clip_star.owned || clip_plus.owned)
5338- {
5339- x11_export_final_selection();
5340- if (clip_star.owned)
5341- clip_lose_selection(&clip_star);
5342- if (clip_plus.owned)
5343- clip_lose_selection(&clip_plus);
5344- if (x11_display != NULL)
5345- XFlush(x11_display);
5346- }
5347+ loose_clipboard();
5348 # endif
5349
5350 # if defined(_REENTRANT) && defined(SIGCONT)
5351@@ -1726,6 +1738,11 @@
5352 }
5353 if (x11_window == 0 || x11_display == NULL)
5354 return (result = FAIL);
5355+
5356+# ifdef FEAT_EVAL
5357+ set_vim_var_nr(VV_WINDOWID, (long)x11_window);
5358+# endif
5359+
5360 return (result = OK);
5361 }
5362
5363@@ -3706,6 +3723,10 @@
5364 if (options & SHELL_COOKED)
5365 settmode(TMODE_COOK); /* set to normal mode */
5366
5367+# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
5368+ loose_clipboard();
5369+# endif
5370+
5371 # ifdef __EMX__
5372 if (cmd == NULL)
5373 x = system(""); /* this starts an interactive shell in emx */
5374@@ -3814,13 +3835,17 @@
5375 # endif
5376 int did_settmode = FALSE; /* settmode(TMODE_RAW) called */
5377
5378+ newcmd = vim_strsave(p_sh);
5379+ if (newcmd == NULL) /* out of memory */
5380+ goto error;
5381+
5382 out_flush();
5383 if (options & SHELL_COOKED)
5384 settmode(TMODE_COOK); /* set to normal mode */
5385
5386- newcmd = vim_strsave(p_sh);
5387- if (newcmd == NULL) /* out of memory */
5388- goto error;
5389+# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
5390+ loose_clipboard();
5391+# endif
5392
5393 /*
5394 * Do this loop twice:
5395@@ -4148,7 +4173,6 @@
5396 # ifdef FEAT_GUI
5397 if (pty_master_fd >= 0)
5398 {
5399- close(pty_slave_fd); /* close slave side of pty */
5400 fromshell_fd = pty_master_fd;
5401 toshell_fd = dup(pty_master_fd);
5402 }
5403@@ -4430,7 +4454,7 @@
5404 ++noread_cnt;
5405 while (RealWaitForChar(fromshell_fd, 10L, NULL))
5406 {
5407- len = read(fromshell_fd, (char *)buffer
5408+ len = read_eintr(fromshell_fd, buffer
5409 # ifdef FEAT_MBYTE
5410 + buffer_off, (size_t)(BUFLEN - buffer_off)
5411 # else
5412@@ -4617,6 +4641,14 @@
5413 break;
5414 }
5415
5416+# ifdef FEAT_GUI
5417+ /* Close slave side of pty. Only do this after the child has
5418+ * exited, otherwise the child may hang when it tries to write on
5419+ * the pty. */
5420+ if (pty_master_fd >= 0)
5421+ close(pty_slave_fd);
5422+# endif
5423+
5424 /* Make sure the child that writes to the external program is
5425 * dead. */
5426 if (wpid > 0)
5427diff -Naur vim73.orig/src/os_win16.c vim73/src/os_win16.c
5428--- vim73.orig/src/os_win16.c 2010-06-26 00:03:31.000000000 -0400
5429+++ vim73/src/os_win16.c 2011-01-08 21:01:19.434656677 -0500
5430@@ -20,13 +20,11 @@
5431 # pragma warn -obs
5432 #endif
5433
5434-#include "vimio.h"
5435 #include "vim.h"
5436
5437 #include <dos.h>
5438 #include <string.h>
5439 #include <sys/types.h>
5440-#include <errno.h>
5441 #include <signal.h>
5442 #include <limits.h>
5443 #include <process.h>
5444diff -Naur vim73.orig/src/os_win32.c vim73/src/os_win32.c
5445--- vim73.orig/src/os_win32.c 2010-07-14 10:49:36.000000000 -0400
5446+++ vim73/src/os_win32.c 2011-01-08 21:01:19.438656953 -0500
5447@@ -20,7 +20,6 @@
5448 * Roger Knobbe <rogerk@wonderware.com> did the initial port of Vim 3.0.
5449 */
5450
5451-#include "vimio.h"
5452 #include "vim.h"
5453
5454 #ifdef FEAT_MZSCHEME
5455@@ -28,7 +27,6 @@
5456 #endif
5457
5458 #include <sys/types.h>
5459-#include <errno.h>
5460 #include <signal.h>
5461 #include <limits.h>
5462 #include <process.h>
5463@@ -206,42 +204,73 @@
5464 static int suppress_winsize = 1; /* don't fiddle with console */
5465 #endif
5466
5467+static char_u *exe_path = NULL;
5468+
5469 static void
5470 get_exe_name(void)
5471 {
5472- char temp[256];
5473- static int did_set_PATH = FALSE;
5474+ /* Maximum length of $PATH is more than MAXPATHL. 8191 is often mentioned
5475+ * as the maximum length that works (plus a NUL byte). */
5476+#define MAX_ENV_PATH_LEN 8192
5477+ char temp[MAX_ENV_PATH_LEN];
5478+ char_u *p;
5479
5480 if (exe_name == NULL)
5481 {
5482 /* store the name of the executable, may be used for $VIM */
5483- GetModuleFileName(NULL, temp, 255);
5484+ GetModuleFileName(NULL, temp, MAX_ENV_PATH_LEN - 1);
5485 if (*temp != NUL)
5486 exe_name = FullName_save((char_u *)temp, FALSE);
5487 }
5488
5489- if (!did_set_PATH && exe_name != NULL)
5490+ if (exe_path == NULL && exe_name != NULL)
5491 {
5492- char_u *p;
5493- char_u *newpath;
5494-
5495- /* Append our starting directory to $PATH, so that when doing "!xxd"
5496- * it's found in our starting directory. Needed because SearchPath()
5497- * also looks there. */
5498- p = mch_getenv("PATH");
5499- newpath = alloc((unsigned)(STRLEN(p) + STRLEN(exe_name) + 2));
5500- if (newpath != NULL)
5501- {
5502- STRCPY(newpath, p);
5503- STRCAT(newpath, ";");
5504- vim_strncpy(newpath + STRLEN(newpath), exe_name,
5505- gettail_sep(exe_name) - exe_name);
5506- vim_setenv((char_u *)"PATH", newpath);
5507- vim_free(newpath);
5508+ exe_path = vim_strnsave(exe_name,
5509+ (int)(gettail_sep(exe_name) - exe_name));
5510+ if (exe_path != NULL)
5511+ {
5512+ /* Append our starting directory to $PATH, so that when doing
5513+ * "!xxd" it's found in our starting directory. Needed because
5514+ * SearchPath() also looks there. */
5515+ p = mch_getenv("PATH");
5516+ if (p == NULL
5517+ || STRLEN(p) + STRLEN(exe_path) + 2 < MAX_ENV_PATH_LEN)
5518+ {
5519+ if (p == NULL || *p == NUL)
5520+ temp[0] = NUL;
5521+ else
5522+ {
5523+ STRCPY(temp, p);
5524+ STRCAT(temp, ";");
5525+ }
5526+ STRCAT(temp, exe_path);
5527+ vim_setenv((char_u *)"PATH", temp);
5528+ }
5529 }
5530+ }
5531+}
5532+
5533+/*
5534+ * Load library "name".
5535+ */
5536+ HINSTANCE
5537+vimLoadLib(char *name)
5538+{
5539+ HINSTANCE dll = NULL;
5540+ char old_dir[MAXPATHL];
5541
5542- did_set_PATH = TRUE;
5543+ if (exe_path == NULL)
5544+ get_exe_name();
5545+ if (exe_path != NULL && mch_dirname(old_dir, MAXPATHL) == OK)
5546+ {
5547+ /* Change directory to where the executable is, both to make sure we
5548+ * find a .dll there and to avoid looking for a .dll in the current
5549+ * directory. */
5550+ mch_chdir(exe_path);
5551+ dll = LoadLibrary(name);
5552+ mch_chdir(old_dir);
5553 }
5554+ return dll;
5555 }
5556
5557 #if defined(DYNAMIC_GETTEXT) || defined(PROTO)
5558@@ -254,7 +283,7 @@
5559 static char *null_libintl_bindtextdomain(const char *, const char *);
5560 static char *null_libintl_bind_textdomain_codeset(const char *, const char *);
5561
5562-static HINSTANCE hLibintlDLL = 0;
5563+static HINSTANCE hLibintlDLL = NULL;
5564 char *(*dyn_libintl_gettext)(const char *) = null_libintl_gettext;
5565 char *(*dyn_libintl_textdomain)(const char *) = null_libintl_textdomain;
5566 char *(*dyn_libintl_bindtextdomain)(const char *, const char *)
5567@@ -282,26 +311,16 @@
5568 if (hLibintlDLL)
5569 return 1;
5570 /* Load gettext library (libintl.dll) */
5571- hLibintlDLL = LoadLibrary(libname != NULL ? libname : GETTEXT_DLL);
5572+ hLibintlDLL = vimLoadLib(libname != NULL ? libname : GETTEXT_DLL);
5573 if (!hLibintlDLL)
5574 {
5575- char_u dirname[_MAX_PATH];
5576-
5577- /* Try using the path from gvim.exe to find the .dll there. */
5578- get_exe_name();
5579- STRCPY(dirname, exe_name);
5580- STRCPY(gettail(dirname), GETTEXT_DLL);
5581- hLibintlDLL = LoadLibrary((char *)dirname);
5582- if (!hLibintlDLL)
5583+ if (p_verbose > 0)
5584 {
5585- if (p_verbose > 0)
5586- {
5587- verbose_enter();
5588- EMSG2(_(e_loadlib), GETTEXT_DLL);
5589- verbose_leave();
5590- }
5591- return 0;
5592+ verbose_enter();
5593+ EMSG2(_(e_loadlib), GETTEXT_DLL);
5594+ verbose_leave();
5595 }
5596+ return 0;
5597 }
5598 for (i = 0; libintl_entry[i].name != NULL
5599 && libintl_entry[i].ptr != NULL; ++i)
5600@@ -430,7 +449,7 @@
5601 * Seems like a lot of overhead to load/unload ADVAPI32.DLL each
5602 * time we verify security...
5603 */
5604- advapi_lib = LoadLibrary("ADVAPI32.DLL");
5605+ advapi_lib = vimLoadLib("ADVAPI32.DLL");
5606 if (advapi_lib != NULL)
5607 {
5608 pSetNamedSecurityInfo = (PSNSECINFO)GetProcAddress(advapi_lib,
5609@@ -1615,6 +1634,35 @@
5610 return TRUE;
5611 }
5612
5613+#if ((defined(__MINGW32__) || defined (__CYGWIN32__)) && \
5614+ __MSVCRT_VERSION__ >= 0x800) || (defined(_MSC_VER) && _MSC_VER >= 1400)
5615+/*
5616+ * Bad parameter handler.
5617+ *
5618+ * Certain MS CRT functions will intentionally crash when passed invalid
5619+ * parameters to highlight possible security holes. Setting this function as
5620+ * the bad parameter handler will prevent the crash.
5621+ *
5622+ * In debug builds the parameters contain CRT information that might help track
5623+ * down the source of a problem, but in non-debug builds the arguments are all
5624+ * NULL/0. Debug builds will also produce assert dialogs from the CRT, it is
5625+ * worth allowing these to make debugging of issues easier.
5626+ */
5627+ static void
5628+bad_param_handler(const wchar_t *expression,
5629+ const wchar_t *function,
5630+ const wchar_t *file,
5631+ unsigned int line,
5632+ uintptr_t pReserved)
5633+{
5634+}
5635+
5636+# define SET_INVALID_PARAM_HANDLER \
5637+ ((void)_set_invalid_parameter_handler(bad_param_handler))
5638+#else
5639+# define SET_INVALID_PARAM_HANDLER
5640+#endif
5641+
5642 #ifdef FEAT_GUI_W32
5643
5644 /*
5645@@ -1627,6 +1675,9 @@
5646 extern int _fmode;
5647 #endif
5648
5649+ /* Silently handle invalid parameters to CRT functions */
5650+ SET_INVALID_PARAM_HANDLER;
5651+
5652 /* Let critical errors result in a failure, not in a dialog box. Required
5653 * for the timestamp test to work on removed floppies. */
5654 SetErrorMode(SEM_FAILCRITICALERRORS);
5655@@ -2103,6 +2154,9 @@
5656 extern int _fmode;
5657 #endif
5658
5659+ /* Silently handle invalid parameters to CRT functions */
5660+ SET_INVALID_PARAM_HANDLER;
5661+
5662 /* Let critical errors result in a failure, not in a dialog box. Required
5663 * for the timestamp test to work on removed floppies. */
5664 SetErrorMode(SEM_FAILCRITICALERRORS);
5665@@ -2273,12 +2327,14 @@
5666 int len)
5667 {
5668 char szTrueName[_MAX_PATH + 2];
5669+ char szTrueNameTemp[_MAX_PATH + 2];
5670 char *ptrue, *ptruePrev;
5671 char *porig, *porigPrev;
5672 int flen;
5673 WIN32_FIND_DATA fb;
5674 HANDLE hFind;
5675 int c;
5676+ int slen;
5677
5678 flen = (int)STRLEN(name);
5679 if (flen == 0 || flen > _MAX_PATH)
5680@@ -2323,12 +2379,19 @@
5681 }
5682 *ptrue = NUL;
5683
5684+ /* To avoid a slow failure append "\*" when searching a directory,
5685+ * server or network share. */
5686+ STRCPY(szTrueNameTemp, szTrueName);
5687+ slen = (int)strlen(szTrueNameTemp);
5688+ if (*porig == psepc && slen + 2 < _MAX_PATH)
5689+ STRCPY(szTrueNameTemp + slen, "\\*");
5690+
5691 /* Skip "", "." and "..". */
5692 if (ptrue > ptruePrev
5693 && (ptruePrev[0] != '.'
5694 || (ptruePrev[1] != NUL
5695 && (ptruePrev[1] != '.' || ptruePrev[2] != NUL)))
5696- && (hFind = FindFirstFile(szTrueName, &fb))
5697+ && (hFind = FindFirstFile(szTrueNameTemp, &fb))
5698 != INVALID_HANDLE_VALUE)
5699 {
5700 c = *porig;
5701@@ -3120,9 +3183,10 @@
5702 * It's nicer to run a filter command in a minimized window, but in
5703 * Windows 95 this makes the command MUCH slower. We can't do it under
5704 * Win32s either as it stops the synchronous spawn workaround working.
5705+ * Don't activate the window to keep focus on Vim.
5706 */
5707 if ((options & SHELL_DOOUT) && !mch_windows95() && !gui_is_win32s())
5708- si.wShowWindow = SW_SHOWMINIMIZED;
5709+ si.wShowWindow = SW_SHOWMINNOACTIVE;
5710 else
5711 si.wShowWindow = SW_SHOWNORMAL;
5712 si.cbReserved2 = 0;
5713diff -Naur vim73.orig/src/popupmnu.c vim73/src/popupmnu.c
5714--- vim73.orig/src/popupmnu.c 2010-08-08 09:14:58.000000000 -0400
5715+++ vim73/src/popupmnu.c 2011-01-08 21:01:19.046656594 -0500
5716@@ -558,8 +558,11 @@
5717 win_T *curwin_save = curwin;
5718 int res = OK;
5719
5720- /* Open a preview window. 3 lines by default. */
5721+ /* Open a preview window. 3 lines by default. Prefer
5722+ * 'previewheight' if set and smaller. */
5723 g_do_tagpreview = 3;
5724+ if (p_pvh > 0 && p_pvh < g_do_tagpreview)
5725+ g_do_tagpreview = p_pvh;
5726 resized = prepare_tagpreview(FALSE);
5727 g_do_tagpreview = 0;
5728
5729diff -Naur vim73.orig/src/proto/fileio.pro vim73/src/proto/fileio.pro
5730--- vim73.orig/src/proto/fileio.pro 2010-08-15 08:30:28.000000000 -0400
5731+++ vim73/src/proto/fileio.pro 2011-01-08 21:01:19.354659886 -0500
5732@@ -54,4 +54,6 @@
5733 int match_file_pat __ARGS((char_u *pattern, regprog_T *prog, char_u *fname, char_u *sfname, char_u *tail, int allow_dirs));
5734 int match_file_list __ARGS((char_u *list, char_u *sfname, char_u *ffname));
5735 char_u *file_pat_to_reg_pat __ARGS((char_u *pat, char_u *pat_end, char *allow_dirs, int no_bslash));
5736+long read_eintr __ARGS((int fd, void *buf, size_t bufsize));
5737+long write_eintr __ARGS((int fd, void *buf, size_t bufsize));
5738 /* vim: set ft=c : */
5739diff -Naur vim73.orig/src/proto/getchar.pro vim73/src/proto/getchar.pro
5740--- vim73.orig/src/proto/getchar.pro 2010-08-15 08:30:29.000000000 -0400
5741+++ vim73/src/proto/getchar.pro 2011-01-08 21:01:18.918658776 -0500
5742@@ -51,6 +51,7 @@
5743 int get_map_mode __ARGS((char_u **cmdp, int forceit));
5744 void map_clear __ARGS((char_u *cmdp, char_u *arg, int forceit, int abbr));
5745 void map_clear_int __ARGS((buf_T *buf, int mode, int local, int abbr));
5746+char_u *map_mode_to_chars __ARGS((int mode));
5747 int map_to_exists __ARGS((char_u *str, char_u *modechars, int abbr));
5748 int map_to_exists_mode __ARGS((char_u *rhs, int mode, int abbr));
5749 char_u *set_context_in_map_cmd __ARGS((expand_T *xp, char_u *cmd, char_u *arg, int forceit, int isabbrev, int isunmap, cmdidx_T cmdidx));
5750@@ -61,7 +62,7 @@
5751 int makemap __ARGS((FILE *fd, buf_T *buf));
5752 int put_escstr __ARGS((FILE *fd, char_u *strstart, int what));
5753 void check_map_keycodes __ARGS((void));
5754-char_u *check_map __ARGS((char_u *keys, int mode, int exact, int ign_mod, int abbr));
5755+char_u *check_map __ARGS((char_u *keys, int mode, int exact, int ign_mod, int abbr, mapblock_T **mp_ptr, int *local_ptr));
5756 void init_mappings __ARGS((void));
5757 void add_map __ARGS((char_u *map, int mode));
5758 /* vim: set ft=c : */
5759diff -Naur vim73.orig/src/proto/message.pro vim73/src/proto/message.pro
5760--- vim73.orig/src/proto/message.pro 2010-08-15 08:30:41.000000000 -0400
5761+++ vim73/src/proto/message.pro 2011-01-08 21:01:18.918658776 -0500
5762@@ -33,6 +33,7 @@
5763 int msg_outtrans_len_attr __ARGS((char_u *msgstr, int len, int attr));
5764 void msg_make __ARGS((char_u *arg));
5765 int msg_outtrans_special __ARGS((char_u *strstart, int from));
5766+char_u *str2special_save __ARGS((char_u *str, int is_lhs));
5767 char_u *str2special __ARGS((char_u **sp, int from));
5768 void str2specialbuf __ARGS((char_u *sp, char_u *buf, int len));
5769 void msg_prt_line __ARGS((char_u *s, int list));
5770diff -Naur vim73.orig/src/proto/os_win32.pro vim73/src/proto/os_win32.pro
5771--- vim73.orig/src/proto/os_win32.pro 2010-08-15 08:31:14.000000000 -0400
5772+++ vim73/src/proto/os_win32.pro 2011-01-08 21:01:18.926655661 -0500
5773@@ -1,4 +1,5 @@
5774 /* os_win32.c */
5775+HINSTANCE vimLoadLib __ARGS((char *name));
5776 int dyn_libintl_init __ARGS((char *libname));
5777 void dyn_libintl_end __ARGS((void));
5778 void PlatformId __ARGS((void));
5779diff -Naur vim73.orig/src/quickfix.c vim73/src/quickfix.c
5780--- vim73.orig/src/quickfix.c 2010-08-09 16:12:14.000000000 -0400
5781+++ vim73/src/quickfix.c 2011-01-08 21:01:19.226656888 -0500
5782@@ -1656,9 +1656,7 @@
5783 opened_window = TRUE; /* close it when fail */
5784 p_swb = empty_option; /* don't split again */
5785 swb_flags = 0;
5786-# ifdef FEAT_SCROLLBIND
5787- curwin->w_p_scb = FALSE;
5788-# endif
5789+ RESET_BINDING(curwin);
5790 if (ll_ref != NULL)
5791 {
5792 /* The new window should use the location list from the
5793@@ -2125,6 +2123,7 @@
5794 --qi->qf_lists[idx].qf_count;
5795 }
5796 vim_free(qi->qf_lists[idx].qf_title);
5797+ qi->qf_lists[idx].qf_title = NULL;
5798 }
5799
5800 /*
5801@@ -2333,9 +2332,7 @@
5802 win_goto(lastwin);
5803 if (win_split(height, WSP_BELOW | WSP_NEWLOC) == FAIL)
5804 return; /* not enough room for window */
5805-#ifdef FEAT_SCROLLBIND
5806- curwin->w_p_scb = FALSE;
5807-#endif
5808+ RESET_BINDING(curwin);
5809
5810 if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
5811 {
5812@@ -2362,6 +2359,7 @@
5813 set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
5814 OPT_LOCAL);
5815 set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
5816+ RESET_BINDING(curwin);
5817 #ifdef FEAT_DIFF
5818 curwin->w_p_diff = FALSE;
5819 #endif
5820@@ -3435,6 +3433,7 @@
5821 char_u *fname;
5822 {
5823 buf_T *newbuf;
5824+ buf_T *newbuf_to_wipe = NULL;
5825 int failed = TRUE;
5826 aco_save_T aco;
5827
5828@@ -3471,15 +3470,19 @@
5829 failed = FALSE;
5830 if (curbuf != newbuf)
5831 {
5832- /* Bloody autocommands changed the buffer! */
5833- if (buf_valid(newbuf))
5834- wipe_buffer(newbuf, FALSE);
5835+ /* Bloody autocommands changed the buffer! Can happen when
5836+ * using netrw and editing a remote file. Use the current
5837+ * buffer instead, delete the dummy one after restoring the
5838+ * window stuff. */
5839+ newbuf_to_wipe = newbuf;
5840 newbuf = curbuf;
5841 }
5842 }
5843
5844 /* restore curwin/curbuf and a few other things */
5845 aucmd_restbuf(&aco);
5846+ if (newbuf_to_wipe != NULL && buf_valid(newbuf_to_wipe))
5847+ wipe_buffer(newbuf_to_wipe, FALSE);
5848 }
5849
5850 if (!buf_valid(newbuf))
5851diff -Naur vim73.orig/src/regexp.c vim73/src/regexp.c
5852--- vim73.orig/src/regexp.c 2010-07-12 16:41:48.000000000 -0400
5853+++ vim73/src/regexp.c 2011-01-08 20:59:37.790766680 -0500
5854@@ -3538,6 +3538,7 @@
5855
5856 regline = line;
5857 reglnum = 0;
5858+ reg_toolong = FALSE;
5859
5860 /* Simplest case: Anchored match need be tried only once. */
5861 if (prog->reganch)
5862diff -Naur vim73.orig/src/screen.c vim73/src/screen.c
5863--- vim73.orig/src/screen.c 2010-08-13 09:21:27.000000000 -0400
5864+++ vim73/src/screen.c 2011-01-08 21:01:19.494656637 -0500
5865@@ -2317,7 +2317,7 @@
5866 num = (long)lnum;
5867 else
5868 /* 'relativenumber', don't use negative numbers */
5869- num = (long)abs((int)get_cursor_rel_lnum(wp, lnum));
5870+ num = labs((long)get_cursor_rel_lnum(wp, lnum));
5871
5872 sprintf((char *)buf, "%*ld ", w, num);
5873 #ifdef FEAT_RIGHTLEFT
5874@@ -3405,9 +3405,9 @@
5875 # endif
5876 )
5877 {
5878- int_u text_sign;
5879+ int text_sign;
5880 # ifdef FEAT_SIGN_ICONS
5881- int_u icon_sign;
5882+ int icon_sign;
5883 # endif
5884
5885 /* Draw two cells with the sign value or blank. */
5886@@ -3475,8 +3475,7 @@
5887 num = (long)lnum;
5888 else
5889 /* 'relativenumber', don't use negative numbers */
5890- num = (long)abs((int)get_cursor_rel_lnum(wp,
5891- lnum));
5892+ num = labs((long)get_cursor_rel_lnum(wp, lnum));
5893
5894 sprintf((char *)extra, "%*ld ",
5895 number_width(wp), num);
5896@@ -6522,8 +6521,17 @@
5897 stl, use_sandbox,
5898 fillchar, maxwidth, hltab, tabtab);
5899 vim_free(stl);
5900- len = (int)STRLEN(buf);
5901
5902+ /* Make all characters printable. */
5903+ p = transstr(buf);
5904+ if (p != NULL)
5905+ {
5906+ vim_strncpy(buf, p, sizeof(buf) - 1);
5907+ vim_free(p);
5908+ }
5909+
5910+ /* fill up with "fillchar" */
5911+ len = (int)STRLEN(buf);
5912 while (width < maxwidth && len < (int)sizeof(buf) - 1)
5913 {
5914 #ifdef FEAT_MBYTE
5915diff -Naur vim73.orig/src/search.c vim73/src/search.c
5916--- vim73.orig/src/search.c 2010-07-14 10:49:41.000000000 -0400
5917+++ vim73/src/search.c 2011-01-08 20:59:41.002656834 -0500
5918@@ -5075,9 +5075,7 @@
5919 if (win_split(0, 0) == FAIL)
5920 #endif
5921 break;
5922-#ifdef FEAT_SCROLLBIND
5923- curwin->w_p_scb = FALSE;
5924-#endif
5925+ RESET_BINDING(curwin);
5926 }
5927 if (depth == -1)
5928 {
5929diff -Naur vim73.orig/src/spell.c vim73/src/spell.c
5930--- vim73.orig/src/spell.c 2010-08-01 09:43:01.000000000 -0400
5931+++ vim73/src/spell.c 2011-01-08 21:01:19.386656778 -0500
5932@@ -303,10 +303,6 @@
5933 * few bytes as possible, see offset2bytes())
5934 */
5935
5936-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
5937-# include "vimio.h" /* for lseek(), must be before vim.h */
5938-#endif
5939-
5940 #include "vim.h"
5941
5942 #if defined(FEAT_SPELL) || defined(PROTO)
5943@@ -327,6 +323,16 @@
5944 typedef long idx_T;
5945 #endif
5946
5947+#ifdef VMS
5948+# define SPL_FNAME_TMPL "%s_%s.spl"
5949+# define SPL_FNAME_ADD "_add."
5950+# define SPL_FNAME_ASCII "_ascii."
5951+#else
5952+# define SPL_FNAME_TMPL "%s.%s.spl"
5953+# define SPL_FNAME_ADD ".add."
5954+# define SPL_FNAME_ASCII ".ascii."
5955+#endif
5956+
5957 /* Flags used for a word. Only the lowest byte can be used, the region byte
5958 * comes above it. */
5959 #define WF_REGION 0x01 /* region byte follows */
5960@@ -2471,14 +2477,24 @@
5961 * Find the first spell file for "lang" in 'runtimepath' and load it.
5962 */
5963 vim_snprintf((char *)fname_enc, sizeof(fname_enc) - 5,
5964- "spell/%s.%s.spl", lang, spell_enc());
5965+#ifdef VMS
5966+ "spell/%s_%s.spl",
5967+#else
5968+ "spell/%s.%s.spl",
5969+#endif
5970+ lang, spell_enc());
5971 r = do_in_runtimepath(fname_enc, FALSE, spell_load_cb, &sl);
5972
5973 if (r == FAIL && *sl.sl_lang != NUL)
5974 {
5975 /* Try loading the ASCII version. */
5976 vim_snprintf((char *)fname_enc, sizeof(fname_enc) - 5,
5977- "spell/%s.ascii.spl", lang);
5978+#ifdef VMS
5979+ "spell/%s_ascii.spl",
5980+#else
5981+ "spell/%s.ascii.spl",
5982+#endif
5983+ lang);
5984 r = do_in_runtimepath(fname_enc, FALSE, spell_load_cb, &sl);
5985
5986 #ifdef FEAT_AUTOCMD
5987@@ -2496,7 +2512,12 @@
5988
5989 if (r == FAIL)
5990 {
5991- smsg((char_u *)_("Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""),
5992+ smsg((char_u *)
5993+#ifdef VMS
5994+ _("Warning: Cannot find word list \"%s_%s.spl\" or \"%s_ascii.spl\""),
5995+#else
5996+ _("Warning: Cannot find word list \"%s.%s.spl\" or \"%s.ascii.spl\""),
5997+#endif
5998 lang, spell_enc(), lang);
5999 }
6000 else if (sl.sl_slang != NULL)
6001@@ -2530,7 +2551,7 @@
6002 int_wordlist_spl(fname)
6003 char_u *fname;
6004 {
6005- vim_snprintf((char *)fname, MAXPATHL, "%s.%s.spl",
6006+ vim_snprintf((char *)fname, MAXPATHL, SPL_FNAME_TMPL,
6007 int_wordlist, spell_enc());
6008 }
6009
6010@@ -2785,8 +2806,8 @@
6011 if (lp->sl_fname == NULL)
6012 goto endFAIL;
6013
6014- /* Check for .add.spl. */
6015- lp->sl_add = strstr((char *)gettail(fname), ".add.") != NULL;
6016+ /* Check for .add.spl (_add.spl for VMS). */
6017+ lp->sl_add = strstr((char *)gettail(fname), SPL_FNAME_ADD) != NULL;
6018 }
6019 else
6020 lp = old_lp;
6021@@ -4679,7 +4700,7 @@
6022 buf_T *buf;
6023 char_u fname[MAXPATHL];
6024
6025- /* Go through all buffers and handle 'spelllang'. */ //<VN>
6026+ /* Go through all buffers and handle 'spelllang'. <VN> */
6027 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
6028 ga_clear(&buf->b_s.b_langp);
6029
6030@@ -4951,7 +4972,7 @@
6031 char_u *si_info; /* info text chars or NULL */
6032 int si_region_count; /* number of regions supported (1 when there
6033 are no regions) */
6034- char_u si_region_name[16]; /* region names; used only if
6035+ char_u si_region_name[17]; /* region names; used only if
6036 * si_region_count > 1) */
6037
6038 garray_T si_rep; /* list of fromto_T entries from REP lines */
6039@@ -9109,8 +9130,8 @@
6040 /* For ":mkspell path/vim" output file is "path/vim.latin1.spl". */
6041 innames = &fnames[0];
6042 incount = 1;
6043- vim_snprintf((char *)wfname, sizeof(wfname), "%s.%s.spl", fnames[0],
6044- spin.si_ascii ? (char_u *)"ascii" : spell_enc());
6045+ vim_snprintf((char *)wfname, sizeof(wfname), SPL_FNAME_TMPL,
6046+ fnames[0], spin.si_ascii ? (char_u *)"ascii" : spell_enc());
6047 }
6048 else if (len > 4 && STRCMP(fnames[0] + len - 4, ".spl") == 0)
6049 {
6050@@ -9119,15 +9140,15 @@
6051 }
6052 else
6053 /* Name should be language, make the file name from it. */
6054- vim_snprintf((char *)wfname, sizeof(wfname), "%s.%s.spl", fnames[0],
6055- spin.si_ascii ? (char_u *)"ascii" : spell_enc());
6056+ vim_snprintf((char *)wfname, sizeof(wfname), SPL_FNAME_TMPL,
6057+ fnames[0], spin.si_ascii ? (char_u *)"ascii" : spell_enc());
6058
6059 /* Check for .ascii.spl. */
6060- if (strstr((char *)gettail(wfname), ".ascii.") != NULL)
6061+ if (strstr((char *)gettail(wfname), SPL_FNAME_ASCII) != NULL)
6062 spin.si_ascii = TRUE;
6063
6064 /* Check for .add.spl. */
6065- if (strstr((char *)gettail(wfname), ".add.") != NULL)
6066+ if (strstr((char *)gettail(wfname), SPL_FNAME_ADD) != NULL)
6067 spin.si_add = TRUE;
6068 }
6069
6070@@ -9530,7 +9551,8 @@
6071 if (aspath)
6072 /* Use directory of an entry with path, e.g., for
6073 * "/dir/lg.utf-8.spl" use "/dir". */
6074- vim_strncpy(buf, curbuf->b_s.b_p_spl, lstart - curbuf->b_s.b_p_spl - 1);
6075+ vim_strncpy(buf, curbuf->b_s.b_p_spl,
6076+ lstart - curbuf->b_s.b_p_spl - 1);
6077 else
6078 /* Copy the path from 'runtimepath' to buf[]. */
6079 copy_option_part(&rtp, buf, MAXPATHL, ",");
6080@@ -9539,13 +9561,14 @@
6081 /* Use the first language name from 'spelllang' and the
6082 * encoding used in the first loaded .spl file. */
6083 if (aspath)
6084- vim_strncpy(buf, curbuf->b_s.b_p_spl, lend - curbuf->b_s.b_p_spl);
6085+ vim_strncpy(buf, curbuf->b_s.b_p_spl,
6086+ lend - curbuf->b_s.b_p_spl);
6087 else
6088 {
6089 /* Create the "spell" directory if it doesn't exist yet. */
6090 l = (int)STRLEN(buf);
6091 vim_snprintf((char *)buf + l, MAXPATHL - l, "/spell");
6092- if (!filewritable(buf) != 2)
6093+ if (filewritable(buf) != 2)
6094 vim_mkdir(buf, 0755);
6095
6096 l = (int)STRLEN(buf);
6097@@ -9837,10 +9860,7 @@
6098 {
6099 /* be quick for ASCII */
6100 if (wp->w_s->b_spell_ismw[*p])
6101- {
6102 s = p + 1; /* skip a mid-word character */
6103- l = MB_BYTE2LEN(*s);
6104- }
6105 }
6106 else
6107 {
6108@@ -9848,10 +9868,7 @@
6109 if (c < 256 ? wp->w_s->b_spell_ismw[c]
6110 : (wp->w_s->b_spell_ismw_mb != NULL
6111 && vim_strchr(wp->w_s->b_spell_ismw_mb, c) != NULL))
6112- {
6113 s = p + l;
6114- l = MB_BYTE2LEN(*s);
6115- }
6116 }
6117
6118 c = mb_ptr2char(s);
6119@@ -13811,11 +13828,8 @@
6120 su->su_sfmaxscore = cleanup_suggestions(gap,
6121 su->su_sfmaxscore, SUG_CLEAN_COUNT(su));
6122 else
6123- {
6124- i = su->su_maxscore;
6125 su->su_maxscore = cleanup_suggestions(gap,
6126 su->su_maxscore, SUG_CLEAN_COUNT(su));
6127- }
6128 }
6129 }
6130 }
6131diff -Naur vim73.orig/src/structs.h vim73/src/structs.h
6132--- vim73.orig/src/structs.h 2010-08-07 10:59:27.000000000 -0400
6133+++ vim73/src/structs.h 2011-01-08 21:01:18.918658776 -0500
6134@@ -979,9 +979,10 @@
6135 struct mapblock
6136 {
6137 mapblock_T *m_next; /* next mapblock in list */
6138- char_u *m_keys; /* mapped from */
6139+ char_u *m_keys; /* mapped from, lhs */
6140 int m_keylen; /* strlen(m_keys) */
6141- char_u *m_str; /* mapped to */
6142+ char_u *m_str; /* mapped to, rhs */
6143+ char_u *m_orig_str; /* rhs as entered by the user */
6144 int m_mode; /* valid mode */
6145 int m_noremap; /* if non-zero no re-mapping for m_str */
6146 char m_silent; /* <silent> used, don't echo commands */
6147diff -Naur vim73.orig/src/syntax.c vim73/src/syntax.c
6148--- vim73.orig/src/syntax.c 2010-08-08 09:17:03.000000000 -0400
6149+++ vim73/src/syntax.c 2011-01-08 21:01:18.790655926 -0500
6150@@ -7600,10 +7600,10 @@
6151 /*
6152 * Copy characters from arg[] to buf[], translating <> codes.
6153 */
6154- for (p = arg, off = 0; off < 100 && *p; )
6155+ for (p = arg, off = 0; off < 100 - 6 && *p; )
6156 {
6157 len = trans_special(&p, buf + off, FALSE);
6158- if (len) /* recognized special char */
6159+ if (len > 0) /* recognized special char */
6160 off += len;
6161 else /* copy as normal char */
6162 buf[off++] = *p++;
6163diff -Naur vim73.orig/src/tag.c vim73/src/tag.c
6164--- vim73.orig/src/tag.c 2010-08-10 03:25:22.000000000 -0400
6165+++ vim73/src/tag.c 2011-01-08 21:01:19.386656778 -0500
6166@@ -11,10 +11,6 @@
6167 * Code to handle tags and the tag stack
6168 */
6169
6170-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
6171-# include "vimio.h" /* for lseek(), must be before vim.h */
6172-#endif
6173-
6174 #include "vim.h"
6175
6176 /*
6177@@ -3143,9 +3139,7 @@
6178 {
6179 win_split(postponed_split > 0 ? postponed_split : 0,
6180 postponed_split_flags);
6181-# ifdef FEAT_SCROLLBIND
6182- curwin->w_p_scb = FALSE;
6183-# endif
6184+ RESET_BINDING(curwin);
6185 }
6186 #endif
6187
6188diff -Naur vim73.orig/src/term.c vim73/src/term.c
6189--- vim73.orig/src/term.c 2010-07-25 09:30:31.000000000 -0400
6190+++ vim73/src/term.c 2011-01-08 21:01:19.486656758 -0500
6191@@ -3053,10 +3053,13 @@
6192 int old_Rows = Rows;
6193 int old_Columns = Columns;
6194
6195- (void)ui_get_shellsize();
6196- check_shellsize();
6197- if (old_Rows != Rows || old_Columns != Columns)
6198- shell_resized();
6199+ if (!exiting)
6200+ {
6201+ (void)ui_get_shellsize();
6202+ check_shellsize();
6203+ if (old_Rows != Rows || old_Columns != Columns)
6204+ shell_resized();
6205+ }
6206 }
6207
6208 /*
6209@@ -3828,6 +3831,7 @@
6210 * Check from typebuf.tb_buf[typebuf.tb_off] to typebuf.tb_buf[typebuf.tb_off
6211 * + max_offset].
6212 * Return 0 for no match, -1 for partial match, > 0 for full match.
6213+ * Return KEYLEN_REMOVED when a key code was deleted.
6214 * With a match, the match is removed, the replacement code is inserted in
6215 * typebuf.tb_buf[] and the number of characters in typebuf.tb_buf[] is
6216 * returned.
6217@@ -3845,6 +3849,7 @@
6218 int slen = 0; /* init for GCC */
6219 int modslen;
6220 int len;
6221+ int retval = 0;
6222 int offset;
6223 char_u key_name[2];
6224 int modifiers;
6225@@ -4940,6 +4945,13 @@
6226 #endif
6227 string[new_slen++] = key_name[1];
6228 }
6229+ else if (new_slen == 0 && key_name[0] == KS_EXTRA
6230+ && key_name[1] == KE_IGNORE)
6231+ {
6232+ /* Do not put K_IGNORE into the buffer, do return KEYLEN_REMOVED
6233+ * to indicate what happened. */
6234+ retval = KEYLEN_REMOVED;
6235+ }
6236 else
6237 {
6238 string[new_slen++] = K_SPECIAL;
6239@@ -4976,7 +4988,7 @@
6240 (size_t)(buflen - offset));
6241 mch_memmove(buf + offset, string, (size_t)new_slen);
6242 }
6243- return (len + extra + offset);
6244+ return retval == 0 ? (len + extra + offset) : retval;
6245 }
6246
6247 return 0; /* no match found */
6248diff -Naur vim73.orig/src/testdir/Make_amiga.mak vim73/src/testdir/Make_amiga.mak
6249--- vim73.orig/src/testdir/Make_amiga.mak 2010-08-04 10:34:34.000000000 -0400
6250+++ vim73/src/testdir/Make_amiga.mak 2011-01-08 21:01:19.138657005 -0500
6251@@ -27,7 +27,8 @@
6252 test56.out test57.out test58.out test59.out test60.out \
6253 test61.out test62.out test63.out test64.out test65.out \
6254 test66.out test67.out test68.out test69.out test70.out \
6255- test71.out test72.out test73.out
6256+ test71.out test72.out test73.out test74.out test75.out \
6257+ test76.out
6258
6259 .SUFFIXES: .in .out
6260
6261@@ -120,3 +121,6 @@
6262 test71.out: test71.in
6263 test72.out: test72.in
6264 test73.out: test73.in
6265+test74.out: test74.in
6266+test75.out: test75.in
6267+test76.out: test76.in
6268diff -Naur vim73.orig/src/testdir/Make_dos.mak vim73/src/testdir/Make_dos.mak
6269--- vim73.orig/src/testdir/Make_dos.mak 2010-08-13 12:27:19.000000000 -0400
6270+++ vim73/src/testdir/Make_dos.mak 2011-01-08 21:01:19.138657005 -0500
6271@@ -27,7 +27,8 @@
6272 test30.out test31.out test32.out test33.out test34.out \
6273 test37.out test38.out test39.out test40.out test41.out \
6274 test42.out test52.out test65.out test66.out test67.out \
6275- test68.out test69.out test71.out test72.out test73.out
6276+ test68.out test69.out test71.out test72.out test73.out \
6277+ test74.out test75.out test76.out
6278
6279 SCRIPTS32 = test50.out test70.out
6280
6281diff -Naur vim73.orig/src/testdir/Make_ming.mak vim73/src/testdir/Make_ming.mak
6282--- vim73.orig/src/testdir/Make_ming.mak 2010-08-04 10:34:47.000000000 -0400
6283+++ vim73/src/testdir/Make_ming.mak 2011-01-08 21:01:19.138657005 -0500
6284@@ -47,7 +47,8 @@
6285 test30.out test31.out test32.out test33.out test34.out \
6286 test37.out test38.out test39.out test40.out test41.out \
6287 test42.out test52.out test65.out test66.out test67.out \
6288- test68.out test69.out test71.out test72.out test72.out
6289+ test68.out test69.out test71.out test72.out test73.out \
6290+ test74.out test75.out test76.out
6291
6292 SCRIPTS32 = test50.out test70.out
6293
6294diff -Naur vim73.orig/src/testdir/Make_os2.mak vim73/src/testdir/Make_os2.mak
6295--- vim73.orig/src/testdir/Make_os2.mak 2010-08-04 10:34:55.000000000 -0400
6296+++ vim73/src/testdir/Make_os2.mak 2011-01-08 21:01:19.138657005 -0500
6297@@ -27,7 +27,8 @@
6298 test56.out test57.out test58.out test59.out test60.out \
6299 test61.out test62.out test63.out test64.out test65.out \
6300 test66.out test67.out test68.out test69.out test70.out \
6301- test71.out test72.out test73.out
6302+ test71.out test72.out test73.out test74.out test75.out \
6303+ test76.out
6304
6305 .SUFFIXES: .in .out
6306
6307diff -Naur vim73.orig/src/testdir/Make_vms.mms vim73/src/testdir/Make_vms.mms
6308--- vim73.orig/src/testdir/Make_vms.mms 2010-08-04 10:35:46.000000000 -0400
6309+++ vim73/src/testdir/Make_vms.mms 2011-01-08 21:01:19.138657005 -0500
6310@@ -4,7 +4,7 @@
6311 # Authors: Zoltan Arpadffy, <arpadffy@polarhome.com>
6312 # Sandor Kopanyi, <sandor.kopanyi@mailbox.hu>
6313 #
6314-# Last change: 2010 Aug 04
6315+# Last change: 2010 Nov 10
6316 #
6317 # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
6318 # Edit the lines in the Configuration section below to select.
6319@@ -74,7 +74,7 @@
6320 test56.out test57.out test60.out \
6321 test61.out test62.out test63.out test64.out test65.out \
6322 test66.out test67.out test68.out test69.out \
6323- test71.out test72.out
6324+ test71.out test72.out test74.out test75.out test76.out
6325
6326 # Known problems:
6327 # Test 30: a problem around mac format - unknown reason
6328diff -Naur vim73.orig/src/testdir/Makefile vim73/src/testdir/Makefile
6329--- vim73.orig/src/testdir/Makefile 2010-08-15 08:56:30.000000000 -0400
6330+++ vim73/src/testdir/Makefile 2011-01-08 21:01:19.138657005 -0500
6331@@ -10,6 +10,7 @@
6332 # This will make testing about 10 times as slow.
6333 # VALGRIND = valgrind --tool=memcheck --leak-check=yes --num-callers=15 --log-file=valgrind.$*
6334
6335+
6336 SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
6337 test7.out test8.out test9.out test10.out test11.out \
6338 test12.out test13.out test14.out test15.out test17.out \
6339@@ -23,7 +24,8 @@
6340 test54.out test55.out test56.out test57.out test58.out \
6341 test59.out test60.out test61.out test62.out test63.out \
6342 test64.out test65.out test66.out test67.out test68.out \
6343- test69.out test70.out test71.out test72.out test73.out
6344+ test69.out test70.out test71.out test72.out test73.out \
6345+ test74.out test75.out test76.out
6346
6347 SCRIPTS_GUI = test16.out
6348
6349@@ -44,7 +46,7 @@
6350 $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
6351
6352 clean:
6353- -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* valgrind.pid* viminfo
6354+ -rm -rf *.out *.failed *.rej *.orig test.log tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* valgrind.* viminfo
6355
6356 test1.out: test1.in
6357 -rm -f $*.failed tiny.vim small.vim mbyte.vim mzscheme.vim test.ok X* viminfo
6358diff -Naur vim73.orig/src/testdir/main.aap vim73/src/testdir/main.aap
6359--- vim73.orig/src/testdir/main.aap 2010-07-30 16:03:23.000000000 -0400
6360+++ vim73/src/testdir/main.aap 2011-01-08 21:01:18.878656504 -0500
6361@@ -13,7 +13,7 @@
6362 test33.out test34.out test35.out test36.out test37.out
6363 test38.out test39.out test40.out test41.out test42.out
6364 test43.out test44.out test45.out test46.out test47.out
6365- test48.out test49.out
6366+ test48.out test49.out test74.out
6367
6368 ScriptsGUI = test16.out
6369
6370diff -Naur vim73.orig/src/testdir/test49.vim vim73/src/testdir/test49.vim
6371--- vim73.orig/src/testdir/test49.vim 2010-05-15 07:04:10.000000000 -0400
6372+++ vim73/src/testdir/test49.vim 2011-01-08 21:01:18.782656702 -0500
6373@@ -1,6 +1,6 @@
6374 " Vim script language tests
6375 " Author: Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com>
6376-" Last Change: 2006 Apr 28
6377+" Last Change: 2010 Sep 29
6378
6379 "-------------------------------------------------------------------------------
6380 " Test environment {{{1
6381@@ -8711,7 +8711,7 @@
6382 endif
6383 else
6384 if cmd == "let"
6385- let match = MATCH(0, thrmsg, 'E106', "Unknown variable")
6386+ let match = MATCH(0, thrmsg, 'E121', "Undefined variable")
6387 elseif cmd == "unlet"
6388 let match = MATCH(0, thrmsg, 'E108', "No such variable")
6389 endif
6390diff -Naur vim73.orig/src/testdir/test55.in vim73/src/testdir/test55.in
6391--- vim73.orig/src/testdir/test55.in 2010-05-15 07:04:10.000000000 -0400
6392+++ vim73/src/testdir/test55.in 2011-01-08 21:01:19.158657647 -0500
6393@@ -342,7 +342,18 @@
6394 :$put =(d == d)
6395 :$put =(l != deepcopy(l))
6396 :$put =(d != deepcopy(d))
6397+:"
6398+:" compare complex recursively linked list and dict
6399+:let l = []
6400+:call add(l, l)
6401+:let dict4 = {"l": l}
6402+:call add(dict4.l, dict4)
6403+:let lcopy = deepcopy(l)
6404+:let dict4copy = deepcopy(dict4)
6405+:$put =(l == lcopy)
6406+:$put =(dict4 == dict4copy)
6407 :endfun
6408+:"
6409 :call Test(1, 2, [3, 4], {5: 6}) " This may take a while
6410 :"
6411 :delfunc Test
6412diff -Naur vim73.orig/src/testdir/test55.ok vim73/src/testdir/test55.ok
6413--- vim73.orig/src/testdir/test55.ok 2010-05-15 07:04:10.000000000 -0400
6414+++ vim73/src/testdir/test55.ok 2011-01-08 21:01:19.158657647 -0500
6415@@ -109,3 +109,5 @@
6416 1
6417 0
6418 0
6419+1
6420+1
6421diff -Naur vim73.orig/src/testdir/test57.in vim73/src/testdir/test57.in
6422--- vim73.orig/src/testdir/test57.in 2010-05-15 07:04:10.000000000 -0400
6423+++ vim73/src/testdir/test57.in 2011-01-08 21:01:18.866656341 -0500
6424@@ -53,15 +53,19 @@
6425 t02: numeric
6426 abc
6427 ab
6428-a
6429 a321
6430 a123
6431 a122
6432+a
6433+x-22
6434 b321
6435 b123
6436+
6437 c123d
6438+-24
6439 123b
6440 c321d
6441+0
6442 b322b
6443 b321
6444 b321b
6445diff -Naur vim73.orig/src/testdir/test57.ok vim73/src/testdir/test57.ok
6446--- vim73.orig/src/testdir/test57.ok 2010-05-15 07:04:10.000000000 -0400
6447+++ vim73/src/testdir/test57.ok 2011-01-08 21:01:18.866656341 -0500
6448@@ -21,6 +21,10 @@
6449 a
6450
6451
6452+
6453+-24
6454+x-22
6455+0
6456 a122
6457 a123
6458 b123
6459diff -Naur vim73.orig/src/testdir/test61.in vim73/src/testdir/test61.in
6460--- vim73.orig/src/testdir/test61.in 2010-06-26 23:07:58.000000000 -0400
6461+++ vim73/src/testdir/test61.in 2011-01-08 20:59:38.610657137 -0500
6462@@ -4,6 +4,10 @@
6463 Also tests :earlier and :later.
6464
6465 STARTTEST
6466+:echo undotree().entries
6467+ENDTEST
6468+
6469+STARTTEST
6470 :" Delete three characters and undo
6471 Gx:set ul=100
6472 x:set ul=100
6473diff -Naur vim73.orig/src/testdir/test68.in vim73/src/testdir/test68.in
6474--- vim73.orig/src/testdir/test68.in 2010-05-15 07:04:10.000000000 -0400
6475+++ vim73/src/testdir/test68.in 2011-01-08 21:01:18.806655841 -0500
6476@@ -51,6 +51,17 @@
6477 }
6478
6479 STARTTEST
6480+/^{/+2
6481+:set tw& fo=a
6482+I^^
6483+ENDTEST
6484+
6485+{
6486+ 1aa
6487+ 2bb
6488+}
6489+
6490+STARTTEST
6491 :g/^STARTTEST/.,/^ENDTEST/d
6492 :1;/^Results/,$wq! test.out
6493 ENDTEST
6494diff -Naur vim73.orig/src/testdir/test68.ok vim73/src/testdir/test68.ok
6495--- vim73.orig/src/testdir/test68.ok 2010-05-15 07:04:10.000000000 -0400
6496+++ vim73/src/testdir/test68.ok 2011-01-08 21:01:18.806655841 -0500
6497@@ -33,3 +33,6 @@
6498 #a b
6499 }
6500
6501+
6502+{ 1aa ^^2bb }
6503+
6504diff -Naur vim73.orig/src/testdir/test74.in vim73/src/testdir/test74.in
6505--- vim73.orig/src/testdir/test74.in 1969-12-31 19:00:00.000000000 -0500
6506+++ vim73/src/testdir/test74.in 2011-01-08 21:01:18.878656504 -0500
6507@@ -0,0 +1,36 @@
6508+" Tests for storing global variables in the .viminfo file vim: set ft=vim:
6509+
6510+STARTTEST
6511+:so small.vim
6512+:" Do all test in a separate window to avoid E211 when we recursively
6513+:" delete the Xfind directory during cleanup
6514+:"
6515+:" This will cause a few errors, do it silently.
6516+:set visualbell
6517+:set nocp viminfo+=!,nviminfo
6518+:let MY_GLOBAL_DICT={'foo': 1, 'bar': 0, 'longvarible': 1000}
6519+:" store a really long list, so line wrapping will occur in viminfo file
6520+:let MY_GLOBAL_LIST=range(1,100)
6521+:wv! Xviminfo
6522+:unlet MY_GLOBAL_DICT
6523+:unlet MY_GLOBAL_LIST
6524+:rv! Xviminfo
6525+:call delete('Xviminfo')
6526+:if exists("MY_GLOBAL_DICT")
6527+:redir >> test.out
6528+:echo MY_GLOBAL_DICT
6529+:redir end
6530+:endif
6531+:if exists("MY_GLOBAL_LIST")
6532+:redir >> test.out
6533+:echo MY_GLOBAL_LIST
6534+:redir end
6535+:endif
6536+:redir >> test.out
6537+:echo "foobar"
6538+:redir end
6539+:endif
6540+:qa!
6541+ENDTEST
6542+
6543+eof
6544diff -Naur vim73.orig/src/testdir/test74.ok vim73/src/testdir/test74.ok
6545--- vim73.orig/src/testdir/test74.ok 1969-12-31 19:00:00.000000000 -0500
6546+++ vim73/src/testdir/test74.ok 2011-01-08 21:01:18.878656504 -0500
6547@@ -0,0 +1,5 @@
6548+
6549+{'foo': 1, 'longvarible': 1000, 'bar': 0}
6550+[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
6551+
6552+foobar
6553diff -Naur vim73.orig/src/testdir/test75.in vim73/src/testdir/test75.in
6554--- vim73.orig/src/testdir/test75.in 1969-12-31 19:00:00.000000000 -0500
6555+++ vim73/src/testdir/test75.in 2011-01-08 21:01:18.918658776 -0500
6556@@ -0,0 +1,16 @@
6557+" Tests for functions.
6558+
6559+STARTTEST
6560+:so small.vim
6561+:" Test maparg() with a string result
6562+:map foo<C-V> is<F4>foo
6563+:vnoremap <script> <buffer> <expr> <silent> bar isbar
6564+:call append('$', maparg('foo<C-V>'))
6565+:call append('$', string(maparg('foo<C-V>', '', 0, 1)))
6566+:call append('$', string(maparg('bar', '', 0, 1)))
6567+:"
6568+:/^eof/+1,$w! test.out
6569+:qa!
6570+ENDTEST
6571+
6572+eof
6573diff -Naur vim73.orig/src/testdir/test75.ok vim73/src/testdir/test75.ok
6574--- vim73.orig/src/testdir/test75.ok 1969-12-31 19:00:00.000000000 -0500
6575+++ vim73/src/testdir/test75.ok 2011-01-08 21:01:18.918658776 -0500
6576@@ -0,0 +1,3 @@
6577+is<F4>foo
6578+{'silent': 0, 'noremap': 0, 'lhs': 'foo<C-V>', 'mode': ' ', 'expr': 0, 'sid': 0, 'rhs': 'is<F4>foo', 'buffer': 0}
6579+{'silent': 1, 'noremap': 1, 'lhs': 'bar', 'mode': 'v', 'expr': 1, 'sid': 0, 'rhs': 'isbar', 'buffer': 1}
6580diff -Naur vim73.orig/src/testdir/test76.in vim73/src/testdir/test76.in
6581--- vim73.orig/src/testdir/test76.in 1969-12-31 19:00:00.000000000 -0500
6582+++ vim73/src/testdir/test76.in 2011-01-08 21:01:19.138657005 -0500
6583@@ -0,0 +1,46 @@
6584+Tests for completefunc/omnifunc. vim: set ft=vim :
6585+
6586+STARTTEST
6587+:"Test that nothing happens if the 'completefunc' opens
6588+:"a new window (no completion, no crash)
6589+:so small.vim
6590+:function! DummyCompleteOne(findstart, base)
6591+: if a:findstart
6592+: return 0
6593+: else
6594+: wincmd n
6595+: return ['onedef', 'oneDEF']
6596+: endif
6597+:endfunction
6598+:setlocal completefunc=DummyCompleteOne
6599+/^one
6600+A:q!
6601+:function! DummyCompleteTwo(findstart, base)
6602+: if a:findstart
6603+: wincmd n
6604+: return 0
6605+: else
6606+: return ['twodef', 'twoDEF']
6607+: endif
6608+:endfunction
6609+:setlocal completefunc=DummyCompleteTwo
6610+/^two
6611+A:q!
6612+:"Test that 'completefunc' works when it's OK.
6613+:function! DummyCompleteThree(findstart, base)
6614+: if a:findstart
6615+: return 0
6616+: else
6617+: return ['threedef', 'threeDEF']
6618+: endif
6619+:endfunction
6620+:setlocal completefunc=DummyCompleteThree
6621+/^three
6622+A:/^+++/,/^three/w! test.out
6623+:qa!
6624+ENDTEST
6625+
6626++++
6627+one
6628+two
6629+three
6630diff -Naur vim73.orig/src/testdir/test76.ok vim73/src/testdir/test76.ok
6631--- vim73.orig/src/testdir/test76.ok 1969-12-31 19:00:00.000000000 -0500
6632+++ vim73/src/testdir/test76.ok 2011-01-08 21:01:19.142655736 -0500
6633@@ -0,0 +1,4 @@
6634++++
6635+
6636+two
6637+threeDEF
6638diff -Naur vim73.orig/src/ui.c vim73/src/ui.c
6639--- vim73.orig/src/ui.c 2010-08-08 09:17:30.000000000 -0400
6640+++ vim73/src/ui.c 2011-01-08 21:01:18.766656221 -0500
6641@@ -469,7 +469,7 @@
6642 */
6643 #ifdef FEAT_X11
6644 /* Always own the selection, we might have lost it without being
6645- * notified. */
6646+ * notified, e.g. during a ":sh" command. */
6647 if (cbd->available)
6648 {
6649 int was_owned = cbd->owned;
6650@@ -1944,10 +1944,9 @@
6651 */
6652
6653 static Boolean clip_x11_convert_selection_cb __ARGS((Widget, Atom *, Atom *, Atom *, XtPointer *, long_u *, int *));
6654-
6655 static void clip_x11_lose_ownership_cb __ARGS((Widget, Atom *));
6656-
6657 static void clip_x11_timestamp_cb __ARGS((Widget w, XtPointer n, XEvent *event, Boolean *cont));
6658+static void clip_x11_request_selection_cb __ARGS((Widget, XtPointer, Atom *, Atom *, XtPointer, long_u *, int *));
6659
6660 /*
6661 * Property callback to get a timestamp for XtOwnSelection.
6662@@ -1985,8 +1984,17 @@
6663 return;
6664
6665 /* Get the selection, using the event timestamp. */
6666- XtOwnSelection(w, xproperty->atom, xproperty->time,
6667- clip_x11_convert_selection_cb, clip_x11_lose_ownership_cb, NULL);
6668+ if (XtOwnSelection(w, xproperty->atom, xproperty->time,
6669+ clip_x11_convert_selection_cb, clip_x11_lose_ownership_cb,
6670+ NULL) == OK)
6671+ {
6672+ /* Set the "owned" flag now, there may have been a call to
6673+ * lose_ownership_cb in between. */
6674+ if (xproperty->atom == clip_plus.sel_atom)
6675+ clip_plus.owned = TRUE;
6676+ else
6677+ clip_star.owned = TRUE;
6678+ }
6679 }
6680
6681 void
6682@@ -1997,8 +2005,6 @@
6683 /*(XtEventHandler)*/clip_x11_timestamp_cb, (XtPointer)NULL);
6684 }
6685
6686-static void clip_x11_request_selection_cb __ARGS((Widget, XtPointer, Atom *, Atom *, XtPointer, long_u *, int *));
6687-
6688 static void
6689 clip_x11_request_selection_cb(w, success, sel_atom, type, value, length,
6690 format)
6691@@ -2336,7 +2342,7 @@
6692
6693 void
6694 clip_x11_lose_selection(myShell, cbd)
6695- Widget myShell;
6696+ Widget myShell;
6697 VimClipboard *cbd;
6698 {
6699 XtDisownSelection(myShell, cbd->sel_atom, CurrentTime);
6700@@ -2344,14 +2350,29 @@
6701
6702 int
6703 clip_x11_own_selection(myShell, cbd)
6704- Widget myShell;
6705+ Widget myShell;
6706 VimClipboard *cbd;
6707 {
6708- /* Get the time by a zero-length append, clip_x11_timestamp_cb will be
6709- * called with the current timestamp. */
6710- if (!XChangeProperty(XtDisplay(myShell), XtWindow(myShell), cbd->sel_atom,
6711- timestamp_atom, 32, PropModeAppend, NULL, 0))
6712+ /* When using the GUI we have proper timestamps, use the one of the last
6713+ * event. When in the console we don't get events (the terminal gets
6714+ * them), Get the time by a zero-length append, clip_x11_timestamp_cb will
6715+ * be called with the current timestamp. */
6716+#ifdef FEAT_GUI
6717+ if (gui.in_use)
6718+ {
6719+ if (XtOwnSelection(myShell, cbd->sel_atom,
6720+ XtLastTimestampProcessed(XtDisplay(myShell)),
6721+ clip_x11_convert_selection_cb, clip_x11_lose_ownership_cb,
6722+ NULL) == False)
6723 return FAIL;
6724+ }
6725+ else
6726+#endif
6727+ {
6728+ if (!XChangeProperty(XtDisplay(myShell), XtWindow(myShell),
6729+ cbd->sel_atom, timestamp_atom, 32, PropModeAppend, NULL, 0))
6730+ return FAIL;
6731+ }
6732 /* Flush is required in a terminal as nothing else is doing it. */
6733 XFlush(XtDisplay(myShell));
6734 return OK;
6735diff -Naur vim73.orig/src/undo.c vim73/src/undo.c
6736--- vim73.orig/src/undo.c 2010-08-07 06:48:15.000000000 -0400
6737+++ vim73/src/undo.c 2011-01-08 21:01:19.386656778 -0500
6738@@ -81,10 +81,6 @@
6739 #define UH_MAGIC 0x18dade /* value for uh_magic when in use */
6740 #define UE_MAGIC 0xabc123 /* value for ue_magic when in use */
6741
6742-#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
6743-# include "vimio.h" /* for vim_read(), must be before vim.h */
6744-#endif
6745-
6746 #include "vim.h"
6747
6748 static void u_unch_branch __ARGS((u_header_T *uhp));
6749@@ -1386,7 +1382,7 @@
6750 char_u mbuf[UF_START_MAGIC_LEN];
6751 int len;
6752
6753- len = vim_read(fd, mbuf, UF_START_MAGIC_LEN);
6754+ len = read_eintr(fd, mbuf, UF_START_MAGIC_LEN);
6755 close(fd);
6756 if (len < UF_START_MAGIC_LEN
6757 || memcmp(mbuf, UF_START_MAGIC, UF_START_MAGIC_LEN) != 0)
6758@@ -1861,6 +1857,7 @@
6759 curbuf->b_u_seq_cur = seq_cur;
6760 curbuf->b_u_time_cur = seq_time;
6761 curbuf->b_u_save_nr_last = last_save_nr;
6762+ curbuf->b_u_save_nr_cur = last_save_nr;
6763
6764 curbuf->b_u_synced = TRUE;
6765 vim_free(uhp_table);
6766@@ -2794,7 +2791,7 @@
6767 uhp->uh_time);
6768 if (uhp->uh_save_nr > 0)
6769 {
6770- while (STRLEN(IObuff) < 32)
6771+ while (STRLEN(IObuff) < 33)
6772 STRCAT(IObuff, " ");
6773 vim_snprintf_add((char *)IObuff, IOSIZE,
6774 " %3ld", uhp->uh_save_nr);
6775@@ -2849,7 +2846,7 @@
6776 sort_strings((char_u **)ga.ga_data, ga.ga_len);
6777
6778 msg_start();
6779- msg_puts_attr((char_u *)_("number changes time saved"),
6780+ msg_puts_attr((char_u *)_("number changes when saved"),
6781 hl_attr(HLF_T));
6782 for (i = 0; i < ga.ga_len && !got_int; ++i)
6783 {
6784@@ -2879,7 +2876,15 @@
6785 if (time(NULL) - tt >= 100)
6786 {
6787 curtime = localtime(&tt);
6788- (void)strftime((char *)buf, buflen, "%H:%M:%S", curtime);
6789+ if (time(NULL) - tt < (60L * 60L * 12L))
6790+ /* within 12 hours */
6791+ (void)strftime((char *)buf, buflen, "%H:%M:%S", curtime);
6792+ else if (time(NULL) - tt < (60L * 60L * 24L * 180L))
6793+ /* within 6 months */
6794+ (void)strftime((char *)buf, buflen, "%m/%d %H:%M:%S", curtime);
6795+ else
6796+ /* long ago */
6797+ (void)strftime((char *)buf, buflen, "%y/%m/%d %H:%M:%S", curtime);
6798 }
6799 else
6800 #endif
6801diff -Naur vim73.orig/src/version.c vim73/src/version.c
6802--- vim73.orig/src/version.c 2010-08-01 09:45:48.000000000 -0400
6803+++ vim73/src/version.c 2011-01-08 21:01:19.514657428 -0500
6804@@ -715,6 +715,204 @@
6805 static int included_patches[] =
6806 { /* Add new patch number below this line */
6807 /**/
6808+ 99,
6809+/**/
6810+ 98,
6811+/**/
6812+ 97,
6813+/**/
6814+ 96,
6815+/**/
6816+ 95,
6817+/**/
6818+ 94,
6819+/**/
6820+ 93,
6821+/**/
6822+ 92,
6823+/**/
6824+ 91,
6825+/**/
6826+ 90,
6827+/**/
6828+ 89,
6829+/**/
6830+ 88,
6831+/**/
6832+ 87,
6833+/**/
6834+ 86,
6835+/**/
6836+ 85,
6837+/**/
6838+ 84,
6839+/**/
6840+ 83,
6841+/**/
6842+ 82,
6843+/**/
6844+ 81,
6845+/**/
6846+ 80,
6847+/**/
6848+ 79,
6849+/**/
6850+ 78,
6851+/**/
6852+ 77,
6853+/**/
6854+ 76,
6855+/**/
6856+ 75,
6857+/**/
6858+ 74,
6859+/**/
6860+ 73,
6861+/**/
6862+ 72,
6863+/**/
6864+ 71,
6865+/**/
6866+ 70,
6867+/**/
6868+ 69,
6869+/**/
6870+ 68,
6871+/**/
6872+ 67,
6873+/**/
6874+ 66,
6875+/**/
6876+ 65,
6877+/**/
6878+ 64,
6879+/**/
6880+ 63,
6881+/**/
6882+ 62,
6883+/**/
6884+ 61,
6885+/**/
6886+ 60,
6887+/**/
6888+ 59,
6889+/**/
6890+ 58,
6891+/**/
6892+ 57,
6893+/**/
6894+ 56,
6895+/**/
6896+ 55,
6897+/**/
6898+ 54,
6899+/**/
6900+ 53,
6901+/**/
6902+ 52,
6903+/**/
6904+ 51,
6905+/**/
6906+ 50,
6907+/**/
6908+ 49,
6909+/**/
6910+ 48,
6911+/**/
6912+ 47,
6913+/**/
6914+ 46,
6915+/**/
6916+ 45,
6917+/**/
6918+ 44,
6919+/**/
6920+ 43,
6921+/**/
6922+ 42,
6923+/**/
6924+ 41,
6925+/**/
6926+ 40,
6927+/**/
6928+ 39,
6929+/**/
6930+ 38,
6931+/**/
6932+ 37,
6933+/**/
6934+ 36,
6935+/**/
6936+ 35,
6937+/**/
6938+ 34,
6939+/**/
6940+ 33,
6941+/**/
6942+ 32,
6943+/**/
6944+ 31,
6945+/**/
6946+ 30,
6947+/**/
6948+ 29,
6949+/**/
6950+ 28,
6951+/**/
6952+ 27,
6953+/**/
6954+ 26,
6955+/**/
6956+ 25,
6957+/**/
6958+ 24,
6959+/**/
6960+ 23,
6961+/**/
6962+ 22,
6963+/**/
6964+ 21,
6965+/**/
6966+ 20,
6967+/**/
6968+ 19,
6969+/**/
6970+ 18,
6971+/**/
6972+ 17,
6973+/**/
6974+ 16,
6975+/**/
6976+ 15,
6977+/**/
6978+ 14,
6979+/**/
6980+ 13,
6981+/**/
6982+ 12,
6983+/**/
6984+ 11,
6985+/**/
6986+ 10,
6987+/**/
6988+ 9,
6989+/**/
6990+ 8,
6991+/**/
6992+ 7,
6993+/**/
6994+ 6,
6995+/**/
6996+ 5,
6997+/**/
6998+ 4,
6999+/**/
7000+ 3,
7001+/**/
7002+ 2,
7003+/**/
7004+ 1,
7005+/**/
7006 0
7007 };
7008
7009@@ -1262,9 +1460,9 @@
7010 if (highest_patch())
7011 {
7012 /* Check for 9.9x or 9.9xx, alpha/beta version */
7013- if (isalpha((int)mediumVersion[3]))
7014+ if (isalpha((int)vers[3]))
7015 {
7016- if (isalpha((int)mediumVersion[4]))
7017+ if (isalpha((int)vers[4]))
7018 sprintf((char *)vers + 5, ".%d%s", highest_patch(),
7019 mediumVersion + 5);
7020 else
7021diff -Naur vim73.orig/src/vim.h vim73/src/vim.h
7022--- vim73.orig/src/vim.h 2010-07-29 14:46:39.000000000 -0400
7023+++ vim73/src/vim.h 2011-01-08 21:01:19.466658112 -0500
7024@@ -27,6 +27,11 @@
7025 # endif
7026 #endif
7027
7028+#if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64) \
7029+ || defined(__EMX__)
7030+# include "vimio.h"
7031+#endif
7032+
7033 /* ============ the header file puzzle (ca. 50-100 pieces) ========= */
7034
7035 #ifdef HAVE_CONFIG_H /* GNU autoconf (or something else) was here */
7036@@ -192,8 +197,8 @@
7037 #endif
7038
7039 #ifdef NO_X11_INCLUDES
7040- /* In os_mac_conv.c NO_X11_INCLUDES is defined to avoid X11 headers.
7041- * Disable all X11 related things to avoid conflicts. */
7042+ /* In os_mac_conv.c and os_macosx.m NO_X11_INCLUDES is defined to avoid
7043+ * X11 headers. Disable all X11 related things to avoid conflicts. */
7044 # ifdef FEAT_X11
7045 # undef FEAT_X11
7046 # endif
7047@@ -475,6 +480,11 @@
7048 # include <sys/stat.h>
7049 #endif
7050
7051+#if defined(HAVE_ERRNO_H) || defined(DJGPP) || defined(WIN16) \
7052+ || defined(WIN32) || defined(_WIN64) || defined(__EMX__)
7053+# include <errno.h>
7054+#endif
7055+
7056 /*
7057 * Allow other (non-unix) systems to configure themselves now
7058 * These are also in os_unix.h, because osdef.sh needs them there.
7059@@ -798,6 +808,7 @@
7060 #define WILD_KEEP_ALL 32
7061 #define WILD_SILENT 64
7062 #define WILD_ESCAPE 128
7063+#define WILD_ICASE 256
7064
7065 /* Flags for expand_wildcards() */
7066 #define EW_DIR 0x01 /* include directory names */
7067@@ -808,6 +819,7 @@
7068 #define EW_SILENT 0x20 /* don't print "1 returned" from shell */
7069 #define EW_EXEC 0x40 /* executable files */
7070 #define EW_PATH 0x80 /* search in 'path' too */
7071+#define EW_ICASE 0x100 /* ignore case */
7072 /* Note: mostly EW_NOTFOUND and EW_SILENT are mutually exclusive: EW_NOTFOUND
7073 * is used when executing commands and EW_SILENT for interactive expanding. */
7074
7075@@ -1640,6 +1652,11 @@
7076 # define USE_INPUT_BUF
7077 #endif
7078
7079+#ifndef EINTR
7080+# define read_eintr(fd, buf, count) vim_read((fd), (buf), (count))
7081+# define write_eintr(fd, buf, count) vim_write((fd), (buf), (count))
7082+#endif
7083+
7084 #ifdef MSWIN
7085 /* On MS-Windows the third argument isn't size_t. This matters for Win64,
7086 * where sizeof(size_t)==8, not 4 */
7087@@ -1842,7 +1859,8 @@
7088 #define VV_OP 52
7089 #define VV_SEARCHFORWARD 53
7090 #define VV_OLDFILES 54
7091-#define VV_LEN 55 /* number of v: vars */
7092+#define VV_WINDOWID 55
7093+#define VV_LEN 56 /* number of v: vars */
7094
7095 #ifdef FEAT_CLIPBOARD
7096
7097@@ -2193,4 +2211,8 @@
7098 #define MSCR_LEFT -1
7099 #define MSCR_RIGHT -2
7100
7101+#define KEYLEN_PART_KEY -1 /* keylen value for incomplete key-code */
7102+#define KEYLEN_PART_MAP -2 /* keylen value for incomplete mapping */
7103+#define KEYLEN_REMOVED 9999 /* keylen value for removed sequence */
7104+
7105 #endif /* VIM__H */
7106diff -Naur vim73.orig/src/window.c vim73/src/window.c
7107--- vim73.orig/src/window.c 2010-07-20 16:23:49.000000000 -0400
7108+++ vim73/src/window.c 2011-01-08 21:01:19.514657428 -0500
7109@@ -70,7 +70,8 @@
7110 #endif /* FEAT_WINDOWS */
7111
7112 static win_T *win_alloc __ARGS((win_T *after, int hidden));
7113-static void win_new_height __ARGS((win_T *, int));
7114+static void set_fraction __ARGS((win_T *wp));
7115+static void win_new_height __ARGS((win_T *wp, int height));
7116
7117 #define URL_SLASH 1 /* path_is_url() has found "://" */
7118 #define URL_BACKSLASH 2 /* path_is_url() has found ":\\" */
7119@@ -525,9 +526,7 @@
7120 setpcmark();
7121 if (win_split(0, 0) == OK)
7122 {
7123-# ifdef FEAT_SCROLLBIND
7124- curwin->w_p_scb = FALSE;
7125-# endif
7126+ RESET_BINDING(curwin);
7127 (void)do_ecmd(0, ptr, NULL, NULL, ECMD_LASTL,
7128 ECMD_HIDE, NULL);
7129 if (nchar == 'F' && lnum >= 0)
7130@@ -985,10 +984,17 @@
7131 else
7132 frame_append(curfrp, frp);
7133
7134+ /* Set w_fraction now so that the cursor keeps the same relative
7135+ * vertical position. */
7136+ if (oldwin->w_height > 0)
7137+ set_fraction(oldwin);
7138+ wp->w_fraction = oldwin->w_fraction;
7139+
7140 #ifdef FEAT_VERTSPLIT
7141 if (flags & WSP_VERT)
7142 {
7143 wp->w_p_scr = curwin->w_p_scr;
7144+
7145 if (need_status)
7146 {
7147 win_new_height(oldwin, oldwin->w_height - 1);
7148@@ -3277,9 +3283,7 @@
7149 if (aucmd_win != NULL)
7150 {
7151 win_init_some(aucmd_win, curwin);
7152-# ifdef FEAT_SCROLLBIND
7153- aucmd_win->w_p_scb = FALSE;
7154-# endif
7155+ RESET_BINDING(aucmd_win);
7156 new_frame(aucmd_win);
7157 }
7158 }
7159@@ -3320,10 +3324,8 @@
7160 /* First window in new tab page, initialize it from "oldwin". */
7161 win_init(curwin, oldwin, 0);
7162
7163-# ifdef FEAT_SCROLLBIND
7164- /* We don't want scroll-binding in the first window. */
7165- curwin->w_p_scb = FALSE;
7166-# endif
7167+ /* We don't want cursor- and scroll-binding in the first window. */
7168+ RESET_BINDING(curwin);
7169 }
7170 #endif
7171
7172@@ -5459,6 +5461,19 @@
7173
7174 #endif /* FEAT_WINDOWS */
7175
7176+#define FRACTION_MULT 16384L
7177+
7178+/*
7179+ * Set wp->w_fraction for the current w_wrow and w_height.
7180+ */
7181+ static void
7182+set_fraction(wp)
7183+ win_T *wp;
7184+{
7185+ wp->w_fraction = ((long)wp->w_wrow * FRACTION_MULT
7186+ + FRACTION_MULT / 2) / (long)wp->w_height;
7187+}
7188+
7189 /*
7190 * Set the height of a window.
7191 * This takes care of the things inside the window, not what happens to the
7192@@ -5471,7 +5486,6 @@
7193 {
7194 linenr_T lnum;
7195 int sline, line_size;
7196-#define FRACTION_MULT 16384L
7197
7198 /* Don't want a negative height. Happens when splitting a tiny window.
7199 * Will equalize heights soon to fix it. */
7200@@ -5481,8 +5495,7 @@
7201 return; /* nothing to do */
7202
7203 if (wp->w_wrow != wp->w_prev_fraction_row && wp->w_height > 0)
7204- wp->w_fraction = ((long)wp->w_wrow * FRACTION_MULT
7205- + FRACTION_MULT / 2) / (long)wp->w_height;
7206+ set_fraction(wp);
7207
7208 wp->w_height = height;
7209 wp->w_skipcol = 0;
7210diff -Naur vim73.orig/src/workshop.c vim73/src/workshop.c
7211--- vim73.orig/src/workshop.c 2010-08-08 09:18:24.000000000 -0400
7212+++ vim73/src/workshop.c 2011-01-08 21:01:19.438656953 -0500
7213@@ -16,7 +16,6 @@
7214 #include <sys/types.h>
7215 #include <netdb.h>
7216 #include <netinet/in.h>
7217-#include <errno.h>
7218 #include <sys/socket.h>
7219 #ifdef HAVE_LIBGEN_H
7220 # include <libgen.h>
Note: See TracBrowser for help on using the repository browser.