--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.204 (extra)
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.204 (extra)
+Problem: Win32: Using the example at 'balloonexpr' the balloon disappears
+ after four seconds and then comes back again. Also moves the
+ mouse pointer a little bit. (Yongwei Wu)
+Solution: Set the autopop time to 30 seconds (the max value). (Sergey
+ Khorev) Move the mouse two pixels forward and one back to end up
+ in the same position (really!).
+Files: src/gui_w32.c
+
+
+
+*** ../vim-7.1.203/src/gui_w32.c Thu Jan 3 20:44:35 2008
+--- src/gui_w32.c Sat Jan 5 13:09:56 2008
+***************
+*** 4575,4585 ****
+ SendMessage(beval->balloon, TTM_ADDTOOL, 0, (LPARAM)pti);
+ /* Make tooltip appear sooner */
+ SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_INITIAL, 10);
+ /*
+ * HACK: force tooltip to appear, because it'll not appear until
+ * first mouse move. D*mn M$
+ */
+! mouse_event(MOUSEEVENTF_MOVE, 1, 1, 0, 0);
+ mouse_event(MOUSEEVENTF_MOVE, (DWORD)-1, (DWORD)-1, 0, 0);
+ vim_free(pti);
+ }
+--- 4575,4589 ----
+ SendMessage(beval->balloon, TTM_ADDTOOL, 0, (LPARAM)pti);
+ /* Make tooltip appear sooner */
+ SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_INITIAL, 10);
++ /* I've performed some tests and it seems the longest possible life time
++ * of tooltip is 30 seconds */
++ SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_AUTOPOP, 30000);
+ /*
+ * HACK: force tooltip to appear, because it'll not appear until
+ * first mouse move. D*mn M$
++ * Amazingly moving (2, 2) and then (-1, -1) the mouse doesn't move.
+ */
+! mouse_event(MOUSEEVENTF_MOVE, 2, 2, 0, 0);
+ mouse_event(MOUSEEVENTF_MOVE, (DWORD)-1, (DWORD)-1, 0, 0);
+ vim_free(pti);
+ }
+*** ../vim-7.1.203/src/version.c Fri Jan 4 21:25:01 2008
+--- src/version.c Sat Jan 5 13:12:22 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 204,
+ /**/
+
+--
+WOMAN: I didn't know we had a king. I thought we were an autonomous
+ collective.
+DENNIS: You're fooling yourself. We're living in a dictatorship. A
+ self-perpetuating autocracy in which the working classes--
+WOMAN: Oh there you go, bringing class into it again.
+DENNIS: That's what it's all about if only people would--
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.205
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.205
+Problem: Can't get the operator in an ":omap".
+Solution: Add the "v:operator" variable. (Ben Schmidt)
+Files: runtime/doc/eval.txt, src/eval.c, src/normal.c, src/vim.h
+
+
+*** ../vim-7.1.204/runtime/doc/eval.txt Tue Sep 25 17:54:41 2007
+--- runtime/doc/eval.txt Fri Jan 4 20:38:55 2008
+***************
+*** 1,4 ****
+! *eval.txt* For Vim version 7.1. Last change: 2007 Sep 25
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 04
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 1401,1410 ****
+ This is the screen column number, like with |virtcol()|. The
+ value is zero when there was no mouse button click.
+
+ *v:prevcount* *prevcount-variable*
+ v:prevcount The count given for the last but one Normal mode command.
+ This is the v:count value of the previous command. Useful if
+! you want to cancel Visual mode and then use the count. >
+ :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
+ < Read-only.
+
+--- 1401,1424 ----
+ This is the screen column number, like with |virtcol()|. The
+ value is zero when there was no mouse button click.
+
++ *v:operator* *operator-variable*
++ v:operator The last operator given in Normal mode. This is a single
++ character except for commands starting with <g> or <z>,
++ in which case it is two characters. Best used alongside
++ |v:prevcount| and |v:register|. Useful if you want to cancel
++ Operator-pending mode and then use the operator, e.g.: >
++ :omap O <Esc>:call MyMotion(v:operator)<CR>
++ < The value remains set until another operator is entered, thus
++ don't expect it to be empty.
++ v:operator is not set for |:delete|, |:yank| or other Ex
++ commands.
++ Read-only.
++
+ *v:prevcount* *prevcount-variable*
+ v:prevcount The count given for the last but one Normal mode command.
+ This is the v:count value of the previous command. Useful if
+! you want to cancel Visual or Operator-pending mode and then
+! use the count, e.g.: >
+ :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
+ < Read-only.
+
+*** ../vim-7.1.204/src/eval.c Fri Dec 7 17:08:35 2007
+--- src/eval.c Sat Jan 5 13:22:52 2008
+***************
+*** 345,350 ****
+--- 345,351 ----
+ {VV_NAME("mouse_win", VAR_NUMBER), 0},
+ {VV_NAME("mouse_lnum", VAR_NUMBER), 0},
+ {VV_NAME("mouse_col", VAR_NUMBER), 0},
++ {VV_NAME("operator", VAR_STRING), VV_RO},
+ };
+
+ /* shorthand */
+*** ../vim-7.1.204/src/normal.c Thu Jan 3 13:19:50 2008
+--- src/normal.c Fri Jan 4 20:53:43 2008
+***************
+*** 141,146 ****
+--- 141,149 ----
+ static void nv_Undo __ARGS((cmdarg_T *cap));
+ static void nv_tilde __ARGS((cmdarg_T *cap));
+ static void nv_operator __ARGS((cmdarg_T *cap));
++ #ifdef FEAT_EVAL
++ static void set_op_var __ARGS((int optype));
++ #endif
+ static void nv_lineop __ARGS((cmdarg_T *cap));
+ static void nv_home __ARGS((cmdarg_T *cap));
+ static void nv_pipe __ARGS((cmdarg_T *cap));
+***************
+*** 7180,7185 ****
+--- 7183,7191 ----
+ {
+ cap->oap->start = curwin->w_cursor;
+ cap->oap->op_type = OP_DELETE;
++ #ifdef FEAT_EVAL
++ set_op_var(OP_DELETE);
++ #endif
+ cap->count1 = 1;
+ nv_dollar(cap);
+ finish_op = TRUE;
+***************
+*** 8219,8226 ****
+--- 8225,8257 ----
+ {
+ cap->oap->start = curwin->w_cursor;
+ cap->oap->op_type = op_type;
++ #ifdef FEAT_EVAL
++ set_op_var(op_type);
++ #endif
++ }
++ }
++
++ #ifdef FEAT_EVAL
++ /*
++ * Set v:operator to the characters for "optype".
++ */
++ static void
++ set_op_var(optype)
++ int optype;
++ {
++ char_u opchars[3];
++
++ if (optype == OP_NOP)
++ set_vim_var_string(VV_OP, NULL, 0);
++ else
++ {
++ opchars[0] = get_op_char(optype);
++ opchars[1] = get_extra_op_char(optype);
++ opchars[2] = NUL;
++ set_vim_var_string(VV_OP, opchars, -1);
+ }
+ }
++ #endif
+
+ /*
+ * Handle linewise operator "dd", "yy", etc.
+*** ../vim-7.1.204/src/vim.h Sat Aug 11 13:57:31 2007
+--- src/vim.h Fri Jan 4 19:11:31 2008
+***************
+*** 1688,1694 ****
+ #define VV_MOUSE_WIN 49
+ #define VV_MOUSE_LNUM 50
+ #define VV_MOUSE_COL 51
+! #define VV_LEN 52 /* number of v: vars */
+
+ #ifdef FEAT_CLIPBOARD
+
+--- 1688,1695 ----
+ #define VV_MOUSE_WIN 49
+ #define VV_MOUSE_LNUM 50
+ #define VV_MOUSE_COL 51
+! #define VV_OP 52
+! #define VV_LEN 53 /* number of v: vars */
+
+ #ifdef FEAT_CLIPBOARD
+
+*** ../vim-7.1.204/src/version.c Sat Jan 5 13:15:08 2008
+--- src/version.c Sat Jan 5 13:31:49 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 205,
+ /**/
+
+--
+ARTHUR: Then who is your lord?
+WOMAN: We don't have a lord.
+ARTHUR: What?
+DENNIS: I told you. We're an anarcho-syndicalist commune. We take it in
+ turns to act as a sort of executive officer for the week.
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.206
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.206
+Problem: Compiler warnings when using MODIFIED_BY.
+Solution: Add type casts. (Ben Schmidt)
+Files: src/version.c
+
+
+*** ../vim-7.1.205/src/version.c Sat Jan 5 13:34:01 2008
+--- src/version.c Sat Jan 5 13:56:55 2008
+***************
+*** 1587,1595 ****
+
+ if (*mesg == ' ')
+ {
+! vim_strncpy(modby, _("Modified by "), MODBY_LEN - 1);
+ l = STRLEN(modby);
+! vim_strncpy(modby + l, MODIFIED_BY, MODBY_LEN - l - 1);
+ mesg = modby;
+ }
+ #endif
+--- 1589,1597 ----
+
+ if (*mesg == ' ')
+ {
+! vim_strncpy(modby, (char_u *)_("Modified by "), MODBY_LEN - 1);
+ l = STRLEN(modby);
+! vim_strncpy(modby + l, (char_u *)MODIFIED_BY, MODBY_LEN - l - 1);
+ mesg = modby;
+ }
+ #endif
+*** ../vim-7.1.205/src/version.c Sat Jan 5 13:34:01 2008
+--- src/version.c Sat Jan 5 13:56:55 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 206,
+ /**/
+
+--
+ARTHUR: I am your king!
+WOMAN: Well, I didn't vote for you.
+ARTHUR: You don't vote for kings.
+WOMAN: Well, 'ow did you become king then?
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.207
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.207
+Problem: Netbeans: "remove" cannot delete one line.
+Solution: Remove partial lines and whole lines properly. Avoid a memory
+ leak. (Xavier de Gaye)
+Files: src/netbeans.c
+
+
+*** ../vim-7.1.206/src/netbeans.c Thu May 10 18:40:48 2007
+--- src/netbeans.c Sat Jan 5 18:03:24 2008
+***************
+*** 1204,1209 ****
+--- 1204,1257 ----
+ return result;
+ }
+
++ /*
++ * Remove from "first" byte to "last" byte (inclusive), at line "lnum" of the
++ * current buffer. Remove to end of line when "last" is MAXCOL.
++ */
++ static void
++ nb_partialremove(linenr_T lnum, colnr_T first, colnr_T last)
++ {
++ char_u *oldtext, *newtext;
++ int oldlen;
++ int lastbyte = last;
++
++ oldtext = ml_get(lnum);
++ oldlen = STRLEN(oldtext);
++ if (first >= oldlen || oldlen == 0) /* just in case */
++ return;
++ if (lastbyte >= oldlen)
++ lastbyte = oldlen - 1;
++ newtext = alloc(oldlen - (int)(lastbyte - first));
++ if (newtext != NULL)
++ {
++ mch_memmove(newtext, oldtext, first);
++ mch_memmove(newtext + first, oldtext + lastbyte + 1, STRLEN(oldtext + lastbyte + 1) + 1);
++ nbdebug((" NEW LINE %d: %s\n", lnum, newtext));
++ ml_replace(lnum, newtext, FALSE);
++ }
++ }
++
++ /*
++ * Replace the "first" line with the concatenation of the "first" and
++ * the "other" line. The "other" line is not removed.
++ */
++ static void
++ nb_joinlines(linenr_T first, linenr_T other)
++ {
++ int len_first, len_other;
++ char_u *p;
++
++ len_first = STRLEN(ml_get(first));
++ len_other = STRLEN(ml_get(other));
++ p = alloc((unsigned)(len_first + len_other + 1));
++ if (p != NULL)
++ {
++ mch_memmove(p, ml_get(first), len_first);
++ mch_memmove(p + len_first, ml_get(other), len_other + 1);
++ ml_replace(first, p, FALSE);
++ }
++ }
++
+ #define SKIP_STOP 2
+ #define streq(a,b) (strcmp(a,b) == 0)
+ static int needupdate = 0;
+***************
+*** 1371,1376 ****
+--- 1419,1426 ----
+ long count;
+ pos_T first, last;
+ pos_T *pos;
++ pos_T *next;
++ linenr_T del_from_lnum, del_to_lnum; /* lines to be deleted as a whole */
+ int oldFire = netbeansFireChanges;
+ int oldSuppress = netbeansSuppressNoLines;
+ int wasChanged;
+***************
+*** 1420,1444 ****
+ }
+ last = *pos;
+ nbdebug((" LAST POS: line %d, col %d\n", last.lnum, last.col));
+! curwin->w_cursor = first;
+ doupdate = 1;
+
+! /* keep part of first line */
+! if (first.lnum == last.lnum && first.col != last.col)
+ {
+! /* deletion is within one line */
+! char_u *p = ml_get(first.lnum);
+! mch_memmove(p + first.col, p + last.col + 1, STRLEN(p + last.col) + 1);
+! nbdebug((" NEW LINE %d: %s\n", first.lnum, p));
+! ml_replace(first.lnum, p, TRUE);
+ }
+
+! if (first.lnum < last.lnum)
+ {
+ int i;
+
+ /* delete signs from the lines being deleted */
+! for (i = first.lnum; i <= last.lnum; i++)
+ {
+ int id = buf_findsign_id(buf->bufp, (linenr_T)i);
+ if (id > 0)
+--- 1470,1544 ----
+ }
+ last = *pos;
+ nbdebug((" LAST POS: line %d, col %d\n", last.lnum, last.col));
+! del_from_lnum = first.lnum;
+! del_to_lnum = last.lnum;
+ doupdate = 1;
+
+! /* Get the position of the first byte after the deleted
+! * section. "next" is NULL when deleting to the end of the
+! * file. */
+! next = off2pos(buf->bufp, off + count);
+!
+! /* Remove part of the first line. */
+! if (first.col != 0 || (next != NULL && first.lnum == next->lnum))
+ {
+! if (first.lnum != last.lnum
+! || (next != NULL && first.lnum != next->lnum))
+! {
+! /* remove to the end of the first line */
+! nb_partialremove(first.lnum, first.col,
+! (colnr_T)MAXCOL);
+! if (first.lnum == last.lnum)
+! {
+! /* Partial line to remove includes the end of
+! * line. Join the line with the next one, have
+! * the next line deleted below. */
+! nb_joinlines(first.lnum, next->lnum);
+! del_to_lnum = next->lnum;
+! }
+! }
+! else
+! {
+! /* remove within one line */
+! nb_partialremove(first.lnum, first.col, last.col);
+! }
+! ++del_from_lnum; /* don't delete the first line */
+! }
+!
+! /* Remove part of the last line. */
+! if (first.lnum != last.lnum && next != NULL
+! && next->col != 0 && last.lnum == next->lnum)
+! {
+! nb_partialremove(last.lnum, 0, last.col);
+! if (del_from_lnum > first.lnum)
+! {
+! /* Join end of last line to start of first line; last
+! * line is deleted below. */
+! nb_joinlines(first.lnum, last.lnum);
+! }
+! else
+! /* First line is deleted as a whole, keep the last
+! * line. */
+! --del_to_lnum;
+ }
+
+! /* First is partial line; last line to remove includes
+! * the end of line; join first line to line following last
+! * line; line following last line is deleted below. */
+! if (first.lnum != last.lnum && del_from_lnum > first.lnum
+! && next != NULL && last.lnum != next->lnum)
+! {
+! nb_joinlines(first.lnum, next->lnum);
+! del_to_lnum = next->lnum;
+! }
+!
+! /* Delete whole lines if there are any. */
+! if (del_to_lnum >= del_from_lnum)
+ {
+ int i;
+
+ /* delete signs from the lines being deleted */
+! for (i = del_from_lnum; i <= del_to_lnum; i++)
+ {
+ int id = buf_findsign_id(buf->bufp, (linenr_T)i);
+ if (id > 0)
+***************
+*** 1450,1459 ****
+ nbdebug((" No sign on line %d\n", i));
+ }
+
+! /* delete whole lines */
+! nbdebug((" Deleting lines %d through %d\n", first.lnum, last.lnum));
+! del_lines(last.lnum - first.lnum + 1, FALSE);
+ }
+ buf->bufp->b_changed = wasChanged; /* logically unchanged */
+ netbeansFireChanges = oldFire;
+ netbeansSuppressNoLines = oldSuppress;
+--- 1550,1564 ----
+ nbdebug((" No sign on line %d\n", i));
+ }
+
+! nbdebug((" Deleting lines %d through %d\n", del_from_lnum, del_to_lnum));
+! curwin->w_cursor.lnum = del_from_lnum;
+! curwin->w_cursor.col = 0;
+! del_lines(del_to_lnum - del_from_lnum + 1, FALSE);
+ }
++
++ /* Leave cursor at first deleted byte. */
++ curwin->w_cursor = first;
++ check_cursor_lnum();
+ buf->bufp->b_changed = wasChanged; /* logically unchanged */
+ netbeansFireChanges = oldFire;
+ netbeansSuppressNoLines = oldSuppress;
+***************
+*** 2374,2381 ****
+ * the current buffer as "buf".
+ */
+ static void
+! nb_set_curbuf(buf)
+! buf_T *buf;
+ {
+ if (curbuf != buf && buf_jump_open_win(buf) == NULL)
+ set_curbuf(buf, DOBUF_GOTO);
+--- 2479,2485 ----
+ * the current buffer as "buf".
+ */
+ static void
+! nb_set_curbuf(buf_T *buf)
+ {
+ if (curbuf != buf && buf_jump_open_win(buf) == NULL)
+ set_curbuf(buf, DOBUF_GOTO);
+*** ../vim-7.1.206/src/version.c Sat Jan 5 13:58:48 2008
+--- src/version.c Sat Jan 5 18:06:04 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 207,
+ /**/
+
+--
+Q: How many hardware engineers does it take to change a lightbulb?
+A: None. We'll fix it in software.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.208
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.208
+Problem: On Alpha get an unaligned access error.
+Solution: Store the dictitem pointer before using it. (Matthew Luckie)
+Files: src/eval.c
+
+
+*** ../vim-7.1.207/src/eval.c Sat Jan 5 13:34:01 2008
+--- src/eval.c Sat Jan 5 13:22:52 2008
+***************
+*** 3407,3412 ****
+--- 3407,3413 ----
+ hashtab_T *ht;
+ hashitem_T *hi;
+ char_u *varname;
++ dictitem_T *di;
+
+ ht = find_var_ht(name, &varname);
+ if (ht != NULL && *varname != NUL)
+***************
+*** 3414,3422 ****
+ hi = hash_find(ht, varname);
+ if (!HASHITEM_EMPTY(hi))
+ {
+! if (var_check_fixed(HI2DI(hi)->di_flags, name))
+! return FAIL;
+! if (var_check_ro(HI2DI(hi)->di_flags, name))
+ return FAIL;
+ delete_var(ht, hi);
+ return OK;
+--- 3415,3423 ----
+ hi = hash_find(ht, varname);
+ if (!HASHITEM_EMPTY(hi))
+ {
+! di = HI2DI(hi);
+! if (var_check_fixed(di->di_flags, name)
+! || var_check_ro(di->di_flags, name))
+ return FAIL;
+ delete_var(ht, hi);
+ return OK;
+*** ../vim-7.1.207/src/version.c Sat Jan 5 18:06:33 2008
+--- src/version.c Sat Jan 5 22:14:17 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 208,
+ /**/
+
+--
+ARTHUR: Bloody peasant!
+DENNIS: Oh, what a give away. Did you here that, did you here that, eh?
+ That's what I'm on about -- did you see him repressing me, you saw it
+ didn't you?
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.209
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.209
+Problem: GTK: When using the netrw plugin and doing ":gui" Vim hangs.
+Solution: Stop getting a selection after three seconds. This is a hack.
+Files: src/gui_gtk_x11.c
+
+
+*** ../vim-7.1.208/src/gui_gtk_x11.c Fri Oct 19 14:32:50 2007
+--- src/gui_gtk_x11.c Sun Jan 6 15:15:52 2008
+***************
+*** 6660,6665 ****
+--- 6660,6666 ----
+ unsigned i;
+ int nbytes;
+ char_u *buffer;
++ time_t start;
+
+ for (i = 0; i < N_SELECTION_TARGETS; ++i)
+ {
+***************
+*** 6670,6676 ****
+ cbd->gtk_sel_atom, target,
+ (guint32)GDK_CURRENT_TIME);
+
+! while (received_selection == RS_NONE)
+ gtk_main(); /* wait for selection_received_cb */
+
+ if (received_selection != RS_FAIL)
+--- 6671,6681 ----
+ cbd->gtk_sel_atom, target,
+ (guint32)GDK_CURRENT_TIME);
+
+! /* Hack: Wait up to three seconds for the selection. A hang was
+! * noticed here when using the netrw plugin combined with ":gui"
+! * during the FocusGained event. */
+! start = time(NULL);
+! while (received_selection == RS_NONE && time(NULL) < start + 3)
+ gtk_main(); /* wait for selection_received_cb */
+
+ if (received_selection != RS_FAIL)
+*** ../vim-7.1.208/src/version.c Sat Jan 5 22:15:21 2008
+--- src/version.c Sun Jan 6 15:14:48 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 209,
+ /**/
+
+--
+BLACK KNIGHT: I move for no man.
+ARTHUR: So be it!
+ [hah] [parry thrust]
+ [ARTHUR chops the BLACK KNIGHT's left arm off]
+ARTHUR: Now stand aside, worthy adversary.
+BLACK KNIGHT: 'Tis but a scratch.
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.210
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.210
+Problem: Listing mapping for 0xdb fails when 'encoding' is utf-8. (Tony
+ Mechelynck)
+Solution: Recognize K_SPECIAL KS_EXTRA KE_CSI as a CSI byte.
+Files: src/mbyte.c
+
+
+*** ../vim-7.1.209/src/mbyte.c Fri Jan 4 17:46:46 2008
+--- src/mbyte.c Sun Jan 6 17:13:51 2008
+***************
+*** 2863,2877 ****
+ buf[m++] = K_SPECIAL;
+ n += 2;
+ }
+ # ifdef FEAT_GUI
+! else if (str[n] == CSI
+ && str[n + 1] == KS_EXTRA
+ && str[n + 2] == (int)KE_CSI)
+ {
+ buf[m++] = CSI;
+ n += 2;
+ }
+- # endif
+ else if (str[n] == K_SPECIAL
+ # ifdef FEAT_GUI
+ || str[n] == CSI
+--- 2882,2898 ----
+ buf[m++] = K_SPECIAL;
+ n += 2;
+ }
++ else if ((str[n] == K_SPECIAL
+ # ifdef FEAT_GUI
+! || str[n] == CSI
+! # endif
+! )
+ && str[n + 1] == KS_EXTRA
+ && str[n + 2] == (int)KE_CSI)
+ {
+ buf[m++] = CSI;
+ n += 2;
+ }
+ else if (str[n] == K_SPECIAL
+ # ifdef FEAT_GUI
+ || str[n] == CSI
+*** ../vim-7.1.209/src/version.c Sun Jan 6 15:16:12 2008
+--- src/version.c Sun Jan 6 17:17:25 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 210,
+ /**/
+
+--
+ARTHUR: A scratch? Your arm's off!
+BLACK KNIGHT: No, it isn't.
+ARTHUR: Well, what's that then?
+BLACK KNIGHT: I've had worse.
+ The Quest for the Holy Grail (Monty Python)
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.211
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.211
+Problem: The matchparen plugin may take an unexpected amount of time, so
+ that it looks like Vim hangs.
+Solution: Add a timeout to searchpair(), searchpairpos(), search() and
+ searchpos(). Use half a second timeout in the plugin.
+Files: runtime/doc/eval.txt, runtime/plugin/matchparen.vim, src/edit.c,
+ src/eval.c, src/ex_cmds2.c, src/ex_docmd.c, src/normal.c,
+ src/proto/eval.pro, src/proto/ex_cmds2.pro, src/proto/search.pro,
+ src/search.c
+
+
+*** ../vim-7.1.210/runtime/doc/eval.txt Sat Jan 5 13:34:01 2008
+--- runtime/doc/eval.txt Sun Jan 6 16:27:33 2008
+***************
+*** 1,4 ****
+! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 04
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 06
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 1733,1746 ****
+ repeat( {expr}, {count}) String repeat {expr} {count} times
+ resolve( {filename}) String get filename a shortcut points to
+ reverse( {list}) List reverse {list} in-place
+! search( {pattern} [, {flags}]) Number search for {pattern}
+ searchdecl({name} [, {global} [, {thisblock}]])
+ Number search for variable declaration
+! searchpair( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
+ Number search for other end of start/end pair
+! searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
+ List search for other end of start/end pair
+! searchpos( {pattern} [, {flags} [, {stopline}]])
+ List search for {pattern}
+ server2client( {clientid}, {string})
+ Number send reply string
+--- 1733,1747 ----
+ repeat( {expr}, {count}) String repeat {expr} {count} times
+ resolve( {filename}) String get filename a shortcut points to
+ reverse( {list}) List reverse {list} in-place
+! search( {pattern} [, {flags} [, {stopline} [, {timeout}]]])
+! Number search for {pattern}
+ searchdecl({name} [, {global} [, {thisblock}]])
+ Number search for variable declaration
+! searchpair( {start}, {middle}, {end} [, {flags} [, {skip} [...]]])
+ Number search for other end of start/end pair
+! searchpairpos( {start}, {middle}, {end} [, {flags} [, {skip} [...]]])
+ List search for other end of start/end pair
+! searchpos( {pattern} [, {flags} [, {stopline} [, {timeout}]]])
+ List search for {pattern}
+ server2client( {clientid}, {string})
+ Number send reply string
+***************
+*** 4212,4218 ****
+ If you want a list to remain unmodified make a copy first: >
+ :let revlist = reverse(copy(mylist))
+
+! search({pattern} [, {flags} [, {stopline}]]) *search()*
+ Search for regexp pattern {pattern}. The search starts at the
+ cursor position (you can use |cursor()| to set it).
+
+--- 4216,4222 ----
+ If you want a list to remain unmodified make a copy first: >
+ :let revlist = reverse(copy(mylist))
+
+! search({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *search()*
+ Search for regexp pattern {pattern}. The search starts at the
+ cursor position (you can use |cursor()| to set it).
+
+***************
+*** 4240,4245 ****
+--- 4244,4257 ----
+ let end = search('END', '', line("w$"))
+ < When {stopline} is used and it is not zero this also implies
+ that the search does not wrap around the end of the file.
++ A zero value is equal to not giving the argument.
++
++ When the {timeout} argument is given the search stops when
++ more than this many milli seconds have passed. Thus when
++ {timeout} is 500 the search stops after half a second.
++ The value must not be negative. A zero value is like not
++ giving the argument.
++ {only available when compiled with the +reltime feature}
+
+ If there is no match a 0 is returned and the cursor doesn't
+ move. No error message is given.
+***************
+*** 4302,4308 ****
+ endif
+ <
+ *searchpair()*
+! searchpair({start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
+ Search for the match of a nested start-end pair. This can be
+ used to find the "endif" that matches an "if", while other
+ if/endif pairs in between are ignored.
+--- 4314,4321 ----
+ endif
+ <
+ *searchpair()*
+! searchpair({start}, {middle}, {end} [, {flags} [, {skip}
+! [, {stopline} [, {timeout}]]]])
+ Search for the match of a nested start-end pair. This can be
+ used to find the "endif" that matches an "if", while other
+ if/endif pairs in between are ignored.
+***************
+*** 4337,4343 ****
+ When evaluating {skip} causes an error the search is aborted
+ and -1 returned.
+
+! For {stopline} see |search()|.
+
+ The value of 'ignorecase' is used. 'magic' is ignored, the
+ patterns are used like it's on.
+--- 4350,4356 ----
+ When evaluating {skip} causes an error the search is aborted
+ and -1 returned.
+
+! For {stopline} and {timeout} see |search()|.
+
+ The value of 'ignorecase' is used. 'magic' is ignored, the
+ patterns are used like it's on.
+***************
+*** 4383,4389 ****
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')
+ <
+ *searchpairpos()*
+! searchpairpos({start}, {middle}, {end} [, {flags} [, {skip} [, {stopline}]]])
+ Same as searchpair(), but returns a |List| with the line and
+ column position of the match. The first element of the |List|
+ is the line number and the second element is the byte index of
+--- 4396,4403 ----
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')
+ <
+ *searchpairpos()*
+! searchpairpos({start}, {middle}, {end} [, {flags} [, {skip}
+! [, {stopline} [, {timeout}]]]])
+ Same as searchpair(), but returns a |List| with the line and
+ column position of the match. The first element of the |List|
+ is the line number and the second element is the byte index of
+***************
+*** 4394,4400 ****
+ <
+ See |match-parens| for a bigger and more useful example.
+
+! searchpos({pattern} [, {flags} [, {stopline}]]) *searchpos()*
+ Same as |search()|, but returns a |List| with the line and
+ column position of the match. The first element of the |List|
+ is the line number and the second element is the byte index of
+--- 4408,4414 ----
+ <
+ See |match-parens| for a bigger and more useful example.
+
+! searchpos({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *searchpos()*
+ Same as |search()|, but returns a |List| with the line and
+ column position of the match. The first element of the |List|
+ is the line number and the second element is the byte index of
+*** ../vim-7.1.210/runtime/plugin/matchparen.vim Sat Aug 18 18:20:57 2007
+--- runtime/plugin/matchparen.vim Sun Jan 6 16:22:39 2008
+***************
+*** 1,6 ****
+ " Vim plugin for showing matching parens
+ " Maintainer: Bram Moolenaar <Bram@vim.org>
+! " Last Change: 2007 Aug 8
+
+ " Exit quickly when:
+ " - this plugin was already loaded (or disabled)
+--- 1,6 ----
+ " Vim plugin for showing matching parens
+ " Maintainer: Bram Moolenaar <Bram@vim.org>
+! " Last Change: 2008 Jan 06
+
+ " Exit quickly when:
+ " - this plugin was already loaded (or disabled)
+***************
+*** 111,117 ****
+ \ '=~? "string\\|character\\|singlequote\\|comment"'
+ execute 'if' s_skip '| let s_skip = 0 | endif'
+
+! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline)
+
+ if before > 0
+ call winrestview(save_cursor)
+--- 111,122 ----
+ \ '=~? "string\\|character\\|singlequote\\|comment"'
+ execute 'if' s_skip '| let s_skip = 0 | endif'
+
+! try
+! " Limit the search time to 500 msec to avoid a hang on very long lines.
+! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 500)
+! catch /E118/
+! let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline)
+! endtry
+
+ if before > 0
+ call winrestview(save_cursor)
+*** ../vim-7.1.210/src/edit.c Wed Jan 2 22:08:43 2008
+--- src/edit.c Sun Jan 6 16:08:00 2008
+***************
+*** 4062,4068 ****
+ found_new_match = searchit(NULL, ins_buf, pos,
+ compl_direction,
+ compl_pattern, 1L, SEARCH_KEEP + SEARCH_NFMSG,
+! RE_LAST, (linenr_T)0);
+ --msg_silent;
+ if (!compl_started)
+ {
+--- 4062,4068 ----
+ found_new_match = searchit(NULL, ins_buf, pos,
+ compl_direction,
+ compl_pattern, 1L, SEARCH_KEEP + SEARCH_NFMSG,
+! RE_LAST, (linenr_T)0, NULL);
+ --msg_silent;
+ if (!compl_started)
+ {
+*** ../vim-7.1.210/src/eval.c Sat Jan 5 22:15:21 2008
+--- src/eval.c Sun Jan 6 16:37:42 2008
+***************
+*** 7213,7223 ****
+ {"repeat", 2, 2, f_repeat},
+ {"resolve", 1, 1, f_resolve},
+ {"reverse", 1, 1, f_reverse},
+! {"search", 1, 3, f_search},
+ {"searchdecl", 1, 3, f_searchdecl},
+! {"searchpair", 3, 6, f_searchpair},
+! {"searchpairpos", 3, 6, f_searchpairpos},
+! {"searchpos", 1, 3, f_searchpos},
+ {"server2client", 2, 2, f_server2client},
+ {"serverlist", 0, 0, f_serverlist},
+ {"setbufvar", 3, 3, f_setbufvar},
+--- 7213,7223 ----
+ {"repeat", 2, 2, f_repeat},
+ {"resolve", 1, 1, f_resolve},
+ {"reverse", 1, 1, f_reverse},
+! {"search", 1, 4, f_search},
+ {"searchdecl", 1, 3, f_searchdecl},
+! {"searchpair", 3, 7, f_searchpair},
+! {"searchpairpos", 3, 7, f_searchpairpos},
+! {"searchpos", 1, 4, f_searchpos},
+ {"server2client", 2, 2, f_server2client},
+ {"serverlist", 0, 0, f_serverlist},
+ {"setbufvar", 3, 3, f_setbufvar},
+***************
+*** 14020,14025 ****
+--- 14020,14029 ----
+ int dir;
+ int retval = 0; /* default: FAIL */
+ long lnum_stop = 0;
++ proftime_T tm;
++ #ifdef FEAT_RELTIME
++ long time_limit = 0;
++ #endif
+ int options = SEARCH_KEEP;
+ int subpatnum;
+
+***************
+*** 14033,14047 ****
+ if (flags & SP_END)
+ options |= SEARCH_END;
+
+! /* Optional extra argument: line number to stop searching. */
+! if (argvars[1].v_type != VAR_UNKNOWN
+! && argvars[2].v_type != VAR_UNKNOWN)
+ {
+ lnum_stop = get_tv_number_chk(&argvars[2], NULL);
+ if (lnum_stop < 0)
+ goto theend;
+ }
+
+ /*
+ * This function does not accept SP_REPEAT and SP_RETCOUNT flags.
+ * Check to make sure only those flags are set.
+--- 14037,14063 ----
+ if (flags & SP_END)
+ options |= SEARCH_END;
+
+! /* Optional arguments: line number to stop searching and timeout. */
+! if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN)
+ {
+ lnum_stop = get_tv_number_chk(&argvars[2], NULL);
+ if (lnum_stop < 0)
+ goto theend;
++ #ifdef FEAT_RELTIME
++ if (argvars[3].v_type != VAR_UNKNOWN)
++ {
++ time_limit = get_tv_number_chk(&argvars[3], NULL);
++ if (time_limit < 0)
++ goto theend;
++ }
++ #endif
+ }
+
++ #ifdef FEAT_RELTIME
++ /* Set the time limit, if there is one. */
++ profile_setlimit(time_limit, &tm);
++ #endif
++
+ /*
+ * This function does not accept SP_REPEAT and SP_RETCOUNT flags.
+ * Check to make sure only those flags are set.
+***************
+*** 14057,14063 ****
+
+ pos = save_cursor = curwin->w_cursor;
+ subpatnum = searchit(curwin, curbuf, &pos, dir, pat, 1L,
+! options, RE_SEARCH, (linenr_T)lnum_stop);
+ if (subpatnum != FAIL)
+ {
+ if (flags & SP_SUBPAT)
+--- 14073,14079 ----
+
+ pos = save_cursor = curwin->w_cursor;
+ subpatnum = searchit(curwin, curbuf, &pos, dir, pat, 1L,
+! options, RE_SEARCH, (linenr_T)lnum_stop, &tm);
+ if (subpatnum != FAIL)
+ {
+ if (flags & SP_SUBPAT)
+***************
+*** 14147,14152 ****
+--- 14163,14169 ----
+ char_u nbuf3[NUMBUFLEN];
+ int retval = 0; /* default: FAIL */
+ long lnum_stop = 0;
++ long time_limit = 0;
+
+ /* Get the three pattern arguments: start, middle, end. */
+ spat = get_tv_string_chk(&argvars[0]);
+***************
+*** 14182,14194 ****
+ lnum_stop = get_tv_number_chk(&argvars[5], NULL);
+ if (lnum_stop < 0)
+ goto theend;
+ }
+ }
+ if (skip == NULL)
+ goto theend; /* type error */
+
+ retval = do_searchpair(spat, mpat, epat, dir, skip, flags,
+! match_pos, lnum_stop);
+
+ theend:
+ p_ws = save_p_ws;
+--- 14199,14219 ----
+ lnum_stop = get_tv_number_chk(&argvars[5], NULL);
+ if (lnum_stop < 0)
+ goto theend;
++ #ifdef FEAT_RELTIME
++ if (argvars[6].v_type != VAR_UNKNOWN)
++ {
++ time_limit = get_tv_number_chk(&argvars[6], NULL);
++ if (time_limit < 0)
++ goto theend;
++ }
++ #endif
+ }
+ }
+ if (skip == NULL)
+ goto theend; /* type error */
+
+ retval = do_searchpair(spat, mpat, epat, dir, skip, flags,
+! match_pos, lnum_stop, time_limit);
+
+ theend:
+ p_ws = save_p_ws;
+***************
+*** 14240,14246 ****
+ * Returns 0 or -1 for no match,
+ */
+ long
+! do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos, lnum_stop)
+ char_u *spat; /* start pattern */
+ char_u *mpat; /* middle pattern */
+ char_u *epat; /* end pattern */
+--- 14265,14272 ----
+ * Returns 0 or -1 for no match,
+ */
+ long
+! do_searchpair(spat, mpat, epat, dir, skip, flags, match_pos,
+! lnum_stop, time_limit)
+ char_u *spat; /* start pattern */
+ char_u *mpat; /* middle pattern */
+ char_u *epat; /* end pattern */
+***************
+*** 14249,14254 ****
+--- 14275,14281 ----
+ int flags; /* SP_SETPCMARK and other SP_ values */
+ pos_T *match_pos;
+ linenr_T lnum_stop; /* stop at this line if not zero */
++ long time_limit; /* stop after this many msec */
+ {
+ char_u *save_cpo;
+ char_u *pat, *pat2 = NULL, *pat3 = NULL;
+***************
+*** 14263,14273 ****
+--- 14290,14306 ----
+ int nest = 1;
+ int err;
+ int options = SEARCH_KEEP;
++ proftime_T tm;
+
+ /* Make 'cpoptions' empty, the 'l' flag should not be used here. */
+ save_cpo = p_cpo;
+ p_cpo = (char_u *)"";
+
++ #ifdef FEAT_RELTIME
++ /* Set the time limit, if there is one. */
++ profile_setlimit(time_limit, &tm);
++ #endif
++
+ /* Make two search patterns: start/end (pat2, for in nested pairs) and
+ * start/middle/end (pat3, for the top pair). */
+ pat2 = alloc((unsigned)(STRLEN(spat) + STRLEN(epat) + 15));
+***************
+*** 14291,14297 ****
+ for (;;)
+ {
+ n = searchit(curwin, curbuf, &pos, dir, pat, 1L,
+! options, RE_SEARCH, lnum_stop);
+ if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos)))
+ /* didn't find it or found the first match again: FAIL */
+ break;
+--- 14324,14330 ----
+ for (;;)
+ {
+ n = searchit(curwin, curbuf, &pos, dir, pat, 1L,
+! options, RE_SEARCH, lnum_stop, &tm);
+ if (n == FAIL || (firstpos.lnum != 0 && equalpos(pos, firstpos)))
+ /* didn't find it or found the first match again: FAIL */
+ break;
+*** ../vim-7.1.210/src/ex_cmds2.c Fri Jan 4 16:00:10 2008
+--- src/ex_cmds2.c Sun Jan 6 18:22:28 2008
+***************
+*** 895,913 ****
+ sprintf(buf, "%10.6lf", (double)tm->QuadPart / (double)fr.QuadPart);
+ # else
+ sprintf(buf, "%3ld.%06ld", (long)tm->tv_sec, (long)tm->tv_usec);
+! #endif
+ return buf;
+ }
+
+! # endif /* FEAT_PROFILE || FEAT_RELTIME */
+
+- # if defined(FEAT_PROFILE) || defined(PROTO)
+ /*
+! * Functions for profiling.
+ */
+! static void script_do_profile __ARGS((scriptitem_T *si));
+! static void script_dump_profile __ARGS((FILE *fd));
+! static proftime_T prof_wait_time;
+
+ /*
+ * Set the time in "tm" to zero.
+--- 895,955 ----
+ sprintf(buf, "%10.6lf", (double)tm->QuadPart / (double)fr.QuadPart);
+ # else
+ sprintf(buf, "%3ld.%06ld", (long)tm->tv_sec, (long)tm->tv_usec);
+! # endif
+ return buf;
+ }
+
+! /*
+! * Put the time "msec" past now in "tm".
+! */
+! void
+! profile_setlimit(msec, tm)
+! long msec;
+! proftime_T *tm;
+! {
+! if (msec <= 0) /* no limit */
+! profile_zero(tm);
+! else
+! {
+! # ifdef WIN3264
+! LARGE_INTEGER fr;
+!
+! QueryPerformanceCounter(tm);
+! QueryPerformanceFrequency(&fr);
+! tm->QuadPart += (double)msec / 1000.0 * (double)fr.QuadPart;
+! # else
+! long usec;
+!
+! gettimeofday(tm, NULL);
+! usec = (long)tm->tv_usec + (long)msec * 1000;
+! tm->tv_usec = usec % 1000000L;
+! tm->tv_sec += usec / 1000000L;
+! # endif
+! }
+! }
+
+ /*
+! * Return TRUE if the current time is past "tm".
+ */
+! int
+! profile_passed_limit(tm)
+! proftime_T *tm;
+! {
+! proftime_T now;
+!
+! # ifdef WIN3264
+! if (tm->QuadPart == 0) /* timer was not set */
+! return FALSE;
+! QueryPerformanceCounter(&now);
+! return (now.QuadPart > tm->QuadPart);
+! # else
+! if (tm->tv_sec == 0) /* timer was not set */
+! return FALSE;
+! gettimeofday(&now, NULL);
+! return (now.tv_sec > tm->tv_sec
+! || (now.tv_sec == tm->tv_sec && now.tv_usec > tm->tv_usec));
+! # endif
+! }
+
+ /*
+ * Set the time in "tm" to zero.
+***************
+*** 923,928 ****
+--- 965,980 ----
+ tm->tv_sec = 0;
+ # endif
+ }
++
++ # endif /* FEAT_PROFILE || FEAT_RELTIME */
++
++ # if defined(FEAT_PROFILE) || defined(PROTO)
++ /*
++ * Functions for profiling.
++ */
++ static void script_do_profile __ARGS((scriptitem_T *si));
++ static void script_dump_profile __ARGS((FILE *fd));
++ static proftime_T prof_wait_time;
+
+ /*
+ * Add the time "tm2" to "tm".
+*** ../vim-7.1.210/src/ex_docmd.c Fri Jan 4 16:00:10 2008
+--- src/ex_docmd.c Sun Jan 6 16:08:29 2008
+***************
+*** 3979,3985 ****
+ *cmd == '?' ? BACKWARD : FORWARD,
+ (char_u *)"", 1L,
+ SEARCH_MSG + SEARCH_START,
+! i, (linenr_T)0) != FAIL)
+ lnum = pos.lnum;
+ else
+ {
+--- 3980,3986 ----
+ *cmd == '?' ? BACKWARD : FORWARD,
+ (char_u *)"", 1L,
+ SEARCH_MSG + SEARCH_START,
+! i, (linenr_T)0, NULL) != FAIL)
+ lnum = pos.lnum;
+ else
+ {
+*** ../vim-7.1.210/src/normal.c Sat Jan 5 13:34:01 2008
+--- src/normal.c Sun Jan 6 16:08:54 2008
+***************
+*** 4194,4200 ****
+ for (;;)
+ {
+ t = searchit(curwin, curbuf, &curwin->w_cursor, FORWARD,
+! pat, 1L, searchflags, RE_LAST, (linenr_T)0);
+ if (curwin->w_cursor.lnum >= old_pos.lnum)
+ t = FAIL; /* match after start is failure too */
+
+--- 4194,4200 ----
+ for (;;)
+ {
+ t = searchit(curwin, curbuf, &curwin->w_cursor, FORWARD,
+! pat, 1L, searchflags, RE_LAST, (linenr_T)0, NULL);
+ if (curwin->w_cursor.lnum >= old_pos.lnum)
+ t = FAIL; /* match after start is failure too */
+
+*** ../vim-7.1.210/src/proto/eval.pro Sun May 6 15:18:09 2007
+--- src/proto/eval.pro Sun Jan 6 15:55:47 2008
+***************
+*** 54,60 ****
+ long get_dict_number __ARGS((dict_T *d, char_u *key));
+ char_u *get_function_name __ARGS((expand_T *xp, int idx));
+ char_u *get_expr_name __ARGS((expand_T *xp, int idx));
+! long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop));
+ void set_vim_var_nr __ARGS((int idx, long val));
+ long get_vim_var_nr __ARGS((int idx));
+ char_u *get_vim_var_str __ARGS((int idx));
+--- 54,60 ----
+ long get_dict_number __ARGS((dict_T *d, char_u *key));
+ char_u *get_function_name __ARGS((expand_T *xp, int idx));
+ char_u *get_expr_name __ARGS((expand_T *xp, int idx));
+! long do_searchpair __ARGS((char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit));
+ void set_vim_var_nr __ARGS((int idx, long val));
+ long get_vim_var_nr __ARGS((int idx));
+ char_u *get_vim_var_str __ARGS((int idx));
+*** ../vim-7.1.210/src/proto/ex_cmds2.pro Sat May 5 20:21:13 2007
+--- src/proto/ex_cmds2.pro Sun Jan 6 16:42:24 2008
+***************
+*** 14,19 ****
+--- 14,21 ----
+ void profile_end __ARGS((proftime_T *tm));
+ void profile_sub __ARGS((proftime_T *tm, proftime_T *tm2));
+ char *profile_msg __ARGS((proftime_T *tm));
++ void profile_setlimit __ARGS((long msec, proftime_T *tm));
++ int profile_passed_limit __ARGS((proftime_T *tm));
+ void profile_zero __ARGS((proftime_T *tm));
+ void profile_add __ARGS((proftime_T *tm, proftime_T *tm2));
+ void profile_self __ARGS((proftime_T *self, proftime_T *total, proftime_T *children));
+*** ../vim-7.1.210/src/proto/search.pro Wed Aug 8 22:48:16 2007
+--- src/proto/search.pro Sun Jan 6 16:11:53 2008
+***************
+*** 10,16 ****
+ void reset_search_dir __ARGS((void));
+ void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
+ void last_pat_prog __ARGS((regmmatch_T *regmatch));
+! int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum));
+ int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options));
+ int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat));
+ int searchc __ARGS((cmdarg_T *cap, int t_cmd));
+--- 10,16 ----
+ void reset_search_dir __ARGS((void));
+ void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
+ void last_pat_prog __ARGS((regmmatch_T *regmatch));
+! int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm));
+ int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options));
+ int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat));
+ int searchc __ARGS((cmdarg_T *cap, int t_cmd));
+*** ../vim-7.1.210/src/search.c Tue Jan 1 15:42:45 2008
+--- src/search.c Sun Jan 6 18:23:37 2008
+***************
+*** 494,501 ****
+ * When FEAT_EVAL is defined, returns the index of the first matching
+ * subpattern plus one; one if there was none.
+ */
+ int
+! searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum)
+ win_T *win; /* window to search in; can be NULL for a
+ buffer without a window! */
+ buf_T *buf;
+--- 494,502 ----
+ * When FEAT_EVAL is defined, returns the index of the first matching
+ * subpattern plus one; one if there was none.
+ */
++ /*ARGSUSED*/
+ int
+! searchit(win, buf, pos, dir, pat, count, options, pat_use, stop_lnum, tm)
+ win_T *win; /* window to search in; can be NULL for a
+ buffer without a window! */
+ buf_T *buf;
+***************
+*** 506,511 ****
+--- 507,513 ----
+ int options;
+ int pat_use; /* which pattern to use when "pat" is empty */
+ linenr_T stop_lnum; /* stop after this line number when != 0 */
++ proftime_T *tm; /* timeout limit or NULL */
+ {
+ int found;
+ linenr_T lnum; /* no init to shut up Apollo cc */
+***************
+*** 594,599 ****
+--- 596,606 ----
+ if (stop_lnum != 0 && (dir == FORWARD
+ ? lnum > stop_lnum : lnum < stop_lnum))
+ break;
++ #ifdef FEAT_RELTIME
++ /* Stop after passing the "tm" time limit. */
++ if (tm != NULL && profile_passed_limit(tm))
++ break;
++ #endif
+
+ /*
+ * Look for a match somewhere in line "lnum".
+***************
+*** 1249,1255 ****
+ (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
+ + SEARCH_MSG + SEARCH_START
+ + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
+! RE_LAST, (linenr_T)0);
+
+ if (dircp != NULL)
+ *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */
+--- 1256,1262 ----
+ (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
+ + SEARCH_MSG + SEARCH_START
+ + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
+! RE_LAST, (linenr_T)0, NULL);
+
+ if (dircp != NULL)
+ *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */
+***************
+*** 3780,3786 ****
+ if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)",
+ (char_u *)"",
+ (char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0,
+! NULL, (linenr_T)0) <= 0)
+ {
+ curwin->w_cursor = old_pos;
+ goto theend;
+--- 3787,3793 ----
+ if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)",
+ (char_u *)"",
+ (char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0,
+! NULL, (linenr_T)0, 0L) <= 0)
+ {
+ curwin->w_cursor = old_pos;
+ goto theend;
+***************
+*** 3814,3820 ****
+ sprintf((char *)epat, "</%.*s>\\c", len, p);
+
+ r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"",
+! 0, NULL, (linenr_T)0);
+
+ vim_free(spat);
+ vim_free(epat);
+--- 3821,3827 ----
+ sprintf((char *)epat, "</%.*s>\\c", len, p);
+
+ r = do_searchpair(spat, (char_u *)"", epat, FORWARD, (char_u *)"",
+! 0, NULL, (linenr_T)0, 0L);
+
+ vim_free(spat);
+ vim_free(epat);
+*** ../vim-7.1.210/src/version.c Sun Jan 6 17:18:16 2008
+--- src/version.c Sun Jan 6 20:00:03 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 211,
+ /**/
+
+--
+No letters of the alphabet were harmed in the creation of this message.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.212
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.212
+Problem: Accessing a byte before a line.
+Solution: Check that the column is 1 or more. (Dominuque Pelle)
+Files: src/edit.c
+
+
+*** ../vim-7.1.211/src/edit.c Sun Jan 6 20:05:36 2008
+--- src/edit.c Mon Jan 7 22:31:36 2008
+***************
+*** 8452,8457 ****
+--- 8452,8458 ----
+ if ( mode == BACKSPACE_CHAR
+ && ((p_sta && in_indent)
+ || (curbuf->b_p_sts != 0
++ && curwin->w_cursor.col > 0
+ && (*(ml_get_cursor() - 1) == TAB
+ || (*(ml_get_cursor() - 1) == ' '
+ && (!*inserted_space_p
+*** ../vim-7.1.211/src/version.c Sun Jan 6 20:05:36 2008
+--- src/version.c Wed Jan 9 10:11:49 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 212,
+ /**/
+
+--
+CRONE: Who sent you?
+ARTHUR: The Knights Who Say Ni!
+CRONE: Aaaagh! (she looks around in rear) No! We have no shrubberies here.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.213
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.213
+Problem: A ":tabedit" command that results in the "swap file exists" dialog
+ and selecting "abort" doesn't close the new tab. (Al Budden)
+Solution: Pass "old_curwin" to do_exedit().
+Files: src/ex_docmd.c
+
+
+*** ../vim-7.1.212/src/ex_docmd.c Sun Jan 6 20:05:36 2008
+--- src/ex_docmd.c Wed Jan 9 20:11:13 2008
+***************
+*** 7126,7132 ****
+ : eap->addr_count == 0 ? 0
+ : (int)eap->line2 + 1) != FAIL)
+ {
+! do_exedit(eap, NULL);
+
+ /* set the alternate buffer for the window we came from */
+ if (curwin != old_curwin
+--- 7127,7133 ----
+ : eap->addr_count == 0 ? 0
+ : (int)eap->line2 + 1) != FAIL)
+ {
+! do_exedit(eap, old_curwin);
+
+ /* set the alternate buffer for the window we came from */
+ if (curwin != old_curwin
+*** ../vim-7.1.212/src/version.c Wed Jan 9 10:13:24 2008
+--- src/version.c Wed Jan 9 20:29:09 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 213,
+ /**/
+
+--
+Q: What do you call a fish without an eye?
+A: fsh!
+Q: What do you call a deer with no eyes?
+A: no eye deer.
+Q: What do you call a deer with no eyes and no legs?
+A: still no eye deer.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.214
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.214
+Problem: ":1s/g\n\zs1//" deletes characters from the first line. (A Politz)
+Solution: Start replacing in the line where the match starts.
+Files: src/ex_cmds.c
+
+
+*** ../vim-7.1.213/src/ex_cmds.c Fri Jan 4 14:52:14 2008
+--- src/ex_cmds.c Wed Jan 9 22:32:26 2008
+***************
+*** 4200,4206 ****
+ linenr_T old_line_count = curbuf->b_ml.ml_line_count;
+ linenr_T line2;
+ long nmatch; /* number of lines in match */
+- linenr_T sub_firstlnum; /* nr of first sub line */
+ char_u *sub_firstline; /* allocated copy of first sub line */
+ int endcolumn = FALSE; /* cursor in last column when done */
+ pos_T old_cursor = curwin->w_cursor;
+--- 4200,4205 ----
+***************
+*** 4447,4453 ****
+ #endif
+ ); ++lnum)
+ {
+- sub_firstlnum = lnum;
+ nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0);
+ if (nmatch)
+ {
+--- 4446,4451 ----
+***************
+*** 4463,4468 ****
+--- 4461,4467 ----
+ long nmatch_tl = 0; /* nr of lines matched below lnum */
+ int do_again; /* do it again after joining lines */
+ int skip_match = FALSE;
++ linenr_T sub_firstlnum; /* nr of first sub line */
+
+ /*
+ * The new text is build up step by step, to avoid too much
+***************
+*** 4482,4489 ****
+ * far.
+ * new_end The new text, where to append new text.
+ *
+! * lnum The line number where we were looking for the
+! * first match in the old line.
+ * sub_firstlnum The line number in the buffer where to look
+ * for a match. Can be different from "lnum"
+ * when the pattern or substitute string contains
+--- 4481,4490 ----
+ * far.
+ * new_end The new text, where to append new text.
+ *
+! * lnum The line number where we found the start of
+! * the match. Can be below the line we searched
+! * when there is a \n before a \zs in the
+! * pattern.
+ * sub_firstlnum The line number in the buffer where to look
+ * for a match. Can be different from "lnum"
+ * when the pattern or substitute string contains
+***************
+*** 4507,4518 ****
+ * updating the screen or handling a multi-line match. The "old_"
+ * pointers point into this copy.
+ */
+! sub_firstline = vim_strsave(ml_get(sub_firstlnum));
+! if (sub_firstline == NULL)
+! {
+! vim_free(new_start);
+! goto outofmem;
+! }
+ copycol = 0;
+ matchcol = 0;
+
+--- 4508,4514 ----
+ * updating the screen or handling a multi-line match. The "old_"
+ * pointers point into this copy.
+ */
+! sub_firstlnum = lnum;
+ copycol = 0;
+ matchcol = 0;
+
+***************
+*** 4533,4538 ****
+--- 4529,4556 ----
+ */
+ for (;;)
+ {
++ /* Advance "lnum" to the line where the match starts. The
++ * match does not start in the first line when there is a line
++ * break before \zs. */
++ if (regmatch.startpos[0].lnum > 0)
++ {
++ lnum += regmatch.startpos[0].lnum;
++ sub_firstlnum += regmatch.startpos[0].lnum;
++ nmatch -= regmatch.startpos[0].lnum;
++ vim_free(sub_firstline);
++ sub_firstline = NULL;
++ }
++
++ if (sub_firstline == NULL)
++ {
++ sub_firstline = vim_strsave(ml_get(sub_firstlnum));
++ if (sub_firstline == NULL)
++ {
++ vim_free(new_start);
++ goto outofmem;
++ }
++ }
++
+ /* Save the line number of the last change for the final
+ * cursor position (just like Vi). */
+ curwin->w_cursor.lnum = lnum;
+***************
+*** 4638,4644 ****
+ temp = RedrawingDisabled;
+ RedrawingDisabled = 0;
+
+! search_match_lines = regmatch.endpos[0].lnum;
+ search_match_endcol = regmatch.endpos[0].col;
+ highlight_match = TRUE;
+
+--- 4656,4663 ----
+ temp = RedrawingDisabled;
+ RedrawingDisabled = 0;
+
+! search_match_lines = regmatch.endpos[0].lnum
+! - regmatch.startpos[0].lnum;
+ search_match_endcol = regmatch.endpos[0].col;
+ highlight_match = TRUE;
+
+***************
+*** 4749,4755 ****
+ * 3. substitute the string.
+ */
+ /* get length of substitution part */
+! sublen = vim_regsub_multi(®match, sub_firstlnum,
+ sub, sub_firstline, FALSE, p_magic, TRUE);
+
+ /* When the match included the "$" of the last line it may
+--- 4768,4775 ----
+ * 3. substitute the string.
+ */
+ /* get length of substitution part */
+! sublen = vim_regsub_multi(®match,
+! sub_firstlnum - regmatch.startpos[0].lnum,
+ sub, sub_firstline, FALSE, p_magic, TRUE);
+
+ /* When the match included the "$" of the last line it may
+***************
+*** 4819,4825 ****
+ mch_memmove(new_end, sub_firstline + copycol, (size_t)i);
+ new_end += i;
+
+! (void)vim_regsub_multi(®match, sub_firstlnum,
+ sub, new_end, TRUE, p_magic, TRUE);
+ sub_nsubs++;
+ did_sub = TRUE;
+--- 4839,4846 ----
+ mch_memmove(new_end, sub_firstline + copycol, (size_t)i);
+ new_end += i;
+
+! (void)vim_regsub_multi(®match,
+! sub_firstlnum - regmatch.startpos[0].lnum,
+ sub, new_end, TRUE, p_magic, TRUE);
+ sub_nsubs++;
+ did_sub = TRUE;
+***************
+*** 4908,4917 ****
+ skip:
+ /* We already know that we did the last subst when we are at
+ * the end of the line, except that a pattern like
+! * "bar\|\nfoo" may match at the NUL. */
+ lastone = (skip_match
+ || got_int
+ || got_quit
+ || !(do_all || do_again)
+ || (sub_firstline[matchcol] == NUL && nmatch <= 1
+ && !re_multiline(regmatch.regprog)));
+--- 4929,4941 ----
+ skip:
+ /* We already know that we did the last subst when we are at
+ * the end of the line, except that a pattern like
+! * "bar\|\nfoo" may match at the NUL. "lnum" can be below
+! * "line2" when there is a \zs in the pattern after a line
+! * break. */
+ lastone = (skip_match
+ || got_int
+ || got_quit
++ || lnum > line2
+ || !(do_all || do_again)
+ || (sub_firstline[matchcol] == NUL && nmatch <= 1
+ && !re_multiline(regmatch.regprog)));
+***************
+*** 4926,4937 ****
+ * When asking the user we like to show the already replaced
+ * text, but don't do it when "\<@=" or "\<@!" is used, it
+ * changes what matches.
+ */
+ if (lastone
+ || (do_ask && !re_lookbehind(regmatch.regprog))
+ || nmatch_tl > 0
+ || (nmatch = vim_regexec_multi(®match, curwin,
+! curbuf, sub_firstlnum, matchcol)) == 0)
+ {
+ if (new_start != NULL)
+ {
+--- 4950,4964 ----
+ * When asking the user we like to show the already replaced
+ * text, but don't do it when "\<@=" or "\<@!" is used, it
+ * changes what matches.
++ * When the match starts below where we start searching also
++ * need to replace the line first (using \zs after \n).
+ */
+ if (lastone
+ || (do_ask && !re_lookbehind(regmatch.regprog))
+ || nmatch_tl > 0
+ || (nmatch = vim_regexec_multi(®match, curwin,
+! curbuf, sub_firstlnum, matchcol)) == 0
+! || regmatch.startpos[0].lnum > 0)
+ {
+ if (new_start != NULL)
+ {
+***************
+*** 5001,5007 ****
+--- 5028,5041 ----
+ * 5. break if there isn't another match in this line
+ */
+ if (nmatch <= 0)
++ {
++ /* If the match found didn't start where we were
++ * searching, do the next search in the line where we
++ * found the match. */
++ if (nmatch == -1)
++ lnum -= regmatch.startpos[0].lnum;
+ break;
++ }
+ }
+
+ line_breakcheck();
+*** ../vim-7.1.213/src/version.c Wed Jan 9 20:29:51 2008
+--- src/version.c Wed Jan 9 22:37:47 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 214,
+ /**/
+
+--
+Q: What's orange and sounds like a parrot?
+A: A carrot
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.215
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.215
+Problem: It is difficult to figure out what syntax items are nested at a
+ certain position.
+Solution: Add the synstack() function.
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/syntax.pro,
+ src/syntax.c
+
+
+*** ../vim-7.1.214/runtime/doc/eval.txt Sun Jan 6 20:05:36 2008
+--- runtime/doc/eval.txt Thu Jan 10 22:20:31 2008
+***************
+*** 1,4 ****
+! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 06
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 10
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 1786,1791 ****
+--- 1786,1792 ----
+ synIDattr( {synID}, {what} [, {mode}])
+ String attribute {what} of syntax ID {synID}
+ synIDtrans( {synID}) Number translated syntax ID of {synID}
++ synstack({lnum}, {col}) List stack of syntax IDs at {lnum} and {col}
+ system( {expr} [, {input}]) String output of shell command/filter {expr}
+ tabpagebuflist( [{arg}]) List list of buffer numbers in tab page
+ tabpagenr( [{arg}]) Number number of current or last tab page
+***************
+*** 4962,4967 ****
+--- 4966,4989 ----
+ highlight the character. Highlight links given with
+ ":highlight link" are followed.
+
++ synstack({lnum}, {col}) *synstack()*
++ Return a |List|, which is the stack of syntax items at the
++ position {lnum} and {col} in the current window. Each item in
++ the List is an ID like what |synID()| returns.
++ The stack is the situation in between the character at "col"
++ and the next character. Note that a region of only one
++ character will not show up, it only exists inside that
++ character, not in between characters.
++ The first item in the List is the outer region, following are
++ items contained in that one. The last one is what |synID()|
++ returns, unless not the whole item is highlighted or it is a
++ transparent item.
++ This function is useful for debugging a syntax file.
++ Example that shows the syntax stack under the cursor: >
++ for id in synstack(line("."), col("."))
++ echo synIDattr(id, "name")
++ endfor
++
+ system({expr} [, {input}]) *system()* *E677*
+ Get the output of the shell command {expr}.
+ When {input} is given, this string is written to a file and
+*** ../vim-7.1.214/src/eval.c Sun Jan 6 20:05:36 2008
+--- src/eval.c Wed Jan 9 13:42:56 2008
+***************
+*** 651,656 ****
+--- 651,657 ----
+ static void f_synID __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_synIDattr __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_synIDtrans __ARGS((typval_T *argvars, typval_T *rettv));
++ static void f_synstack __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_system __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_tabpagebuflist __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv));
+***************
+*** 7252,7257 ****
+--- 7253,7259 ----
+ {"synID", 3, 3, f_synID},
+ {"synIDattr", 2, 3, f_synIDattr},
+ {"synIDtrans", 1, 1, f_synIDtrans},
++ {"synstack", 2, 2, f_synstack},
+ {"system", 1, 2, f_system},
+ {"tabpagebuflist", 0, 1, f_tabpagebuflist},
+ {"tabpagenr", 0, 1, f_tabpagenr},
+***************
+*** 15843,15848 ****
+--- 15845,15890 ----
+ id = 0;
+
+ rettv->vval.v_number = id;
++ }
++
++ /*
++ * "synstack(lnum, col)" function
++ */
++ /*ARGSUSED*/
++ static void
++ f_synstack(argvars, rettv)
++ typval_T *argvars;
++ typval_T *rettv;
++ {
++ #ifdef FEAT_SYN_HL
++ long lnum;
++ long col;
++ int i;
++ int id;
++ #endif
++
++ rettv->v_type = VAR_LIST;
++ rettv->vval.v_list = NULL;
++
++ #ifdef FEAT_SYN_HL
++ lnum = get_tv_lnum(argvars); /* -1 on type error */
++ col = get_tv_number(&argvars[1]) - 1; /* -1 on type error */
++
++ if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
++ && col >= 0 && col < (long)STRLEN(ml_get(lnum))
++ && rettv_list_alloc(rettv) != FAIL)
++ {
++ (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL);
++ for (i = 0; ; ++i)
++ {
++ id = syn_get_stack_item(i);
++ if (id < 0)
++ break;
++ if (list_append_number(rettv->vval.v_list, id) == FAIL)
++ break;
++ }
++ }
++ #endif
+ }
+
+ /*
+*** ../vim-7.1.214/src/proto/syntax.pro Tue Jul 24 14:32:44 2007
+--- src/proto/syntax.pro Wed Jan 9 13:38:20 2008
+***************
+*** 13,18 ****
+--- 13,19 ----
+ void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg));
+ char_u *get_syntax_name __ARGS((expand_T *xp, int idx));
+ int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp));
++ int syn_get_stack_item __ARGS((int i));
+ int syn_get_foldlevel __ARGS((win_T *wp, long lnum));
+ void init_highlight __ARGS((int both, int reset));
+ int load_colors __ARGS((char_u *name));
+*** ../vim-7.1.214/src/syntax.c Sun Oct 7 15:21:31 2007
+--- src/syntax.c Wed Jan 9 15:17:47 2008
+***************
+*** 6104,6109 ****
+--- 6102,6123 ----
+
+ return (trans ? current_trans_id : current_id);
+ }
++
++ #if defined(FEAT_EVAL) || defined(PROTO)
++ /*
++ * Return the syntax ID at position "i" in the current stack.
++ * The caller must have called syn_get_id() before to fill the stack.
++ * Returns -1 when "i" is out of range.
++ */
++ int
++ syn_get_stack_item(i)
++ int i;
++ {
++ if (i >= current_state.ga_len )
++ return -1;
++ return CUR_STATE(i).si_id;
++ }
++ #endif
+
+ #if defined(FEAT_FOLDING) || defined(PROTO)
+ /*
+*** ../vim-7.1.214/src/version.c Wed Jan 9 22:39:55 2008
+--- src/version.c Thu Jan 10 22:17:38 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 215,
+ /**/
+
+--
+TALL KNIGHT: We are now no longer the Knights Who Say Ni!
+ONE KNIGHT: Ni!
+OTHERS: Sh!
+ONE KNIGHT: (whispers) Sorry.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.216
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.216
+Problem: Variants of --remote-tab are not mentioned for "vim --help".
+Solution: Display optional -wait and -silent.
+Files: src/main.c
+
+
+*** ../vim-7.1.215/src/main.c Tue Sep 25 17:54:41 2007
+--- src/main.c Sun Dec 30 15:09:11 2007
+***************
+*** 3081,3087 ****
+ main_msg(_("--remote-wait <files> As --remote but wait for files to have been edited"));
+ main_msg(_("--remote-wait-silent <files> Same, don't complain if there is no server"));
+ # ifdef FEAT_WINDOWS
+! main_msg(_("--remote-tab <files> As --remote but open tab page for each file"));
+ # endif
+ main_msg(_("--remote-send <keys>\tSend <keys> to a Vim server and exit"));
+ main_msg(_("--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"));
+--- 3081,3087 ----
+ main_msg(_("--remote-wait <files> As --remote but wait for files to have been edited"));
+ main_msg(_("--remote-wait-silent <files> Same, don't complain if there is no server"));
+ # ifdef FEAT_WINDOWS
+! main_msg(_("--remote-tab[-wait][-silent] <files> As --remote but use tab page per file"));
+ # endif
+ main_msg(_("--remote-send <keys>\tSend <keys> to a Vim server and exit"));
+ main_msg(_("--remote-expr <expr>\tEvaluate <expr> in a Vim server and print result"));
+*** ../vim-7.1.215/src/version.c Thu Jan 10 22:23:22 2008
+--- src/version.c Fri Jan 11 20:25:14 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 216,
+ /**/
+
+--
+TIM: But follow only if you are men of valour. For the entrance to this cave
+ is guarded by a monster, a creature so foul and cruel that no man yet has
+ fought with it and lived. Bones of full fifty men lie strewn about its
+ lair ...
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.217
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.217
+Problem: The "help-tags" tag may be missing from runtime/doc/tags when it
+ was generated during "make install".
+Solution: Add the "++t" argument to ":helptags" to force adding the tag.
+Files: runtime/doc/Makefile, runtime/doc/various.txt, src/ex_cmds.c,
+ src/ex_cmds.h
+
+
+*** ../vim-7.1.216/runtime/doc/Makefile Sat May 5 19:14:15 2007
+--- runtime/doc/Makefile Fri Jan 11 20:55:34 2008
+***************
+*** 301,307 ****
+ # Use Vim to generate the tags file. Can only be used when Vim has been
+ # compiled and installed. Supports multiple languages.
+ vimtags: $(DOCS)
+! $(VIMEXE) -u NONE -esX -c "helptags ." -c quit
+
+ # Use "doctags" to generate the tags file. Only works for English!
+ tags: doctags $(DOCS)
+--- 301,307 ----
+ # Use Vim to generate the tags file. Can only be used when Vim has been
+ # compiled and installed. Supports multiple languages.
+ vimtags: $(DOCS)
+! $(VIMEXE) -u NONE -esX -c "helptags ++t ." -c quit
+
+ # Use "doctags" to generate the tags file. Only works for English!
+ tags: doctags $(DOCS)
+*** ../vim-7.1.216/runtime/doc/various.txt Sat May 12 17:05:26 2007
+--- runtime/doc/various.txt Fri Jan 11 20:45:45 2008
+***************
+*** 1,4 ****
+! *various.txt* For Vim version 7.1. Last change: 2007 Jan 14
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *various.txt* For Vim version 7.1. Last change: 2008 Jan 11
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 748,754 ****
+
+ *:helpt* *:helptags*
+ *E154* *E150* *E151* *E152* *E153* *E670*
+! :helpt[ags] {dir} Generate the help tags file(s) for directory {dir}.
+ All "*.txt" and "*.??x" files in the directory are
+ scanned for a help tag definition in between stars.
+ The "*.??x" files are for translated docs, they
+--- 754,761 ----
+
+ *:helpt* *:helptags*
+ *E154* *E150* *E151* *E152* *E153* *E670*
+! :helpt[ags] [++t] {dir}
+! Generate the help tags file(s) for directory {dir}.
+ All "*.txt" and "*.??x" files in the directory are
+ scanned for a help tag definition in between stars.
+ The "*.??x" files are for translated docs, they
+***************
+*** 756,761 ****
+--- 763,771 ----
+ The generated tags files are sorted.
+ When there are duplicates an error message is given.
+ An existing tags file is silently overwritten.
++ The optional "++t" argument forces adding the
++ "help-tags" tag. This is also done when the {dir} is
++ equal to $VIMRUNTIME/doc.
+ To rebuild the help tags in the runtime directory
+ (requires write permission there): >
+ :helptags $VIMRUNTIME/doc
+*** ../vim-7.1.216/src/ex_cmds.c Wed Jan 9 22:39:55 2008
+--- src/ex_cmds.c Fri Jan 11 20:47:13 2008
+***************
+*** 6091,6097 ****
+ }
+
+ #if defined(FEAT_EX_EXTRA) || defined(PROTO)
+! static void helptags_one __ARGS((char_u *dir, char_u *ext, char_u *lang));
+
+ /*
+ * ":helptags"
+--- 6091,6097 ----
+ }
+
+ #if defined(FEAT_EX_EXTRA) || defined(PROTO)
+! static void helptags_one __ARGS((char_u *dir, char_u *ext, char_u *lang, int add_help_tags));
+
+ /*
+ * ":helptags"
+***************
+*** 6110,6115 ****
+--- 6110,6123 ----
+ char_u fname[8];
+ int filecount;
+ char_u **files;
++ int add_help_tags = FALSE;
++
++ /* Check for ":helptags ++t {dir}". */
++ if (STRNCMP(eap->arg, "++t", 3) == 0 && vim_iswhite(eap->arg[3]))
++ {
++ add_help_tags = TRUE;
++ eap->arg = skipwhite(eap->arg + 3);
++ }
+
+ if (!mch_isdir(eap->arg))
+ {
+***************
+*** 6192,6198 ****
+ ext[1] = fname[5];
+ ext[2] = fname[6];
+ }
+! helptags_one(eap->arg, ext, fname);
+ }
+
+ ga_clear(&ga);
+--- 6200,6206 ----
+ ext[1] = fname[5];
+ ext[2] = fname[6];
+ }
+! helptags_one(eap->arg, ext, fname, add_help_tags);
+ }
+
+ ga_clear(&ga);
+***************
+*** 6200,6214 ****
+
+ #else
+ /* No language support, just use "*.txt" and "tags". */
+! helptags_one(eap->arg, (char_u *)".txt", (char_u *)"tags");
+ #endif
+ }
+
+ static void
+! helptags_one(dir, ext, tagfname)
+! char_u *dir; /* doc directory */
+! char_u *ext; /* suffix, ".txt", ".itx", ".frx", etc. */
+! char_u *tagfname; /* "tags" for English, "tags-it" for Italian. */
+ {
+ FILE *fd_tags;
+ FILE *fd;
+--- 6208,6223 ----
+
+ #else
+ /* No language support, just use "*.txt" and "tags". */
+! helptags_one(eap->arg, (char_u *)".txt", (char_u *)"tags", add_help_tags);
+ #endif
+ }
+
+ static void
+! helptags_one(dir, ext, tagfname, add_help_tags)
+! char_u *dir; /* doc directory */
+! char_u *ext; /* suffix, ".txt", ".itx", ".frx", etc. */
+! char_u *tagfname; /* "tags" for English, "tags-fr" for French. */
+! int add_help_tags; /* add "help-tags" tag */
+ {
+ FILE *fd_tags;
+ FILE *fd;
+***************
+*** 6259,6268 ****
+ }
+
+ /*
+! * If generating tags for "$VIMRUNTIME/doc" add the "help-tags" tag.
+ */
+ ga_init2(&ga, (int)sizeof(char_u *), 100);
+! if (fullpathcmp((char_u *)"$VIMRUNTIME/doc", dir, FALSE) == FPC_SAME)
+ {
+ if (ga_grow(&ga, 1) == FAIL)
+ got_int = TRUE;
+--- 6268,6279 ----
+ }
+
+ /*
+! * If using the "++t" argument or generating tags for "$VIMRUNTIME/doc"
+! * add the "help-tags" tag.
+ */
+ ga_init2(&ga, (int)sizeof(char_u *), 100);
+! if (add_help_tags || fullpathcmp((char_u *)"$VIMRUNTIME/doc",
+! dir, FALSE) == FPC_SAME)
+ {
+ if (ga_grow(&ga, 1) == FAIL)
+ got_int = TRUE;
+*** ../vim-7.1.216/src/ex_cmds.h Thu Mar 8 11:00:55 2007
+--- src/ex_cmds.h Fri Jan 11 20:49:18 2008
+***************
+*** 422,428 ****
+ EX(CMD_helpgrep, "helpgrep", ex_helpgrep,
+ EXTRA|NOTRLCOM|NEEDARG),
+ EX(CMD_helptags, "helptags", ex_helptags,
+! NEEDARG|FILE1|TRLBAR|CMDWIN),
+ EX(CMD_hardcopy, "hardcopy", ex_hardcopy,
+ RANGE|COUNT|EXTRA|TRLBAR|DFLALL|BANG),
+ EX(CMD_highlight, "highlight", ex_highlight,
+--- 422,428 ----
+ EX(CMD_helpgrep, "helpgrep", ex_helpgrep,
+ EXTRA|NOTRLCOM|NEEDARG),
+ EX(CMD_helptags, "helptags", ex_helptags,
+! NEEDARG|FILES|TRLBAR|CMDWIN),
+ EX(CMD_hardcopy, "hardcopy", ex_hardcopy,
+ RANGE|COUNT|EXTRA|TRLBAR|DFLALL|BANG),
+ EX(CMD_highlight, "highlight", ex_highlight,
+*** ../vim-7.1.216/src/version.c Fri Jan 11 20:25:42 2008
+--- src/version.c Fri Jan 11 20:58:44 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 217,
+ /**/
+
+--
+My girlfriend told me I should be more affectionate.
+So I got TWO girlfriends.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.218
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.218
+Problem: A syntax region without a "keepend", containing a region with
+ "extend" could be truncated at the end of the containing region.
+Solution: Do not call syn_update_ends() when there are no keepend items.
+Files: src/syntax.c
+
+
+*** ../vim-7.1.217/src/syntax.c Thu Jan 10 22:23:22 2008
+--- src/syntax.c Wed Jan 9 15:17:47 2008
+***************
+*** 2495,2501 ****
+ if (current_state.ga_len == 0)
+ break;
+
+! if (had_extend)
+ {
+ syn_update_ends(FALSE);
+ if (current_state.ga_len == 0)
+--- 2493,2499 ----
+ if (current_state.ga_len == 0)
+ break;
+
+! if (had_extend && keepend_level >= 0)
+ {
+ syn_update_ends(FALSE);
+ if (current_state.ga_len == 0)
+*** ../vim-7.1.217/src/version.c Fri Jan 11 21:00:49 2008
+--- src/version.c Fri Jan 11 21:25:46 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 218,
+ /**/
+
+--
+The Law of VIM:
+For each member b of the possible behaviour space B of program P, there exists
+a finite time t before which at least one user u in the total user space U of
+program P will request b becomes a member of the allowed behaviour space B'
+(B' <= B).
+In other words: Sooner or later everyone wants everything as an option.
+ -- Vince Negri
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.219
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.219 (after 7.1.215)
+Problem: synstack() returns situation after the current character, can't
+ see the state for a one-character region.
+Solution: Don't update ending states in the requested column.
+Files: runtime/doc/eval.txt, src/eval.c, src/hardcopy.c,
+ src/proto/syntax.pro, src/screen.c, src/spell.c, src/syntax.c
+
+
+*** ../vim-7.1.218/runtime/doc/eval.txt Thu Jan 10 22:23:22 2008
+--- runtime/doc/eval.txt Fri Jan 11 22:04:59 2008
+***************
+*** 1,4 ****
+! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 10
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+--- 1,4 ----
+! *eval.txt* For Vim version 7.1. Last change: 2008 Jan 11
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+***************
+*** 4967,4976 ****
+ Return a |List|, which is the stack of syntax items at the
+ position {lnum} and {col} in the current window. Each item in
+ the List is an ID like what |synID()| returns.
+- The stack is the situation in between the character at "col"
+- and the next character. Note that a region of only one
+- character will not show up, it only exists inside that
+- character, not in between characters.
+ The first item in the List is the outer region, following are
+ items contained in that one. The last one is what |synID()|
+ returns, unless not the whole item is highlighted or it is a
+--- 4970,4975 ----
+*** ../vim-7.1.218/src/eval.c Thu Jan 10 22:23:22 2008
+--- src/eval.c Fri Jan 11 21:46:12 2008
+***************
+*** 15725,15731 ****
+
+ if (!transerr && lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
+ && col >= 0 && col < (long)STRLEN(ml_get(lnum)))
+! id = syn_get_id(curwin, lnum, (colnr_T)col, trans, NULL);
+ #endif
+
+ rettv->vval.v_number = id;
+--- 15725,15731 ----
+
+ if (!transerr && lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count
+ && col >= 0 && col < (long)STRLEN(ml_get(lnum)))
+! id = syn_get_id(curwin, lnum, (colnr_T)col, trans, NULL, FALSE);
+ #endif
+
+ rettv->vval.v_number = id;
+***************
+*** 15874,15880 ****
+ && col >= 0 && col < (long)STRLEN(ml_get(lnum))
+ && rettv_list_alloc(rettv) != FAIL)
+ {
+! (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL);
+ for (i = 0; ; ++i)
+ {
+ id = syn_get_stack_item(i);
+--- 15874,15880 ----
+ && col >= 0 && col < (long)STRLEN(ml_get(lnum))
+ && rettv_list_alloc(rettv) != FAIL)
+ {
+! (void)syn_get_id(curwin, lnum, (colnr_T)col, FALSE, NULL, TRUE);
+ for (i = 0; ; ++i)
+ {
+ id = syn_get_stack_item(i);
+*** ../vim-7.1.218/src/hardcopy.c Thu May 10 20:40:02 2007
+--- src/hardcopy.c Fri Jan 11 21:46:20 2008
+***************
+*** 876,882 ****
+ */
+ if (psettings->do_syntax)
+ {
+! id = syn_get_id(curwin, ppos->file_line, col, 1, NULL);
+ if (id > 0)
+ id = syn_get_final_id(id);
+ else
+--- 876,882 ----
+ */
+ if (psettings->do_syntax)
+ {
+! id = syn_get_id(curwin, ppos->file_line, col, 1, NULL, FALSE);
+ if (id > 0)
+ id = syn_get_final_id(id);
+ else
+*** ../vim-7.1.218/src/proto/syntax.pro Thu Jan 10 22:23:22 2008
+--- src/proto/syntax.pro Fri Jan 11 21:54:19 2008
+***************
+*** 4,10 ****
+ void syn_stack_apply_changes __ARGS((buf_T *buf));
+ void syntax_end_parsing __ARGS((linenr_T lnum));
+ int syntax_check_changed __ARGS((linenr_T lnum));
+! int get_syntax_attr __ARGS((colnr_T col, int *can_spell));
+ void syntax_clear __ARGS((buf_T *buf));
+ void ex_syntax __ARGS((exarg_T *eap));
+ int syntax_present __ARGS((buf_T *buf));
+--- 4,10 ----
+ void syn_stack_apply_changes __ARGS((buf_T *buf));
+ void syntax_end_parsing __ARGS((linenr_T lnum));
+ int syntax_check_changed __ARGS((linenr_T lnum));
+! int get_syntax_attr __ARGS((colnr_T col, int *can_spell, int keep_state));
+ void syntax_clear __ARGS((buf_T *buf));
+ void ex_syntax __ARGS((exarg_T *eap));
+ int syntax_present __ARGS((buf_T *buf));
+***************
+*** 12,18 ****
+ void set_context_in_echohl_cmd __ARGS((expand_T *xp, char_u *arg));
+ void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg));
+ char_u *get_syntax_name __ARGS((expand_T *xp, int idx));
+! int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp));
+ int syn_get_stack_item __ARGS((int i));
+ int syn_get_foldlevel __ARGS((win_T *wp, long lnum));
+ void init_highlight __ARGS((int both, int reset));
+--- 12,18 ----
+ void set_context_in_echohl_cmd __ARGS((expand_T *xp, char_u *arg));
+ void set_context_in_syntax_cmd __ARGS((expand_T *xp, char_u *arg));
+ char_u *get_syntax_name __ARGS((expand_T *xp, int idx));
+! int syn_get_id __ARGS((win_T *wp, long lnum, colnr_T col, int trans, int *spellp, int keep_state));
+ int syn_get_stack_item __ARGS((int i));
+ int syn_get_foldlevel __ARGS((win_T *wp, long lnum));
+ void init_highlight __ARGS((int both, int reset));
+*** ../vim-7.1.218/src/screen.c Thu Nov 8 21:23:34 2007
+--- src/screen.c Fri Jan 11 21:48:10 2008
+***************
+*** 3885,3891 ****
+ # ifdef FEAT_SPELL
+ has_spell ? &can_spell :
+ # endif
+! NULL);
+
+ if (did_emsg)
+ {
+--- 3885,3891 ----
+ # ifdef FEAT_SPELL
+ has_spell ? &can_spell :
+ # endif
+! NULL, FALSE);
+
+ if (did_emsg)
+ {
+*** ../vim-7.1.218/src/spell.c Sun Aug 5 18:32:21 2007
+--- src/spell.c Fri Jan 11 21:46:50 2008
+***************
+*** 2146,2152 ****
+ {
+ col = (int)(p - buf);
+ (void)syn_get_id(wp, lnum, (colnr_T)col,
+! FALSE, &can_spell);
+ if (!can_spell)
+ attr = HLF_COUNT;
+ }
+--- 2146,2152 ----
+ {
+ col = (int)(p - buf);
+ (void)syn_get_id(wp, lnum, (colnr_T)col,
+! FALSE, &can_spell, FALSE);
+ if (!can_spell)
+ attr = HLF_COUNT;
+ }
+*** ../vim-7.1.218/src/syntax.c Fri Jan 11 21:26:49 2008
+--- src/syntax.c Sat Jan 12 16:42:25 2008
+***************
+*** 378,384 ****
+ static int syn_stack_equal __ARGS((synstate_T *sp));
+ static void validate_current_state __ARGS((void));
+ static int syn_finish_line __ARGS((int syncing));
+! static int syn_current_attr __ARGS((int syncing, int displaying, int *can_spell));
+ static int did_match_already __ARGS((int idx, garray_T *gap));
+ static stateitem_T *push_next_match __ARGS((stateitem_T *cur_si));
+ static void check_state_ends __ARGS((void));
+--- 378,384 ----
+ static int syn_stack_equal __ARGS((synstate_T *sp));
+ static void validate_current_state __ARGS((void));
+ static int syn_finish_line __ARGS((int syncing));
+! static int syn_current_attr __ARGS((int syncing, int displaying, int *can_spell, int keep_state));
+ static int did_match_already __ARGS((int idx, garray_T *gap));
+ static stateitem_T *push_next_match __ARGS((stateitem_T *cur_si));
+ static void check_state_ends __ARGS((void));
+***************
+*** 1691,1697 ****
+ {
+ while (!current_finished)
+ {
+! (void)syn_current_attr(syncing, FALSE, NULL);
+ /*
+ * When syncing, and found some item, need to check the item.
+ */
+--- 1690,1696 ----
+ {
+ while (!current_finished)
+ {
+! (void)syn_current_attr(syncing, FALSE, NULL, FALSE);
+ /*
+ * When syncing, and found some item, need to check the item.
+ */
+***************
+*** 1731,1739 ****
+ * done.
+ */
+ int
+! get_syntax_attr(col, can_spell)
+ colnr_T col;
+ int *can_spell;
+ {
+ int attr = 0;
+
+--- 1730,1739 ----
+ * done.
+ */
+ int
+! get_syntax_attr(col, can_spell, keep_state)
+ colnr_T col;
+ int *can_spell;
++ int keep_state; /* keep state of char at "col" */
+ {
+ int attr = 0;
+
+***************
+*** 1768,1774 ****
+ */
+ while (current_col <= col)
+ {
+! attr = syn_current_attr(FALSE, TRUE, can_spell);
+ ++current_col;
+ }
+
+--- 1768,1775 ----
+ */
+ while (current_col <= col)
+ {
+! attr = syn_current_attr(FALSE, TRUE, can_spell,
+! current_col == col ? keep_state : FALSE);
+ ++current_col;
+ }
+
+***************
+*** 1779,1788 ****
+ * Get syntax attributes for current_lnum, current_col.
+ */
+ static int
+! syn_current_attr(syncing, displaying, can_spell)
+ int syncing; /* When 1: called for syncing */
+ int displaying; /* result will be displayed */
+ int *can_spell; /* return: do spell checking */
+ {
+ int syn_id;
+ lpos_T endpos; /* was: char_u *endp; */
+--- 1780,1790 ----
+ * Get syntax attributes for current_lnum, current_col.
+ */
+ static int
+! syn_current_attr(syncing, displaying, can_spell, keep_state)
+ int syncing; /* When 1: called for syncing */
+ int displaying; /* result will be displayed */
+ int *can_spell; /* return: do spell checking */
++ int keep_state; /* keep syntax stack afterwards */
+ {
+ int syn_id;
+ lpos_T endpos; /* was: char_u *endp; */
+***************
+*** 2298,2304 ****
+ * may be for an empty match and a containing item might end in the
+ * current column.
+ */
+! if (!syncing)
+ {
+ check_state_ends();
+ if (current_state.ga_len > 0
+--- 2300,2306 ----
+ * may be for an empty match and a containing item might end in the
+ * current column.
+ */
+! if (!syncing && !keep_state)
+ {
+ check_state_ends();
+ if (current_state.ga_len > 0
+***************
+*** 6086,6097 ****
+ * Function called for expression evaluation: get syntax ID at file position.
+ */
+ int
+! syn_get_id(wp, lnum, col, trans, spellp)
+ win_T *wp;
+ long lnum;
+ colnr_T col;
+! int trans; /* remove transparancy */
+! int *spellp; /* return: can do spell checking */
+ {
+ /* When the position is not after the current position and in the same
+ * line of the same buffer, need to restart parsing. */
+--- 6088,6100 ----
+ * Function called for expression evaluation: get syntax ID at file position.
+ */
+ int
+! syn_get_id(wp, lnum, col, trans, spellp, keep_state)
+ win_T *wp;
+ long lnum;
+ colnr_T col;
+! int trans; /* remove transparancy */
+! int *spellp; /* return: can do spell checking */
+! int keep_state; /* keep state of char at "col" */
+ {
+ /* When the position is not after the current position and in the same
+ * line of the same buffer, need to restart parsing. */
+***************
+*** 6100,6106 ****
+ || col < current_col)
+ syntax_start(wp, lnum);
+
+! (void)get_syntax_attr(col, spellp);
+
+ return (trans ? current_trans_id : current_id);
+ }
+--- 6103,6109 ----
+ || col < current_col)
+ syntax_start(wp, lnum);
+
+! (void)get_syntax_attr(col, spellp, keep_state);
+
+ return (trans ? current_trans_id : current_id);
+ }
+***************
+*** 6115,6122 ****
+ syn_get_stack_item(i)
+ int i;
+ {
+! if (i >= current_state.ga_len )
+ return -1;
+ return CUR_STATE(i).si_id;
+ }
+ #endif
+--- 6118,6131 ----
+ syn_get_stack_item(i)
+ int i;
+ {
+! if (i >= current_state.ga_len)
+! {
+! /* Need to invalidate the state, because we didn't properly finish it
+! * for the last character, "keep_state" was TRUE. */
+! invalidate_current_state();
+! current_col = MAXCOL;
+ return -1;
++ }
+ return CUR_STATE(i).si_id;
+ }
+ #endif
+*** ../vim-7.1.218/src/version.c Fri Jan 11 21:26:49 2008
+--- src/version.c Sat Jan 12 16:40:47 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 219,
+ /**/
+
+--
+ARTHUR: Go on, Bors, chop its head off.
+BORS: Right. Silly little bleeder. One rabbit stew coming up.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.220
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.220
+Problem: When a ")" or word movement command moves the cursor back from the
+ end of the line it may end up on the trail byte of a multi-byte
+ character. It's also moved back when it isn't needed.
+Solution: Add the adjust_cursor() function.
+Files: src/normal.c
+
+
+*** ../vim-7.1.219/src/normal.c Sun Jan 6 20:05:36 2008
+--- src/normal.c Sat Jan 12 17:10:14 2008
+***************
+*** 150,155 ****
+--- 150,156 ----
+ static void nv_bck_word __ARGS((cmdarg_T *cap));
+ static void nv_wordcmd __ARGS((cmdarg_T *cap));
+ static void nv_beginline __ARGS((cmdarg_T *cap));
++ static void adjust_cursor __ARGS((oparg_T *oap));
+ #ifdef FEAT_VISUAL
+ static void adjust_for_sel __ARGS((cmdarg_T *cap));
+ static int unadjust_for_sel __ARGS((void));
+***************
+*** 6567,6578 ****
+ clearopbeep(cap->oap);
+ else
+ {
+! /* Don't leave the cursor on the NUL past a line */
+! if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL)
+! {
+! --curwin->w_cursor.col;
+! cap->oap->inclusive = TRUE;
+! }
+ #ifdef FEAT_VIRTUALEDIT
+ curwin->w_cursor.coladd = 0;
+ #endif
+--- 6568,6575 ----
+ clearopbeep(cap->oap);
+ else
+ {
+! /* Don't leave the cursor on the NUL past end of line. */
+! adjust_cursor(cap->oap);
+ #ifdef FEAT_VIRTUALEDIT
+ curwin->w_cursor.coladd = 0;
+ #endif
+***************
+*** 8408,8419 ****
+ else
+ n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP);
+
+! /* Don't leave the cursor on the NUL past a line */
+! if (n != FAIL && curwin->w_cursor.col > 0 && gchar_cursor() == NUL)
+! {
+! --curwin->w_cursor.col;
+! cap->oap->inclusive = TRUE;
+! }
+
+ if (n == FAIL && cap->oap->op_type == OP_NOP)
+ clearopbeep(cap->oap);
+--- 8405,8413 ----
+ else
+ n = fwd_word(cap->count1, cap->arg, cap->oap->op_type != OP_NOP);
+
+! /* Don't leave the cursor on the NUL past the end of line. */
+! if (n != FAIL)
+! adjust_cursor(cap->oap);
+
+ if (n == FAIL && cap->oap->op_type == OP_NOP)
+ clearopbeep(cap->oap);
+***************
+*** 8426,8431 ****
+--- 8420,8458 ----
+ if ((fdo_flags & FDO_HOR) && KeyTyped && cap->oap->op_type == OP_NOP)
+ foldOpenCursor();
+ #endif
++ }
++ }
++
++ /*
++ * Used after a movement command: If the cursor ends up on the NUL after the
++ * end of the line, may move it back to the last character and make the motion
++ * inclusive.
++ */
++ static void
++ adjust_cursor(oap)
++ oparg_T *oap;
++ {
++ /* The cursor cannot remain on the NUL when:
++ * - the column is > 0
++ * - not in Visual mode or 'selection' is "o"
++ * - 'virtualedit' is not "all" and not "onemore".
++ */
++ if (curwin->w_cursor.col > 0 && gchar_cursor() == NUL
++ #ifdef FEAT_VISUAL
++ && (!VIsual_active || *p_sel == 'o')
++ #endif
++ #ifdef FEAT_VIRTUALEDIT
++ && !virtual_active() && (ve_flags & VE_ONEMORE) == 0
++ #endif
++ )
++ {
++ --curwin->w_cursor.col;
++ #ifdef FEAT_MBYTE
++ /* prevent cursor from moving on the trail byte */
++ if (has_mbyte)
++ mb_adjust_cursor();
++ #endif
++ oap->inclusive = TRUE;
+ }
+ }
+
+*** ../vim-7.1.219/src/version.c Sat Jan 12 16:45:25 2008
+--- src/version.c Sat Jan 12 17:07:28 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 220,
+ /**/
+
+--
+A hamburger walks into a bar, and the bartender says: "I'm sorry,
+but we don't serve food here."
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.221
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.221
+Problem: When inserting a "(", triggering the matchparen plugin, the
+ following highlighting may be messed up.
+Solution: Before triggering the CursorMovedI autocommands update the display
+ to update the stored syntax stacks for the change.
+Files: src/edit.c
+
+
+*** ../vim-7.1.220/src/edit.c Wed Jan 9 10:13:24 2008
+--- src/edit.c Sat Jan 12 16:07:41 2008
+***************
+*** 1455,1460 ****
+--- 1455,1468 ----
+ # endif
+ )
+ {
++ # ifdef FEAT_SYN_HL
++ /* Need to update the screen first, to make sure syntax
++ * highlighting is correct after making a change (e.g., inserting
++ * a "(". The autocommand may also require a redraw, so it's done
++ * again below, unfortunately. */
++ if (syntax_present(curbuf) && must_redraw)
++ update_screen(0);
++ # endif
+ apply_autocmds(EVENT_CURSORMOVEDI, NULL, NULL, FALSE, curbuf);
+ last_cursormoved = curwin->w_cursor;
+ }
+*** ../vim-7.1.220/src/version.c Sat Jan 12 17:11:25 2008
+--- src/version.c Sat Jan 12 18:11:22 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 221,
+ /**/
+
+--
+ROBIN: The what?
+ARTHUR: The Holy Hand Grenade of Antioch. 'Tis one of the sacred relics
+ Brother Maynard always carries with him.
+ALL: Yes. Of course.
+ARTHUR: (shouting) Bring up the Holy Hand Grenade!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.222
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.222 (after 7.1.217)
+Problem: Wildcards in argument of ":helptags" are not expanded. (Marcel
+ Svitalsky)
+Solution: Expand wildcards in the directory name.
+Files: src/ex_cmds.c
+
+
+*** ../vim-7.1.221/src/ex_cmds.c Fri Jan 11 21:00:49 2008
+--- src/ex_cmds.c Sat Jan 12 21:40:51 2008
+***************
+*** 6106,6111 ****
+--- 6106,6113 ----
+ #ifdef FEAT_MULTI_LANG
+ char_u lang[2];
+ #endif
++ expand_T xpc;
++ char_u *dirname;
+ char_u ext[5];
+ char_u fname[8];
+ int filecount;
+***************
+*** 6119,6125 ****
+ eap->arg = skipwhite(eap->arg + 3);
+ }
+
+! if (!mch_isdir(eap->arg))
+ {
+ EMSG2(_("E150: Not a directory: %s"), eap->arg);
+ return;
+--- 6121,6131 ----
+ eap->arg = skipwhite(eap->arg + 3);
+ }
+
+! ExpandInit(&xpc);
+! xpc.xp_context = EXPAND_DIRECTORIES;
+! dirname = ExpandOne(&xpc, eap->arg, NULL,
+! WILD_LIST_NOTFOUND|WILD_SILENT, WILD_EXPAND_FREE);
+! if (dirname == NULL || !mch_isdir(dirname))
+ {
+ EMSG2(_("E150: Not a directory: %s"), eap->arg);
+ return;
+***************
+*** 6127,6133 ****
+
+ #ifdef FEAT_MULTI_LANG
+ /* Get a list of all files in the directory. */
+! STRCPY(NameBuff, eap->arg);
+ add_pathsep(NameBuff);
+ STRCAT(NameBuff, "*");
+ if (gen_expand_wildcards(1, &NameBuff, &filecount, &files,
+--- 6133,6139 ----
+
+ #ifdef FEAT_MULTI_LANG
+ /* Get a list of all files in the directory. */
+! STRCPY(NameBuff, dirname);
+ add_pathsep(NameBuff);
+ STRCAT(NameBuff, "*");
+ if (gen_expand_wildcards(1, &NameBuff, &filecount, &files,
+***************
+*** 6135,6140 ****
+--- 6141,6147 ----
+ || filecount == 0)
+ {
+ EMSG2("E151: No match: %s", NameBuff);
++ vim_free(dirname);
+ return;
+ }
+
+***************
+*** 6200,6206 ****
+ ext[1] = fname[5];
+ ext[2] = fname[6];
+ }
+! helptags_one(eap->arg, ext, fname, add_help_tags);
+ }
+
+ ga_clear(&ga);
+--- 6207,6213 ----
+ ext[1] = fname[5];
+ ext[2] = fname[6];
+ }
+! helptags_one(dirname, ext, fname, add_help_tags);
+ }
+
+ ga_clear(&ga);
+***************
+*** 6208,6215 ****
+
+ #else
+ /* No language support, just use "*.txt" and "tags". */
+! helptags_one(eap->arg, (char_u *)".txt", (char_u *)"tags", add_help_tags);
+ #endif
+ }
+
+ static void
+--- 6215,6223 ----
+
+ #else
+ /* No language support, just use "*.txt" and "tags". */
+! helptags_one(dirname, (char_u *)".txt", (char_u *)"tags", add_help_tags);
+ #endif
++ vim_free(dirname);
+ }
+
+ static void
+*** ../vim-7.1.221/src/version.c Sat Jan 12 18:13:05 2008
+--- src/version.c Sun Jan 13 13:27:04 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 222,
+ /**/
+
+--
+ Arthur pulls Pin out. The MONK blesses the grenade as ...
+ARTHUR: (quietly) One, two, five ...
+GALAHAD: Three, sir!
+ARTHUR: Three.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.223
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.223
+Problem: glob() doesn't work properly when 'shell' is "sh" or "bash" and
+ the expanded name contains spaces, '~', single quotes and other
+ special characters. (Adri Verhoef, Charles Campbell)
+Solution: For Posix shells define a vimglob() function to list the matches
+ instead of using "echo" directly.
+Files: src/os_unix.c
+
+
+*** ../vim-7.1.222/src/os_unix.c Thu Jan 3 18:55:21 2008
+--- src/os_unix.c Sun Jan 13 13:52:53 2008
+***************
+*** 4946,4951 ****
+--- 4946,4954 ----
+ char_u *p;
+ int dir;
+ #ifdef __EMX__
++ /*
++ * This is the OS/2 implementation.
++ */
+ # define EXPL_ALLOC_INC 16
+ char_u **expl_files;
+ size_t files_alloced, files_free;
+***************
+*** 5056,5075 ****
+ return OK;
+
+ #else /* __EMX__ */
+!
+ int j;
+ char_u *tempname;
+ char_u *command;
+ FILE *fd;
+ char_u *buffer;
+! #define STYLE_ECHO 0 /* use "echo" to expand */
+! #define STYLE_GLOB 1 /* use "glob" to expand, for csh */
+! #define STYLE_PRINT 2 /* use "print -N" to expand, for zsh */
+! #define STYLE_BT 3 /* `cmd` expansion, execute the pattern directly */
+ int shell_style = STYLE_ECHO;
+ int check_spaces;
+ static int did_find_nul = FALSE;
+ int ampersent = FALSE;
+
+ *num_file = 0; /* default: no files found */
+ *file = NULL;
+--- 5059,5084 ----
+ return OK;
+
+ #else /* __EMX__ */
+! /*
+! * This is the non-OS/2 implementation (really Unix).
+! */
+ int j;
+ char_u *tempname;
+ char_u *command;
+ FILE *fd;
+ char_u *buffer;
+! #define STYLE_ECHO 0 /* use "echo", the default */
+! #define STYLE_GLOB 1 /* use "glob", for csh */
+! #define STYLE_VIMGLOB 2 /* use "vimglob", for Posix sh */
+! #define STYLE_PRINT 3 /* use "print -N", for zsh */
+! #define STYLE_BT 4 /* `cmd` expansion, execute the pattern
+! * directly */
+ int shell_style = STYLE_ECHO;
+ int check_spaces;
+ static int did_find_nul = FALSE;
+ int ampersent = FALSE;
++ /* vimglob() function to define for Posix shell */
++ static char *sh_vimglob_func = "vimglob() { while [ $# -ge 1 ]; do echo -n \"$1\"; echo; shift; done }; vimglob >";
+
+ *num_file = 0; /* default: no files found */
+ *file = NULL;
+***************
+*** 5107,5115 ****
+
+ /*
+ * Let the shell expand the patterns and write the result into the temp
+! * file. if expanding `cmd` execute it directly.
+! * If we use csh, glob will work better than echo.
+! * If we use zsh, print -N will work better than glob.
+ */
+ if (num_pat == 1 && *pat[0] == '`'
+ && (len = STRLEN(pat[0])) > 2
+--- 5116,5132 ----
+
+ /*
+ * Let the shell expand the patterns and write the result into the temp
+! * file.
+! * STYLE_BT: NL separated
+! * If expanding `cmd` execute it directly.
+! * STYLE_GLOB: NUL separated
+! * If we use *csh, "glob" will work better than "echo".
+! * STYLE_PRINT: NL or NUL separated
+! * If we use *zsh, "print -N" will work better than "glob".
+! * STYLE_VIMGLOB: NL separated
+! * If we use *sh*, we define "vimglob()".
+! * STYLE_ECHO: space separated.
+! * A shell we don't know, stay safe and use "echo".
+ */
+ if (num_pat == 1 && *pat[0] == '`'
+ && (len = STRLEN(pat[0])) > 2
+***************
+*** 5122,5130 ****
+ else if (STRCMP(p_sh + len - 3, "zsh") == 0)
+ shell_style = STYLE_PRINT;
+ }
+!
+! /* "unset nonomatch; print -N >" plus two is 29 */
+ len = STRLEN(tempname) + 29;
+ for (i = 0; i < num_pat; ++i)
+ {
+ /* Count the length of the patterns in the same way as they are put in
+--- 5139,5155 ----
+ else if (STRCMP(p_sh + len - 3, "zsh") == 0)
+ shell_style = STYLE_PRINT;
+ }
+! if (shell_style == STYLE_ECHO && strstr((char *)gettail(p_sh),
+! "sh") != NULL)
+! shell_style = STYLE_VIMGLOB;
+!
+! /* Compute the length of the command. We need 2 extra bytes: for the
+! * optional '&' and for the NUL.
+! * Worst case: "unset nonomatch; print -N >" plus two is 29 */
+ len = STRLEN(tempname) + 29;
++ if (shell_style == STYLE_VIMGLOB)
++ len += STRLEN(sh_vimglob_func);
++
+ for (i = 0; i < num_pat; ++i)
+ {
+ /* Count the length of the patterns in the same way as they are put in
+***************
+*** 5183,5192 ****
+--- 5208,5221 ----
+ STRCAT(command, "glob >");
+ else if (shell_style == STYLE_PRINT)
+ STRCAT(command, "print -N >");
++ else if (shell_style == STYLE_VIMGLOB)
++ STRCAT(command, sh_vimglob_func);
+ else
+ STRCAT(command, "echo >");
+ }
++
+ STRCAT(command, tempname);
++
+ if (shell_style != STYLE_BT)
+ for (i = 0; i < num_pat; ++i)
+ {
+***************
+*** 5232,5239 ****
+ if (flags & EW_SILENT)
+ show_shell_mess = FALSE;
+ if (ampersent)
+! STRCAT(command, "&"); /* put the '&' back after the
+! redirection */
+
+ /*
+ * Using zsh -G: If a pattern has no matches, it is just deleted from
+--- 5261,5267 ----
+ if (flags & EW_SILENT)
+ show_shell_mess = FALSE;
+ if (ampersent)
+! STRCAT(command, "&"); /* put the '&' after the redirection */
+
+ /*
+ * Using zsh -G: If a pattern has no matches, it is just deleted from
+***************
+*** 5265,5271 ****
+ show_shell_mess = TRUE;
+ vim_free(command);
+
+! if (i) /* mch_call_shell() failed */
+ {
+ mch_remove(tempname);
+ vim_free(tempname);
+--- 5293,5299 ----
+ show_shell_mess = TRUE;
+ vim_free(command);
+
+! if (i != 0) /* mch_call_shell() failed */
+ {
+ mch_remove(tempname);
+ vim_free(tempname);
+***************
+*** 5336,5342 ****
+ }
+ vim_free(tempname);
+
+! #if defined(__CYGWIN__) || defined(__CYGWIN32__)
+ /* Translate <CR><NL> into <NL>. Caution, buffer may contain NUL. */
+ p = buffer;
+ for (i = 0; i < len; ++i)
+--- 5364,5370 ----
+ }
+ vim_free(tempname);
+
+! # if defined(__CYGWIN__) || defined(__CYGWIN32__)
+ /* Translate <CR><NL> into <NL>. Caution, buffer may contain NUL. */
+ p = buffer;
+ for (i = 0; i < len; ++i)
+***************
+*** 5359,5365 ****
+ }
+ }
+ /* file names are separated with NL */
+! else if (shell_style == STYLE_BT)
+ {
+ buffer[len] = NUL; /* make sure the buffer ends in NUL */
+ p = buffer;
+--- 5387,5393 ----
+ }
+ }
+ /* file names are separated with NL */
+! else if (shell_style == STYLE_BT || shell_style == STYLE_VIMGLOB)
+ {
+ buffer[len] = NUL; /* make sure the buffer ends in NUL */
+ p = buffer;
+***************
+*** 5438,5444 ****
+ {
+ (*file)[i] = p;
+ /* Space or NL separates */
+! if (shell_style == STYLE_ECHO || shell_style == STYLE_BT)
+ {
+ while (!(shell_style == STYLE_ECHO && *p == ' ')
+ && *p != '\n' && *p != NUL)
+--- 5466,5473 ----
+ {
+ (*file)[i] = p;
+ /* Space or NL separates */
+! if (shell_style == STYLE_ECHO || shell_style == STYLE_BT
+! || shell_style == STYLE_VIMGLOB)
+ {
+ while (!(shell_style == STYLE_ECHO && *p == ' ')
+ && *p != '\n' && *p != NUL)
+*** ../vim-7.1.222/src/version.c Sun Jan 13 13:30:34 2008
+--- src/version.c Sun Jan 13 13:45:04 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 223,
+ /**/
+
+--
+User: I'm having problems with my text editor.
+Help desk: Which editor are you using?
+User: I don't know, but it's version VI (pronounced: 6).
+Help desk: Oh, then you should upgrade to version VIM (pronounced: 994).
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.224
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.224
+Problem: When using "vim -F -o file1 file2" only one window is
+ right-to-left. Same for "-H". (Ben Schmidt)
+Solution: use set_option_value() to set 'rightleft'.
+Files: src/main.c
+
+
+*** ../vim-7.1.223/src/main.c Fri Jan 11 20:25:42 2008
+--- src/main.c Sun Jan 13 16:12:09 2008
+***************
+*** 1775,1781 ****
+
+ case 'F': /* "-F" start in Farsi mode: rl + fkmap set */
+ #ifdef FEAT_FKMAP
+! curwin->w_p_rl = p_fkmap = TRUE;
+ #else
+ mch_errmsg(_(e_nofarsi));
+ mch_exit(2);
+--- 1775,1782 ----
+
+ case 'F': /* "-F" start in Farsi mode: rl + fkmap set */
+ #ifdef FEAT_FKMAP
+! p_fkmap = TRUE;
+! set_option_value((char_u *)"rl", 1L, NULL, 0);
+ #else
+ mch_errmsg(_(e_nofarsi));
+ mch_exit(2);
+***************
+*** 1792,1798 ****
+
+ case 'H': /* "-H" start in Hebrew mode: rl + hkmap set */
+ #ifdef FEAT_RIGHTLEFT
+! curwin->w_p_rl = p_hkmap = TRUE;
+ #else
+ mch_errmsg(_(e_nohebrew));
+ mch_exit(2);
+--- 1793,1800 ----
+
+ case 'H': /* "-H" start in Hebrew mode: rl + hkmap set */
+ #ifdef FEAT_RIGHTLEFT
+! p_hkmap = TRUE;
+! set_option_value((char_u *)"rl", 1L, NULL, 0);
+ #else
+ mch_errmsg(_(e_nohebrew));
+ mch_exit(2);
+*** ../vim-7.1.223/src/version.c Sun Jan 13 13:53:30 2008
+--- src/version.c Sun Jan 13 16:15:49 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 224,
+ /**/
+
+--
+LAUNCELOT: Isn't there a St. Aaaaarrrrrrggghhh's in Cornwall?
+ARTHUR: No, that's Saint Ives.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.225
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.225
+Problem: Using unitialized value when XGetWMNormalHints() fails.
+Solution: Check the return value. (Dominique Pelle)
+Files: src/os_unix.c
+
+
+*** ../vim-7.1.224/src/os_unix.c Sun Jan 13 13:53:30 2008
+--- src/os_unix.c Sun Jan 13 13:52:53 2008
+***************
+*** 6145,6153 ****
+ if (xterm_trace == 1)
+ {
+ /* Get the hints just before tracking starts. The font size might
+! * have changed recently */
+! XGetWMNormalHints(xterm_dpy, x11_window, &xterm_hints, &got_hints);
+! if (!(got_hints & PResizeInc)
+ || xterm_hints.width_inc <= 1
+ || xterm_hints.height_inc <= 1)
+ {
+--- 6145,6153 ----
+ if (xterm_trace == 1)
+ {
+ /* Get the hints just before tracking starts. The font size might
+! * have changed recently. */
+! if (!XGetWMNormalHints(xterm_dpy, x11_window, &xterm_hints, &got_hints)
+! || !(got_hints & PResizeInc)
+ || xterm_hints.width_inc <= 1
+ || xterm_hints.height_inc <= 1)
+ {
+*** ../vim-7.1.224/src/version.c Sun Jan 13 16:17:02 2008
+--- src/version.c Sun Jan 13 16:29:51 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 225,
+ /**/
+
+--
+"When I die, I want a tombstone that says "GAME OVER" - Ton Richters
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.226
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.226
+Problem: Command line completion doesn't work when a file name contains a
+ '&' character.
+Solution: Accept all characters in a file name, except ones that end a
+ command or white space.
+Files: src/ex_docmd.c
+
+
+*** ../vim-7.1.225/src/ex_docmd.c Wed Jan 9 20:29:51 2008
+--- src/ex_docmd.c Wed Jan 9 20:11:13 2008
+***************
+*** 3338,3349 ****
+ }
+ in_quote = !in_quote;
+ }
+ #ifdef SPACE_IN_FILENAME
+! else if (!vim_isfilec_or_wc(c)
+! && (!(ea.argt & NOSPC) || usefilter))
+! #else
+! else if (!vim_isfilec_or_wc(c))
+ #endif
+ {
+ while (*p != NUL)
+ {
+--- 3338,3350 ----
+ }
+ in_quote = !in_quote;
+ }
++ /* An argument can contain just about everything, except
++ * characters that end the command and white space. */
++ else if (c == '|' || c == '\n' || c == '"' || (vim_iswhite(c)
+ #ifdef SPACE_IN_FILENAME
+! && (!(ea.argt & NOSPC) || usefilter)
+ #endif
++ ))
+ {
+ while (*p != NUL)
+ {
+*** ../vim-7.1.225/src/version.c Sun Jan 13 16:30:23 2008
+--- src/version.c Sun Jan 13 17:10:15 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 226,
+ /**/
+
+--
+ [Another hideous roar.]
+BEDEVERE: That's it!
+ARTHUR: What?
+BEDEVERE: It's The Legendary Black Beast of Aaaaarrrrrrggghhh!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.227
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.227
+Problem: Hang in syntax HL when moving over a ")". (Dominique Pelle)
+Solution: Avoid storing a syntax state in the wrong position in the list of
+ remembered states.
+Files: src/syntax.c
+
+
+*** ../vim-7.1.226/src/syntax.c Sat Jan 12 16:45:25 2008
+--- src/syntax.c Sat Jan 12 16:45:44 2008
+***************
+*** 372,378 ****
+ static int syn_stack_cleanup __ARGS((void));
+ static void syn_stack_free_entry __ARGS((buf_T *buf, synstate_T *p));
+ static synstate_T *syn_stack_find_entry __ARGS((linenr_T lnum));
+! static synstate_T *store_current_state __ARGS((synstate_T *sp));
+ static void load_current_state __ARGS((synstate_T *from));
+ static void invalidate_current_state __ARGS((void));
+ static int syn_stack_equal __ARGS((synstate_T *sp));
+--- 372,378 ----
+ static int syn_stack_cleanup __ARGS((void));
+ static void syn_stack_free_entry __ARGS((buf_T *buf, synstate_T *p));
+ static synstate_T *syn_stack_find_entry __ARGS((linenr_T lnum));
+! static synstate_T *store_current_state __ARGS((void));
+ static void load_current_state __ARGS((synstate_T *from));
+ static void invalidate_current_state __ARGS((void));
+ static int syn_stack_equal __ARGS((synstate_T *sp));
+***************
+*** 464,470 ****
+ synstate_T *p;
+ synstate_T *last_valid = NULL;
+ synstate_T *last_min_valid = NULL;
+! synstate_T *sp, *prev;
+ linenr_T parsed_lnum;
+ linenr_T first_stored;
+ int dist;
+--- 464,470 ----
+ synstate_T *p;
+ synstate_T *last_valid = NULL;
+ synstate_T *last_min_valid = NULL;
+! synstate_T *sp, *prev = NULL;
+ linenr_T parsed_lnum;
+ linenr_T first_stored;
+ int dist;
+***************
+*** 502,508 ****
+ if (!current_state_stored)
+ {
+ ++current_lnum;
+! (void)store_current_state(NULL);
+ }
+
+ /*
+--- 502,508 ----
+ if (!current_state_stored)
+ {
+ ++current_lnum;
+! (void)store_current_state();
+ }
+
+ /*
+***************
+*** 558,564 ****
+ dist = 999999;
+ else
+ dist = syn_buf->b_ml.ml_line_count / (syn_buf->b_sst_len - Rows) + 1;
+- prev = syn_stack_find_entry(current_lnum);
+ while (current_lnum < lnum)
+ {
+ syn_start_line();
+--- 558,563 ----
+***************
+*** 573,581 ****
+ * equal to the current state. If so, then validate all saved
+ * states that depended on a change before the parsed line. */
+ if (prev == NULL)
+ sp = syn_buf->b_sst_first;
+ else
+! sp = prev->sst_next;
+ if (sp != NULL
+ && sp->sst_lnum == current_lnum
+ && syn_stack_equal(sp))
+--- 572,584 ----
+ * equal to the current state. If so, then validate all saved
+ * states that depended on a change before the parsed line. */
+ if (prev == NULL)
++ prev = syn_stack_find_entry(current_lnum - 1);
++ if (prev == NULL)
+ sp = syn_buf->b_sst_first;
+ else
+! sp = prev;
+! while (sp != NULL && sp->sst_lnum < current_lnum)
+! sp = sp->sst_next;
+ if (sp != NULL
+ && sp->sst_lnum == current_lnum
+ && syn_stack_equal(sp))
+***************
+*** 601,607 ****
+ else if (prev == NULL
+ || current_lnum == lnum
+ || current_lnum >= prev->sst_lnum + dist)
+! prev = store_current_state(prev);
+ }
+
+ /* This can take a long time: break when CTRL-C pressed. The current
+--- 604,610 ----
+ else if (prev == NULL
+ || current_lnum == lnum
+ || current_lnum >= prev->sst_lnum + dist)
+! prev = store_current_state();
+ }
+
+ /* This can take a long time: break when CTRL-C pressed. The current
+***************
+*** 1353,1369 ****
+ * The current state must be valid for the start of the current_lnum line!
+ */
+ static synstate_T *
+! store_current_state(sp)
+! synstate_T *sp; /* at or before where state is to be saved or
+! NULL */
+ {
+ int i;
+ synstate_T *p;
+ bufstate_T *bp;
+ stateitem_T *cur_si;
+!
+! if (sp == NULL)
+! sp = syn_stack_find_entry(current_lnum);
+
+ /*
+ * If the current state contains a start or end pattern that continues
+--- 1356,1368 ----
+ * The current state must be valid for the start of the current_lnum line!
+ */
+ static synstate_T *
+! store_current_state()
+ {
+ int i;
+ synstate_T *p;
+ bufstate_T *bp;
+ stateitem_T *cur_si;
+! synstate_T *sp = syn_stack_find_entry(current_lnum);
+
+ /*
+ * If the current state contains a start or end pattern that continues
+***************
+*** 1667,1673 ****
+ * Store the current state in b_sst_array[] for later use.
+ */
+ ++current_lnum;
+! (void)store_current_state(NULL);
+ }
+ }
+
+--- 1666,1672 ----
+ * Store the current state in b_sst_array[] for later use.
+ */
+ ++current_lnum;
+! (void)store_current_state();
+ }
+ }
+
+*** ../vim-7.1.226/src/version.c Sun Jan 13 17:11:25 2008
+--- src/version.c Sun Jan 13 17:37:10 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 227,
+ /**/
+
+--
+Dreams are free, but there's a small charge for alterations.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.228
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.228
+Problem: When 'foldmethod' is "indent" and a fold is created with ">>" it
+ can't be closed with "zc". (Daniel Shahaf)
+Solution: Reset the "small" flag of a fold when adding a line to it.
+Files: src/fold.c
+
+
+*** ../vim-7.1.227/src/fold.c Sun Oct 14 15:32:10 2007
+--- src/fold.c Sun Jan 13 21:26:48 2008
+***************
+*** 2676,2681 ****
+--- 2676,2682 ----
+ if (fp->fd_len < flp->lnum - fp->fd_top)
+ {
+ fp->fd_len = flp->lnum - fp->fd_top;
++ fp->fd_small = MAYBE;
+ fold_changed = TRUE;
+ }
+
+*** ../vim-7.1.227/src/version.c Sun Jan 13 17:39:29 2008
+--- src/version.c Sun Jan 13 21:56:53 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 228,
+ /**/
+
+--
+VOICE OVER: As the horrendous Black Beast lunged forward, escape for Arthur
+ and his knights seemed hopeless, when, suddenly ... the animator
+ suffered a fatal heart attack.
+ANIMATOR: Aaaaagh!
+VOICE OVER: The cartoon peril was no more ... The Quest for Holy Grail could
+ continue.
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.229
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.229
+Problem: A fold is closed when it shouldn't when 'foldmethod' is "indent"
+ and backspacing a non-white character so that the indent increases.
+Solution: Keep the fold open after backspacing a character.
+Files: src/edit.c
+
+
+*** ../vim-7.1.228/src/edit.c Sat Jan 12 18:13:05 2008
+--- src/edit.c Mon Jan 14 20:06:43 2008
+***************
+*** 8618,8623 ****
+--- 8619,8632 ----
+ if (vim_strchr(p_cpo, CPO_BACKSPACE) != NULL && dollar_vcol == 0)
+ dollar_vcol = curwin->w_virtcol;
+
++ #ifdef FEAT_FOLDING
++ /* When deleting a char the cursor line must never be in a closed fold.
++ * E.g., when 'foldmethod' is indent and deleting the first non-white
++ * char before a Tab. */
++ if (did_backspace)
++ foldOpenCursor();
++ #endif
++
+ return did_backspace;
+ }
+
+*** ../vim-7.1.228/src/version.c Sun Jan 13 21:57:25 2008
+--- src/version.c Mon Jan 14 20:08:35 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 229,
+ /**/
+
+--
+ROBIN: (warily) And if you get a question wrong?
+ARTHUR: You are cast into the Gorge of Eternal Peril.
+ROBIN: Oh ... wacho!
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.230
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.230
+Problem: Memory leak when executing SourceCmd autocommands.
+Solution: Free the memory. (Dominique Pelle)
+Files: src/ex_cmds2.c
+
+
+*** ../vim-7.1.229/src/ex_cmds2.c Sun Jan 6 20:05:36 2008
+--- src/ex_cmds2.c Tue Jan 15 20:41:28 2008
+***************
+*** 2889,2899 ****
+ if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL)
+ && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp,
+ FALSE, curbuf))
+ # ifdef FEAT_EVAL
+! return aborting() ? FAIL : OK;
+ # else
+! return OK;
+ # endif
+
+ /* Apply SourcePre autocommands, they may get the file. */
+ apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf);
+--- 2889,2902 ----
+ if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL)
+ && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp,
+ FALSE, curbuf))
++ {
+ # ifdef FEAT_EVAL
+! retval = aborting() ? FAIL : OK;
+ # else
+! retval = OK;
+ # endif
++ goto theend;
++ }
+
+ /* Apply SourcePre autocommands, they may get the file. */
+ apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf);
+*** ../vim-7.1.229/src/version.c Mon Jan 14 20:11:37 2008
+--- src/version.c Tue Jan 15 22:15:03 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 230,
+ /**/
+
+--
+Citizens are not allowed to attend a movie house or theater nor ride in a
+public streetcar within at least four hours after eating garlic.
+ [real standing law in Indiana, United States of America]
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.231
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.231
+Problem: When shifting lines the change is acted upon multiple times.
+Solution: Don't have shift_line() call changed_bytes.
+Files: src/edit.c, src/ops.c, src/proto/edit.pro, src/proto/ops.pro
+
+
+*** ../vim-7.1.230/src/edit.c Mon Jan 14 20:11:37 2008
+--- src/edit.c Mon Jan 14 20:06:43 2008
+***************
+*** 1662,1672 ****
+ * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec).
+ */
+ void
+! change_indent(type, amount, round, replaced)
+ int type;
+ int amount;
+ int round;
+ int replaced; /* replaced character, put on replace stack */
+ {
+ int vcol;
+ int last_vcol;
+--- 1662,1673 ----
+ * if round is TRUE, round the indent to 'shiftwidth' (only with _INC and _Dec).
+ */
+ void
+! change_indent(type, amount, round, replaced, call_changed_bytes)
+ int type;
+ int amount;
+ int round;
+ int replaced; /* replaced character, put on replace stack */
++ int call_changed_bytes; /* call changed_bytes() */
+ {
+ int vcol;
+ int last_vcol;
+***************
+*** 1723,1729 ****
+ * Set the new indent. The cursor will be put on the first non-blank.
+ */
+ if (type == INDENT_SET)
+! (void)set_indent(amount, SIN_CHANGED);
+ else
+ {
+ #ifdef FEAT_VREPLACE
+--- 1724,1730 ----
+ * Set the new indent. The cursor will be put on the first non-blank.
+ */
+ if (type == INDENT_SET)
+! (void)set_indent(amount, call_changed_bytes ? SIN_CHANGED : 0);
+ else
+ {
+ #ifdef FEAT_VREPLACE
+***************
+*** 1733,1739 ****
+ if (State & VREPLACE_FLAG)
+ State = INSERT;
+ #endif
+! shift_line(type == INDENT_DEC, round, 1);
+ #ifdef FEAT_VREPLACE
+ State = save_State;
+ #endif
+--- 1734,1740 ----
+ if (State & VREPLACE_FLAG)
+ State = INSERT;
+ #endif
+! shift_line(type == INDENT_DEC, round, 1, call_changed_bytes);
+ #ifdef FEAT_VREPLACE
+ State = save_State;
+ #endif
+***************
+*** 5921,5927 ****
+ {
+ #ifdef FEAT_VREPLACE
+ if (State & VREPLACE_FLAG)
+! change_indent(INDENT_SET, second_indent, FALSE, NUL);
+ else
+ #endif
+ (void)set_indent(second_indent, SIN_CHANGED);
+--- 5922,5928 ----
+ {
+ #ifdef FEAT_VREPLACE
+ if (State & VREPLACE_FLAG)
+! change_indent(INDENT_SET, second_indent, FALSE, NUL, TRUE);
+ else
+ #endif
+ (void)set_indent(second_indent, SIN_CHANGED);
+***************
+*** 7227,7233 ****
+ fixthisline(get_the_indent)
+ int (*get_the_indent) __ARGS((void));
+ {
+! change_indent(INDENT_SET, get_the_indent(), FALSE, 0);
+ if (linewhite(curwin->w_cursor.lnum))
+ did_ai = TRUE; /* delete the indent if the line stays empty */
+ }
+--- 7228,7234 ----
+ fixthisline(get_the_indent)
+ int (*get_the_indent) __ARGS((void));
+ {
+! change_indent(INDENT_SET, get_the_indent(), FALSE, 0, TRUE);
+ if (linewhite(curwin->w_cursor.lnum))
+ did_ai = TRUE; /* delete the indent if the line stays empty */
+ }
+***************
+*** 8170,8179 ****
+ replace_pop_ins();
+ if (lastc == '^')
+ old_indent = get_indent(); /* remember curr. indent */
+! change_indent(INDENT_SET, 0, TRUE, 0);
+ }
+ else
+! change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, TRUE, 0);
+
+ if (did_ai && *skipwhite(ml_get_curline()) != NUL)
+ did_ai = FALSE;
+--- 8171,8180 ----
+ replace_pop_ins();
+ if (lastc == '^')
+ old_indent = get_indent(); /* remember curr. indent */
+! change_indent(INDENT_SET, 0, TRUE, 0, TRUE);
+ }
+ else
+! change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, TRUE, 0, TRUE);
+
+ if (did_ai && *skipwhite(ml_get_curline()) != NUL)
+ did_ai = FALSE;
+***************
+*** 9633,9639 ****
+ curwin->w_cursor = old_pos;
+ #ifdef FEAT_VREPLACE
+ if (State & VREPLACE_FLAG)
+! change_indent(INDENT_SET, i, FALSE, NUL);
+ else
+ #endif
+ (void)set_indent(i, SIN_CHANGED);
+--- 9634,9640 ----
+ curwin->w_cursor = old_pos;
+ #ifdef FEAT_VREPLACE
+ if (State & VREPLACE_FLAG)
+! change_indent(INDENT_SET, i, FALSE, NUL, TRUE);
+ else
+ #endif
+ (void)set_indent(i, SIN_CHANGED);
+***************
+*** 9662,9668 ****
+ curwin->w_cursor = old_pos;
+ }
+ if (temp)
+! shift_line(TRUE, FALSE, 1);
+ }
+ }
+
+--- 9663,9669 ----
+ curwin->w_cursor = old_pos;
+ }
+ if (temp)
+! shift_line(TRUE, FALSE, 1, TRUE);
+ }
+ }
+
+*** ../vim-7.1.230/src/ops.c Thu Jan 3 16:31:17 2008
+--- src/ops.c Sun Jan 13 21:52:18 2008
+***************
+*** 258,264 ****
+ if (first_char != '#' || !preprocs_left())
+ #endif
+ {
+! shift_line(oap->op_type == OP_LSHIFT, p_sr, amount);
+ }
+ ++curwin->w_cursor.lnum;
+ }
+--- 258,264 ----
+ if (first_char != '#' || !preprocs_left())
+ #endif
+ {
+! shift_line(oap->op_type == OP_LSHIFT, p_sr, amount, FALSE);
+ }
+ ++curwin->w_cursor.lnum;
+ }
+***************
+*** 321,330 ****
+ * leaves cursor on first blank in the line
+ */
+ void
+! shift_line(left, round, amount)
+ int left;
+ int round;
+ int amount;
+ {
+ int count;
+ int i, j;
+--- 321,331 ----
+ * leaves cursor on first blank in the line
+ */
+ void
+! shift_line(left, round, amount, call_changed_bytes)
+ int left;
+ int round;
+ int amount;
++ int call_changed_bytes; /* call changed_bytes() */
+ {
+ int count;
+ int i, j;
+***************
+*** 363,372 ****
+ /* Set new indent */
+ #ifdef FEAT_VREPLACE
+ if (State & VREPLACE_FLAG)
+! change_indent(INDENT_SET, count, FALSE, NUL);
+ else
+ #endif
+! (void)set_indent(count, SIN_CHANGED);
+ }
+
+ #if defined(FEAT_VISUALEXTRA) || defined(PROTO)
+--- 364,373 ----
+ /* Set new indent */
+ #ifdef FEAT_VREPLACE
+ if (State & VREPLACE_FLAG)
+! change_indent(INDENT_SET, count, FALSE, NUL, call_changed_bytes);
+ else
+ #endif
+! (void)set_indent(count, call_changed_bytes ? SIN_CHANGED : 0);
+ }
+
+ #if defined(FEAT_VISUALEXTRA) || defined(PROTO)
+*** ../vim-7.1.230/src/proto/edit.pro Wed Jan 2 17:48:24 2008
+--- src/proto/edit.pro Sun Jan 13 21:52:27 2008
+***************
+*** 3,9 ****
+ void edit_putchar __ARGS((int c, int highlight));
+ void edit_unputchar __ARGS((void));
+ void display_dollar __ARGS((colnr_T col));
+! void change_indent __ARGS((int type, int amount, int round, int replaced));
+ void truncate_spaces __ARGS((char_u *line));
+ void backspace_until_column __ARGS((int col));
+ int vim_is_ctrl_x_key __ARGS((int c));
+--- 3,9 ----
+ void edit_putchar __ARGS((int c, int highlight));
+ void edit_unputchar __ARGS((void));
+ void display_dollar __ARGS((colnr_T col));
+! void change_indent __ARGS((int type, int amount, int round, int replaced, int call_changed_bytes));
+ void truncate_spaces __ARGS((char_u *line));
+ void backspace_until_column __ARGS((int col));
+ int vim_is_ctrl_x_key __ARGS((int c));
+*** ../vim-7.1.230/src/proto/ops.pro Sun May 6 13:56:32 2007
+--- src/proto/ops.pro Sun Jan 13 21:52:30 2008
+***************
+*** 4,10 ****
+ int get_op_char __ARGS((int optype));
+ int get_extra_op_char __ARGS((int optype));
+ void op_shift __ARGS((oparg_T *oap, int curs_top, int amount));
+! void shift_line __ARGS((int left, int round, int amount));
+ void op_reindent __ARGS((oparg_T *oap, int (*how)(void)));
+ int get_expr_register __ARGS((void));
+ void set_expr_line __ARGS((char_u *new_line));
+--- 4,10 ----
+ int get_op_char __ARGS((int optype));
+ int get_extra_op_char __ARGS((int optype));
+ void op_shift __ARGS((oparg_T *oap, int curs_top, int amount));
+! void shift_line __ARGS((int left, int round, int amount, int call_changed_bytes));
+ void op_reindent __ARGS((oparg_T *oap, int (*how)(void)));
+ int get_expr_register __ARGS((void));
+ void set_expr_line __ARGS((char_u *new_line));
+*** ../vim-7.1.230/src/version.c Tue Jan 15 22:16:36 2008
+--- src/version.c Wed Jan 16 19:58:25 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 231,
+ /**/
+
+--
+Snoring is prohibited unless all bedroom windows are closed and securely
+locked.
+ [real standing law in Massachusetts, United States of America]
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.232
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.232 (after 7.1.207 and 7.1.211)
+Problem: Compiler warnings with MSVC.
+Solution: Add type casts. (Mike Williams)
+Files: src/ex_cmds2.c, src/netbeans.c
+
+
+*** ../vim-7.1.231/src/ex_cmds2.c Tue Jan 15 22:16:36 2008
+--- src/ex_cmds2.c Tue Jan 15 20:41:28 2008
+***************
+*** 916,922 ****
+
+ QueryPerformanceCounter(tm);
+ QueryPerformanceFrequency(&fr);
+! tm->QuadPart += (double)msec / 1000.0 * (double)fr.QuadPart;
+ # else
+ long usec;
+
+--- 916,922 ----
+
+ QueryPerformanceCounter(tm);
+ QueryPerformanceFrequency(&fr);
+! tm->QuadPart += (LONGLONG)((double)msec / 1000.0 * (double)fr.QuadPart);
+ # else
+ long usec;
+
+*** ../vim-7.1.231/src/netbeans.c Sat Jan 5 18:06:33 2008
+--- src/netbeans.c Mon Jan 14 21:11:02 2008
+***************
+*** 1217,1223 ****
+
+ oldtext = ml_get(lnum);
+ oldlen = STRLEN(oldtext);
+! if (first >= oldlen || oldlen == 0) /* just in case */
+ return;
+ if (lastbyte >= oldlen)
+ lastbyte = oldlen - 1;
+--- 1217,1223 ----
+
+ oldtext = ml_get(lnum);
+ oldlen = STRLEN(oldtext);
+! if (first >= (colnr_T)oldlen || oldlen == 0) /* just in case */
+ return;
+ if (lastbyte >= oldlen)
+ lastbyte = oldlen - 1;
+*** ../vim-7.1.231/src/version.c Wed Jan 16 20:01:14 2008
+--- src/version.c Fri Jan 18 11:38:39 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 232,
+ /**/
+
+--
+Why is "abbreviation" such a long word?
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.233
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.233
+Problem: Crash when doing Insert mode completion for a user defined
+ command. (Yegappan Lakshmanan)
+Solution: Don't use the non-existing command line.
+Files: src/ex_getln.c
+
+
+*** ../vim-7.1.232/src/ex_getln.c Fri Jan 4 15:16:57 2008
+--- src/ex_getln.c Fri Jan 18 13:07:11 2008
+***************
+*** 4655,4661 ****
+ static void * call_user_expand_func __ARGS((void *(*user_expand_func) __ARGS((char_u *, int, char_u **, int)), expand_T *xp, int *num_file, char_u ***file));
+
+ /*
+! * call "user_expand_func()" to invoke a user defined VimL function and return
+ * the result (either a string or a List).
+ */
+ static void *
+--- 4655,4661 ----
+ static void * call_user_expand_func __ARGS((void *(*user_expand_func) __ARGS((char_u *, int, char_u **, int)), expand_T *xp, int *num_file, char_u ***file));
+
+ /*
+! * Call "user_expand_func()" to invoke a user defined VimL function and return
+ * the result (either a string or a List).
+ */
+ static void *
+***************
+*** 4677,4687 ****
+ *num_file = 0;
+ *file = NULL;
+
+! keep = ccline.cmdbuff[ccline.cmdlen];
+! ccline.cmdbuff[ccline.cmdlen] = 0;
+! sprintf((char *)num, "%d", ccline.cmdpos);
+ args[0] = xp->xp_pattern;
+- args[1] = ccline.cmdbuff;
+ args[2] = num;
+
+ /* Save the cmdline, we don't know what the function may do. */
+--- 4677,4698 ----
+ *num_file = 0;
+ *file = NULL;
+
+! if (ccline.cmdbuff == NULL)
+! {
+! /* Completion from Insert mode, pass fake arguments. */
+! keep = 0;
+! sprintf((char *)num, "%d", STRLEN(xp->xp_pattern));
+! args[1] = xp->xp_pattern;
+! }
+! else
+! {
+! /* Completion on the command line, pass real arguments. */
+! keep = ccline.cmdbuff[ccline.cmdlen];
+! ccline.cmdbuff[ccline.cmdlen] = 0;
+! sprintf((char *)num, "%d", ccline.cmdpos);
+! args[1] = ccline.cmdbuff;
+! }
+ args[0] = xp->xp_pattern;
+ args[2] = num;
+
+ /* Save the cmdline, we don't know what the function may do. */
+***************
+*** 4694,4701 ****
+
+ ccline = save_ccline;
+ current_SID = save_current_SID;
+!
+! ccline.cmdbuff[ccline.cmdlen] = keep;
+
+ return ret;
+ }
+--- 4705,4712 ----
+
+ ccline = save_ccline;
+ current_SID = save_current_SID;
+! if (ccline.cmdbuff != NULL)
+! ccline.cmdbuff[ccline.cmdlen] = keep;
+
+ return ret;
+ }
+*** ../vim-7.1.232/src/version.c Fri Jan 18 11:40:02 2008
+--- src/version.c Fri Jan 18 13:01:05 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 233,
+ /**/
+
+--
+"I love deadlines. I especially like the whooshing sound they
+make as they go flying by."
+ -- Douglas Adams
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.234
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.234
+Problem: When diff'ing three files the third one isn't displayed correctly.
+ (Gary Johnson)
+Solution: Compute the size of diff blocks correctly when merging blocks.
+ Compute filler lines correctly when scrolling.
+Files: src/diff.c
+
+
+*** ../vim-7.1.233/src/diff.c Fri Oct 19 18:57:33 2007
+--- src/diff.c Fri Jan 18 17:32:31 2008
+***************
+*** 1299,1305 ****
+ }
+ else
+ /* second overlap of new block with existing block */
+! dp->df_count[idx_new] += count_new - count_orig;
+
+ /* Adjust the size of the block to include all the lines to the
+ * end of the existing block or the new diff, whatever ends last. */
+--- 1299,1307 ----
+ }
+ else
+ /* second overlap of new block with existing block */
+! dp->df_count[idx_new] += count_new - count_orig
+! + dpl->df_lnum[idx_orig] + dpl->df_count[idx_orig]
+! - (dp->df_lnum[idx_orig] + dp->df_count[idx_orig]);
+
+ /* Adjust the size of the block to include all the lines to the
+ * end of the existing block or the new diff, whatever ends last. */
+***************
+*** 1628,1641 ****
+ win_T *fromwin;
+ win_T *towin;
+ {
+! buf_T *buf = fromwin->w_buffer;
+ linenr_T lnum = fromwin->w_topline;
+! int idx;
+ diff_T *dp;
+ int i;
+
+! idx = diff_buf_idx(buf);
+! if (idx == DB_COUNT)
+ return; /* safety check */
+
+ if (curtab->tp_diff_invalid)
+--- 1630,1645 ----
+ win_T *fromwin;
+ win_T *towin;
+ {
+! buf_T *frombuf = fromwin->w_buffer;
+ linenr_T lnum = fromwin->w_topline;
+! int fromidx;
+! int toidx;
+ diff_T *dp;
++ int max_count;
+ int i;
+
+! fromidx = diff_buf_idx(frombuf);
+! if (fromidx == DB_COUNT)
+ return; /* safety check */
+
+ if (curtab->tp_diff_invalid)
+***************
+*** 1645,1686 ****
+
+ /* search for a change that includes "lnum" in the list of diffblocks. */
+ for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+! if (lnum <= dp->df_lnum[idx] + dp->df_count[idx])
+ break;
+ if (dp == NULL)
+ {
+ /* After last change, compute topline relative to end of file; no
+ * filler lines. */
+ towin->w_topline = towin->w_buffer->b_ml.ml_line_count
+! - (buf->b_ml.ml_line_count - lnum);
+ }
+ else
+ {
+ /* Find index for "towin". */
+! i = diff_buf_idx(towin->w_buffer);
+! if (i == DB_COUNT)
+ return; /* safety check */
+
+! towin->w_topline = lnum + (dp->df_lnum[i] - dp->df_lnum[idx]);
+! if (lnum >= dp->df_lnum[idx])
+ {
+! /* Inside a change: compute filler lines. */
+! if (dp->df_count[i] == dp->df_count[idx])
+ towin->w_topfill = fromwin->w_topfill;
+! else if (dp->df_count[i] > dp->df_count[idx])
+ {
+! if (lnum == dp->df_lnum[idx] + dp->df_count[idx])
+! towin->w_topline = dp->df_lnum[i] + dp->df_count[i]
+! - fromwin->w_topfill;
+ }
+! else
+ {
+! if (towin->w_topline >= dp->df_lnum[i] + dp->df_count[i])
+ {
+! if (diff_flags & DIFF_FILLER)
+! towin->w_topfill = dp->df_lnum[idx]
+! + dp->df_count[idx] - lnum;
+! towin->w_topline = dp->df_lnum[i] + dp->df_count[i];
+ }
+ }
+ }
+--- 1649,1720 ----
+
+ /* search for a change that includes "lnum" in the list of diffblocks. */
+ for (dp = curtab->tp_first_diff; dp != NULL; dp = dp->df_next)
+! if (lnum <= dp->df_lnum[fromidx] + dp->df_count[fromidx])
+ break;
+ if (dp == NULL)
+ {
+ /* After last change, compute topline relative to end of file; no
+ * filler lines. */
+ towin->w_topline = towin->w_buffer->b_ml.ml_line_count
+! - (frombuf->b_ml.ml_line_count - lnum);
+ }
+ else
+ {
+ /* Find index for "towin". */
+! toidx = diff_buf_idx(towin->w_buffer);
+! if (toidx == DB_COUNT)
+ return; /* safety check */
+
+! towin->w_topline = lnum + (dp->df_lnum[toidx] - dp->df_lnum[fromidx]);
+! if (lnum >= dp->df_lnum[fromidx])
+ {
+! /* Inside a change: compute filler lines. With three or more
+! * buffers we need to know the largest count. */
+! max_count = 0;
+! for (i = 0; i < DB_COUNT; ++i)
+! if (curtab->tp_diffbuf[i] != NULL
+! && max_count < dp->df_count[i])
+! max_count = dp->df_count[i];
+!
+! if (dp->df_count[toidx] == dp->df_count[fromidx])
+! {
+! /* same number of lines: use same filler count */
+ towin->w_topfill = fromwin->w_topfill;
+! }
+! else if (dp->df_count[toidx] > dp->df_count[fromidx])
+ {
+! if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx])
+! {
+! /* more lines in towin and fromwin doesn't show diff
+! * lines, only filler lines */
+! if (max_count - fromwin->w_topfill >= dp->df_count[toidx])
+! {
+! /* towin also only shows filler lines */
+! towin->w_topline = dp->df_lnum[toidx]
+! + dp->df_count[toidx];
+! towin->w_topfill = fromwin->w_topfill;
+! }
+! else
+! /* towin still has some diff lines to show */
+! towin->w_topline = dp->df_lnum[toidx]
+! + max_count - fromwin->w_topfill;
+! }
+ }
+! else if (towin->w_topline >= dp->df_lnum[toidx]
+! + dp->df_count[toidx])
+ {
+! /* less lines in towin and no diff lines to show: compute
+! * filler lines */
+! towin->w_topline = dp->df_lnum[toidx] + dp->df_count[toidx];
+! if (diff_flags & DIFF_FILLER)
+ {
+! if (lnum == dp->df_lnum[fromidx] + dp->df_count[fromidx])
+! /* fromwin is also out of diff lines */
+! towin->w_topfill = fromwin->w_topfill;
+! else
+! /* fromwin has some diff lines */
+! towin->w_topfill = dp->df_lnum[fromidx]
+! + max_count - lnum;
+ }
+ }
+ }
+*** ../vim-7.1.233/src/version.c Fri Jan 18 13:15:32 2008
+--- src/version.c Fri Jan 18 17:37:32 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 234,
+ /**/
+
+--
+ERIC IDLE PLAYED: THE DEAD COLLECTOR, MR BINT (A VILLAGE NE'ER-DO -WELL VERY
+ KEEN ON BURNING WITCHES), SIR ROBIN, THE GUARD WHO DOESN'T
+ HICOUGH BUT TRIES TO GET THINGS STRAIGHT, CONCORDE (SIR
+ LAUNCELOT'S TRUSTY STEED), ROGER THE SHRUBBER (A SHRUBBER),
+ BROTHER MAYNARD
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.235
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.235
+Problem: Pattern matching is slow when using a lot of simple patterns.
+Solution: Avoid allocating memory by not freeing it when it's not so much.
+ (Alexei Alexandrov)
+Files: src/regexp.c
+
+
+*** ../vim-7.1.234/src/regexp.c Wed Jan 2 15:34:48 2008
+--- src/regexp.c Fri Jan 18 20:35:21 2008
+***************
+*** 378,391 ****
+
+ static char_u *reg_prev_sub = NULL;
+
+- #if defined(EXITFREE) || defined(PROTO)
+- void
+- free_regexp_stuff()
+- {
+- vim_free(reg_prev_sub);
+- }
+- #endif
+-
+ /*
+ * REGEXP_INRANGE contains all characters which are always special in a []
+ * range after '\'.
+--- 378,383 ----
+***************
+*** 3206,3217 ****
+ } backpos_T;
+
+ /*
+! * regstack and backpos are used by regmatch(). They are kept over calls to
+! * avoid invoking malloc() and free() often.
+ */
+! static garray_T regstack; /* stack with regitem_T items, sometimes
+! preceded by regstar_T or regbehind_T. */
+! static garray_T backpos; /* table with backpos_T for BACK */
+
+ /*
+ * Get pointer to the line "lnum", which is relative to "reg_firstlnum".
+--- 3198,3236 ----
+ } backpos_T;
+
+ /*
+! * "regstack" and "backpos" are used by regmatch(). They are kept over calls
+! * to avoid invoking malloc() and free() often.
+! * "regstack" is a stack with regitem_T items, sometimes preceded by regstar_T
+! * or regbehind_T.
+! * "backpos_T" is a table with backpos_T for BACK
+! */
+! static garray_T regstack = {0, 0, 0, 0, NULL};
+! static garray_T backpos = {0, 0, 0, 0, NULL};
+!
+! /*
+! * Both for regstack and backpos tables we use the following strategy of
+! * allocation (to reduce malloc/free calls):
+! * - Initial size is fairly small.
+! * - When needed, the tables are grown bigger (8 times at first, double after
+! * that).
+! * - After executing the match we free the memory only if the array has grown.
+! * Thus the memory is kept allocated when it's at the initial size.
+! * This makes it fast while not keeping a lot of memory allocated.
+! * A three times speed increase was observed when using many simple patterns.
+ */
+! #define REGSTACK_INITIAL 2048
+! #define BACKPOS_INITIAL 64
+!
+! #if defined(EXITFREE) || defined(PROTO)
+! void
+! free_regexp_stuff()
+! {
+! ga_clear(®stack);
+! ga_clear(&backpos);
+! vim_free(reg_tofree);
+! vim_free(reg_prev_sub);
+! }
+! #endif
+
+ /*
+ * Get pointer to the line "lnum", which is relative to "reg_firstlnum".
+***************
+*** 3346,3360 ****
+ char_u *s;
+ long retval = 0L;
+
+! reg_tofree = NULL;
+!
+! /* Init the regstack empty. Use an item size of 1 byte, since we push
+! * different things onto it. Use a large grow size to avoid reallocating
+! * it too often. */
+! ga_init2(®stack, 1, 10000);
+!
+! /* Init the backpos table empty. */
+! ga_init2(&backpos, sizeof(backpos_T), 10);
+
+ if (REG_MULTI)
+ {
+--- 3365,3389 ----
+ char_u *s;
+ long retval = 0L;
+
+! /* Create "regstack" and "backpos" if they are not allocated yet.
+! * We allocate *_INITIAL amount of bytes first and then set the grow size
+! * to much bigger value to avoid many malloc calls in case of deep regular
+! * expressions. */
+! if (regstack.ga_data == NULL)
+! {
+! /* Use an item size of 1 byte, since we push different things
+! * onto the regstack. */
+! ga_init2(®stack, 1, REGSTACK_INITIAL);
+! ga_grow(®stack, REGSTACK_INITIAL);
+! regstack.ga_growsize = REGSTACK_INITIAL * 8;
+! }
+!
+! if (backpos.ga_data == NULL)
+! {
+! ga_init2(&backpos, sizeof(backpos_T), BACKPOS_INITIAL);
+! ga_grow(&backpos, BACKPOS_INITIAL);
+! backpos.ga_growsize = BACKPOS_INITIAL * 8;
+! }
+
+ if (REG_MULTI)
+ {
+***************
+*** 3525,3533 ****
+ }
+
+ theend:
+! vim_free(reg_tofree);
+! ga_clear(®stack);
+! ga_clear(&backpos);
+
+ return retval;
+ }
+--- 3554,3570 ----
+ }
+
+ theend:
+! /* Free "reg_tofree" when it's a bit big.
+! * Free regstack and backpos if they are bigger than their initial size. */
+! if (reg_tofreelen > 400)
+! {
+! vim_free(reg_tofree);
+! reg_tofree = NULL;
+! }
+! if (regstack.ga_maxlen > REGSTACK_INITIAL)
+! ga_clear(®stack);
+! if (backpos.ga_maxlen > BACKPOS_INITIAL)
+! ga_clear(&backpos);
+
+ return retval;
+ }
+***************
+*** 3717,3724 ****
+ #define RA_MATCH 4 /* successful match */
+ #define RA_NOMATCH 5 /* didn't match */
+
+! /* Init the regstack and backpos table empty. They are initialized and
+! * freed in vim_regexec_both() to reduce malloc()/free() calls. */
+ regstack.ga_len = 0;
+ backpos.ga_len = 0;
+
+--- 3754,3761 ----
+ #define RA_MATCH 4 /* successful match */
+ #define RA_NOMATCH 5 /* didn't match */
+
+! /* Make "regstack" and "backpos" empty. They are allocated and freed in
+! * vim_regexec_both() to reduce malloc()/free() calls. */
+ regstack.ga_len = 0;
+ backpos.ga_len = 0;
+
+*** ../vim-7.1.234/src/version.c Fri Jan 18 17:39:10 2008
+--- src/version.c Fri Jan 18 20:33:26 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 235,
+ /**/
+
+--
+NEIL INNES PLAYED: THE FIRST SELF-DESTRUCTIVE MONK, ROBIN'S LEAST FAVORITE
+ MINSTREL, THE PAGE CRUSHED BY A RABBIT, THE OWNER OF A DUCK
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--- /dev/null
+To: vim-dev@vim.org
+Subject: Patch 7.1.236
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.236
+Problem: When using 'incsearch' and 'hlsearch' a complicated pattern may
+ make Vim hang until CTRL-C is pressed.
+Solution: Add the 'redrawtime' option.
+Files: runtime/doc/options.txt, src/ex_cmds.c, src/ex_docmd.c,
+ src/ex_getln.c, src/gui.c, src/misc1.c, src/normal.c,
+ src/option.c, src/quickfix.c, src/regexp.c, src/proto/regexp.pro,
+ src/proto/search.pro, src/search.c, src/screen.c,
+ src/option.h, src/spell.c, src/structs.h, src/syntax.c, src/tag.c,
+ src/vim.h
+
+
+*** ../vim-7.1.235/runtime/doc/options.txt Sun Aug 12 16:55:01 2007
+--- runtime/doc/options.txt Sat Jan 19 14:01:22 2008
+***************
+*** 3618,3623 ****
+--- 3636,3642 ----
+ When you get bored looking at the highlighted matches, you can turn it
+ off with |:nohlsearch|. As soon as you use a search command, the
+ highlighting comes back.
++ 'redrawtime' specifies the maximum time spend on finding matches.
+ When the search pattern can match an end-of-line, Vim will try to
+ highlight all of the matched text. However, this depends on where the
+ search starts. This will be the first line in the window or the first
+***************
+*** 3851,3856 ****
+--- 3870,3879 ----
+ original position when no match is found and when pressing <Esc>. You
+ still need to finish the search command with <Enter> to move the
+ cursor to the match.
++ When compiled with the |+reltime| feature Vim only searches for about
++ half a second. With a complicated pattern and/or a lot of text the
++ match may not be found. This is to avoid that Vim hangs while you
++ are typing the pattern.
+ The highlighting can be set with the 'i' flag in 'highlight'.
+ See also: 'hlsearch'.
+ CTRL-L can be used to add one character from after the current match
+***************
+*** 5185,5190 ****
+--- 5210,5227 ----
+ {not in Vi:} When using the ":view" command the 'readonly' option is
+ set for the newly edited buffer.
+
++ *'redrawtime'* *'rdt'*
++ 'redrawtime' 'rdt' number (default 2000)
++ global
++ {not in Vi}
++ {only available when compiled with the |+reltime|
++ feature}
++ The time in milliseconds for redrawing the display. This applies to
++ searching for patterns for 'hlsearch' and |:match| highlighting.
++ When redrawing takes more than this many milliseconds no further
++ matches will be highlighted. This is used to avoid that Vim hangs
++ when using a very complicated pattern.
++
+ *'remap'* *'noremap'*
+ 'remap' boolean (default on)
+ global
+*** ../vim-7.1.235/src/ex_cmds.c Sun Jan 13 13:30:34 2008
+--- src/ex_cmds.c Sat Jan 19 13:04:28 2008
+***************
+*** 4446,4452 ****
+ #endif
+ ); ++lnum)
+ {
+! nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0);
+ if (nmatch)
+ {
+ colnr_T copycol;
+--- 4446,4453 ----
+ #endif
+ ); ++lnum)
+ {
+! nmatch = vim_regexec_multi(®match, curwin, curbuf, lnum,
+! (colnr_T)0, NULL);
+ if (nmatch)
+ {
+ colnr_T copycol;
+***************
+*** 4957,4963 ****
+ || (do_ask && !re_lookbehind(regmatch.regprog))
+ || nmatch_tl > 0
+ || (nmatch = vim_regexec_multi(®match, curwin,
+! curbuf, sub_firstlnum, matchcol)) == 0
+ || regmatch.startpos[0].lnum > 0)
+ {
+ if (new_start != NULL)
+--- 4958,4965 ----
+ || (do_ask && !re_lookbehind(regmatch.regprog))
+ || nmatch_tl > 0
+ || (nmatch = vim_regexec_multi(®match, curwin,
+! curbuf, sub_firstlnum,
+! matchcol, NULL)) == 0
+ || regmatch.startpos[0].lnum > 0)
+ {
+ if (new_start != NULL)
+***************
+*** 5022,5028 ****
+ }
+ if (nmatch == -1 && !lastone)
+ nmatch = vim_regexec_multi(®match, curwin, curbuf,
+! sub_firstlnum, matchcol);
+
+ /*
+ * 5. break if there isn't another match in this line
+--- 5024,5030 ----
+ }
+ if (nmatch == -1 && !lastone)
+ nmatch = vim_regexec_multi(®match, curwin, curbuf,
+! sub_firstlnum, matchcol, NULL);
+
+ /*
+ * 5. break if there isn't another match in this line
+***************
+*** 5252,5258 ****
+ for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum)
+ {
+ /* a match on this line? */
+! match = vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0);
+ if ((type == 'g' && match) || (type == 'v' && !match))
+ {
+ ml_setmarked(lnum);
+--- 5254,5261 ----
+ for (lnum = eap->line1; lnum <= eap->line2 && !got_int; ++lnum)
+ {
+ /* a match on this line? */
+! match = vim_regexec_multi(®match, curwin, curbuf, lnum,
+! (colnr_T)0, NULL);
+ if ((type == 'g' && match) || (type == 'v' && !match))
+ {
+ ml_setmarked(lnum);
+*** ../vim-7.1.235/src/ex_docmd.c Sun Jan 13 17:11:25 2008
+--- src/ex_docmd.c Fri Jan 18 21:01:16 2008
+***************
+*** 3931,3937 ****
+ curwin->w_cursor.col = 0;
+ searchcmdlen = 0;
+ if (!do_search(NULL, c, cmd, 1L,
+! SEARCH_HIS + SEARCH_MSG + SEARCH_START))
+ {
+ curwin->w_cursor = pos;
+ cmd = NULL;
+--- 3931,3938 ----
+ curwin->w_cursor.col = 0;
+ searchcmdlen = 0;
+ if (!do_search(NULL, c, cmd, 1L,
+! SEARCH_HIS + SEARCH_MSG + SEARCH_START,
+! NULL))
+ {
+ curwin->w_cursor = pos;
+ cmd = NULL;
+*** ../vim-7.1.235/src/ex_getln.c Fri Jan 18 13:15:32 2008
+--- src/ex_getln.c Fri Jan 18 21:34:42 2008
+***************
+*** 1709,1714 ****
+--- 1709,1717 ----
+ if (p_is && !cmd_silent && (firstc == '/' || firstc == '?'))
+ {
+ pos_T end_pos;
++ #ifdef FEAT_RELTIME
++ proftime_T tm;
++ #endif
+
+ /* if there is a character waiting, search and redraw later */
+ if (char_avail())
+***************
+*** 1727,1734 ****
+ cursor_off(); /* so the user knows we're busy */
+ out_flush();
+ ++emsg_off; /* So it doesn't beep if bad expr */
+ i = do_search(NULL, firstc, ccline.cmdbuff, count,
+! SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK);
+ --emsg_off;
+ /* if interrupted while searching, behave like it failed */
+ if (got_int)
+--- 1730,1747 ----
+ cursor_off(); /* so the user knows we're busy */
+ out_flush();
+ ++emsg_off; /* So it doesn't beep if bad expr */
++ #ifdef FEAT_RELTIME
++ /* Set the time limit to half a second. */
++ profile_setlimit(500L, &tm);
++ #endif
+ i = do_search(NULL, firstc, ccline.cmdbuff, count,
+! SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK,
+! #ifdef FEAT_RELTIME
+! &tm
+! #else
+! NULL
+! #endif
+! );
+ --emsg_off;
+ /* if interrupted while searching, behave like it failed */
+ if (got_int)
+*** ../vim-7.1.235/src/gui.c Thu Jan 3 16:14:25 2008
+--- src/gui.c Fri Jan 18 21:01:36 2008
+***************
+*** 5052,5058 ****
+ /* Search for the next match. */
+ i = msg_scroll;
+ do_search(NULL, down ? '/' : '?', ga.ga_data, 1L,
+! SEARCH_MSG + SEARCH_MARK);
+ msg_scroll = i; /* don't let an error message set msg_scroll */
+ }
+
+--- 5052,5058 ----
+ /* Search for the next match. */
+ i = msg_scroll;
+ do_search(NULL, down ? '/' : '?', ga.ga_data, 1L,
+! SEARCH_MSG + SEARCH_MARK, NULL);
+ msg_scroll = i; /* don't let an error message set msg_scroll */
+ }
+
+*** ../vim-7.1.235/src/misc1.c Thu Jan 3 12:42:38 2008
+--- src/misc1.c Sat Jan 19 13:04:39 2008
+***************
+*** 437,443 ****
+ {
+ regmatch.rmm_ic = FALSE;
+ regmatch.rmm_maxcol = 0;
+! if (vim_regexec_multi(®match, curwin, curbuf, lnum, (colnr_T)0))
+ {
+ pos.lnum = regmatch.endpos[0].lnum + lnum;
+ pos.col = regmatch.endpos[0].col;
+--- 437,444 ----
+ {
+ regmatch.rmm_ic = FALSE;
+ regmatch.rmm_maxcol = 0;
+! if (vim_regexec_multi(®match, curwin, curbuf, lnum,
+! (colnr_T)0, NULL))
+ {
+ pos.lnum = regmatch.endpos[0].lnum + lnum;
+ pos.col = regmatch.endpos[0].col;
+*** ../vim-7.1.235/src/normal.c Sat Jan 12 17:11:25 2008
+--- src/normal.c Fri Jan 18 21:01:47 2008
+***************
+*** 6093,6099 ****
+ curwin->w_set_curswant = TRUE;
+
+ i = do_search(cap->oap, dir, pat, cap->count1,
+! opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG);
+ if (i == 0)
+ clearop(cap->oap);
+ else
+--- 6093,6099 ----
+ curwin->w_set_curswant = TRUE;
+
+ i = do_search(cap->oap, dir, pat, cap->count1,
+! opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, NULL);
+ if (i == 0)
+ clearop(cap->oap);
+ else
+*** ../vim-7.1.235/src/option.c Tue Oct 2 20:40:01 2007
+--- src/option.c Sat Jan 19 13:44:33 2008
+***************
+*** 1991,1996 ****
+--- 1991,2003 ----
+ {"redraw", NULL, P_BOOL|P_VI_DEF,
+ (char_u *)NULL, PV_NONE,
+ {(char_u *)FALSE, (char_u *)0L}},
++ {"redrawtime", "rdt", P_NUM|P_VI_DEF,
++ #ifdef FEAT_RELTIME
++ (char_u *)&p_rdt, PV_NONE,
++ #else
++ (char_u *)NULL, PV_NONE,
++ #endif
++ {(char_u *)2000L, (char_u *)0L}},
+ {"remap", NULL, P_BOOL|P_VI_DEF,
+ (char_u *)&p_remap, PV_NONE,
+ {(char_u *)TRUE, (char_u *)0L}},
+*** ../vim-7.1.235/src/quickfix.c Sun Sep 30 14:00:41 2007
+--- src/quickfix.c Sat Jan 19 13:04:53 2008
+***************
+*** 1803,1809 ****
+ /* Move the cursor to the first line in the buffer */
+ save_cursor = curwin->w_cursor;
+ curwin->w_cursor.lnum = 0;
+! if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1, SEARCH_KEEP))
+ curwin->w_cursor = save_cursor;
+ }
+
+--- 1803,1810 ----
+ /* Move the cursor to the first line in the buffer */
+ save_cursor = curwin->w_cursor;
+ curwin->w_cursor.lnum = 0;
+! if (!do_search(NULL, '/', qf_ptr->qf_pattern, (long)1,
+! SEARCH_KEEP, NULL))
+ curwin->w_cursor = save_cursor;
+ }
+
+***************
+*** 3159,3165 ****
+ {
+ col = 0;
+ while (vim_regexec_multi(®match, curwin, buf, lnum,
+! col) > 0)
+ {
+ ;
+ if (qf_add_entry(qi, &prevp,
+--- 3160,3166 ----
+ {
+ col = 0;
+ while (vim_regexec_multi(®match, curwin, buf, lnum,
+! col, NULL) > 0)
+ {
+ ;
+ if (qf_add_entry(qi, &prevp,
+*** ../vim-7.1.235/src/regexp.c Fri Jan 18 20:36:40 2008
+--- src/regexp.c Sat Jan 19 15:18:12 2008
+***************
+*** 3040,3046 ****
+ } save_se_T;
+
+ static char_u *reg_getline __ARGS((linenr_T lnum));
+! static long vim_regexec_both __ARGS((char_u *line, colnr_T col));
+ static long regtry __ARGS((regprog_T *prog, colnr_T col));
+ static void cleanup_subexpr __ARGS((void));
+ #ifdef FEAT_SYN_HL
+--- 3040,3046 ----
+ } save_se_T;
+
+ static char_u *reg_getline __ARGS((linenr_T lnum));
+! static long vim_regexec_both __ARGS((char_u *line, colnr_T col, proftime_T *tm));
+ static long regtry __ARGS((regprog_T *prog, colnr_T col));
+ static void cleanup_subexpr __ARGS((void));
+ #ifdef FEAT_SYN_HL
+***************
+*** 3284,3290 ****
+ ireg_icombine = FALSE;
+ #endif
+ ireg_maxcol = 0;
+! return (vim_regexec_both(line, col) != 0);
+ }
+
+ #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
+--- 3284,3290 ----
+ ireg_icombine = FALSE;
+ #endif
+ ireg_maxcol = 0;
+! return (vim_regexec_both(line, col, NULL) != 0);
+ }
+
+ #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
+***************
+*** 3308,3314 ****
+ ireg_icombine = FALSE;
+ #endif
+ ireg_maxcol = 0;
+! return (vim_regexec_both(line, col) != 0);
+ }
+ #endif
+
+--- 3308,3314 ----
+ ireg_icombine = FALSE;
+ #endif
+ ireg_maxcol = 0;
+! return (vim_regexec_both(line, col, NULL) != 0);
+ }
+ #endif
+
+***************
+*** 3321,3332 ****
+ * match otherwise.
+ */
+ long
+! vim_regexec_multi(rmp, win, buf, lnum, col)
+ regmmatch_T *rmp;
+ win_T *win; /* window in which to search or NULL */
+ buf_T *buf; /* buffer in which to search */
+ linenr_T lnum; /* nr of line to start looking for match */
+ colnr_T col; /* column to start looking for match */
+ {
+ long r;
+ buf_T *save_curbuf = curbuf;
+--- 3321,3333 ----
+ * match otherwise.
+ */
+ long
+! vim_regexec_multi(rmp, win, buf, lnum, col, tm)
+ regmmatch_T *rmp;
+ win_T *win; /* window in which to search or NULL */
+ buf_T *buf; /* buffer in which to search */
+ linenr_T lnum; /* nr of line to start looking for match */
+ colnr_T col; /* column to start looking for match */
++ proftime_T *tm; /* timeout limit or NULL */
+ {
+ long r;
+ buf_T *save_curbuf = curbuf;
+***************
+*** 3346,3352 ****
+
+ /* Need to switch to buffer "buf" to make vim_iswordc() work. */
+ curbuf = buf;
+! r = vim_regexec_both(NULL, col);
+ curbuf = save_curbuf;
+
+ return r;
+--- 3347,3353 ----
+
+ /* Need to switch to buffer "buf" to make vim_iswordc() work. */
+ curbuf = buf;
+! r = vim_regexec_both(NULL, col, tm);
+ curbuf = save_curbuf;
+
+ return r;
+***************
+*** 3356,3365 ****
+ * Match a regexp against a string ("line" points to the string) or multiple
+ * lines ("line" is NULL, use reg_getline()).
+ */
+ static long
+! vim_regexec_both(line, col)
+ char_u *line;
+ colnr_T col; /* column to start looking for match */
+ {
+ regprog_T *prog;
+ char_u *s;
+--- 3357,3368 ----
+ * Match a regexp against a string ("line" points to the string) or multiple
+ * lines ("line" is NULL, use reg_getline()).
+ */
++ /*ARGSUSED*/
+ static long
+! vim_regexec_both(line, col, tm)
+ char_u *line;
+ colnr_T col; /* column to start looking for match */
++ proftime_T *tm; /* timeout limit or NULL */
+ {
+ regprog_T *prog;
+ char_u *s;
+***************
+*** 3502,3507 ****
+--- 3505,3513 ----
+ }
+ else
+ {
++ #ifdef FEAT_RELTIME
++ int tm_count = 0;
++ #endif
+ /* Messy cases: unanchored match. */
+ while (!got_int)
+ {
+***************
+*** 3550,3555 ****
+--- 3556,3570 ----
+ else
+ #endif
+ ++col;
++ #ifdef FEAT_RELTIME
++ /* Check for timeout once in a twenty times to avoid overhead. */
++ if (tm != NULL && ++tm_count == 20)
++ {
++ tm_count = 0;
++ if (profile_passed_limit(tm))
++ break;
++ }
++ #endif
+ }
+ }
+
+*** ../vim-7.1.235/src/proto/regexp.pro Sat May 5 19:42:08 2007
+--- src/proto/regexp.pro Sat Jan 19 13:14:09 2008
+***************
+*** 1,13 ****
+ /* regexp.c */
+- void free_regexp_stuff __ARGS((void));
+ int re_multiline __ARGS((regprog_T *prog));
+ int re_lookbehind __ARGS((regprog_T *prog));
+ char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp));
+ regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags));
+ int vim_regcomp_had_eol __ARGS((void));
+ int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
+ int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
+! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col));
+ reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em));
+ void unref_extmatch __ARGS((reg_extmatch_T *em));
+ char_u *regtilde __ARGS((char_u *source, int magic));
+--- 1,13 ----
+ /* regexp.c */
+ int re_multiline __ARGS((regprog_T *prog));
+ int re_lookbehind __ARGS((regprog_T *prog));
+ char_u *skip_regexp __ARGS((char_u *startp, int dirc, int magic, char_u **newp));
+ regprog_T *vim_regcomp __ARGS((char_u *expr, int re_flags));
+ int vim_regcomp_had_eol __ARGS((void));
++ void free_regexp_stuff __ARGS((void));
+ int vim_regexec __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
+ int vim_regexec_nl __ARGS((regmatch_T *rmp, char_u *line, colnr_T col));
+! long vim_regexec_multi __ARGS((regmmatch_T *rmp, win_T *win, buf_T *buf, linenr_T lnum, colnr_T col, proftime_T *tm));
+ reg_extmatch_T *ref_extmatch __ARGS((reg_extmatch_T *em));
+ void unref_extmatch __ARGS((reg_extmatch_T *em));
+ char_u *regtilde __ARGS((char_u *source, int magic));
+*** ../vim-7.1.235/src/proto/search.pro Sun Jan 6 20:05:36 2008
+--- src/proto/search.pro Fri Jan 18 21:03:49 2008
+***************
+*** 11,17 ****
+ void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
+ void last_pat_prog __ARGS((regmmatch_T *regmatch));
+ int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm));
+! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options));
+ int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat));
+ int searchc __ARGS((cmdarg_T *cap, int t_cmd));
+ pos_T *findmatch __ARGS((oparg_T *oap, int initc));
+--- 11,17 ----
+ void set_last_search_pat __ARGS((char_u *s, int idx, int magic, int setlast));
+ void last_pat_prog __ARGS((regmmatch_T *regmatch));
+ int searchit __ARGS((win_T *win, buf_T *buf, pos_T *pos, int dir, char_u *pat, long count, int options, int pat_use, linenr_T stop_lnum, proftime_T *tm));
+! int do_search __ARGS((oparg_T *oap, int dirc, char_u *pat, long count, int options, proftime_T *tm));
+ int search_for_exact_line __ARGS((buf_T *buf, pos_T *pos, int dir, char_u *pat));
+ int searchc __ARGS((cmdarg_T *cap, int t_cmd));
+ pos_T *findmatch __ARGS((oparg_T *oap, int initc));
+*** ../vim-7.1.235/src/search.c Sun Jan 6 20:05:36 2008
+--- src/search.c Sat Jan 19 13:13:25 2008
+***************
+*** 606,612 ****
+ * Look for a match somewhere in line "lnum".
+ */
+ nmatched = vim_regexec_multi(®match, win, buf,
+! lnum, (colnr_T)0);
+ /* Abort searching on an error (e.g., out of stack). */
+ if (called_emsg)
+ break;
+--- 606,618 ----
+ * Look for a match somewhere in line "lnum".
+ */
+ nmatched = vim_regexec_multi(®match, win, buf,
+! lnum, (colnr_T)0,
+! #ifdef FEAT_RELTIME
+! tm
+! #else
+! NULL
+! #endif
+! );
+ /* Abort searching on an error (e.g., out of stack). */
+ if (called_emsg)
+ break;
+***************
+*** 615,623 ****
+ /* match may actually be in another line when using \zs */
+ matchpos = regmatch.startpos[0];
+ endpos = regmatch.endpos[0];
+! # ifdef FEAT_EVAL
+ submatch = first_submatch(®match);
+! # endif
+ /* Line me be past end of buffer for "\n\zs". */
+ if (lnum + matchpos.lnum > buf->b_ml.ml_line_count)
+ ptr = (char_u *)"";
+--- 621,629 ----
+ /* match may actually be in another line when using \zs */
+ matchpos = regmatch.startpos[0];
+ endpos = regmatch.endpos[0];
+! #ifdef FEAT_EVAL
+ submatch = first_submatch(®match);
+! #endif
+ /* Line me be past end of buffer for "\n\zs". */
+ if (lnum + matchpos.lnum > buf->b_ml.ml_line_count)
+ ptr = (char_u *)"";
+***************
+*** 693,699 ****
+ if (ptr[matchcol] == NUL
+ || (nmatched = vim_regexec_multi(®match,
+ win, buf, lnum + matchpos.lnum,
+! matchcol)) == 0)
+ {
+ match_ok = FALSE;
+ break;
+--- 699,711 ----
+ if (ptr[matchcol] == NUL
+ || (nmatched = vim_regexec_multi(®match,
+ win, buf, lnum + matchpos.lnum,
+! matchcol,
+! #ifdef FEAT_RELTIME
+! tm
+! #else
+! NULL
+! #endif
+! )) == 0)
+ {
+ match_ok = FALSE;
+ break;
+***************
+*** 799,805 ****
+ if (ptr[matchcol] == NUL
+ || (nmatched = vim_regexec_multi(®match,
+ win, buf, lnum + matchpos.lnum,
+! matchcol)) == 0)
+ break;
+
+ /* Need to get the line pointer again, a
+--- 811,823 ----
+ if (ptr[matchcol] == NUL
+ || (nmatched = vim_regexec_multi(®match,
+ win, buf, lnum + matchpos.lnum,
+! matchcol,
+! #ifdef FEAT_RELTIME
+! tm
+! #else
+! NULL
+! #endif
+! )) == 0)
+ break;
+
+ /* Need to get the line pointer again, a
+***************
+*** 977,988 ****
+ * return 0 for failure, 1 for found, 2 for found and line offset added
+ */
+ int
+! do_search(oap, dirc, pat, count, options)
+ oparg_T *oap; /* can be NULL */
+ int dirc; /* '/' or '?' */
+ char_u *pat;
+ long count;
+ int options;
+ {
+ pos_T pos; /* position of the last match */
+ char_u *searchstr;
+--- 995,1007 ----
+ * return 0 for failure, 1 for found, 2 for found and line offset added
+ */
+ int
+! do_search(oap, dirc, pat, count, options, tm)
+ oparg_T *oap; /* can be NULL */
+ int dirc; /* '/' or '?' */
+ char_u *pat;
+ long count;
+ int options;
++ proftime_T *tm; /* timeout limit or NULL */
+ {
+ pos_T pos; /* position of the last match */
+ char_u *searchstr;
+***************
+*** 1256,1262 ****
+ (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
+ + SEARCH_MSG + SEARCH_START
+ + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
+! RE_LAST, (linenr_T)0, NULL);
+
+ if (dircp != NULL)
+ *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */
+--- 1275,1281 ----
+ (SEARCH_KEEP + SEARCH_PEEK + SEARCH_HIS
+ + SEARCH_MSG + SEARCH_START
+ + ((pat != NULL && *pat == ';') ? 0 : SEARCH_NOOF))),
+! RE_LAST, (linenr_T)0, tm);
+
+ if (dircp != NULL)
+ *dircp = dirc; /* restore second '/' or '?' for normal_cmd() */
+*** ../vim-7.1.235/src/screen.c Sat Jan 12 16:45:25 2008
+--- src/screen.c Sat Jan 19 13:52:29 2008
+***************
+*** 848,858 ****
+--- 848,863 ----
+ cur->hl.buf = buf;
+ cur->hl.lnum = 0;
+ cur->hl.first_lnum = 0;
++ # ifdef FEAT_RELTIME
++ /* Set the time limit to 'redrawtime'. */
++ profile_setlimit(p_rdt, &(cur->hl.tm));
++ # endif
+ cur = cur->next;
+ }
+ search_hl.buf = buf;
+ search_hl.lnum = 0;
+ search_hl.first_lnum = 0;
++ /* time limit is set at the toplevel, for all windows */
+ #endif
+
+ #ifdef FEAT_LINEBREAK
+***************
+*** 6462,6467 ****
+--- 6467,6476 ----
+ {
+ last_pat_prog(&search_hl.rm);
+ search_hl.attr = hl_attr(HLF_L);
++ # ifdef FEAT_RELTIME
++ /* Set the time limit to 'redrawtime'. */
++ profile_setlimit(p_rdt, &search_hl.tm);
++ # endif
+ }
+ }
+
+***************
+*** 6587,6592 ****
+--- 6596,6609 ----
+ called_emsg = FALSE;
+ for (;;)
+ {
++ #ifdef FEAT_RELTIME
++ /* Stop searching after passing the time limit. */
++ if (profile_passed_limit(&(shl->tm)))
++ {
++ shl->lnum = 0; /* no match found in time */
++ break;
++ }
++ #endif
+ /* Three situations:
+ * 1. No useful previous match: search from start of line.
+ * 2. Not Vi compatible or empty match: continue at next character.
+***************
+*** 6620,6626 ****
+ matchcol = shl->rm.endpos[0].col;
+
+ shl->lnum = lnum;
+! nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol);
+ if (called_emsg)
+ {
+ /* Error while handling regexp: stop using this regexp. */
+--- 6637,6649 ----
+ matchcol = shl->rm.endpos[0].col;
+
+ shl->lnum = lnum;
+! nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol,
+! #ifdef FEAT_RELTIME
+! &(shl->tm)
+! #else
+! NULL
+! #endif
+! );
+ if (called_emsg)
+ {
+ /* Error while handling regexp: stop using this regexp. */
+*** ../vim-7.1.235/src/option.h Thu May 10 20:34:47 2007
+--- src/option.h Sat Jan 19 13:45:51 2008
+***************
+*** 633,638 ****
+--- 633,641 ----
+ #ifdef FEAT_SEARCHPATH
+ EXTERN char_u *p_cdpath; /* 'cdpath' */
+ #endif
++ #ifdef FEAT_RELTIME
++ EXTERN long p_rdt; /* 'redrawtime' */
++ #endif
+ EXTERN int p_remap; /* 'remap' */
+ EXTERN long p_report; /* 'report' */
+ #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
+*** ../vim-7.1.235/src/spell.c Sat Jan 12 16:45:25 2008
+--- src/spell.c Fri Jan 18 21:02:47 2008
+***************
+*** 10343,10349 ****
+ curwin->w_cursor.lnum = 0;
+ while (!got_int)
+ {
+! if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP) == 0
+ || u_save_cursor() == FAIL)
+ break;
+
+--- 10343,10349 ----
+ curwin->w_cursor.lnum = 0;
+ while (!got_int)
+ {
+! if (do_search(NULL, '/', frompat, 1L, SEARCH_KEEP, NULL) == 0
+ || u_save_cursor() == FAIL)
+ break;
+
+*** ../vim-7.1.235/src/structs.h Mon Oct 1 22:53:27 2007
+--- src/structs.h Fri Jan 18 21:18:53 2008
+***************
+*** 1717,1722 ****
+--- 1717,1725 ----
+ linenr_T first_lnum; /* first lnum to search for multi-line pat */
+ colnr_T startcol; /* in win_line() points to char where HL starts */
+ colnr_T endcol; /* in win_line() points to char where HL ends */
++ #ifdef FEAT_RELTIME
++ proftime_T tm; /* for a time limit */
++ #endif
+ } match_T;
+
+ /*
+*** ../vim-7.1.235/src/syntax.c Sun Jan 13 17:39:29 2008
+--- src/syntax.c Sat Jan 19 13:13:49 2008
+***************
+*** 3097,3103 ****
+ colnr_T col;
+ {
+ rmp->rmm_maxcol = syn_buf->b_p_smc;
+! if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col) > 0)
+ {
+ rmp->startpos[0].lnum += lnum;
+ rmp->endpos[0].lnum += lnum;
+--- 3097,3103 ----
+ colnr_T col;
+ {
+ rmp->rmm_maxcol = syn_buf->b_p_smc;
+! if (vim_regexec_multi(rmp, syn_win, syn_buf, lnum, col, NULL) > 0)
+ {
+ rmp->startpos[0].lnum += lnum;
+ rmp->endpos[0].lnum += lnum;
+*** ../vim-7.1.235/src/tag.c Thu May 10 19:44:07 2007
+--- src/tag.c Fri Jan 18 21:03:41 2008
+***************
+*** 3191,3197 ****
+ #endif
+ save_lnum = curwin->w_cursor.lnum;
+ curwin->w_cursor.lnum = 0; /* start search before first line */
+! if (do_search(NULL, pbuf[0], pbuf + 1, (long)1, search_options))
+ retval = OK;
+ else
+ {
+--- 3191,3198 ----
+ #endif
+ save_lnum = curwin->w_cursor.lnum;
+ curwin->w_cursor.lnum = 0; /* start search before first line */
+! if (do_search(NULL, pbuf[0], pbuf + 1, (long)1,
+! search_options, NULL))
+ retval = OK;
+ else
+ {
+***************
+*** 3203,3209 ****
+ */
+ p_ic = TRUE;
+ if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1,
+! search_options))
+ {
+ /*
+ * Failed to find pattern, take a guess: "^func ("
+--- 3204,3210 ----
+ */
+ p_ic = TRUE;
+ if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1,
+! search_options, NULL))
+ {
+ /*
+ * Failed to find pattern, take a guess: "^func ("
+***************
+*** 3213,3225 ****
+ cc = *tagp.tagname_end;
+ *tagp.tagname_end = NUL;
+ sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname);
+! if (!do_search(NULL, '/', pbuf, (long)1, search_options))
+ {
+ /* Guess again: "^char * \<func (" */
+ sprintf((char *)pbuf, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(",
+ tagp.tagname);
+ if (!do_search(NULL, '/', pbuf, (long)1,
+! search_options))
+ found = 0;
+ }
+ *tagp.tagname_end = cc;
+--- 3214,3227 ----
+ cc = *tagp.tagname_end;
+ *tagp.tagname_end = NUL;
+ sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname);
+! if (!do_search(NULL, '/', pbuf, (long)1,
+! search_options, NULL))
+ {
+ /* Guess again: "^char * \<func (" */
+ sprintf((char *)pbuf, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(",
+ tagp.tagname);
+ if (!do_search(NULL, '/', pbuf, (long)1,
+! search_options, NULL))
+ found = 0;
+ }
+ *tagp.tagname_end = cc;
+*** ../vim-7.1.235/src/vim.h Sat Jan 5 13:34:01 2008
+--- src/vim.h Fri Jan 18 21:29:22 2008
+***************
+*** 1550,1555 ****
+--- 1550,1565 ----
+ # define MB_MAXBYTES 21
+ #endif
+
++ #if (defined(FEAT_PROFILE) || defined(FEAT_RELTIME)) && !defined(PROTO)
++ # ifdef WIN3264
++ typedef LARGE_INTEGER proftime_T;
++ # else
++ typedef struct timeval proftime_T;
++ # endif
++ #else
++ typedef int proftime_T; /* dummy for function prototypes */
++ #endif
++
+ /* Include option.h before structs.h, because the number of window-local and
+ * buffer-local options is used there. */
+ #include "option.h" /* options and default values */
+***************
+*** 1760,1775 ****
+ # include <io.h> /* for access() */
+
+ # define stat(a,b) (access(a,0) ? -1 : stat(a,b))
+- #endif
+-
+- #if (defined(FEAT_PROFILE) || defined(FEAT_RELTIME)) && !defined(PROTO)
+- # ifdef WIN3264
+- typedef LARGE_INTEGER proftime_T;
+- # else
+- typedef struct timeval proftime_T;
+- # endif
+- #else
+- typedef int proftime_T; /* dummy for function prototypes */
+ #endif
+
+ #include "ex_cmds.h" /* Ex command defines */
+--- 1770,1775 ----
+*** ../vim-7.1.235/src/version.c Fri Jan 18 20:36:40 2008
+--- src/version.c Sat Jan 19 15:19:48 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+ { /* Add new patch number below this line */
++ /**/
++ 236,
+ /**/
+
+--
+Every time I lose weight, it finds me again!
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ download, build and distribute -- http://www.A-A-P.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///