diff --git a/.cvsignore b/.gitignore similarity index 100% rename from .cvsignore rename to .gitignore diff --git a/7.1.136 b/7.1.136 new file mode 100644 index 00000000..c1a9a82c --- /dev/null +++ b/7.1.136 @@ -0,0 +1,47 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.136 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.136 +Problem: Memory leak when using Ruby syntax highlighting. (Dominique Pelle) +Solution: Free the contained-in list. +Files: src/syntax.c + + +*** ../vim-7.1.135/src/syntax.c Thu Aug 30 19:36:52 2007 +--- src/syntax.c Sun Oct 7 15:10:54 2007 +*************** +*** 3354,3359 **** +--- 3354,3360 ---- + { + vim_free(SYN_ITEMS(buf)[i].sp_cont_list); + vim_free(SYN_ITEMS(buf)[i].sp_next_list); ++ vim_free(SYN_ITEMS(buf)[i].sp_syn.cont_in_list); + } + } + +*** ../vim-7.1.135/src/version.c Wed Oct 3 14:30:54 2007 +--- src/version.c Sun Oct 7 15:20:22 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 136, + /**/ + +-- +Every engineer dreams about saving the universe and having sex with aliens. +This is much more glamorous than the real life of an engineer, which consists +of hiding from the universe and having sex without the participation of other +life forms. (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.137 b/7.1.137 new file mode 100644 index 00000000..7e3a53f6 --- /dev/null +++ b/7.1.137 @@ -0,0 +1,49 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.137 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.137 +Problem: Build failure when using EXITFREE. (Dominique Pelle) +Solution: Add an #ifdef around using clip_exclude_prog. +Files: src/misc2.c + + +*** ../vim-7.1.136/src/misc2.c Sat Sep 29 14:15:00 2007 +--- src/misc2.c Sun Sep 30 18:00:09 2007 +*************** +*** 1037,1043 **** +--- 1038,1046 ---- + + /* Free some global vars. */ + vim_free(username); ++ # ifdef FEAT_CLIPBOARD + vim_free(clip_exclude_prog); ++ # endif + vim_free(last_cmdline); + vim_free(new_last_cmdline); + set_keep_msg(NULL, 0); +*** ../vim-7.1.136/src/version.c Sun Oct 7 15:21:31 2007 +--- src/version.c Sun Oct 7 15:42:26 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 137, + /**/ + +-- +For society, it's probably a good thing that engineers value function over +appearance. For example, you wouldn't want engineers to build nuclear power +plants that only _look_ like they would keep all the radiation inside. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.138 b/7.1.138 new file mode 100644 index 00000000..792cdbc6 --- /dev/null +++ b/7.1.138 @@ -0,0 +1,66 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.138 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.138 +Problem: The Perl Msg() function doesn't stop when "q" is typed at the more + prompt. (Hari Krishna Dara) +Solution: Check got_int. +Files: src/if_perl.xs + + +*** ../vim-7.1.137/src/if_perl.xs Sat Sep 15 14:48:57 2007 +--- src/if_perl.xs Wed Oct 3 17:00:16 2007 +*************** +*** 445,457 **** + char *next; + char *token = (char *)s; + +! while ((next = strchr(token, '\n'))) + { + *next++ = '\0'; /* replace \n with \0 */ + msg_attr((char_u *)token, attr); + token = next; + } +! if (*token) + msg_attr((char_u *)token, attr); + } + +--- 445,457 ---- + char *next; + char *token = (char *)s; + +! while ((next = strchr(token, '\n')) && !got_int) + { + *next++ = '\0'; /* replace \n with \0 */ + msg_attr((char_u *)token, attr); + token = next; + } +! if (*token && !got_int) + msg_attr((char_u *)token, attr); + } + +*** ../vim-7.1.137/src/version.c Sun Oct 7 15:44:28 2007 +--- src/version.c Tue Oct 9 10:45:08 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 138, + /**/ + +-- +A consultant is a person who takes your money and annoys your employees while +tirelessly searching for the best way to extend the consulting contract. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.139 b/7.1.139 new file mode 100644 index 00000000..27671514 --- /dev/null +++ b/7.1.139 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.139 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.139 +Problem: When using marker folding and ending Insert mode with CTRL-C the + current fold is truncated. (Fred Kater) +Solution: Ignore got_int while updating folds. +Files: src/fold.c + + +*** ../vim-7.1.138/src/fold.c Thu May 10 21:02:13 2007 +--- src/fold.c Sun Oct 14 15:27:13 2007 +*************** +*** 858,864 **** +--- 858,871 ---- + || foldmethodIsDiff(wp) + #endif + || foldmethodIsSyntax(wp)) ++ { ++ int save_got_int = got_int; ++ ++ /* reset got_int here, otherwise it won't work */ ++ got_int = FALSE; + foldUpdateIEMS(wp, top, bot); ++ got_int |= save_got_int; ++ } + } + + /* foldUpdateAll() {{{2 */ +*** ../vim-7.1.138/src/version.c Tue Oct 9 10:46:39 2007 +--- src/version.c Sun Oct 14 15:31:18 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 139, + /**/ + +-- +If Pacman had affected us as kids we'd be running around in dark rooms, +munching pills and listening to repetitive music. + -- Marcus Brigstocke + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.140 b/7.1.140 new file mode 100644 index 00000000..d10c1884 --- /dev/null +++ b/7.1.140 @@ -0,0 +1,52 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.140 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.140 +Problem: v:count is set only after typing a non-digit, that makes it + difficult to make a nice mapping. +Solution: Set v:count while still typing the count. +Files: src/normal.c + + +*** ../vim-7.1.139/src/normal.c Thu Sep 13 18:25:08 2007 +--- src/normal.c Sun Oct 14 17:15:36 2007 +*************** +*** 690,695 **** +--- 690,702 ---- + ca.count0 = ca.count0 * 10 + (c - '0'); + if (ca.count0 < 0) /* got too large! */ + ca.count0 = 999999999L; ++ #ifdef FEAT_EVAL ++ /* Set v:count here, when called from main() and not a stuffed ++ * command, so that v:count can be used in an expression mapping ++ * right after the count. */ ++ if (toplevel && stuff_empty()) ++ set_vcount(ca.count0, ca.count0 == 0 ? 1 : ca.count0); ++ #endif + if (ctrl_w) + { + ++no_mapping; +*** ../vim-7.1.139/src/version.c Sun Oct 14 15:32:10 2007 +--- src/version.c Sun Oct 14 17:13:15 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 140, + /**/ + +-- +How To Keep A Healthy Level Of Insanity: +11. Specify that your drive-through order is "to go". + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.141 b/7.1.141 new file mode 100644 index 00000000..7b3c5d9f --- /dev/null +++ b/7.1.141 @@ -0,0 +1,97 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.141 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.141 +Problem: GTK: -geom argument doesn't support a negative offset. +Solution: Compute position from the right/lower corner. +Files: src/gui_gtk_x11.c + + +*** ../vim-7.1.140/src/gui_gtk_x11.c Sat Sep 15 14:06:41 2007 +--- src/gui_gtk_x11.c Mon Oct 8 21:26:50 2007 +*************** +*** 4044,4049 **** +--- 4044,4051 ---- + unsigned int w, h; + int x = 0; + int y = 0; ++ guint pixel_width; ++ guint pixel_height; + + mask = XParseGeometry((char *)gui.geom, &x, &y, &w, &h); + +*************** +*** 4055,4066 **** +--- 4057,4087 ---- + p_window = h - 1; + Rows = h; + } ++ ++ pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width); ++ pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height); ++ ++ #ifdef HAVE_GTK2 ++ pixel_width += get_menu_tool_width(); ++ pixel_height += get_menu_tool_height(); ++ #endif ++ + if (mask & (XValue | YValue)) ++ { ++ int w, h; ++ gui_mch_get_screen_dimensions(&w, &h); ++ h += p_ghr + get_menu_tool_height(); ++ w += get_menu_tool_width(); ++ if (mask & XNegative) ++ x += w - pixel_width; ++ if (mask & YNegative) ++ y += h - pixel_height; + #ifdef HAVE_GTK2 + gtk_window_move(GTK_WINDOW(gui.mainwin), x, y); + #else + gtk_widget_set_uposition(gui.mainwin, x, y); + #endif ++ } + vim_free(gui.geom); + gui.geom = NULL; + +*************** +*** 4071,4084 **** + */ + if (gtk_socket_id != 0 && (mask & WidthValue || mask & HeightValue)) + { +- guint pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width); +- guint pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height); +- +- #ifdef HAVE_GTK2 +- pixel_width += get_menu_tool_width(); +- pixel_height += get_menu_tool_height(); +- #endif +- + update_window_manager_hints(pixel_width, pixel_height); + init_window_hints_state = 1; + g_timeout_add(1000, check_startup_plug_hints, NULL); +--- 4092,4097 ---- +*** ../vim-7.1.140/src/version.c Sun Oct 14 17:15:45 2007 +--- src/version.c Fri Oct 19 14:28:52 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 141, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +35. Your husband tells you he's had the beard for 2 months. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.142 b/7.1.142 new file mode 100644 index 00000000..892cf99f --- /dev/null +++ b/7.1.142 @@ -0,0 +1,77 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.142 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.142 +Problem: ":redir @A>" doesn't work. +Solution: Ignore the extra ">" also when appending. (James Vega) +Files: src/ex_docmd.c + + +*** ../vim-7.1.141/src/ex_docmd.c Sun Sep 30 14:00:41 2007 +--- src/ex_docmd.c Tue Oct 9 11:09:09 2007 +*************** +*** 8426,8446 **** + || *arg == '"') + { + redir_reg = *arg++; +! if (*arg == '>' && arg[1] == '>') + arg += 2; +! else if ((*arg == NUL || (*arg == '>' && arg[1] == NUL)) && +! (islower(redir_reg) +! # ifdef FEAT_CLIPBOARD +! || redir_reg == '*' +! || redir_reg == '+' +! # endif +! || redir_reg == '"')) + { + if (*arg == '>') + arg++; +! +! /* make register empty */ +! write_reg_contents(redir_reg, (char_u *)"", -1, FALSE); + } + } + if (*arg != NUL) +--- 8426,8442 ---- + || *arg == '"') + { + redir_reg = *arg++; +! if (*arg == '>' && arg[1] == '>') /* append */ + arg += 2; +! else + { ++ /* Can use both "@a" and "@a>". */ + if (*arg == '>') + arg++; +! /* Make register empty when not using @A-@Z and the +! * command is valid. */ +! if (*arg == NUL && !isupper(redir_reg)) +! write_reg_contents(redir_reg, (char_u *)"", -1, FALSE); + } + } + if (*arg != NUL) +*** ../vim-7.1.141/src/version.c Fri Oct 19 14:32:50 2007 +--- src/version.c Fri Oct 19 16:18:36 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 142, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +36. You miss more than five meals a week downloading the latest games from + Apogee. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.143 b/7.1.143 new file mode 100644 index 00000000..fa385afa --- /dev/null +++ b/7.1.143 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.143 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.143 +Problem: Uninitialized memory read when diffing three files. (Dominique + Pelle) +Solution: Remove "+ !notset" so that we don't use fields that were not + computed. +Files: src/diff.c + + +*** ../vim-7.1.142/src/diff.c Sat Sep 29 14:15:00 2007 +--- src/diff.c Sun Oct 14 21:52:56 2007 +*************** +*** 1310,1316 **** + dp->df_count[idx_new] += -off; + off = 0; + } +! for (i = idx_orig; i < idx_new + !notset; ++i) + if (curtab->tp_diffbuf[i] != NULL) + dp->df_count[i] = dpl->df_lnum[i] + dpl->df_count[i] + - dp->df_lnum[i] + off; +--- 1310,1316 ---- + dp->df_count[idx_new] += -off; + off = 0; + } +! for (i = idx_orig; i < idx_new; ++i) + if (curtab->tp_diffbuf[i] != NULL) + dp->df_count[i] = dpl->df_lnum[i] + dpl->df_count[i] + - dp->df_lnum[i] + off; +*** ../vim-7.1.142/src/version.c Fri Oct 19 16:20:09 2007 +--- src/version.c Fri Oct 19 17:32:18 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 143, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +37. You start looking for hot HTML addresses in public restrooms. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.144 b/7.1.144 new file mode 100644 index 00000000..d2bcfa0c --- /dev/null +++ b/7.1.144 @@ -0,0 +1,46 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.144 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.144 +Problem: After ":diffup" cursor can be in the wrong position. +Solution: Force recomputing the cursor position. +Files: src/diff.c + + +*** ../vim-7.1.143/src/diff.c Fri Oct 19 17:32:58 2007 +--- src/diff.c Fri Oct 19 18:54:13 2007 +*************** +*** 791,796 **** +--- 791,799 ---- + } + mch_remove(tmp_orig); + ++ /* force updating cursor position on screen */ ++ curwin->w_valid_cursor.lnum = 0; ++ + diff_redraw(TRUE); + + theend: +*** ../vim-7.1.143/src/version.c Fri Oct 19 17:32:58 2007 +--- src/version.c Fri Oct 19 18:56:49 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 144, + /**/ + +-- +He who laughs last, thinks slowest. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.145 b/7.1.145 new file mode 100644 index 00000000..cb947995 --- /dev/null +++ b/7.1.145 @@ -0,0 +1,171 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.145 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.145 +Problem: Insert mode completion: When using the popup menu, after + completing a word and typing a non-word character Vim is still + completing the same word, following CTRL-N doesn't work. + Insert mode Completion: When using CTRL-X O and there is only + "struct." before the cursor, typing one char to reduce the + matches, then BS completion stops. +Solution: When typing a character that is not part of the item being + completed, stop complete mode. For whole line completion also + accept a space. For file name completion stop at a path + separator. + For omni completion stay in completion mode even if completing + with empty string. +Files: src/edit.c + + +*** ../vim-7.1.144/src/edit.c Thu Sep 13 18:25:08 2007 +--- src/edit.c Fri Oct 19 16:04:38 2007 +*************** +*** 129,134 **** +--- 129,135 ---- + + static void ins_ctrl_x __ARGS((void)); + static int has_compl_option __ARGS((int dict_opt)); ++ static int ins_compl_accept_char __ARGS((int c)); + static int ins_compl_add __ARGS((char_u *str, int len, int icase, char_u *fname, char_u **cptext, int cdir, int flags, int adup)); + static int ins_compl_equal __ARGS((compl_T *match, char_u *str, int len)); + static void ins_compl_longest_match __ARGS((compl_T *match)); +*************** +*** 754,761 **** + continue; + } + +! /* A printable, non-white character: Add to "compl_leader". */ +! if (vim_isprintc(c) && !vim_iswhite(c)) + { + ins_compl_addleader(c); + continue; +--- 755,763 ---- + continue; + } + +! /* A non-white character that fits in with the current +! * completion: Add to "compl_leader". */ +! if (ins_compl_accept_char(c)) + { + ins_compl_addleader(c); + continue; +*************** +*** 2053,2058 **** +--- 2055,2094 ---- + } + + /* ++ * Return TRUE when character "c" is part of the item currently being ++ * completed. Used to decide whether to abandon complete mode when the menu ++ * is visible. ++ */ ++ static int ++ ins_compl_accept_char(c) ++ int c; ++ { ++ if (ctrl_x_mode & CTRL_X_WANT_IDENT) ++ /* When expanding an identifier only accept identifier chars. */ ++ return vim_isIDc(c); ++ ++ switch (ctrl_x_mode) ++ { ++ case CTRL_X_FILES: ++ /* When expanding file name only accept file name chars. But not ++ * path separators, so that "proto/" expands files in ++ * "proto", not "proto/" as a whole */ ++ return vim_isfilec(c) && !vim_ispathsep(c); ++ ++ case CTRL_X_CMDLINE: ++ case CTRL_X_OMNI: ++ /* Command line and Omni completion can work with just about any ++ * printable character, but do stop at white space. */ ++ return vim_isprintc(c) && !vim_iswhite(c); ++ ++ case CTRL_X_WHOLE_LINE: ++ /* For while line completion a space can be part of the line. */ ++ return vim_isprintc(c); ++ } ++ return vim_iswordc(c); ++ } ++ ++ /* + * This is like ins_compl_add(), but if 'ic' and 'inf' are set, then the + * case of the originally typed text is used, and the case of the completed + * text is inferred, ie this tries to work out what case you probably wanted +*************** +*** 3128,3135 **** + p = line + curwin->w_cursor.col; + mb_ptr_back(line, p); + +! /* Stop completion when the whole word was deleted. */ +! if ((int)(p - line) - (int)compl_col <= 0) + return K_BS; + + /* Deleted more than what was used to find matches or didn't finish +--- 3164,3174 ---- + p = line + curwin->w_cursor.col; + mb_ptr_back(line, p); + +! /* Stop completion when the whole word was deleted. For Omni completion +! * allow the word to be deleted, we won't match everything. */ +! if ((int)(p - line) - (int)compl_col < 0 +! || ((int)(p - line) - (int)compl_col == 0 +! && (ctrl_x_mode & CTRL_X_OMNI) == 0)) + return K_BS; + + /* Deleted more than what was used to find matches or didn't finish +*************** +*** 4591,4604 **** + curs_col = curwin->w_cursor.col; + compl_pending = 0; + +! /* if this same ctrl_x_mode has been interrupted use the text from + * "compl_startpos" to the cursor as a pattern to add a new word + * instead of expand the one before the cursor, in word-wise if +! * "compl_startpos" +! * is not in the same line as the cursor then fix it (the line has +! * been split because it was longer than 'tw'). if SOL is set then +! * skip the previous pattern, a word at the beginning of the line has +! * been inserted, we'll look for that -- Acevedo. */ + if ((compl_cont_status & CONT_INTRPT) == CONT_INTRPT + && compl_cont_mode == ctrl_x_mode) + { +--- 4630,4642 ---- + curs_col = curwin->w_cursor.col; + compl_pending = 0; + +! /* If this same ctrl_x_mode has been interrupted use the text from + * "compl_startpos" to the cursor as a pattern to add a new word + * instead of expand the one before the cursor, in word-wise if +! * "compl_startpos" is not in the same line as the cursor then fix it +! * (the line has been split because it was longer than 'tw'). if SOL +! * is set then skip the previous pattern, a word at the beginning of +! * the line has been inserted, we'll look for that -- Acevedo. */ + if ((compl_cont_status & CONT_INTRPT) == CONT_INTRPT + && compl_cont_mode == ctrl_x_mode) + { +*** ../vim-7.1.144/src/version.c Fri Oct 19 18:57:33 2007 +--- src/version.c Fri Oct 19 20:38:21 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 145, + /**/ + +-- +Micro$oft: where do you want to go today? + Linux: where do you want to go tomorrow? + FreeBSD: are you guys coming, or what? + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.146 b/7.1.146 new file mode 100644 index 00000000..75ce738f --- /dev/null +++ b/7.1.146 @@ -0,0 +1,92 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.146 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.146 (extra) +Problem: VMS: Files with a very rare record organization (VFC) cannot be + properly written by Vim. + On older VAX systems mms runs into a syntax error. +Solution: Check for this special situation. Do not wrap a comment, make it + one long line. (Zoltan Arpadffy) +Files: src/fileio.c, src/Make_vms.mms + + +*** ../vim-7.1.145/src/fileio.c Wed Oct 3 12:49:24 2007 +--- src/fileio.c Mon Oct 22 21:10:00 2007 +*************** +*** 4251,4257 **** + * they don't it adds one. + * With other RMS structures it works perfect without this fix. + */ +! if ((buf->b_fab_rat & (FAB$M_FTN | FAB$M_CR)) != 0) + { + int b2write; + +--- 4252,4259 ---- + * they don't it adds one. + * With other RMS structures it works perfect without this fix. + */ +! if (buf->b_fab_rfm == FAB$C_VFC +! || ((buf->b_fab_rat & (FAB$M_FTN | FAB$M_CR)) != 0)) + { + int b2write; + +*** ../vim-7.1.145/src/Make_vms.mms Thu May 10 20:47:35 2007 +--- src/Make_vms.mms Mon Oct 22 21:13:08 2007 +*************** +*** 2,8 **** + # Makefile for Vim on OpenVMS + # + # Maintainer: Zoltan Arpadffy +! # Last change: 2007 May 07 + # + # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 + # with MMS and MMK +--- 2,8 ---- + # Makefile for Vim on OpenVMS + # + # Maintainer: Zoltan Arpadffy +! # Last change: 2007 Oct 22 + # + # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 + # with MMS and MMK +*************** +*** 96,103 **** + + .IFDEF MMSVAX + .IFDEF DECC # VAX with DECC +! CC_DEF = cc # /decc # some system requires this switch +! # but when it is not required /ver might fail + PREFIX = /prefix=all + .ELSE # VAX with VAXC + CC_DEF = cc +--- 96,102 ---- + + .IFDEF MMSVAX + .IFDEF DECC # VAX with DECC +! CC_DEF = cc # /decc # some system requires this switch but when it is not required /ver might fail + PREFIX = /prefix=all + .ELSE # VAX with VAXC + CC_DEF = cc +*** ../vim-7.1.145/src/version.c Fri Oct 19 20:39:56 2007 +--- src/version.c Mon Oct 29 22:36:20 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 146, + /**/ + +-- +Be thankful to be in a traffic jam, because it means you own a car. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.147 b/7.1.147 new file mode 100644 index 00000000..57e49659 --- /dev/null +++ b/7.1.147 @@ -0,0 +1,75 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.147 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.147 (after 7.1.127) +Problem: Freeing memory already freed when completing user name. (Meino + Cramer) +Solution: Use a flag to remember if "orig" needs to be freed. +Files: src/ex_getln.c + + +*** ../vim-7.1.146/src/ex_getln.c Sun Sep 30 22:10:45 2007 +--- src/ex_getln.c Tue Oct 30 17:13:33 2007 +*************** +*** 3353,3358 **** +--- 3353,3359 ---- + char_u *ss = NULL; + static int findex; + static char_u *orig_save = NULL; /* kept value of orig */ ++ int orig_saved = FALSE; + int i; + long_u len; + int non_suf_match; /* number without matching suffix */ +*************** +*** 3421,3426 **** +--- 3422,3428 ---- + { + vim_free(orig_save); + orig_save = orig; ++ orig_saved = TRUE; + + /* + * Do the expansion. +*************** +*** 3546,3552 **** + ExpandCleanup(xp); + + /* Free "orig" if it wasn't stored in "orig_save". */ +! if (orig != orig_save) + vim_free(orig); + + return ss; +--- 3548,3554 ---- + ExpandCleanup(xp); + + /* Free "orig" if it wasn't stored in "orig_save". */ +! if (!orig_saved) + vim_free(orig); + + return ss; +*** ../vim-7.1.146/src/version.c Mon Oct 29 22:37:57 2007 +--- src/version.c Tue Oct 30 17:30:35 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 147, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +59. Your wife says communication is important in a marriage...so you buy + another computer and install a second phone line so the two of you can + chat. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.148 b/7.1.148 new file mode 100644 index 00000000..94872e59 --- /dev/null +++ b/7.1.148 @@ -0,0 +1,73 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.148 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.148 +Problem: Some types are not found by configure. +Solution: Test for the sys/types.h header file. (Sean Boudreau) +Files: src/configure.in, src/auto/configure + + +*** ../vim-7.1.147/src/configure.in Thu Jun 28 13:02:22 2007 +--- src/configure.in Sat Oct 27 15:52:16 2007 +*************** +*** 2026,2032 **** + fi + + AC_CHECK_HEADERS(stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ +! termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h termio.h \ + iconv.h langinfo.h unistd.h stropts.h errno.h \ + sys/resource.h sys/systeminfo.h locale.h \ + sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ +--- 2026,2032 ---- + fi + + AC_CHECK_HEADERS(stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ +! termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h sys/types.h termio.h \ + iconv.h langinfo.h unistd.h stropts.h errno.h \ + sys/resource.h sys/systeminfo.h locale.h \ + sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ +*** ../vim-7.1.147/src/auto/configure Thu Jun 28 13:02:22 2007 +--- src/auto/configure Sun Nov 4 15:34:14 2007 +*************** +*** 10265,10272 **** + + + + for ac_header in stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ +! termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h termio.h \ + iconv.h langinfo.h unistd.h stropts.h errno.h \ + sys/resource.h sys/systeminfo.h locale.h \ + sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ +--- 10265,10273 ---- + + + ++ + for ac_header in stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ +! termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h sys/types.h termio.h \ + iconv.h langinfo.h unistd.h stropts.h errno.h \ + sys/resource.h sys/systeminfo.h locale.h \ + sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ +*** ../vim-7.1.147/src/version.c Tue Oct 30 17:36:31 2007 +--- src/version.c Sun Nov 4 15:34:26 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 148, + /**/ + +-- +If your nose runs, and your feet smell, you might be upside down. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.149 b/7.1.149 new file mode 100644 index 00000000..e6a0f5b6 --- /dev/null +++ b/7.1.149 @@ -0,0 +1,180 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.149 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.149 +Problem: GTK GUI: When the completion popup menu is used scrolling another + window by the scrollbar is OK, but using the scroll wheel it + behaves line . +Solution: Ignore K_MOUSEDOWN and K_MOUSEUP. Fix redrawing the popup menu. +Files: src/edit.c, src/gui.c + + +*** ../vim-7.1.148/src/edit.c Fri Oct 19 20:39:56 2007 +--- src/edit.c Sun Nov 4 16:17:42 2007 +*************** +*** 3385,3392 **** + if (c != Ctrl_R && vim_is_ctrl_x_key(c)) + edit_submode_extra = NULL; + +! /* Ignore end of Select mode mapping */ +! if (c == K_SELECT) + return retval; + + /* Set "compl_get_longest" when finding the first matches. */ +--- 3385,3392 ---- + if (c != Ctrl_R && vim_is_ctrl_x_key(c)) + edit_submode_extra = NULL; + +! /* Ignore end of Select mode mapping and mouse scroll buttons. */ +! if (c == K_SELECT || c == K_MOUSEDOWN || c == K_MOUSEUP) + return retval; + + /* Set "compl_get_longest" when finding the first matches. */ +*************** +*** 8652,8666 **** + int up; + { + pos_T tpos; +! # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) +! win_T *old_curwin; + # endif + + tpos = curwin->w_cursor; + + # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) +- old_curwin = curwin; +- + /* Currently the mouse coordinates are only known in the GUI. */ + if (gui.in_use && mouse_row >= 0 && mouse_col >= 0) + { +--- 8652,8667 ---- + int up; + { + pos_T tpos; +! # if defined(FEAT_WINDOWS) +! win_T *old_curwin = curwin; +! # endif +! # ifdef FEAT_INS_EXPAND +! int did_scroll = FALSE; + # endif + + tpos = curwin->w_cursor; + + # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) + /* Currently the mouse coordinates are only known in the GUI. */ + if (gui.in_use && mouse_row >= 0 && mouse_col >= 0) + { +*************** +*** 8677,8692 **** + # endif + undisplay_dollar(); + +! if (mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)) +! scroll_redraw(up, (long)(curwin->w_botline - curwin->w_topline)); +! else +! scroll_redraw(up, 3L); + + # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) + curwin->w_redr_status = TRUE; + + curwin = old_curwin; + curbuf = curwin->w_buffer; + # endif + + if (!equalpos(curwin->w_cursor, tpos)) +--- 8678,8717 ---- + # endif + undisplay_dollar(); + +! # ifdef FEAT_INS_EXPAND +! /* Don't scroll the window in which completion is being done. */ +! if (!pum_visible() +! # if defined(FEAT_WINDOWS) +! || curwin != old_curwin +! # endif +! ) +! # endif +! { +! if (mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)) +! scroll_redraw(up, (long)(curwin->w_botline - curwin->w_topline)); +! else +! scroll_redraw(up, 3L); +! # ifdef FEAT_INS_EXPAND +! did_scroll = TRUE; +! # endif +! } + + # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) + curwin->w_redr_status = TRUE; + + curwin = old_curwin; + curbuf = curwin->w_buffer; ++ # endif ++ ++ # ifdef FEAT_INS_EXPAND ++ /* The popup menu may overlay the window, need to redraw it. ++ * TODO: Would be more efficient to only redraw the windows that are ++ * overlapped by the popup menu. */ ++ if (pum_visible() && did_scroll) ++ { ++ redraw_all_later(NOT_VALID); ++ ins_compl_show_pum(); ++ } + # endif + + if (!equalpos(curwin->w_cursor, tpos)) +*** ../vim-7.1.148/src/gui.c Wed Sep 5 21:45:54 2007 +--- src/gui.c Fri Oct 19 16:14:57 2007 +*************** +*** 4214,4220 **** + #endif + ) + { +! redraw_win_later(wp, VALID); + updateWindow(wp); /* update window, status line, and cmdline */ + } + +--- 4214,4232 ---- + #endif + ) + { +! int type = VALID; +! +! #ifdef FEAT_INS_EXPAND +! if (pum_visible()) +! { +! type = NOT_VALID; +! wp->w_lines_valid = 0; +! } +! #endif +! /* Don't set must_redraw here, it may cause the popup menu to +! * disappear when losing focus after a scrollbar drag. */ +! if (wp->w_redr_type < type) +! wp->w_redr_type = type; + updateWindow(wp); /* update window, status line, and cmdline */ + } + +*** ../vim-7.1.148/src/version.c Sun Nov 4 15:35:23 2007 +--- src/version.c Tue Nov 6 22:21:03 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 149, + /**/ + +-- +From "know your smileys": + ...---... SOS + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.150 b/7.1.150 new file mode 100644 index 00000000..b0074a95 --- /dev/null +++ b/7.1.150 @@ -0,0 +1,59 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.150 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.150 +Problem: When 'clipboard' has "unnamed" using "p" in Visual mode doesn't + work correctly. (Jianrong Yu) +Solution: When 'clipboard' has "unnamed" also obtain the selection when + getting the default register. +Files: src/ops.c + + +*** ../vim-7.1.149/src/ops.c Tue Sep 25 14:19:35 2007 +--- src/ops.c Sun Oct 28 13:58:35 2007 +*************** +*** 933,941 **** + #ifdef FEAT_CLIPBOARD + /* When Visual area changed, may have to update selection. Obtain the + * selection too. */ +! if (name == '*' && clip_star.available && clip_isautosel()) + { +! clip_update_selection(); + may_get_selection(name); + } + #endif +--- 933,942 ---- + #ifdef FEAT_CLIPBOARD + /* When Visual area changed, may have to update selection. Obtain the + * selection too. */ +! if (name == '*' && clip_star.available) + { +! if (clip_isautosel()) +! clip_update_selection(); + may_get_selection(name); + } + #endif +*** ../vim-7.1.149/src/version.c Tue Nov 6 22:26:39 2007 +--- src/version.c Thu Nov 8 10:34:18 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 150, + /**/ + +-- +From "know your smileys": + 8<}} Glasses, big nose, beard + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.151 b/7.1.151 new file mode 100644 index 00000000..610bafb1 --- /dev/null +++ b/7.1.151 @@ -0,0 +1,70 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.151 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.151 +Problem: Using whole line completion with 'ignorecase' and 'infercase' set + and the line is empty get an lalloc(0) error. +Solution: Don't try changing case for an empty match. (Matthew Wozniski) +Files: src/edit.c + + +*** ../vim-7.1.150/src/edit.c Tue Nov 6 22:26:39 2007 +--- src/edit.c Sun Nov 4 16:17:42 2007 +*************** +*** 2111,2117 **** + int has_lower = FALSE; + int was_letter = FALSE; + +! if (p_ic && curbuf->b_p_inf) + { + /* Infer case of completed part. */ + +--- 2111,2117 ---- + int has_lower = FALSE; + int was_letter = FALSE; + +! if (p_ic && curbuf->b_p_inf && len > 0) + { + /* Infer case of completed part. */ + +*************** +*** 2225,2231 **** + wca[i] = MB_TOUPPER(wca[i]); + } + +! /* + * Generate encoding specific output from wide character array. + * Multi-byte characters can occupy up to five bytes more than + * ASCII characters, and we also need one byte for NUL, so stay +--- 2225,2231 ---- + wca[i] = MB_TOUPPER(wca[i]); + } + +! /* + * Generate encoding specific output from wide character array. + * Multi-byte characters can occupy up to five bytes more than + * ASCII characters, and we also need one byte for NUL, so stay +*** ../vim-7.1.150/src/version.c Thu Nov 8 10:35:02 2007 +--- src/version.c Thu Nov 8 13:01:34 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 151, + /**/ + +-- +From "know your smileys": + %-) After staring at screen for 15 hours + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.152 b/7.1.152 new file mode 100644 index 00000000..d1a0f30b --- /dev/null +++ b/7.1.152 @@ -0,0 +1,118 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.152 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.152 +Problem: Display problem when 'hls' and 'cursorcolumn' are set and + searching for "$". (John Mullin) Also when scrolling + horizontally when 'wrap' is off. +Solution: Keep track of the column where highlighting was set. Check the + column offset when skipping characters. +Files: src/screen.c + + +*** ../vim-7.1.151/src/screen.c Mon Sep 17 22:37:05 2007 +--- src/screen.c Fri Oct 19 15:18:49 2007 +*************** +*** 2599,2604 **** +--- 2599,2605 ---- + int syntax_attr = 0; /* attributes desired by syntax */ + int has_syntax = FALSE; /* this buffer has syntax highl. */ + int save_did_emsg; ++ int eol_hl_off = 0; /* 1 if highlighted char after EOL */ + #endif + #ifdef FEAT_SPELL + int has_spell = FALSE; /* this buffer has spell checking */ +*************** +*** 4312,4317 **** +--- 4313,4322 ---- + { + #ifdef FEAT_SEARCH_EXTRA + long prevcol = (long)(ptr - line) - (c == NUL); ++ ++ /* we're not really at that column when skipping some text */ ++ if ((wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) ++ ++prevcol; + #endif + + /* invert at least one char, used for Visual and empty line or +*************** +*** 4408,4418 **** +--- 4413,4432 ---- + ScreenAttrs[off] = char_attr; + #ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) ++ { + --col; ++ --off; ++ } + else + #endif ++ { + ++col; ++ ++off; ++ } + ++vcol; ++ #ifdef FEAT_SYN_HL ++ eol_hl_off = 1; ++ #endif + } + } + +*************** +*** 4422,4427 **** +--- 4436,4449 ---- + if (c == NUL) + { + #ifdef FEAT_SYN_HL ++ if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol) ++ { ++ /* highlight last char after line */ ++ --col; ++ --off; ++ --vcol; ++ } ++ + /* Highlight 'cursorcolumn' past end of the line. */ + if (wp->w_p_wrap) + v = wp->w_skipcol; +*************** +*** 4432,4438 **** + + vcol = v + col - win_col_off(wp); + if (wp->w_p_cuc +! && (int)wp->w_virtcol >= vcol + && (int)wp->w_virtcol < W_WIDTH(wp) * (row - startrow + 1) + + v + && lnum != wp->w_cursor.lnum +--- 4454,4460 ---- + + vcol = v + col - win_col_off(wp); + if (wp->w_p_cuc +! && (int)wp->w_virtcol >= vcol - eol_hl_off + && (int)wp->w_virtcol < W_WIDTH(wp) * (row - startrow + 1) + + v + && lnum != wp->w_cursor.lnum +*** ../vim-7.1.151/src/version.c Thu Nov 8 13:03:33 2007 +--- src/version.c Thu Nov 8 14:48:59 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 152, + /**/ + +-- +From "know your smileys": + 2B|^2B Message from Shakespeare + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.153 b/7.1.153 new file mode 100644 index 00000000..839977eb --- /dev/null +++ b/7.1.153 @@ -0,0 +1,143 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.153 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.153 +Problem: Compiler warnings on SGI. Undefined XpmAllocColor (Charles + Campbell) +Solution: Add type casts. Init st_dev and st_ino separately. Don't use + type casts for vim_snprintf() when HAVE_STDARG_H is defined. + Define XpmAllocColor when needed. +Files: src/eval.c, src/ex_cmds.c, src/fileio.c, src/misc2.c, + src/gui_xmebw.c + + +*** ../vim-7.1.152/src/eval.c Tue Oct 2 22:07:58 2007 +--- src/eval.c Mon Oct 1 20:56:09 2007 +*************** +*** 8729,8735 **** + static int fnum = 0; + static int change_start = 0; + static int change_end = 0; +! static hlf_T hlID = 0; + int filler_lines; + int col; + +--- 8729,8735 ---- + static int fnum = 0; + static int change_start = 0; + static int change_end = 0; +! static hlf_T hlID = (hlf_T)0; + int filler_lines; + int col; + +*** ../vim-7.1.152/src/ex_cmds.c Thu Sep 13 18:25:08 2007 +--- src/ex_cmds.c Thu Sep 13 16:19:40 2007 +*************** +*** 1774,1780 **** + * overwrite a user's viminfo file after a "su root", with a + * viminfo file that the user can't read. + */ +! st_old.st_dev = st_old.st_ino = 0; + st_old.st_mode = 0600; + if (mch_stat((char *)fname, &st_old) == 0 + && getuid() != ROOT_UID +--- 1774,1781 ---- + * overwrite a user's viminfo file after a "su root", with a + * viminfo file that the user can't read. + */ +! st_old.st_dev = 0; +! st_old.st_ino = 0; + st_old.st_mode = 0600; + if (mch_stat((char *)fname, &st_old) == 0 + && getuid() != ROOT_UID +*** ../vim-7.1.152/src/fileio.c Mon Oct 29 22:37:57 2007 +--- src/fileio.c Mon Oct 22 21:10:00 2007 +*************** +*** 3209,3215 **** + * Get information about original file (if there is one). + */ + #if defined(UNIX) && !defined(ARCHIE) +! st_old.st_dev = st_old.st_ino = 0; + perm = -1; + if (mch_stat((char *)fname, &st_old) < 0) + newfile = TRUE; +--- 3209,3216 ---- + * Get information about original file (if there is one). + */ + #if defined(UNIX) && !defined(ARCHIE) +! st_old.st_dev = 0; +! st_old.st_ino = 0; + perm = -1; + if (mch_stat((char *)fname, &st_old) < 0) + newfile = TRUE; +*** ../vim-7.1.152/src/misc2.c Sun Oct 7 15:44:28 2007 +--- src/misc2.c Sun Sep 30 18:00:09 2007 +*************** +*** 5924,5930 **** +--- 5925,5935 ---- + { + if (emsg_not_now()) + return TRUE; /* no error messages at the moment */ ++ #ifdef HAVE_STDARG_H ++ vim_snprintf((char *)IObuff, IOSIZE, (char *)s, a1, a2); ++ #else + vim_snprintf((char *)IObuff, IOSIZE, (char *)s, (long_u)a1, (long_u)a2); ++ #endif + return emsg(IObuff); + } + +*** ../vim-7.1.152/src/gui_xmebw.c Thu May 10 19:46:55 2007 +--- src/gui_xmebw.c Thu Sep 6 12:57:51 2007 +*************** +*** 395,405 **** + + /* Create the "highlight" pixmap. */ + color[4].pixel = eb->primitive.bottom_shadow_color; + attr.valuemask = XpmColorSymbols | XpmCloseness | XpmAllocColor; + attr.closeness = 65535; /* accuracy isn't crucial */ + attr.colorsymbols = color; + attr.numsymbols = XtNumber(color); +- attr.alloc_color = alloc_color; + + status = XpmCreatePixmapFromData(dpy, root, data, &pix, NULL, &attr); + XpmFreeAttributes(&attr); +--- 395,409 ---- + + /* Create the "highlight" pixmap. */ + color[4].pixel = eb->primitive.bottom_shadow_color; ++ #ifdef XpmAllocColor /* SGI doesn't have it */ + attr.valuemask = XpmColorSymbols | XpmCloseness | XpmAllocColor; ++ attr.alloc_color = alloc_color; ++ #else ++ attr.valuemask = XpmColorSymbols | XpmCloseness; ++ #endif + attr.closeness = 65535; /* accuracy isn't crucial */ + attr.colorsymbols = color; + attr.numsymbols = XtNumber(color); + + status = XpmCreatePixmapFromData(dpy, root, data, &pix, NULL, &attr); + XpmFreeAttributes(&attr); +*** ../vim-7.1.152/src/version.c Thu Nov 8 14:50:58 2007 +--- src/version.c Thu Nov 8 20:45:56 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 153, + /**/ + +-- +From "know your smileys": + @:-() Elvis Presley + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.154 b/7.1.154 new file mode 100644 index 00000000..f38ac016 --- /dev/null +++ b/7.1.154 @@ -0,0 +1,52 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.154 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.154 +Problem: Compiler warning for signed/unsigned compare. +Solution: Add type cast. +Files: src/screen.c + + +*** ../vim-7.1.153/src/screen.c Thu Nov 8 14:50:58 2007 +--- src/screen.c Thu Nov 8 21:18:46 2007 +*************** +*** 4315,4321 **** + long prevcol = (long)(ptr - line) - (c == NUL); + + /* we're not really at that column when skipping some text */ +! if ((wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) + ++prevcol; + #endif + +--- 4315,4321 ---- + long prevcol = (long)(ptr - line) - (c == NUL); + + /* we're not really at that column when skipping some text */ +! if ((long)(wp->w_p_wrap ? wp->w_skipcol : wp->w_leftcol) > prevcol) + ++prevcol; + #endif + +*** ../vim-7.1.153/src/version.c Thu Nov 8 20:47:34 2007 +--- src/version.c Thu Nov 8 21:19:59 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 154, + /**/ + +-- +From "know your smileys": + :-F Bucktoothed vampire with one tooth missing + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.155 b/7.1.155 new file mode 100644 index 00000000..c813fef6 --- /dev/null +++ b/7.1.155 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.155 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.155 +Problem: Crash when 'undolevels' is 0 and repeating "udd". (James Vega) +Solution: When there is only one branch use u_freeheader() to delete it. +Files: src/undo.c + + +*** ../vim-7.1.154/src/undo.c Mon Oct 1 22:53:27 2007 +--- src/undo.c Sat Nov 10 13:45:28 2007 +*************** +*** 1677,1682 **** +--- 1677,1690 ---- + u_header_T **uhpp; /* if not NULL reset when freeing this header */ + { + u_header_T *tofree, *next; ++ ++ /* If this is the top branch we may need to use u_freeheader() to update ++ * all the pointers. */ ++ if (uhp == buf->b_u_oldhead) ++ { ++ u_freeheader(buf, uhp, uhpp); ++ return; ++ } + + if (uhp->uh_alt_prev != NULL) + uhp->uh_alt_prev->uh_alt_next = NULL; +*** ../vim-7.1.154/src/version.c Thu Nov 8 21:23:34 2007 +--- src/version.c Sat Nov 10 22:49:40 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 155, + /**/ + +-- +I AM THANKFUL... +...for the piles of laundry and ironing because it means I +have plenty of clothes to wear. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.156 b/7.1.156 new file mode 100644 index 00000000..4701e023 --- /dev/null +++ b/7.1.156 @@ -0,0 +1,121 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.156 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.156 +Problem: Overlapping arguments for strcpy() when expanding command line + variables. +Solution: Use mch_memmove() instead of STRCPY(). Also fix a few typos. + (Dominique Pelle) +Files: src/ex_docmd.c + + +*** ../vim-7.1.155/src/ex_docmd.c Fri Oct 19 16:20:09 2007 +--- src/ex_docmd.c Sat Nov 10 12:39:51 2007 +*************** +*** 666,672 **** + if (ex_pressedreturn) + { + /* go up one line, to overwrite the ":" line, so the +! * output doensn't contain empty lines. */ + msg_row = prev_msg_row; + if (prev_msg_row == Rows - 1) + msg_row--; +--- 666,672 ---- + if (ex_pressedreturn) + { + /* go up one line, to overwrite the ":" line, so the +! * output doesn't contain empty lines. */ + msg_row = prev_msg_row; + if (prev_msg_row == Rows - 1) + msg_row--; +*************** +*** 2760,2766 **** + + /* + * Isolate the command and search for it in the command table. +! * Exeptions: + * - the 'k' command can directly be followed by any character. + * - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r' + * but :sre[wind] is another command, as are :scrip[tnames], +--- 2760,2766 ---- + + /* + * Isolate the command and search for it in the command table. +! * Exceptions: + * - the 'k' command can directly be followed by any character. + * - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r' + * but :sre[wind] is another command, as are :scrip[tnames], +*************** +*** 6677,6683 **** + * The list should be allocated using alloc(), as should each item in the + * list. This function takes over responsibility for freeing the list. + * +! * XXX The list is made into the arggument list. This is freed using + * FreeWild(), which does a series of vim_free() calls, unless the two defines + * __EMX__ and __ALWAYS_HAS_TRAILING_NUL_POINTER are set. In this case, a + * routine _fnexplodefree() is used. This may cause problems, but as the drop +--- 6677,6683 ---- + * The list should be allocated using alloc(), as should each item in the + * list. This function takes over responsibility for freeing the list. + * +! * XXX The list is made into the argument list. This is freed using + * FreeWild(), which does a series of vim_free() calls, unless the two defines + * __EMX__ and __ALWAYS_HAS_TRAILING_NUL_POINTER are set. In this case, a + * routine _fnexplodefree() is used. This may cause problems, but as the drop +*************** +*** 7795,7801 **** + if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged() + && !eap->forceit) + { +! EMSG(_("E747: Cannot change directory, buffer is modifed (add ! to override)")); + return; + } + +--- 7795,7801 ---- + if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged() + && !eap->forceit) + { +! EMSG(_("E747: Cannot change directory, buffer is modified (add ! to override)")); + return; + } + +*************** +*** 9391,9397 **** + if (src > srcstart && src[-1] == '\\') + { + *usedlen = 0; +! STRCPY(src - 1, src); /* remove backslash */ + return NULL; + } + +--- 9391,9397 ---- + if (src > srcstart && src[-1] == '\\') + { + *usedlen = 0; +! mch_memmove(src - 1, src, STRLEN(src) + 1); /* remove backslash */ + return NULL; + } + +*** ../vim-7.1.155/src/version.c Sat Nov 10 22:50:20 2007 +--- src/version.c Sun Nov 11 19:15:51 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 156, + /**/ + +-- +Common sense is what tells you that the world is flat. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.157 b/7.1.157 new file mode 100644 index 00000000..071fdd8c --- /dev/null +++ b/7.1.157 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.157 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.157 +Problem: In Ex mode, :" gives an error at end-of-file. (Michael Hordijk) +Solution: Only give an error for an empty line, not for a comment. +Files: src/ex_docmd.c + + +*** ../vim-7.1.156/src/ex_docmd.c Sun Nov 11 19:16:44 2007 +--- src/ex_docmd.c Sat Nov 17 20:23:38 2007 +*************** +*** 1741,1747 **** + } + + /* ignore comment and empty lines */ +! if (*ea.cmd == '"' || *ea.cmd == NUL) + { + ex_pressedreturn = TRUE; + goto doend; +--- 1741,1749 ---- + } + + /* ignore comment and empty lines */ +! if (*ea.cmd == '"') +! goto doend; +! if (*ea.cmd == NUL) + { + ex_pressedreturn = TRUE; + goto doend; +*** ../vim-7.1.156/src/version.c Sun Nov 11 19:16:44 2007 +--- src/version.c Tue Nov 20 12:28:22 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 157, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +119. You are reading a book and look for the scroll bar to get to + the next page. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.158 b/7.1.158 new file mode 100644 index 00000000..8bd2e8f6 --- /dev/null +++ b/7.1.158 @@ -0,0 +1,157 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.158 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.158 (extra) +Problem: Win32 console: When 'encoding' is "utf-8" and typing Alt-y the + result is wrong. Win32 GUI: Alt-y results in "u" when 'encoding' + is "cp1250" (Lukas Cerman) +Solution: For utf-8 don't set the 7th bit in a byte, convert to the correct + byte sequence. For cp1250, when conversion to 'encoding' results + in the 7th bit not set, set the 7th bit after conversion. +Files: src/os_win32.c, src/gui_w48.c + + +*** ../vim-7.1.157/src/os_win32.c Mon Oct 1 20:33:45 2007 +--- src/os_win32.c Sat Oct 27 17:35:04 2007 +*************** +*** 1521,1527 **** +--- 1521,1532 ---- + #endif + ) + { ++ #ifdef FEAT_MBYTE ++ n = (*mb_char2bytes)(typeahead[typeaheadlen] | 0x80, ++ typeahead + typeaheadlen); ++ #else + typeahead[typeaheadlen] |= 0x80; ++ #endif + modifiers &= ~MOD_MASK_ALT; + } + +*** ../vim-7.1.157/src/gui_w48.c Sun Sep 30 14:00:41 2007 +--- src/gui_w48.c Mon Oct 29 20:00:25 2007 +*************** +*** 486,495 **** + + /* + * Convert Unicode character "ch" to bytes in "string[slen]". + * Return the length. + */ + static int +! char_to_string(int ch, char_u *string, int slen) + { + int len; + int i; +--- 486,496 ---- + + /* + * Convert Unicode character "ch" to bytes in "string[slen]". ++ * When "had_alt" is TRUE the ALT key was included in "ch". + * Return the length. + */ + static int +! char_to_string(int ch, char_u *string, int slen, int had_alt) + { + int len; + int i; +*************** +*** 522,529 **** +--- 523,544 ---- + * "enc_codepage" is non-zero use the standard Win32 function, + * otherwise use our own conversion function (e.g., for UTF-8). */ + if (enc_codepage > 0) ++ { + len = WideCharToMultiByte(enc_codepage, 0, wstring, len, + string, slen, 0, NULL); ++ /* If we had included the ALT key into the character but now the ++ * upper bit is no longer set, that probably means the conversion ++ * failed. Convert the original character and set the upper bit ++ * afterwards. */ ++ if (had_alt && len == 1 && ch >= 0x80 && string[0] < 0x80) ++ { ++ wstring[0] = ch & 0x7f; ++ len = WideCharToMultiByte(enc_codepage, 0, wstring, len, ++ string, slen, 0, NULL); ++ if (len == 1) /* safety check */ ++ string[0] |= 0x80; ++ } ++ } + else + { + len = 1; +*************** +*** 573,579 **** + char_u string[40]; + int len = 0; + +! len = char_to_string(ch, string, 40); + if (len == 1 && string[0] == Ctrl_C && ctrl_c_interrupts) + { + trash_input_buf(); +--- 588,594 ---- + char_u string[40]; + int len = 0; + +! len = char_to_string(ch, string, 40, FALSE); + if (len == 1 && string[0] == Ctrl_C && ctrl_c_interrupts) + { + trash_input_buf(); +*************** +*** 640,646 **** + { + /* Although the documentation isn't clear about it, we assume "ch" is + * a Unicode character. */ +! len += char_to_string(ch, string + len, 40 - len); + } + + add_to_input_buf(string, len); +--- 655,661 ---- + { + /* Although the documentation isn't clear about it, we assume "ch" is + * a Unicode character. */ +! len += char_to_string(ch, string + len, 40 - len, TRUE); + } + + add_to_input_buf(string, len); +*************** +*** 1775,1781 **** + int len; + + /* Handle "key" as a Unicode character. */ +! len = char_to_string(key, string, 40); + add_to_input_buf(string, len); + } + break; +--- 1790,1796 ---- + int len; + + /* Handle "key" as a Unicode character. */ +! len = char_to_string(key, string, 40, FALSE); + add_to_input_buf(string, len); + } + break; +*** ../vim-7.1.157/src/version.c Tue Nov 20 12:30:31 2007 +--- src/version.c Tue Nov 20 17:19:18 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 158, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +123. You ask the car dealer to install an extra cigarette lighter + on your new car to power your notebook. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.159 b/7.1.159 new file mode 100644 index 00000000..e7f86991 --- /dev/null +++ b/7.1.159 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.159 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.159 +Problem: strcpy() has overlapping arguments. +Solution: Use mch_memmove() instead. (Dominique Pelle) +Files: src/ex_cmds.c + + +*** ../vim-7.1.158/src/ex_cmds.c Thu Nov 8 20:47:34 2007 +--- src/ex_cmds.c Sun Nov 18 14:11:58 2007 +*************** +*** 4885,4891 **** + ++line2; + /* move the cursor to the new line, like Vi */ + ++curwin->w_cursor.lnum; +! STRCPY(new_start, p1 + 1); /* copy the rest */ + p1 = new_start - 1; + } + } +--- 4885,4892 ---- + ++line2; + /* move the cursor to the new line, like Vi */ + ++curwin->w_cursor.lnum; +! /* copy the rest */ +! mch_memmove(new_start, p1 + 1, STRLEN(p1 + 1) + 1); + p1 = new_start - 1; + } + } +*** ../vim-7.1.158/src/version.c Tue Nov 20 17:21:28 2007 +--- src/version.c Tue Nov 20 18:01:45 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 159, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +125. You begin to wonder how often it REALLY is necessary to get up + and shower or bathe. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.160 b/7.1.160 new file mode 100644 index 00000000..48d0443d --- /dev/null +++ b/7.1.160 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.160 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.160 +Problem: When a focus autocommand is defined, getting or losing focus + causes the hit-enter prompt to be redrawn. (Bjorn Winckler) +Solution: Overwrite the last line. +Files: src/message.c + + +*** ../vim-7.1.159/src/message.c Thu Sep 13 22:04:30 2007 +--- src/message.c Sun Nov 4 17:33:15 2007 +*************** +*** 2850,2855 **** +--- 2850,2864 ---- + } + else if (State == HITRETURN || State == SETWSIZE) + { ++ if (msg_row == Rows - 1) ++ { ++ /* Avoid drawing the "hit-enter" prompt below the previous one, ++ * overwrite it. Esp. useful when regaining focus and a ++ * FocusGained autocmd exists but didn't draw anything. */ ++ msg_didout = FALSE; ++ msg_col = 0; ++ msg_clr_eos(); ++ } + hit_return_msg(); + msg_row = Rows - 1; + } +*** ../vim-7.1.159/src/version.c Tue Nov 20 18:03:34 2007 +--- src/version.c Sat Nov 24 15:41:43 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 160, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +142. You dream about creating the world's greatest web site. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.161 b/7.1.161 new file mode 100644 index 00000000..69469ca3 --- /dev/null +++ b/7.1.161 @@ -0,0 +1,176 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.161 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.161 +Problem: Compilation errors with tiny features and EXITFREE. +Solution: Add #ifdefs. (Dominique Pelle) +Files: src/edit.c, src/misc2.c + + +*** ../vim-7.1.160/src/edit.c Thu Nov 8 13:03:33 2007 +--- src/edit.c Sat Nov 24 14:57:46 2007 +*************** +*** 2236,2242 **** + while (i < actual_len && (p - IObuff + 6) < IOSIZE) + #ifdef FEAT_MBYTE + if (has_mbyte) +! p += mb_char2bytes(wca[i++], p); + else + #endif + *(p++) = wca[i++]; +--- 2236,2242 ---- + while (i < actual_len && (p - IObuff + 6) < IOSIZE) + #ifdef FEAT_MBYTE + if (has_mbyte) +! p += (*mb_char2bytes)(wca[i++], p); + else + #endif + *(p++) = wca[i++]; +*************** +*** 6444,6451 **** +--- 6444,6453 ---- + { + vim_free(last_insert); + last_insert = NULL; ++ # ifdef FEAT_INS_EXPAND + vim_free(compl_orig_text); + compl_orig_text = NULL; ++ # endif + } + #endif + +*** ../vim-7.1.160/src/misc2.c Thu Nov 8 20:47:34 2007 +--- src/misc2.c Sat Nov 24 15:01:46 2007 +*************** +*** 964,970 **** + { + buf_T *buf, *nextbuf; + static int entered = FALSE; +- win_T *win; + + /* When we cause a crash here it is caught and Vim tries to exit cleanly. + * Don't try freeing everything again. */ +--- 965,970 ---- +*************** +*** 972,986 **** + return; + entered = TRUE; + + block_autocmds(); /* don't want to trigger autocommands here */ + +! #ifdef FEAT_WINDOWS + /* close all tabs and windows */ + if (first_tabpage->tp_next != NULL) + do_cmdline_cmd((char_u *)"tabonly!"); + if (firstwin != lastwin) + do_cmdline_cmd((char_u *)"only!"); +! #endif + + # if defined(FEAT_SPELL) + /* Free all spell info. */ +--- 972,988 ---- + return; + entered = TRUE; + ++ # ifdef FEAT_AUTOCMD + block_autocmds(); /* don't want to trigger autocommands here */ ++ # endif + +! # ifdef FEAT_WINDOWS + /* close all tabs and windows */ + if (first_tabpage->tp_next != NULL) + do_cmdline_cmd((char_u *)"tabonly!"); + if (firstwin != lastwin) + do_cmdline_cmd((char_u *)"only!"); +! # endif + + # if defined(FEAT_SPELL) + /* Free all spell info. */ +*************** +*** 1031,1038 **** +--- 1033,1044 ---- + free_regexp_stuff(); + free_tag_stuff(); + free_cd_dir(); ++ # ifdef FEAT_EVAL + set_expr_line(NULL); ++ # endif ++ # ifdef FEAT_DIFF + diff_clear(curtab); ++ # endif + clear_sb_text(); /* free any scrollback text */ + + /* Free some global vars. */ +*************** +*** 1041,1059 **** + vim_free(clip_exclude_prog); + # endif + vim_free(last_cmdline); + vim_free(new_last_cmdline); + set_keep_msg(NULL, 0); + vim_free(ff_expand_buffer); + + /* Clear cmdline history. */ + p_hi = 0; + init_history(); + + #ifdef FEAT_QUICKFIX +! qf_free_all(NULL); +! /* Free all location lists */ +! FOR_ALL_WINDOWS(win) +! qf_free_all(win); + #endif + + /* Close all script inputs. */ +--- 1047,1073 ---- + vim_free(clip_exclude_prog); + # endif + vim_free(last_cmdline); ++ # ifdef FEAT_CMDHIST + vim_free(new_last_cmdline); ++ # endif + set_keep_msg(NULL, 0); + vim_free(ff_expand_buffer); + + /* Clear cmdline history. */ + p_hi = 0; ++ # ifdef FEAT_CMDHIST + init_history(); ++ # endif + + #ifdef FEAT_QUICKFIX +! { +! win_T *win; +! +! qf_free_all(NULL); +! /* Free all location lists */ +! FOR_ALL_WINDOWS(win) +! qf_free_all(win); +! } + #endif + + /* Close all script inputs. */ +*** ../vim-7.1.160/src/version.c Sat Nov 24 15:44:17 2007 +--- src/version.c Sat Nov 24 20:55:38 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 161, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +143. You dream in pallettes of 216 websafe colors. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.162 b/7.1.162 new file mode 100644 index 00000000..b61631c3 --- /dev/null +++ b/7.1.162 @@ -0,0 +1,172 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.162 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.162 +Problem: Crash when using a modifier before "while" or "for". (A.Politz) +Solution: Skip modifiers when checking for a loop command. +Files: src/proto/ex_docmd.pro, src/ex_docmd.c, src/ex_eval.c + + +*** ../vim-7.1.161/src/proto/ex_docmd.pro Sun Sep 30 14:00:41 2007 +--- src/proto/ex_docmd.pro Sat Nov 24 16:34:06 2007 +*************** +*** 5,10 **** +--- 5,11 ---- + int getline_equal __ARGS((char_u *(*fgetline)(int, void *, int), void *cookie, char_u *(*func)(int, void *, int))); + void *getline_cookie __ARGS((char_u *(*fgetline)(int, void *, int), void *cookie)); + int checkforcmd __ARGS((char_u **pp, char *cmd, int len)); ++ int modifier_len __ARGS((char_u *cmd)); + int cmd_exists __ARGS((char_u *name)); + char_u *set_one_cmd_context __ARGS((expand_T *xp, char_u *buff)); + char_u *skip_range __ARGS((char_u *cmd, int *ctx)); +*** ../vim-7.1.161/src/ex_docmd.c Tue Nov 20 12:30:31 2007 +--- src/ex_docmd.c Sat Nov 24 16:41:20 2007 +*************** +*** 2963,2968 **** +--- 2963,3019 ---- + #endif + + #if defined(FEAT_EVAL) || defined(PROTO) ++ static struct cmdmod ++ { ++ char *name; ++ int minlen; ++ int has_count; /* :123verbose :3tab */ ++ } cmdmods[] = { ++ {"aboveleft", 3, FALSE}, ++ {"belowright", 3, FALSE}, ++ {"botright", 2, FALSE}, ++ {"browse", 3, FALSE}, ++ {"confirm", 4, FALSE}, ++ {"hide", 3, FALSE}, ++ {"keepalt", 5, FALSE}, ++ {"keepjumps", 5, FALSE}, ++ {"keepmarks", 3, FALSE}, ++ {"leftabove", 5, FALSE}, ++ {"lockmarks", 3, FALSE}, ++ {"rightbelow", 6, FALSE}, ++ {"sandbox", 3, FALSE}, ++ {"silent", 3, FALSE}, ++ {"tab", 3, TRUE}, ++ {"topleft", 2, FALSE}, ++ {"verbose", 4, TRUE}, ++ {"vertical", 4, FALSE}, ++ }; ++ ++ /* ++ * Return length of a command modifier (including optional count). ++ * Return zero when it's not a modifier. ++ */ ++ int ++ modifier_len(cmd) ++ char_u *cmd; ++ { ++ int i, j; ++ char_u *p = cmd; ++ ++ if (VIM_ISDIGIT(*cmd)) ++ p = skipwhite(skipdigits(cmd)); ++ for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i) ++ { ++ for (j = 0; p[j] != NUL; ++j) ++ if (p[j] != cmdmods[i].name[j]) ++ break; ++ if (!isalpha(p[j]) && j >= cmdmods[i].minlen ++ && (p == cmd || cmdmods[i].has_count)) ++ return j + (p - cmd); ++ } ++ return 0; ++ } ++ + /* + * Return > 0 if an Ex command "name" exists. + * Return 2 if there is an exact match. +*************** +*** 2977,3006 **** + int i; + int j; + char_u *p; +- static struct cmdmod +- { +- char *name; +- int minlen; +- } cmdmods[] = { +- {"aboveleft", 3}, +- {"belowright", 3}, +- {"botright", 2}, +- {"browse", 3}, +- {"confirm", 4}, +- {"hide", 3}, +- {"keepalt", 5}, +- {"keepjumps", 5}, +- {"keepmarks", 3}, +- {"leftabove", 5}, +- {"lockmarks", 3}, +- {"rightbelow", 6}, +- {"sandbox", 3}, +- {"silent", 3}, +- {"tab", 3}, +- {"topleft", 2}, +- {"verbose", 4}, +- {"vertical", 4}, +- }; + + /* Check command modifiers. */ + for (i = 0; i < sizeof(cmdmods) / sizeof(struct cmdmod); ++i) +--- 3028,3033 ---- +*** ../vim-7.1.161/src/ex_eval.c Wed Aug 1 15:47:06 2007 +--- src/ex_eval.c Sat Nov 24 16:34:09 2007 +*************** +*** 2269,2277 **** + has_loop_cmd(p) + char_u *p; + { +! p = skipwhite(p); +! while (*p == ':') +! p = skipwhite(p + 1); + if ((p[0] == 'w' && p[1] == 'h') + || (p[0] == 'f' && p[1] == 'o' && p[2] == 'r')) + return TRUE; +--- 2269,2286 ---- + has_loop_cmd(p) + char_u *p; + { +! int len; +! +! /* skip modifiers, white space and ':' */ +! for (;;) +! { +! while (*p == ' ' || *p == '\t' || *p == ':') +! ++p; +! len = modifier_len(p); +! if (len == 0) +! break; +! p += len; +! } + if ((p[0] == 'w' && p[1] == 'h') + || (p[0] == 'f' && p[1] == 'o' && p[2] == 'r')) + return TRUE; +*** ../vim-7.1.161/src/version.c Sat Nov 24 21:27:33 2007 +--- src/version.c Sat Nov 24 21:48:38 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 162, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +144. You eagerly await the update of the "Cool Site of the Day." + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.163 b/7.1.163 new file mode 100644 index 00000000..433b2b3d --- /dev/null +++ b/7.1.163 @@ -0,0 +1,72 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.163 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.163 +Problem: Warning for the unknown option 'bufsecret'. +Solution: Remove the lines .vim that use this option. (Andy Wokula) +Files: runtime/menu.vim + + +*** ../vim-7.1.162/runtime/menu.vim Sun May 6 15:21:23 2007 +--- runtime/menu.vim Mon Nov 19 23:17:11 2007 +*************** +*** 2,8 **** + " You can also use this as a start for your own set of menus. + " + " Maintainer: Bram Moolenaar +! " Last Change: 2007 Jan 09 + + " Note that ":an" (short for ":anoremenu") is often used to make a menu work + " in all modes and avoid side effects from mappings defined by the user. +--- 2,8 ---- + " You can also use this as a start for your own set of menus. + " + " Maintainer: Bram Moolenaar +! " Last Change: 2007 Nov 19 + + " Note that ":an" (short for ":anoremenu") is often used to make a menu work + " in all modes and avoid side effects from mappings defined by the user. +*************** +*** 658,664 **** + let buf = 1 + while buf <= bufnr('$') + if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf) +- \ && !getbufvar(buf, "&bufsecret") + let s:bmenu_count = s:bmenu_count + 1 + endif + let buf = buf + 1 +--- 658,663 ---- +*************** +*** 671,677 **** + let buf = 1 + while buf <= bufnr('$') + if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf) +- \ && !getbufvar(buf, "&bufsecret") + call BMFilename(bufname(buf), buf) + endif + let buf = buf + 1 +--- 670,675 ---- +*** ../vim-7.1.162/src/version.c Sat Nov 24 21:49:19 2007 +--- src/version.c Thu Nov 29 17:44:08 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 163, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +158. You get a tuner card so you can watch TV while surfing. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.164 b/7.1.164 new file mode 100644 index 00000000..09aee5d3 --- /dev/null +++ b/7.1.164 @@ -0,0 +1,52 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.164 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.164 +Problem: Reading past end of regexp pattern. (Dominique Pelle) +Solution: Use utf_ptr2len(). +Files: src/regexp.c + + +*** ../vim-7.1.163/src/regexp.c Sat Aug 11 13:57:31 2007 +--- src/regexp.c Sat Nov 24 13:23:53 2007 +*************** +*** 2770,2776 **** + { + #ifdef FEAT_MBYTE + if (enc_utf8) +! prevchr_len += utf_char2len(mb_ptr2char(regparse + prevchr_len)); + else if (has_mbyte) + prevchr_len += (*mb_ptr2len)(regparse + prevchr_len); + else +--- 2770,2777 ---- + { + #ifdef FEAT_MBYTE + if (enc_utf8) +! /* exclude composing chars that mb_ptr2len does include */ +! prevchr_len += utf_ptr2len(regparse + prevchr_len); + else if (has_mbyte) + prevchr_len += (*mb_ptr2len)(regparse + prevchr_len); + else +*** ../vim-7.1.163/src/version.c Thu Nov 29 17:46:01 2007 +--- src/version.c Thu Nov 29 21:25:45 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 164, + /**/ + +-- +Send $25.00 for handy leaflet on how to make money by selling leaflets + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.165 b/7.1.165 new file mode 100644 index 00000000..b2e8b303 --- /dev/null +++ b/7.1.165 @@ -0,0 +1,177 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.165 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.165 +Problem: Crash related to getting X window ID. (Dominique Pelle) +Solution: Don't trust the window ID that we got in the past, check it every + time. +Files: src/os_unix.c + + +*** ../vim-7.1.164/src/os_unix.c Thu Aug 30 11:46:46 2007 +--- src/os_unix.c Thu Nov 29 18:19:56 2007 +*************** +*** 310,316 **** + } + + /* +! * mch_inchar(): low level input funcion. + * Get a characters from the keyboard. + * Return the number of characters that are available. + * If wtime == 0 do not wait for characters. +--- 310,316 ---- + } + + /* +! * mch_inchar(): low level input function. + * Get a characters from the keyboard. + * Return the number of characters that are available. + * If wtime == 0 do not wait for characters. +*************** +*** 1567,1584 **** + #ifdef FEAT_XCLIPBOARD + if (xterm_dpy != NULL && x11_window != 0) + { +! /* Checked it already. */ +! if (x11_display_from == XD_XTERM) +! return OK; +! +! /* +! * If the X11 display was opened here before, for the window where Vim +! * was started, close that one now to avoid a memory leak. +! */ +! if (x11_display_from == XD_HERE && x11_display != NULL) +! XCloseDisplay(x11_display); +! x11_display = xterm_dpy; +! x11_display_from = XD_XTERM; + if (test_x11_window(x11_display) == FAIL) + { + /* probably bad $WINDOWID */ +--- 1567,1585 ---- + #ifdef FEAT_XCLIPBOARD + if (xterm_dpy != NULL && x11_window != 0) + { +! /* We may have checked it already, but Gnome terminal can move us to +! * another window, so we need to check every time. */ +! if (x11_display_from != XD_XTERM) +! { +! /* +! * If the X11 display was opened here before, for the window where +! * Vim was started, close that one now to avoid a memory leak. +! */ +! if (x11_display_from == XD_HERE && x11_display != NULL) +! XCloseDisplay(x11_display); +! x11_display = xterm_dpy; +! x11_display_from = XD_XTERM; +! } + if (test_x11_window(x11_display) == FAIL) + { + /* probably bad $WINDOWID */ +*************** +*** 2421,2427 **** + /* + * Set the case of the file name, if it already exists. This will cause the + * file name to remain exactly the same. +! * Only required for file systems where case is ingored and preserved. + */ + /*ARGSUSED*/ + void +--- 2422,2428 ---- + /* + * Set the case of the file name, if it already exists. This will cause the + * file name to remain exactly the same. +! * Only required for file systems where case is ignored and preserved. + */ + /*ARGSUSED*/ + void +*************** +*** 4653,4659 **** + ret = poll(fds, nfd, towait); + # ifdef FEAT_MZSCHEME + if (ret == 0 && mzquantum_used) +! /* MzThreads scheduling is required and timeout occured */ + finished = FALSE; + # endif + +--- 4654,4660 ---- + ret = poll(fds, nfd, towait); + # ifdef FEAT_MZSCHEME + if (ret == 0 && mzquantum_used) +! /* MzThreads scheduling is required and timeout occurred */ + finished = FALSE; + # endif + +*************** +*** 4801,4807 **** + #endif + # ifdef FEAT_MZSCHEME + if (ret == 0 && mzquantum_used) +! /* loop if MzThreads must be scheduled and timeout occured */ + finished = FALSE; + # endif + +--- 4802,4808 ---- + #endif + # ifdef FEAT_MZSCHEME + if (ret == 0 && mzquantum_used) +! /* loop if MzThreads must be scheduled and timeout occurred */ + finished = FALSE; + # endif + +*************** +*** 5191,5197 **** + { + /* When using system() always add extra quotes, because the shell + * is started twice. Otherwise put a backslash before special +! * characters, except insice ``. */ + #ifdef USE_SYSTEM + STRCAT(command, " \""); + STRCAT(command, pat[i]); +--- 5192,5198 ---- + { + /* When using system() always add extra quotes, because the shell + * is started twice. Otherwise put a backslash before special +! * characters, except inside ``. */ + #ifdef USE_SYSTEM + STRCAT(command, " \""); + STRCAT(command, pat[i]); +*************** +*** 5675,5681 **** + /* gpm library tries to handling TSTP causes + * problems. Anyways, we close connection to Gpm whenever + * we are going to suspend or starting an external process +! * so we should'nt have problem with this + */ + signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); + return 1; /* succeed */ +--- 5676,5682 ---- + /* gpm library tries to handling TSTP causes + * problems. Anyways, we close connection to Gpm whenever + * we are going to suspend or starting an external process +! * so we shouldn't have problem with this + */ + signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL); + return 1; /* succeed */ +*** ../vim-7.1.164/src/version.c Thu Nov 29 21:26:38 2007 +--- src/version.c Sat Dec 1 17:17:20 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 165, + /**/ + +-- +"Hit any key to continue" is very confusing when you have two keyboards. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.166 b/7.1.166 new file mode 100644 index 00000000..14268d72 --- /dev/null +++ b/7.1.166 @@ -0,0 +1,80 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.166 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.166 +Problem: Memory leak for using "gp" in Visual mode. +Solution: Free memory in put_register(). (Dominique Pelle) +Files: src/ops.c + + +*** ../vim-7.1.165/src/ops.c Thu Nov 8 10:35:02 2007 +--- src/ops.c Sun Nov 25 15:17:43 2007 +*************** +*** 927,934 **** + int name; + int copy; /* make a copy, if FALSE make register empty. */ + { +! static struct yankreg *reg; +! int i; + + #ifdef FEAT_CLIPBOARD + /* When Visual area changed, may have to update selection. Obtain the +--- 927,934 ---- + int name; + int copy; /* make a copy, if FALSE make register empty. */ + { +! struct yankreg *reg; +! int i; + + #ifdef FEAT_CLIPBOARD + /* When Visual area changed, may have to update selection. Obtain the +*************** +*** 967,973 **** + } + + /* +! * Put "reg" into register "name". Free any previous contents. + */ + void + put_register(name, reg) +--- 967,973 ---- + } + + /* +! * Put "reg" into register "name". Free any previous contents and "reg". + */ + void + put_register(name, reg) +*************** +*** 977,982 **** +--- 977,983 ---- + get_yank_register(name, 0); + free_yank_all(); + *y_current = *(struct yankreg *)reg; ++ vim_free(reg); + + # ifdef FEAT_CLIPBOARD + /* Send text written to clipboard register to the clipboard. */ +*** ../vim-7.1.165/src/version.c Sat Dec 1 17:18:45 2007 +--- src/version.c Sat Dec 1 21:11:25 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 166, + /**/ + +-- +An error has occurred. Hit any user to continue. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.167 b/7.1.167 new file mode 100644 index 00000000..66426401 --- /dev/null +++ b/7.1.167 @@ -0,0 +1,80 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.167 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.167 +Problem: Xxd crashes when using "xxd -b -c 110". (Debian bug 452789) +Solution: Allocate more memory. Fix check for maximum number of columns. +Files: src/xxd/xxd.c + + +*** ../vim-7.1.166/src/xxd/xxd.c Thu May 10 19:07:42 2007 +--- src/xxd/xxd.c Thu Nov 29 21:05:16 2007 +*************** +*** 212,218 **** + + #define TRY_SEEK /* attempt to use lseek, or skip forward by reading */ + #define COLS 256 /* change here, if you ever need more columns */ +! #define LLEN (9 + (5*COLS-1)/2 + 2 + COLS) + + char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa; + +--- 212,218 ---- + + #define TRY_SEEK /* attempt to use lseek, or skip forward by reading */ + #define COLS 256 /* change here, if you ever need more columns */ +! #define LLEN (11 + (9*COLS-1)/1 + COLS + 2) + + char hexxa[] = "0123456789abcdef0123456789ABCDEF", *hexx = hexxa; + +*************** +*** 590,596 **** + default: octspergrp = 0; break; + } + +! if (cols < 1 || (!hextype && (cols > COLS))) + { + fprintf(stderr, "%s: invalid number of columns (max. %d).\n", pname, COLS); + exit(1); +--- 590,597 ---- + default: octspergrp = 0; break; + } + +! if (cols < 1 || ((hextype == HEX_NORMAL || hextype == HEX_BITS) +! && (cols > COLS))) + { + fprintf(stderr, "%s: invalid number of columns (max. %d).\n", pname, COLS); + exit(1); +*************** +*** 750,755 **** +--- 751,757 ---- + } + if (ebcdic) + e = (e < 64) ? '.' : etoa64[e-64]; ++ /* When changing this update definition of LLEN above. */ + l[11 + (grplen * cols - 1)/octspergrp + p] = + #ifdef __MVS__ + (e >= 64) +*** ../vim-7.1.166/src/version.c Sat Dec 1 21:12:23 2007 +--- src/version.c Mon Dec 3 21:30:31 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 167, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +178. You look for an icon to double-click to open your bedroom window. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.168 b/7.1.168 new file mode 100644 index 00000000..07bf9c24 --- /dev/null +++ b/7.1.168 @@ -0,0 +1,112 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.168 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.168 (extra) +Problem: Win32 GUI: Since patch 7.1.095, when the Vim window does not have + focus, clicking in it doesn't position the cursor. (Juergen + Kraemer) +Solution: Don't reset s_button_pending just after receiving focus. +Files: src/gui_w48.c + + +*** ../vim-7.1.167/src/gui_w48.c Tue Nov 20 17:21:28 2007 +--- src/gui_w48.c Mon Dec 3 22:13:16 2007 +*************** +*** 290,295 **** +--- 290,300 ---- + + /* Local variables */ + static int s_button_pending = -1; ++ ++ /* s_getting_focus is set when we got focus but didn't see mouse-up event yet, ++ * so don't reset s_button_pending. */ ++ static int s_getting_focus = FALSE; ++ + static int s_x_pending; + static int s_y_pending; + static UINT s_kFlags_pending; +*************** +*** 671,676 **** +--- 676,683 ---- + { + int vim_modifiers = 0x0; + ++ s_getting_focus = FALSE; ++ + if (keyFlags & MK_SHIFT) + vim_modifiers |= MOUSE_SHIFT; + if (keyFlags & MK_CONTROL) +*************** +*** 792,797 **** +--- 799,805 ---- + { + int button; + ++ s_getting_focus = FALSE; + if (s_button_pending > -1) + { + /* Delayed action for mouse down event */ +*************** +*** 1951,1958 **** + allow_scrollbar = FALSE; + + /* Clear pending mouse button, the release event may have been +! * taken by the dialog window. */ +! s_button_pending = -1; + + return OK; + } +--- 1959,1968 ---- + allow_scrollbar = FALSE; + + /* Clear pending mouse button, the release event may have been +! * taken by the dialog window. But don't do this when getting +! * focus, we need the mouse-up event then. */ +! if (!s_getting_focus) +! s_button_pending = -1; + + return OK; + } +*************** +*** 2702,2707 **** +--- 2712,2718 ---- + HWND hwndOldFocus) + { + gui_focus_change(TRUE); ++ s_getting_focus = TRUE; + (void)MyWindowProc(hwnd, WM_SETFOCUS, (WPARAM)hwndOldFocus, 0); + } + +*************** +*** 2711,2716 **** +--- 2722,2728 ---- + HWND hwndNewFocus) + { + gui_focus_change(FALSE); ++ s_getting_focus = FALSE; + (void)MyWindowProc(hwnd, WM_KILLFOCUS, (WPARAM)hwndNewFocus, 0); + } + +*** ../vim-7.1.167/src/version.c Mon Dec 3 21:31:56 2007 +--- src/version.c Mon Dec 3 22:16:32 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 168, + /**/ + +-- +Rule #1: Don't give somebody a tool that he's going to hurt himself with. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.169 b/7.1.169 new file mode 100644 index 00000000..12f66df6 --- /dev/null +++ b/7.1.169 @@ -0,0 +1,75 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.169 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.169 +Problem: Using uninitialized variable when system() fails. (Dominique + Pelle) +Solution: Let system() return an empty string when it fails. +Files: src/eval.c + + +*** ../vim-7.1.168/src/eval.c Thu Nov 8 20:47:34 2007 +--- src/eval.c Fri Nov 30 21:01:26 2007 +*************** +*** 15826,15832 **** + FILE *fd; + + if (check_restricted() || check_secure()) +! return; + + if (argvars[1].v_type != VAR_UNKNOWN) + { +--- 15826,15832 ---- + FILE *fd; + + if (check_restricted() || check_secure()) +! goto done; + + if (argvars[1].v_type != VAR_UNKNOWN) + { +*************** +*** 15837,15843 **** + if ((infile = vim_tempname('i')) == NULL) + { + EMSG(_(e_notmp)); +! return; + } + + fd = mch_fopen((char *)infile, WRITEBIN); +--- 15837,15843 ---- + if ((infile = vim_tempname('i')) == NULL) + { + EMSG(_(e_notmp)); +! goto done; + } + + fd = mch_fopen((char *)infile, WRITEBIN); +*** ../vim-7.1.168/src/version.c Mon Dec 3 22:20:17 2007 +--- src/version.c Fri Dec 7 17:07:32 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 169, + /**/ + +-- +% cat /usr/include/sys/errno.h +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +[...] +#define EMACS 666 /* Too many macros */ +% + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.170 b/7.1.170 new file mode 100644 index 00000000..fabeb110 --- /dev/null +++ b/7.1.170 @@ -0,0 +1,58 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.170 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.170 +Problem: Valgrind warning for overlapping arguments for strcpy(). +Solution: Use mch_memmove() instead. (Dominique Pelle) +Files: src/getchar.c + + +*** ../vim-7.1.169/src/getchar.c Thu Sep 13 18:25:08 2007 +--- src/getchar.c Mon Dec 3 20:42:29 2007 +*************** +*** 253,260 **** + return; + } + else if (buf->bh_index != 0) +! STRCPY(buf->bh_first.b_next->b_str, +! buf->bh_first.b_next->b_str + buf->bh_index); + buf->bh_index = 0; + + if (buf->bh_space >= (int)slen) +--- 253,261 ---- + return; + } + else if (buf->bh_index != 0) +! mch_memmove(buf->bh_first.b_next->b_str, +! buf->bh_first.b_next->b_str + buf->bh_index, +! STRLEN(buf->bh_first.b_next->b_str + buf->bh_index) + 1); + buf->bh_index = 0; + + if (buf->bh_space >= (int)slen) +*** ../vim-7.1.169/src/version.c Fri Dec 7 17:08:35 2007 +--- src/version.c Fri Dec 7 17:27:13 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 170, + /**/ + +-- +Some of the well know MS-Windows errors: + ESLEEP Operator fell asleep + ENOERR No error yet + EDOLLAR OS too expensive + EWINDOWS MS-Windows loaded, system in danger + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.171 b/7.1.171 new file mode 100644 index 00000000..cad1edd4 --- /dev/null +++ b/7.1.171 @@ -0,0 +1,79 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.171 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.171 +Problem: Reading one byte before allocated memory. +Solution: Check index not to become negative. (Dominique Pelle) +Files: src/ex_getln.c + + +*** ../vim-7.1.170/src/ex_getln.c Tue Oct 30 17:36:31 2007 +--- src/ex_getln.c Tue Dec 4 21:49:24 2007 +*************** +*** 1186,1195 **** + case K_LEFT: + case K_S_LEFT: + case K_C_LEFT: + do + { +- if (ccline.cmdpos == 0) +- break; + --ccline.cmdpos; + #ifdef FEAT_MBYTE + if (has_mbyte) /* move to first byte of char */ +--- 1186,1195 ---- + case K_LEFT: + case K_S_LEFT: + case K_C_LEFT: ++ if (ccline.cmdpos == 0) ++ goto cmdline_not_changed; + do + { + --ccline.cmdpos; + #ifdef FEAT_MBYTE + if (has_mbyte) /* move to first byte of char */ +*************** +*** 1198,1204 **** + #endif + ccline.cmdspos -= cmdline_charsize(ccline.cmdpos); + } +! while ((c == K_S_LEFT || c == K_C_LEFT + || (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))) + && ccline.cmdbuff[ccline.cmdpos - 1] != ' '); + #ifdef FEAT_MBYTE +--- 1198,1205 ---- + #endif + ccline.cmdspos -= cmdline_charsize(ccline.cmdpos); + } +! while (ccline.cmdpos > 0 +! && (c == K_S_LEFT || c == K_C_LEFT + || (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))) + && ccline.cmdbuff[ccline.cmdpos - 1] != ' '); + #ifdef FEAT_MBYTE +*** ../vim-7.1.170/src/version.c Fri Dec 7 17:30:04 2007 +--- src/version.c Fri Dec 7 20:00:06 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 171, + /**/ + +-- +Some of the well know MS-Windows errors: + EMULTI Multitasking attempted, system confused + EKEYBOARD Keyboard locked, try getting out of this one! + EXPLAIN Unexplained error, please tell us what happened + EFUTURE Reserved for our future mistakes + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.172 b/7.1.172 new file mode 100644 index 00000000..9f608823 --- /dev/null +++ b/7.1.172 @@ -0,0 +1,50 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.172 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.172 +Problem: When 'buftype' is "acwrite" Vim still checks if the file or + directory exists before overwriting. +Solution: Don't check for overwriting when the buffer name is not a file + name. +Files: src/ex_cmds.c + + +*** ../vim-7.1.171/src/ex_cmds.c Tue Nov 20 18:03:34 2007 +--- src/ex_cmds.c Fri Dec 7 22:13:32 2007 +*************** +*** 2732,2737 **** +--- 2732,2740 ---- + && vim_strchr(p_cpo, CPO_OVERNEW) == NULL) + || (buf->b_flags & BF_READERR)) + && !p_wa ++ #ifdef FEAT_QUICKFIX ++ && !bt_nofile(buf) ++ #endif + && vim_fexists(ffname)) + { + if (!eap->forceit && !eap->append) +*** ../vim-7.1.171/src/version.c Fri Dec 7 20:28:13 2007 +--- src/version.c Sat Dec 8 22:18:54 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 172, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +206. You religiously respond immediately to e-mail, while ignoring + your growing pile of snail mail. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.173 b/7.1.173 new file mode 100644 index 00000000..e6a855d0 --- /dev/null +++ b/7.1.173 @@ -0,0 +1,61 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.173 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.173 +Problem: Accessing freed memory. (Dominique Pelle) +Solution: Don't call reg_getline() to check if a line is the first in the + file. +Files: src/regexp.c + + +*** ../vim-7.1.172/src/regexp.c Thu Nov 29 21:26:38 2007 +--- src/regexp.c Sat Dec 8 15:54:05 2007 +*************** +*** 3810,3820 **** + break; + + case RE_BOF: +! /* Passing -1 to the getline() function provided for the search +! * should always return NULL if the current line is the first +! * line of the file. */ + if (reglnum != 0 || reginput != regline +! || (REG_MULTI && reg_getline((linenr_T)-1) != NULL)) + status = RA_NOMATCH; + break; + +--- 3810,3820 ---- + break; + + case RE_BOF: +! /* We're not at the beginning of the file when below the first +! * line where we started, not at the start of the line or we +! * didn't start at the first line of the buffer. */ + if (reglnum != 0 || reginput != regline +! || (REG_MULTI && reg_firstlnum > 1)) + status = RA_NOMATCH; + break; + +*** ../vim-7.1.172/src/version.c Sat Dec 8 22:20:24 2007 +--- src/version.c Sun Dec 9 19:24:36 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 173, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +213. Your kids start referring to you as "that guy in front of the monitor." + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.174 b/7.1.174 new file mode 100644 index 00000000..7eb4c218 --- /dev/null +++ b/7.1.174 @@ -0,0 +1,71 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.174 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.174 +Problem: Writing NUL past end of a buffer. +Solution: Copy one byte less when using strncat(). (Dominuque Pelle) +Files: src/ex_cmds.c, src/ex_docmd.c + + +*** ../vim-7.1.173/src/ex_cmds.c Sat Dec 8 22:20:24 2007 +--- src/ex_cmds.c Fri Dec 7 22:13:32 2007 +*************** +*** 1650,1656 **** + { + vim_snprintf((char *)IObuff, IOSIZE, _("%sviminfo: %s in line: "), + errnum, message); +! STRNCAT(IObuff, line, IOSIZE - STRLEN(IObuff)); + if (IObuff[STRLEN(IObuff) - 1] == '\n') + IObuff[STRLEN(IObuff) - 1] = NUL; + emsg(IObuff); +--- 1650,1656 ---- + { + vim_snprintf((char *)IObuff, IOSIZE, _("%sviminfo: %s in line: "), + errnum, message); +! STRNCAT(IObuff, line, IOSIZE - STRLEN(IObuff) - 1); + if (IObuff[STRLEN(IObuff) - 1] == '\n') + IObuff[STRLEN(IObuff) - 1] = NUL; + emsg(IObuff); +*** ../vim-7.1.173/src/ex_docmd.c Sat Nov 24 21:49:19 2007 +--- src/ex_docmd.c Fri Dec 7 21:01:03 2007 +*************** +*** 2660,2666 **** + errormsg = IObuff; + } + STRCAT(errormsg, ": "); +! STRNCAT(errormsg, *cmdlinep, IOSIZE - STRLEN(IObuff)); + } + emsg(errormsg); + } +--- 2660,2666 ---- + errormsg = IObuff; + } + STRCAT(errormsg, ": "); +! STRNCAT(errormsg, *cmdlinep, IOSIZE - STRLEN(IObuff) - 1); + } + emsg(errormsg); + } +*** ../vim-7.1.173/src/version.c Sun Dec 9 19:25:35 2007 +--- src/version.c Sun Dec 9 19:36:50 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 174, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +214. Your MCI "Circle of Friends" are all Hayes-compatible. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.175 b/7.1.175 new file mode 100644 index 00000000..3ec00fd7 --- /dev/null +++ b/7.1.175 @@ -0,0 +1,179 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.175 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.175 +Problem: doesn't work with some combination of 'sts', 'linebreak' and + 'backspace'. (Francois Ingelrest) +Solution: When adding white space results in not moving back delete one + character. +Files: src/edit.c + + +*** ../vim-7.1.174/src/edit.c Sat Nov 24 21:27:33 2007 +--- src/edit.c Fri Dec 7 21:32:48 2007 +*************** +*** 8189,8194 **** +--- 8189,8217 ---- + AppendCharToRedobuff(K_DEL); + } + ++ static void ins_bs_one __ARGS((colnr_T *vcolp)); ++ ++ /* ++ * Delete one character for ins_bs(). ++ */ ++ static void ++ ins_bs_one(vcolp) ++ colnr_T *vcolp; ++ { ++ dec_cursor(); ++ getvcol(curwin, &curwin->w_cursor, vcolp, NULL, NULL); ++ if (State & REPLACE_FLAG) ++ { ++ /* Don't delete characters before the insert point when in ++ * Replace mode */ ++ if (curwin->w_cursor.lnum != Insstart.lnum ++ || curwin->w_cursor.col >= Insstart.col) ++ replace_do_bs(); ++ } ++ else ++ (void)del_char(FALSE); ++ } ++ + /* + * Handle Backspace, delete-word and delete-line in Insert mode. + * Return TRUE when backspace was actually used. +*************** +*** 8418,8426 **** + int ts; + colnr_T vcol; + colnr_T want_vcol; +! #if 0 +! int extra = 0; +! #endif + + *inserted_space_p = FALSE; + if (p_sta && in_indent) +--- 8441,8447 ---- + int ts; + colnr_T vcol; + colnr_T want_vcol; +! colnr_T start_vcol; + + *inserted_space_p = FALSE; + if (p_sta && in_indent) +*************** +*** 8431,8436 **** +--- 8452,8458 ---- + * 'showbreak' may get in the way, need to get the last column of + * the previous character. */ + getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); ++ start_vcol = vcol; + dec_cursor(); + getvcol(curwin, &curwin->w_cursor, NULL, NULL, &want_vcol); + inc_cursor(); +*************** +*** 8439,8468 **** + /* delete characters until we are at or before want_vcol */ + while (vcol > want_vcol + && (cc = *(ml_get_cursor() - 1), vim_iswhite(cc))) +! { +! dec_cursor(); +! getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); +! if (State & REPLACE_FLAG) +! { +! /* Don't delete characters before the insert point when in +! * Replace mode */ +! if (curwin->w_cursor.lnum != Insstart.lnum +! || curwin->w_cursor.col >= Insstart.col) +! { +! #if 0 /* what was this for? It causes problems when sw != ts. */ +! if (State == REPLACE && (int)vcol < want_vcol) +! { +! (void)del_char(FALSE); +! extra = 2; /* don't pop too much */ +! } +! else +! #endif +! replace_do_bs(); +! } +! } +! else +! (void)del_char(FALSE); +! } + + /* insert extra spaces until we are at want_vcol */ + while (vcol < want_vcol) +--- 8461,8467 ---- + /* delete characters until we are at or before want_vcol */ + while (vcol > want_vcol + && (cc = *(ml_get_cursor() - 1), vim_iswhite(cc))) +! ins_bs_one(&vcol); + + /* insert extra spaces until we are at want_vcol */ + while (vcol < want_vcol) +*************** +*** 8479,8500 **** + #endif + { + ins_str((char_u *)" "); +! if ((State & REPLACE_FLAG) /* && extra <= 1 */) +! { +! #if 0 +! if (extra) +! replace_push_off(NUL); +! else +! #endif +! replace_push(NUL); +! } +! #if 0 +! if (extra == 2) +! extra = 1; +! #endif + } + getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); + } + } + + /* +--- 8478,8493 ---- + #endif + { + ins_str((char_u *)" "); +! if ((State & REPLACE_FLAG)) +! replace_push(NUL); + } + getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); + } ++ ++ /* If we are now back where we started delete one character. Can ++ * happen when using 'sts' and 'linebreak'. */ ++ if (vcol >= start_vcol) ++ ins_bs_one(&vcol); + } + + /* +*** ../vim-7.1.174/src/version.c Sun Dec 9 19:37:37 2007 +--- src/version.c Sun Dec 9 20:24:11 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 175, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +215. Your mouse-clicking forearm rivals Popeye's. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.176 b/7.1.176 new file mode 100644 index 00000000..e752419f --- /dev/null +++ b/7.1.176 @@ -0,0 +1,88 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.176 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.176 +Problem: Building with Aap fails when the "compiledby" argument contains + '<' or '>' characters. (Alex Yeh) +Solution: Change how quoting is done in the Aap recipe. +Files: src/main.aap + + +*** ../vim-7.1.175/src/main.aap Tue Sep 25 22:13:14 2007 +--- src/main.aap Fri Dec 7 17:03:31 2007 +*************** +*** 63,70 **** + @else: + @ arch = "ppc" + :print Building for $arch system + :sys CONFIG_STATUS=auto/config.status +! ./configure.aap `file2string("config.arg")` + --with-mac-arch=$arch + --cache-file=auto/config.cache + +--- 63,71 ---- + @else: + @ arch = "ppc" + :print Building for $arch system ++ config_args = `file2string("config.arg")` + :sys CONFIG_STATUS=auto/config.status +! ./configure.aap $config_args + --with-mac-arch=$arch + --cache-file=auto/config.cache + +*************** +*** 440,450 **** + :print >> $target char_u *all_lflags = (char_u *)"$linkcmd"; + @if _no.get("COMPILEDBY"): + who = $COMPILEDBY +! where = '' + @else: + :syseval whoami | :eval re.sub("\n", "", stdin) | :assign who + + :syseval hostname | :eval re.sub("\n", "", stdin) | :assign where + :print >> $target char_u *compiled_user = (char_u *)"$who"; + :print >> $target char_u *compiled_sys = (char_u *)"$where"; + +--- 441,453 ---- + :print >> $target char_u *all_lflags = (char_u *)"$linkcmd"; + @if _no.get("COMPILEDBY"): + who = $COMPILEDBY +! where = + @else: + :syseval whoami | :eval re.sub("\n", "", stdin) | :assign who + + :syseval hostname | :eval re.sub("\n", "", stdin) | :assign where ++ @who = string.replace(who, '"', '\\"') ++ @where = string.replace(where, '"', '\\"') + :print >> $target char_u *compiled_user = (char_u *)"$who"; + :print >> $target char_u *compiled_sys = (char_u *)"$where"; + +*** ../vim-7.1.175/src/version.c Sun Dec 9 20:25:59 2007 +--- src/version.c Mon Dec 31 16:40:01 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 176, + /**/ + +-- +E M A C S +s e l o h +c t t n i +a a t f +p r t +e o + l + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.177 b/7.1.177 new file mode 100644 index 00000000..cc3b13c5 --- /dev/null +++ b/7.1.177 @@ -0,0 +1,193 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.177 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.177 +Problem: Freeing memory twice when in debug mode while reading a script. +Solution: Ignore script input while in debug mode. +Files: src/ex_cmds2.c, src/getchar.c, src/globals.h + + +*** ../vim-7.1.176/src/ex_cmds2.c Thu May 10 20:55:46 2007 +--- src/ex_cmds2.c Tue Jan 1 14:13:41 2008 +*************** +*** 93,98 **** +--- 93,100 ---- + int save_emsg_silent = emsg_silent; + int save_redir_off = redir_off; + tasave_T typeaheadbuf; ++ int typeahead_saved = FALSE; ++ int save_ignore_script; + # ifdef FEAT_EX_EXTRA + int save_ex_normal_busy; + # endif +*************** +*** 159,176 **** + * This makes sure we get input from the user here and don't interfere + * with the commands being executed. Reset "ex_normal_busy" to avoid + * the side effects of using ":normal". Save the stuff buffer and make +! * it empty. */ + # ifdef FEAT_EX_EXTRA + save_ex_normal_busy = ex_normal_busy; + ex_normal_busy = 0; + # endif + if (!debug_greedy) + save_typeahead(&typeaheadbuf); + + cmdline = getcmdline_prompt('>', NULL, 0, EXPAND_NOTHING, NULL); + +! if (!debug_greedy) + restore_typeahead(&typeaheadbuf); + # ifdef FEAT_EX_EXTRA + ex_normal_busy = save_ex_normal_busy; + # endif +--- 161,186 ---- + * This makes sure we get input from the user here and don't interfere + * with the commands being executed. Reset "ex_normal_busy" to avoid + * the side effects of using ":normal". Save the stuff buffer and make +! * it empty. Set ignore_script to avoid reading from script input. */ + # ifdef FEAT_EX_EXTRA + save_ex_normal_busy = ex_normal_busy; + ex_normal_busy = 0; + # endif + if (!debug_greedy) ++ { + save_typeahead(&typeaheadbuf); ++ typeahead_saved = TRUE; ++ save_ignore_script = ignore_script; ++ ignore_script = TRUE; ++ } + + cmdline = getcmdline_prompt('>', NULL, 0, EXPAND_NOTHING, NULL); + +! if (typeahead_saved) +! { + restore_typeahead(&typeaheadbuf); ++ ignore_script = save_ignore_script; ++ } + # ifdef FEAT_EX_EXTRA + ex_normal_busy = save_ex_normal_busy; + # endif +*** ../vim-7.1.176/src/getchar.c Fri Dec 7 17:30:04 2007 +--- src/getchar.c Tue Jan 1 14:11:42 2008 +*************** +*** 1279,1286 **** + void + free_typebuf() + { +! vim_free(typebuf.tb_buf); +! vim_free(typebuf.tb_noremap); + } + + /* +--- 1279,1292 ---- + void + free_typebuf() + { +! if (typebuf.tb_buf == typebuf_init) +! EMSG2(_(e_intern2), "Free typebuf 1"); +! else +! vim_free(typebuf.tb_buf); +! if (typebuf.tb_buf == noremapbuf_init) +! EMSG2(_(e_intern2), "Free typebuf 2"); +! else +! vim_free(typebuf.tb_noremap); + } + + /* +*************** +*** 1359,1364 **** +--- 1365,1375 ---- + EMSG(_(e_nesting)); + return; + } ++ #ifdef FEAT_EVAL ++ if (ignore_script) ++ /* Not reading from script, also don't open one. Warning message? */ ++ return; ++ #endif + + if (scriptin[curscript] != NULL) /* already reading script */ + ++curscript; +*************** +*** 2346,2352 **** + current_menu->silent[idx]); + } + } +! #endif /* FEAT_GUI */ + continue; /* try mapping again */ + } + +--- 2357,2363 ---- + current_menu->silent[idx]); + } + } +! #endif /* FEAT_GUI && FEAT_MENU */ + continue; /* try mapping again */ + } + +*************** +*** 2862,2872 **** + undo_off = FALSE; /* restart undo now */ + + /* +! * first try script file +! * If interrupted: Stop reading script files. + */ + script_char = -1; +! while (scriptin[curscript] != NULL && script_char < 0) + { + if (got_int || (script_char = getc(scriptin[curscript])) < 0) + { +--- 2873,2887 ---- + undo_off = FALSE; /* restart undo now */ + + /* +! * Get a character from a script file if there is one. +! * If interrupted: Stop reading script files, close them all. + */ + script_char = -1; +! while (scriptin[curscript] != NULL && script_char < 0 +! #ifdef FEAT_EVAL +! && !ignore_script +! #endif +! ) + { + if (got_int || (script_char = getc(scriptin[curscript])) < 0) + { +*** ../vim-7.1.176/src/globals.h Sat Sep 29 14:15:00 2007 +--- src/globals.h Mon Dec 31 17:00:21 2007 +*************** +*** 954,959 **** +--- 954,962 ---- + EXTERN int ex_normal_busy INIT(= 0); /* recursiveness of ex_normal() */ + EXTERN int ex_normal_lock INIT(= 0); /* forbid use of ex_normal() */ + #endif ++ #ifdef FEAT_EVAL ++ EXTERN int ignore_script INIT(= FALSE); /* ignore script input */ ++ #endif + EXTERN int stop_insert_mode; /* for ":stopinsert" and 'insertmode' */ + + EXTERN int KeyTyped; /* TRUE if user typed current char */ +*** ../vim-7.1.176/src/version.c Mon Dec 31 16:41:31 2007 +--- src/version.c Tue Jan 1 14:00:09 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 177, + /**/ + +-- +Back up my hard drive? I can't find the reverse switch! + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.178 b/7.1.178 new file mode 100644 index 00000000..972e4951 --- /dev/null +++ b/7.1.178 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.178 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.178 +Problem: "%" doesn't work on "/* comment *//* comment */". +Solution: Don't handle the "//" in "*//*" as a C++ comment. (Markus + Heidelberg) +Files: src/search.c + + +*** ../vim-7.1.177/src/search.c Wed Aug 8 22:48:16 2007 +--- src/search.c Mon Dec 10 21:21:17 2007 +*************** +*** 2319,2325 **** + #endif + while ((p = vim_strchr(p, '/')) != NULL) + { +! if (p[1] == '/') + break; + ++p; + } +--- 2319,2327 ---- + #endif + while ((p = vim_strchr(p, '/')) != NULL) + { +! /* accept a double /, unless it's preceded with * and followed by *, +! * because * / / * is an end and start of a C comment */ +! if (p[1] == '/' && (p == line || p[-1] != '*' || p[2] != '*')) + break; + ++p; + } +*** ../vim-7.1.177/src/version.c Tue Jan 1 14:16:42 2008 +--- src/version.c Tue Jan 1 15:41:33 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 178, + /**/ + +-- +I'd like to meet the man who invented sex and see what he's working on now. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.179 b/7.1.179 new file mode 100644 index 00000000..1e131759 --- /dev/null +++ b/7.1.179 @@ -0,0 +1,189 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.179 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.179 +Problem: Need to check for TCL 8.5. +Solution: Adjust configure script. (Alexey Froloff) +Files: src/configure.in, src/auto/configure + + +*** ../vim-7.1.178/src/configure.in Sun Nov 4 15:35:23 2007 +--- src/configure.in Sun Dec 30 13:55:28 2007 +*************** +*** 759,773 **** + + if test "$enable_tclinterp" = "yes"; then + +! dnl on FreeBSD tclsh is a silly script, look for tclsh8.[420] + AC_MSG_CHECKING(--with-tclsh argument) + AC_ARG_WITH(tclsh, [ --with-tclsh=PATH which tclsh to use (default: tclsh8.0)], + tclsh_name="$withval"; AC_MSG_RESULT($tclsh_name), +! tclsh_name="tclsh8.4"; AC_MSG_RESULT(no)) + AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) + AC_SUBST(vi_cv_path_tcl) + +! dnl when no specific version specified, also try 8.2 and 8.0 + if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then + tclsh_name="tclsh8.2" + AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) +--- 759,777 ---- + + if test "$enable_tclinterp" = "yes"; then + +! dnl on FreeBSD tclsh is a silly script, look for tclsh8.[5420] + AC_MSG_CHECKING(--with-tclsh argument) + AC_ARG_WITH(tclsh, [ --with-tclsh=PATH which tclsh to use (default: tclsh8.0)], + tclsh_name="$withval"; AC_MSG_RESULT($tclsh_name), +! tclsh_name="tclsh8.5"; AC_MSG_RESULT(no)) + AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) + AC_SUBST(vi_cv_path_tcl) + +! dnl when no specific version specified, also try 8.4, 8.2 and 8.0 +! if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.5"; then +! tclsh_name="tclsh8.4" +! AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) +! fi + if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then + tclsh_name="tclsh8.2" + AC_PATH_PROG(vi_cv_path_tcl, $tclsh_name) +*************** +*** 810,815 **** +--- 814,820 ---- + AC_MSG_CHECKING(for location of tclConfig.sh script) + if test "x$MACOSX" != "xyes"; then + tclcnf=`echo $tclinc | sed s/include/lib/g` ++ tclcnf="$tclcnf `echo $tclinc | sed s/include/lib64/g`" + else + dnl For Mac OS X 10.3, use the OS-provided framework location + tclcnf="/System/Library/Frameworks/Tcl.framework" +*************** +*** 830,835 **** +--- 835,841 ---- + AC_MSG_RESULT() + AC_MSG_CHECKING(for Tcl library by myself) + tcllib=`echo $tclinc | sed s/include/lib/g` ++ tcllib="$tcllib `echo $tclinc | sed s/include/lib64/g`" + for ext in .so .a ; do + for ver in "" $tclver ; do + for try in $tcllib ; do +*** ../vim-7.1.178/src/auto/configure Sun Nov 4 15:35:23 2007 +--- src/auto/configure Sun Dec 30 13:55:35 2007 +*************** +*** 4445,4451 **** + tclsh_name="$withval"; echo "$as_me:$LINENO: result: $tclsh_name" >&5 + echo "${ECHO_T}$tclsh_name" >&6 + else +! tclsh_name="tclsh8.4"; echo "$as_me:$LINENO: result: no" >&5 + echo "${ECHO_T}no" >&6 + fi; + # Extract the first word of "$tclsh_name", so it can be a program name with args. +--- 4445,4451 ---- + tclsh_name="$withval"; echo "$as_me:$LINENO: result: $tclsh_name" >&5 + echo "${ECHO_T}$tclsh_name" >&6 + else +! tclsh_name="tclsh8.5"; echo "$as_me:$LINENO: result: no" >&5 + echo "${ECHO_T}no" >&6 + fi; + # Extract the first word of "$tclsh_name", so it can be a program name with args. +*************** +*** 4489,4495 **** + + + +! if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then + tclsh_name="tclsh8.2" + # Extract the first word of "$tclsh_name", so it can be a program name with args. + set dummy $tclsh_name; ac_word=$2 +--- 4489,4537 ---- + + + +! if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.5"; then +! tclsh_name="tclsh8.4" +! # Extract the first word of "$tclsh_name", so it can be a program name with args. +! set dummy $tclsh_name; ac_word=$2 +! echo "$as_me:$LINENO: checking for $ac_word" >&5 +! echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +! if test "${ac_cv_path_vi_cv_path_tcl+set}" = set; then +! echo $ECHO_N "(cached) $ECHO_C" >&6 +! else +! case $vi_cv_path_tcl in +! [\\/]* | ?:[\\/]*) +! ac_cv_path_vi_cv_path_tcl="$vi_cv_path_tcl" # Let the user override the test with a path. +! ;; +! *) +! as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +! for as_dir in $PATH +! do +! IFS=$as_save_IFS +! test -z "$as_dir" && as_dir=. +! for ac_exec_ext in '' $ac_executable_extensions; do +! if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then +! ac_cv_path_vi_cv_path_tcl="$as_dir/$ac_word$ac_exec_ext" +! echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 +! break 2 +! fi +! done +! done +! +! ;; +! esac +! fi +! vi_cv_path_tcl=$ac_cv_path_vi_cv_path_tcl +! +! if test -n "$vi_cv_path_tcl"; then +! echo "$as_me:$LINENO: result: $vi_cv_path_tcl" >&5 +! echo "${ECHO_T}$vi_cv_path_tcl" >&6 +! else +! echo "$as_me:$LINENO: result: no" >&5 +! echo "${ECHO_T}no" >&6 +! fi +! +! fi +! if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then + tclsh_name="tclsh8.2" + # Extract the first word of "$tclsh_name", so it can be a program name with args. + set dummy $tclsh_name; ac_word=$2 +*************** +*** 4649,4654 **** +--- 4691,4697 ---- + echo $ECHO_N "checking for location of tclConfig.sh script... $ECHO_C" >&6 + if test "x$MACOSX" != "xyes"; then + tclcnf=`echo $tclinc | sed s/include/lib/g` ++ tclcnf="$tclcnf `echo $tclinc | sed s/include/lib64/g`" + else + tclcnf="/System/Library/Frameworks/Tcl.framework" + fi +*************** +*** 4668,4673 **** +--- 4711,4717 ---- + echo "$as_me:$LINENO: checking for Tcl library by myself" >&5 + echo $ECHO_N "checking for Tcl library by myself... $ECHO_C" >&6 + tcllib=`echo $tclinc | sed s/include/lib/g` ++ tcllib="$tcllib `echo $tclinc | sed s/include/lib64/g`" + for ext in .so .a ; do + for ver in "" $tclver ; do + for try in $tcllib ; do +*** ../vim-7.1.178/src/version.c Tue Jan 1 15:42:45 2008 +--- src/version.c Tue Jan 1 16:24:07 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 179, + /**/ + +-- +Just think of all the things we haven't thought of yet. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.180 b/7.1.180 new file mode 100644 index 00000000..db8ef5dd --- /dev/null +++ b/7.1.180 @@ -0,0 +1,266 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.180 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.180 +Problem: Regexp patterns not tested sufficiently. +Solution: Add more checks to the regexp test. +Files: src/testdir/test64.in, src/testdir/test64.ok + + +*** ../vim-7.1.179/src/testdir/test64.in Tue Sep 25 17:54:41 2007 +--- src/testdir/test64.in Mon Dec 31 14:20:23 2007 +*************** +*** 14,23 **** +--- 14,136 ---- + :" etc. + :" When there is no match use only the first two items. + :let tl = [] ++ :call add(tl, ['ab', 'aab', 'ab']) + :call add(tl, ['b', 'abcdef', 'b']) + :call add(tl, ['bc*', 'abccccdef', 'bcccc']) + :call add(tl, ['bc\{-}', 'abccccdef', 'b']) + :call add(tl, ['bc\{-}\(d\)', 'abccccdef', 'bccccd', 'd']) ++ :call add(tl, ['bc*', 'abbdef', 'b']) ++ :call add(tl, ['c*', 'ccc', 'ccc']) ++ :call add(tl, ['bc*', 'abdef', 'b']) ++ :call add(tl, ['c*', 'abdef', '']) ++ :call add(tl, ['bc\+', 'abccccdef', 'bcccc']) ++ :call add(tl, ['bc\+', 'abdef']) "no match ++ :" ++ :"operator \| ++ :call add(tl, ['a\|ab', 'cabd', 'a']) "alternation is ordered ++ :" ++ :call add(tl, ['c\?', 'ccb', 'c']) ++ :call add(tl, ['bc\?', 'abd', 'b']) ++ :call add(tl, ['bc\?', 'abccd', 'bc']) ++ :" ++ :call add(tl, ['\va{1}', 'ab', 'a']) ++ :" ++ :call add(tl, ['\va{2}', 'aa', 'aa']) ++ :call add(tl, ['\va{2}', 'caad', 'aa']) ++ :call add(tl, ['\va{2}', 'aba']) ++ :call add(tl, ['\va{2}', 'ab']) ++ :call add(tl, ['\va{2}', 'abaa', 'aa']) ++ :call add(tl, ['\va{2}', 'aaa', 'aa']) ++ :" ++ :call add(tl, ['\vb{1}', 'abca', 'b']) ++ :call add(tl, ['\vba{2}', 'abaa', 'baa']) ++ :call add(tl, ['\vba{3}', 'aabaac']) ++ :" ++ :call add(tl, ['\v(ab){1}', 'ab', 'ab', 'ab']) ++ :call add(tl, ['\v(ab){1}', 'dabc', 'ab', 'ab']) ++ :call add(tl, ['\v(ab){1}', 'acb']) ++ :" ++ :call add(tl, ['\v(ab){0,2}', 'acb', "", ""]) ++ :call add(tl, ['\v(ab){0,2}', 'ab', 'ab', 'ab']) ++ :call add(tl, ['\v(ab){1,2}', 'ab', 'ab', 'ab']) ++ :call add(tl, ['\v(ab){1,2}', 'ababc', 'abab', 'ab']) ++ :call add(tl, ['\v(ab){2,4}', 'ababcab', 'abab', 'ab']) ++ :call add(tl, ['\v(ab){2,4}', 'abcababa', 'abab', 'ab']) ++ :" ++ :call add(tl, ['\v(ab){2}', 'abab', 'abab', 'ab']) ++ :call add(tl, ['\v(ab){2}', 'cdababe', 'abab', 'ab']) ++ :call add(tl, ['\v(ab){2}', 'abac']) ++ :call add(tl, ['\v(ab){2}', 'abacabab', 'abab', 'ab']) ++ :call add(tl, ['\v((ab){2}){2}', 'abababab', 'abababab', 'abab', 'ab']) ++ :call add(tl, ['\v((ab){2}){2}', 'abacabababab', 'abababab', 'abab', 'ab']) ++ :" ++ :call add(tl, ['\v(a{1}){1}', 'a', 'a', 'a']) ++ :call add(tl, ['\v(a{2}){1}', 'aa', 'aa', 'aa']) ++ :call add(tl, ['\v(a{2}){1}', 'aaac', 'aa', 'aa']) ++ :call add(tl, ['\v(a{2}){1}', 'daaac', 'aa', 'aa']) ++ :call add(tl, ['\v(a{1}){2}', 'daaac', 'aa', 'a']) ++ :call add(tl, ['\v(a{1}){2}', 'aaa', 'aa', 'a']) ++ :call add(tl, ['\v(a{2})+', 'adaac', 'aa', 'aa']) ++ :call add(tl, ['\v(a{2})+', 'aa', 'aa', 'aa']) ++ :call add(tl, ['\v(a{2}){1}', 'aa', 'aa', 'aa']) ++ :call add(tl, ['\v(a{1}){2}', 'aa', 'aa', 'a']) ++ :call add(tl, ['\v(a{1}){1}', 'a', 'a', 'a']) ++ :call add(tl, ['\v(a{2}){2}', 'aaaa', 'aaaa', 'aa']) ++ :call add(tl, ['\v(a{2}){2}', 'aaabaaaa', 'aaaa', 'aa']) ++ :" ++ :call add(tl, ['\v(a+){2}', 'dadaac', 'aa', 'a']) ++ :call add(tl, ['\v(a{3}){2}', 'aaaaaaa', 'aaaaaa', 'aaa']) ++ :" ++ :call add(tl, ['\v(a{1,2}){2}', 'daaac', 'aaa', 'a']) ++ :call add(tl, ['\v(a{1,3}){2}', 'daaaac', 'aaaa', 'a']) ++ :call add(tl, ['\v(a{1,3}){2}', 'daaaaac', 'aaaaa', 'aa']) ++ :call add(tl, ['\v(a{1,3}){3}', 'daac']) ++ :call add(tl, ['\v(a{1,2}){2}', 'dac']) ++ :call add(tl, ['\v(a+)+', 'daac', 'aa', 'aa']) ++ :call add(tl, ['\v(a+)+', 'aaa', 'aaa', 'aaa']) ++ :call add(tl, ['\v(a+){1,2}', 'aaa', 'aaa', 'aaa']) ++ :call add(tl, ['\v(a+)(a+)', 'aaa', 'aaa', 'aa', 'a']) ++ :call add(tl, ['\v(a{3})+', 'daaaac', 'aaa', 'aaa']) ++ :call add(tl, ['\v(a|b|c)+', 'aacb', 'aacb', 'b']) ++ :call add(tl, ['\v(a|b|c){2}', 'abcb', 'ab', 'b']) ++ :call add(tl, ['\v(abc){2}', 'abcabd', ]) ++ :call add(tl, ['\v(abc){2}', 'abdabcabc','abcabc', 'abc']) ++ :" ++ :call add(tl, ['a*', 'cc', '']) ++ :call add(tl, ['\v(a*)+', 'cc', '']) ++ :call add(tl, ['\v((ab)+)+', 'ab', 'ab', 'ab', 'ab']) ++ :call add(tl, ['\v(((ab)+)+)+', 'ab', 'ab', 'ab', 'ab', 'ab']) ++ :call add(tl, ['\v(((ab)+)+)+', 'dababc', 'abab', 'abab', 'abab', 'ab']) ++ :call add(tl, ['\v(a{0,2})+', 'cc', '']) ++ :call add(tl, ['\v(a*)+', '', '']) ++ :call add(tl, ['\v((a*)+)+', '', '']) ++ :call add(tl, ['\v((ab)*)+', '', '']) ++ :call add(tl, ['\va{1,3}', 'aab', 'aa']) ++ :call add(tl, ['\va{2,3}', 'abaa', 'aa']) ++ :" ++ :call add(tl, ['\v((ab)+|c*)+', 'abcccaba', 'abcccab', '', 'ab']) ++ :call add(tl, ['\v(a{2})|(b{3})', 'bbabbbb', 'bbb', '', 'bbb']) ++ :call add(tl, ['\va{2}|b{2}', 'abab']) ++ :call add(tl, ['\v(a)+|(c)+', 'bbacbaacbbb', 'a', 'a']) ++ :call add(tl, ['\vab{2,3}c', 'aabbccccccccccccc', 'abbc']) ++ :call add(tl, ['\vab{2,3}c', 'aabbbccccccccccccc', 'abbbc']) ++ :call add(tl, ['\vab{2,3}cd{2,3}e', 'aabbbcddee', 'abbbcdde']) ++ :call add(tl, ['\va(bc){2}d', 'aabcbfbc' ]) ++ :call add(tl, ['\va*a{2}', 'a', ]) ++ :call add(tl, ['\va*a{2}', 'aa', 'aa' ]) ++ :call add(tl, ['\va*a{2}', 'aaa', 'aaa' ]) ++ :call add(tl, ['\va*a{2}', 'bbbabcc', ]) ++ :call add(tl, ['\va*b*|a*c*', 'a', 'a']) ++ :call add(tl, ['\va{1}b{1}|a{1}b{1}', '']) ++ :" ++ :"submatches ++ :call add(tl, ['\v(a)', 'ab', 'a', 'a']) ++ :call add(tl, ['\v(a)(b)', 'ab', 'ab', 'a', 'b']) ++ :call add(tl, ['\v(ab)(b)(c)', 'abbc', 'abbc', 'ab', 'b', 'c']) ++ :call add(tl, ['\v((a)(b))', 'ab', 'ab', 'ab', 'a', 'b']) ++ :call add(tl, ['\v(a)|(b)', 'ab', 'a', 'a']) ++ :" ++ :call add(tl, ['\v(a*)+', 'aaaa', 'aaaa', '']) + :call add(tl, ['x', 'abcdef']) + :" + :for t in tl +*** ../vim-7.1.179/src/testdir/test64.ok Tue Aug 14 17:28:14 2007 +--- src/testdir/test64.ok Mon Dec 31 14:20:26 2007 +*************** +*** 4,6 **** +--- 4,102 ---- + OK + OK + OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK ++ OK +*** ../vim-7.1.179/src/version.c Tue Jan 1 16:25:33 2008 +--- src/version.c Tue Jan 1 17:34:32 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 180, + /**/ + +-- +CONCORDE: Message for you, sir. + He falls forward revealing the arrow with the note. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.181 b/7.1.181 new file mode 100644 index 00000000..124ff2a8 --- /dev/null +++ b/7.1.181 @@ -0,0 +1,62 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.181 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.181 +Problem: Accessing uninitialized memory in Farsi mode. (Dominuque Pelle) +Solution: Only invoke lrF_sub() when there is something to do. +Files: src/ex_cmds.c + + +*** ../vim-7.1.180/src/ex_cmds.c Sun Dec 9 19:37:37 2007 +--- src/ex_cmds.c Mon Dec 31 17:29:25 2007 +*************** +*** 4212,4222 **** + sub_nlines = 0; + } + +- #ifdef FEAT_FKMAP /* reverse the flow of the Farsi characters */ +- if (p_altkeymap && curwin->w_p_rl) +- lrF_sub(cmd); +- #endif +- + if (eap->cmdidx == CMD_tilde) + which_pat = RE_LAST; /* use last used regexp */ + else +--- 4212,4217 ---- +*************** +*** 4252,4257 **** +--- 4247,4256 ---- + } + else /* find the end of the regexp */ + { ++ #ifdef FEAT_FKMAP /* reverse the flow of the Farsi characters */ ++ if (p_altkeymap && curwin->w_p_rl) ++ lrF_sub(cmd); ++ #endif + which_pat = RE_LAST; /* use last used regexp */ + delimiter = *cmd++; /* remember delimiter character */ + pat = cmd; /* remember start of search pat */ +*** ../vim-7.1.180/src/version.c Tue Jan 1 17:37:01 2008 +--- src/version.c Wed Jan 2 13:57:31 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 181, + /**/ + +-- +Yah, well, we had to carve our electrons out of driftwood we'd +find. In the winter. Uphill. Both ways. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.182 b/7.1.182 new file mode 100644 index 00000000..23ef997f --- /dev/null +++ b/7.1.182 @@ -0,0 +1,169 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.182 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.182 +Problem: When using tab pages and an argument list the session file may + contain wrong "next" commands. (Alexander Bluem) +Solution: Use "argu" commands and only when needed. +Files: src/ex_docmd.c + + +*** ../vim-7.1.181/src/ex_docmd.c Sun Dec 9 19:37:37 2007 +--- src/ex_docmd.c Mon Dec 31 18:24:16 2007 +*************** +*** 372,378 **** + static char_u *arg_all __ARGS((void)); + #ifdef FEAT_SESSION + static int makeopens __ARGS((FILE *fd, char_u *dirnow)); +! static int put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp)); + static void ex_loadview __ARGS((exarg_T *eap)); + static char_u *get_view_file __ARGS((int c)); + static int did_lcd; /* whether ":lcd" was produced for a session */ +--- 372,378 ---- + static char_u *arg_all __ARGS((void)); + #ifdef FEAT_SESSION + static int makeopens __ARGS((FILE *fd, char_u *dirnow)); +! static int put_view __ARGS((FILE *fd, win_T *wp, int add_edit, unsigned *flagp, int current_arg_idx)); + static void ex_loadview __ARGS((exarg_T *eap)); + static char_u *get_view_file __ARGS((int c)); + static int did_lcd; /* whether ":lcd" was produced for a session */ +*************** +*** 8762,8768 **** + } + else + { +! failed |= (put_view(fd, curwin, !using_vdir, flagp) == FAIL); + } + if (put_line(fd, "let &so = s:so_save | let &siso = s:siso_save") + == FAIL) +--- 8762,8769 ---- + } + else + { +! failed |= (put_view(fd, curwin, !using_vdir, flagp, +! -1) == FAIL); + } + if (put_line(fd, "let &so = s:so_save | let &siso = s:siso_save") + == FAIL) +*************** +*** 9761,9766 **** +--- 9762,9769 ---- + int tabnr; + win_T *tab_firstwin; + frame_T *tab_topframe; ++ int cur_arg_idx = 0; ++ int next_arg_idx; + + if (ssop_flags & SSOP_BUFFERS) + only_save_windows = FALSE; /* Save ALL buffers */ +*************** +*** 9976,9987 **** + { + if (!ses_do_win(wp)) + continue; +! if (put_view(fd, wp, wp != edited_win, &ssop_flags) == FAIL) + return FAIL; + if (nr > 1 && put_line(fd, "wincmd w") == FAIL) + return FAIL; + } + + /* + * Restore cursor to the current window if it's not the first one. + */ +--- 9979,9997 ---- + { + if (!ses_do_win(wp)) + continue; +! if (put_view(fd, wp, wp != edited_win, &ssop_flags, +! cur_arg_idx) == FAIL) + return FAIL; + if (nr > 1 && put_line(fd, "wincmd w") == FAIL) + return FAIL; ++ next_arg_idx = wp->w_arg_idx; + } + ++ /* The argument index in the first tab page is zero, need to set it in ++ * each window. For further tab pages it's the window where we do ++ * "tabedit". */ ++ cur_arg_idx = next_arg_idx; ++ + /* + * Restore cursor to the current window if it's not the first one. + */ +*************** +*** 10190,10200 **** + * Caller must make sure 'scrolloff' is zero. + */ + static int +! put_view(fd, wp, add_edit, flagp) + FILE *fd; + win_T *wp; + int add_edit; /* add ":edit" command to view */ + unsigned *flagp; /* vop_flags or ssop_flags */ + { + win_T *save_curwin; + int f; +--- 10200,10212 ---- + * Caller must make sure 'scrolloff' is zero. + */ + static int +! put_view(fd, wp, add_edit, flagp, current_arg_idx) + FILE *fd; + win_T *wp; + int add_edit; /* add ":edit" command to view */ + unsigned *flagp; /* vop_flags or ssop_flags */ ++ int current_arg_idx; /* current argument index of the window, use ++ * -1 if unknown */ + { + win_T *save_curwin; + int f; +*************** +*** 10224,10233 **** + + /* Only when part of a session: restore the argument index. Some + * arguments may have been deleted, check if the index is valid. */ +! if (wp->w_arg_idx != 0 && wp->w_arg_idx <= WARGCOUNT(wp) + && flagp == &ssop_flags) + { +! if (fprintf(fd, "%ldnext", (long)wp->w_arg_idx) < 0 + || put_eol(fd) == FAIL) + return FAIL; + did_next = TRUE; +--- 10236,10245 ---- + + /* Only when part of a session: restore the argument index. Some + * arguments may have been deleted, check if the index is valid. */ +! if (wp->w_arg_idx != current_arg_idx && wp->w_arg_idx <= WARGCOUNT(wp) + && flagp == &ssop_flags) + { +! if (fprintf(fd, "%ldargu", (long)wp->w_arg_idx + 1) < 0 + || put_eol(fd) == FAIL) + return FAIL; + did_next = TRUE; +*** ../vim-7.1.181/src/version.c Wed Jan 2 13:58:17 2008 +--- src/version.c Wed Jan 2 15:10:01 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 182, + /**/ + +-- +You were lucky. We lived for three months in a brown paper bag in a +septic tank. We used to have to get up at six o'clock in the morning, +clean the bag, eat a crust of stale bread, go to work down mill for +fourteen hours a day week in-week out. When we got home, our Dad +would thrash us to sleep with his belt! + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.183 b/7.1.183 new file mode 100644 index 00000000..79fd6500 --- /dev/null +++ b/7.1.183 @@ -0,0 +1,99 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.183 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.183 +Problem: "Internal error" for ":echo matchstr('a', 'a\%[\&]')" (Mitanu + Paul) +Solution: Inside "\%[]" detect \&, \| and \) as an error. +Files: src/regexp.c + + +*** ../vim-7.1.182/src/regexp.c Sun Dec 9 19:25:35 2007 +--- src/regexp.c Wed Jan 2 15:02:37 2008 +*************** +*** 1288,1295 **** + } + + /* +! * regbranch - one alternative of an | operator +! * + * Implements the & operator. + */ + static char_u * +--- 1288,1294 ---- + } + + /* +! * Handle one alternative of an | operator. + * Implements the & operator. + */ + static char_u * +*************** +*** 1330,1337 **** + } + + /* +! * regbranch - one alternative of an | or & operator +! * + * Implements the concatenation operator. + */ + static char_u * +--- 1329,1335 ---- + } + + /* +! * Handle one alternative of an | or & operator. + * Implements the concatenation operator. + */ + static char_u * +*************** +*** 1708,1713 **** +--- 1706,1713 ---- + case Magic('|'): + case Magic('&'): + case Magic(')'): ++ if (one_exactly) ++ EMSG_ONE_RET_NULL; + EMSG_RET_NULL(_(e_internal)); /* Supposed to be caught earlier. */ + /* NOTREACHED */ + +*************** +*** 3106,3112 **** + * slow, we keep one allocated piece of memory and only re-allocate it when + * it's too small. It's freed in vim_regexec_both() when finished. + */ +! static char_u *reg_tofree; + static unsigned reg_tofreelen; + + /* +--- 3106,3112 ---- + * slow, we keep one allocated piece of memory and only re-allocate it when + * it's too small. It's freed in vim_regexec_both() when finished. + */ +! static char_u *reg_tofree = NULL; + static unsigned reg_tofreelen; + + /* +*** ../vim-7.1.182/src/version.c Wed Jan 2 15:12:29 2008 +--- src/version.c Wed Jan 2 15:33:52 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 183, + /**/ + +-- +Not too long ago, unzipping in public was illegal... + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.184 b/7.1.184 new file mode 100644 index 00000000..9afeff6a --- /dev/null +++ b/7.1.184 @@ -0,0 +1,63 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.184 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.184 +Problem: Crash when deleting backwards over a line break in Insert mode. +Solution: Don't advance the cursor when it's already on the NUL after a + line. (Matthew Wozniski) +Files: src/normal.c + + +*** ../vim-7.1.183/src/normal.c Sun Oct 14 17:15:45 2007 +--- src/normal.c Tue Jan 1 16:40:24 2008 +*************** +*** 5849,5860 **** + /* When the NL before the first char has to be deleted we + * put the cursor on the NUL after the previous line. + * This is a very special case, be careful! +! * don't adjust op_end now, otherwise it won't work */ + if ( (cap->oap->op_type == OP_DELETE + || cap->oap->op_type == OP_CHANGE) + && !lineempty(curwin->w_cursor.lnum)) + { +! ++curwin->w_cursor.col; + cap->retval |= CA_NO_ADJ_OP_END; + } + continue; +--- 5849,5861 ---- + /* When the NL before the first char has to be deleted we + * put the cursor on the NUL after the previous line. + * This is a very special case, be careful! +! * Don't adjust op_end now, otherwise it won't work. */ + if ( (cap->oap->op_type == OP_DELETE + || cap->oap->op_type == OP_CHANGE) + && !lineempty(curwin->w_cursor.lnum)) + { +! if (*ml_get_cursor() != NUL) +! ++curwin->w_cursor.col; + cap->retval |= CA_NO_ADJ_OP_END; + } + continue; +*** ../vim-7.1.183/src/version.c Wed Jan 2 15:34:48 2008 +--- src/version.c Wed Jan 2 16:24:19 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 184, + /**/ + +-- +Not too long ago, cut and paste was done with scissors and glue... + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.185 b/7.1.185 new file mode 100644 index 00000000..0a1e0923 --- /dev/null +++ b/7.1.185 @@ -0,0 +1,140 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.185 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.185 +Problem: Using "gR" with a multi-byte encoding and typing a CR pushes + characters onto the replace stack incorrectly, resulting in BS + putting back the wrong characters. (Paul B. Mahol) +Solution: Push multi-byte characters onto the replace stack in reverse byte + order. Add replace_push_mb(). +Files: src/edit.c, src/misc1.c, src/proto/edit.pro + + +*** ../vim-7.1.184/src/edit.c Sun Dec 9 20:25:59 2007 +--- src/edit.c Tue Jan 1 17:28:07 2008 +*************** +*** 6939,6944 **** +--- 6939,6963 ---- + ++replace_stack_nr; + } + ++ #if defined(FEAT_MBYTE) || defined(PROTO) ++ /* ++ * Push a character onto the replace stack. Handles a multi-byte character in ++ * reverse byte order, so that the first byte is popped off first. ++ * Return the number of bytes done (includes composing characters). ++ */ ++ int ++ replace_push_mb(p) ++ char_u *p; ++ { ++ int l = (*mb_ptr2len)(p); ++ int j; ++ ++ for (j = l - 1; j >= 0; --j) ++ replace_push(p[j]); ++ return l; ++ } ++ #endif ++ + #if 0 + /* + * call replace_push(c) with replace_offset set to the first NUL. +*** ../vim-7.1.184/src/misc1.c Wed Sep 26 22:35:06 2007 +--- src/misc1.c Wed Jan 2 17:48:00 2008 +*************** +*** 591,597 **** + replace_push(NUL); + p = saved_line + curwin->w_cursor.col; + while (*p != NUL) +! replace_push(*p++); + saved_line[curwin->w_cursor.col] = NUL; + } + #endif +--- 592,605 ---- + replace_push(NUL); + p = saved_line + curwin->w_cursor.col; + while (*p != NUL) +! { +! #ifdef FEAT_MBYTE +! if (has_mbyte) +! p += replace_push_mb(p); +! else +! #endif +! replace_push(*p++); +! } + saved_line[curwin->w_cursor.col] = NUL; + } + #endif +*************** +*** 1914,1920 **** + int charlen; + { + int c = buf[0]; +- int l, j; + #endif + int newlen; /* nr of bytes inserted */ + int oldlen; /* nr of bytes deleted (0 when not replacing) */ +--- 1922,1927 ---- +*************** +*** 2016,2028 **** + for (i = 0; i < oldlen; ++i) + { + #ifdef FEAT_MBYTE +! l = (*mb_ptr2len)(oldp + col + i) - 1; +! for (j = l; j >= 0; --j) +! replace_push(oldp[col + i + j]); +! i += l; +! #else +! replace_push(oldp[col + i]); + #endif + } + } + +--- 2023,2033 ---- + for (i = 0; i < oldlen; ++i) + { + #ifdef FEAT_MBYTE +! if (has_mbyte) +! i += replace_push_mb(oldp + col + i) - 1; +! else + #endif ++ replace_push(oldp[col + i]); + } + } + +*** ../vim-7.1.184/src/proto/edit.pro Sat May 5 20:21:34 2007 +--- src/proto/edit.pro Tue Jan 1 17:21:24 2008 +*************** +*** 32,37 **** +--- 32,38 ---- + char_u *get_last_insert __ARGS((void)); + char_u *get_last_insert_save __ARGS((void)); + void replace_push __ARGS((int c)); ++ int replace_push_mb __ARGS((char_u *p)); + void fixthisline __ARGS((int (*get_the_indent)(void))); + void fix_indent __ARGS((void)); + int in_cinkeys __ARGS((int keytyped, int when, int line_is_empty)); +*** ../vim-7.1.184/src/version.c Wed Jan 2 16:25:20 2008 +--- src/version.c Wed Jan 2 17:45:10 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 185, + /**/ + +-- +Not too long ago, a keyboard was something to make music with... + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.186 b/7.1.186 new file mode 100644 index 00000000..c848cbba --- /dev/null +++ b/7.1.186 @@ -0,0 +1,111 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.186 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.186 +Problem: "expand('')" returns a bogus value after changing + directory. (Dave Fishburn) +Solution: Copy "autocmd_fname" to allocated memory and expand to full + filename. Shorten the path when expanding . +Files: src/ex_docmd.c, src/fileio.c + + +*** ../vim-7.1.185/src/ex_docmd.c Wed Jan 2 15:12:29 2008 +--- src/ex_docmd.c Wed Jan 2 20:12:33 2008 +*************** +*** 7799,7804 **** +--- 7799,7805 ---- + free_cd_dir() + { + vim_free(prev_dir); ++ prev_dir = NULL; + } + #endif + +*************** +*** 9521,9526 **** +--- 9522,9528 ---- + *errormsg = (char_u *)_("E495: no autocommand file name to substitute for \"\""); + return NULL; + } ++ result = shorten_fname1(result); + break; + + case SPEC_ABUF: /* buffer number for autocommand */ +*** ../vim-7.1.185/src/fileio.c Thu Nov 8 20:47:34 2007 +--- src/fileio.c Wed Jan 2 20:21:43 2008 +*************** +*** 5556,5562 **** + #endif + + #if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \ +! defined(FEAT_QUICKFIX) || defined(PROTO) + /* + * Try to find a shortname by comparing the fullname with the current + * directory. +--- 5556,5562 ---- + #endif + + #if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \ +! defined(FEAT_QUICKFIX) || defined(FEAT_AUTOCMD) || defined(PROTO) + /* + * Try to find a shortname by comparing the fullname with the current + * directory. +*************** +*** 8546,8551 **** +--- 8546,8553 ---- + + /* + * Set the file name to be used for . ++ * Make a copy to avoid that changing a buffer name or directory makes it ++ * invalid. + */ + if (fname_io == NULL) + { +*************** +*** 8558,8563 **** +--- 8560,8567 ---- + } + else + autocmd_fname = fname_io; ++ if (autocmd_fname != NULL) ++ autocmd_fname = FullName_save(autocmd_fname, FALSE); + + /* + * Set the buffer number to be used for . +*************** +*** 8740,8745 **** +--- 8744,8750 ---- + vim_free(sourcing_name); + sourcing_name = save_sourcing_name; + sourcing_lnum = save_sourcing_lnum; ++ vim_free(autocmd_fname); + autocmd_fname = save_autocmd_fname; + autocmd_bufnr = save_autocmd_bufnr; + autocmd_match = save_autocmd_match; +*** ../vim-7.1.185/src/version.c Wed Jan 2 17:48:24 2008 +--- src/version.c Wed Jan 2 21:06:35 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 186, + /**/ + +-- + LAUNCELOT leaps into SHOT with a mighty cry and runs the GUARD through and + hacks him to the floor. Blood. Swashbuckling music (perhaps). + LAUNCELOT races through into the castle screaming. +SECOND SENTRY: Hey! + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.187 b/7.1.187 new file mode 100644 index 00000000..421a42da --- /dev/null +++ b/7.1.187 @@ -0,0 +1,81 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.187 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.187 +Problem: Win32 GUI: Custom completion using system() no longer works + after patch 7.1.104. (Erik Falor) +Solution: Loop when safe_vgetc() returns K_IGNORE. +Files: src/ex_getln.c + + +*** ../vim-7.1.186/src/ex_getln.c Fri Dec 7 20:28:13 2007 +--- src/ex_getln.c Wed Jan 2 21:42:51 2008 +*************** +*** 335,341 **** + quit_more = FALSE; /* reset after CTRL-D which had a more-prompt */ + + cursorcmd(); /* set the cursor on the right spot */ +! c = safe_vgetc(); + if (KeyTyped) + { + some_key_typed = TRUE; +--- 335,348 ---- + quit_more = FALSE; /* reset after CTRL-D which had a more-prompt */ + + cursorcmd(); /* set the cursor on the right spot */ +! +! /* Get a character. Ignore K_IGNORE, it should not do anything, such +! * as stop completion. */ +! do +! { +! c = safe_vgetc(); +! } while (c == K_IGNORE); +! + if (KeyTyped) + { + some_key_typed = TRUE; +*************** +*** 1209,1215 **** + goto cmdline_not_changed; + + case K_IGNORE: +! goto cmdline_not_changed; /* Ignore mouse */ + + #ifdef FEAT_GUI_W32 + /* On Win32 ignore , we get it when closing the window was +--- 1216,1223 ---- + goto cmdline_not_changed; + + case K_IGNORE: +! /* Ignore mouse event or ex_window() result. */ +! goto cmdline_not_changed; + + #ifdef FEAT_GUI_W32 + /* On Win32 ignore , we get it when closing the window was +*** ../vim-7.1.186/src/version.c Wed Jan 2 21:07:32 2008 +--- src/version.c Wed Jan 2 21:53:24 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 187, + /**/ + +-- +FATHER: Who are you? +PRINCE: I'm ... your son ... +FATHER: Not you. +LAUNCELOT: I'm ... er ... Sir Launcelot, sir. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.188 b/7.1.188 new file mode 100644 index 00000000..1af3bf2f --- /dev/null +++ b/7.1.188 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.188 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.188 +Problem: When 'showmode' is off the message for changing a readonly file is + given in the second column instead of the first. (Payl B. Mahol) +Solution: Put the W10 message in the first column. +Files: src/edit.c + + +*** ../vim-7.1.187/src/edit.c Wed Jan 2 17:48:24 2008 +--- src/edit.c Wed Jan 2 20:56:46 2008 +*************** +*** 550,556 **** + i = showmode(); + + if (!p_im && did_restart_edit == 0) +! change_warning(i + 1); + + #ifdef CURSOR_SHAPE + ui_cursor_shape(); /* may show different cursor shape */ +--- 550,556 ---- + i = showmode(); + + if (!p_im && did_restart_edit == 0) +! change_warning(i == 0 ? 0 : i + 1); + + #ifdef CURSOR_SHAPE + ui_cursor_shape(); /* may show different cursor shape */ +*** ../vim-7.1.187/src/version.c Wed Jan 2 21:54:33 2008 +--- src/version.c Wed Jan 2 22:06:19 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 188, + /**/ + +-- +PRINCE: He's come to rescue me, father. +LAUNCELOT: (embarrassed) Well, let's not jump to conclusions ... + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.189 b/7.1.189 new file mode 100644 index 00000000..86666158 --- /dev/null +++ b/7.1.189 @@ -0,0 +1,76 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.189 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.189 (after 7.1.104) +Problem: Patch 7.1.104 was incomplete. +Solution: Also call plain_vgetc() in ask_yesno(). +Files: src/misc1.c + + +*** ../vim-7.1.188/src/misc1.c Wed Jan 2 17:48:24 2008 +--- src/misc1.c Wed Jan 2 17:48:00 2008 +*************** +*** 222,231 **** + *s++ = *p++; + orig_char_len--; + } + /* Skip over any additional white space (useful when newindent is less + * than old) */ + while (vim_iswhite(*p)) +! (void)*p++; + + } + else +--- 222,232 ---- + *s++ = *p++; + orig_char_len--; + } ++ + /* Skip over any additional white space (useful when newindent is less + * than old) */ + while (vim_iswhite(*p)) +! ++p; + + } + else +*************** +*** 3024,3030 **** + if (direct) + r = get_keystroke(); + else +! r = safe_vgetc(); + if (r == Ctrl_C || r == ESC) + r = 'n'; + msg_putchar(r); /* show what you typed */ +--- 3025,3031 ---- + if (direct) + r = get_keystroke(); + else +! r = plain_vgetc(); + if (r == Ctrl_C || r == ESC) + r = 'n'; + msg_putchar(r); /* show what you typed */ +*** ../vim-7.1.188/src/version.c Wed Jan 2 22:08:43 2008 +--- src/version.c Thu Jan 3 12:40:31 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 189, + /**/ + +-- +Q: How does a UNIX Guru do Sex ? +A: unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.190 b/7.1.190 new file mode 100644 index 00000000..6cf181c4 --- /dev/null +++ b/7.1.190 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.190 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.190 +Problem: Cursor after end-of-line: "iA sentence.)" +Solution: Move cursor back and make motion inclusive. +Files: src/normal.c + + +*** ../vim-7.1.189/src/normal.c Wed Jan 2 16:25:20 2008 +--- src/normal.c Wed Jan 2 22:04:38 2008 +*************** +*** 6564,6569 **** +--- 6564,6575 ---- + 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 +*** ../vim-7.1.189/src/version.c Thu Jan 3 12:42:39 2008 +--- src/version.c Thu Jan 3 13:19:03 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 190, + /**/ + +-- + [clop clop] +GUARD #1: Halt! Who goes there? +ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of + Camelot. King of the Britons, defeator of the Saxons, sovereign of + all England! +GUARD #1: Pull the other one! + 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 /// diff --git a/7.1.191 b/7.1.191 new file mode 100644 index 00000000..4cbc35c3 --- /dev/null +++ b/7.1.191 @@ -0,0 +1,61 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.191 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.191 +Problem: Win32 GUI: after patch 7.1.168 there is still a problem when + clicking in a scrollbar. (Juergen Jottkaerr) +Solution: Don't check the input buffer when dragging the scrollbar. +Files: src/gui.c + + +*** ../vim-7.1.190/src/gui.c Tue Nov 6 22:26:39 2007 +--- src/gui.c Thu Jan 3 13:16:29 2008 +*************** +*** 3734,3741 **** + sb->value = value; + + #ifdef USE_ON_FLY_SCROLL +! /* When not allowed to do the scrolling right now, return. */ +! if (dont_scroll || input_available()) + return; + #endif + #ifdef FEAT_INS_EXPAND +--- 3734,3743 ---- + sb->value = value; + + #ifdef USE_ON_FLY_SCROLL +! /* When not allowed to do the scrolling right now, return. +! * This also checked input_available(), but that causes the first click in +! * a scrollbar to be ignored when Vim doesn't have focus. */ +! if (dont_scroll) + return; + #endif + #ifdef FEAT_INS_EXPAND +*** ../vim-7.1.190/src/version.c Thu Jan 3 13:19:50 2008 +--- src/version.c Thu Jan 3 16:13:23 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 191, + /**/ + +-- +GUARD #1: What -- a swallow carrying a coconut? +ARTHUR: It could grip it by the husk! +GUARD #1: It's not a question of where he grips it! It's a simple question + of weight ratios! A five ounce bird could not carry a 1 pound + coconut. + 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 /// diff --git a/7.1.192 b/7.1.192 new file mode 100644 index 00000000..4dd16382 --- /dev/null +++ b/7.1.192 @@ -0,0 +1,79 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.192 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.192 +Problem: With Visual block selection, "s" and typing something, CTRL-C + doesn't stop Vim from repeating the replacement in other lines, + like happens for "I". +Solution: Check for "got_int" to be set. +Files: src/ops.c + + +*** ../vim-7.1.191/src/ops.c Sat Dec 1 21:12:23 2007 +--- src/ops.c Thu Jan 3 16:26:37 2008 +*************** +*** 2468,2476 **** + + edit(NUL, FALSE, (linenr_T)count1); + +! /* if user has moved off this line, we don't know what to do, so do +! * nothing */ +! if (curwin->w_cursor.lnum != oap->start.lnum) + return; + + if (oap->block_mode) +--- 2468,2477 ---- + + edit(NUL, FALSE, (linenr_T)count1); + +! /* If user has moved off this line, we don't know what to do, so do +! * nothing. +! * Also don't repeat the insert when Insert mode ended with CTRL-C. */ +! if (curwin->w_cursor.lnum != oap->start.lnum || got_int) + return; + + if (oap->block_mode) +*************** +*** 2601,2608 **** + /* + * In Visual block mode, handle copying the new text to all lines of the + * block. + */ +! if (oap->block_mode && oap->start.lnum != oap->end.lnum) + { + /* Auto-indenting may have changed the indent. If the cursor was past + * the indent, exclude that indent change from the inserted text. */ +--- 2602,2610 ---- + /* + * In Visual block mode, handle copying the new text to all lines of the + * block. ++ * Don't repeat the insert when Insert mode ended with CTRL-C. + */ +! if (oap->block_mode && oap->start.lnum != oap->end.lnum && !got_int) + { + /* Auto-indenting may have changed the indent. If the cursor was past + * the indent, exclude that indent change from the inserted text. */ +*** ../vim-7.1.191/src/version.c Thu Jan 3 16:14:25 2008 +--- src/version.c Thu Jan 3 16:30:07 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 192, + /**/ + +-- +"A mouse can be just as dangerous as a bullet or a bomb." + (US Representative Lamar Smith, R-Texas) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.193 b/7.1.193 new file mode 100644 index 00000000..b3836f73 --- /dev/null +++ b/7.1.193 @@ -0,0 +1,100 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.193 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.193 +Problem: Some Vim 5.x digraphs are missing in Vim 7, even though the + character pairs are not used. (Philippe de Muyter) +Solution: Add those Vim 5.x digraphs that don't conflict with others. +Files: src/digraph.c + + +*** ../vim-7.1.192/src/digraph.c Thu Sep 13 18:25:08 2007 +--- src/digraph.c Thu Jan 3 17:48:47 2008 +*************** +*** 1978,1983 **** +--- 1978,2038 ---- + {'f', 't', 0xfb05}, + {'s', 't', 0xfb06}, + # endif /* FEAT_MBYTE */ ++ ++ /* Vim 5.x compatible digraphs that don't conflict with the above */ ++ {'~', '!', 161}, /* ¡ */ ++ {'c', '|', 162}, /* ¢ */ ++ {'$', '$', 163}, /* £ */ ++ {'o', 'x', 164}, /* ¤ - currency symbol in ISO 8859-1 */ ++ {'Y', '-', 165}, /* ¥ */ ++ {'|', '|', 166}, /* ¦ */ ++ {'c', 'O', 169}, /* © */ ++ {'-', ',', 172}, /* ¬ */ ++ {'-', '=', 175}, /* ¯ */ ++ {'~', 'o', 176}, /* ° */ ++ {'2', '2', 178}, /* ² */ ++ {'3', '3', 179}, /* ³ */ ++ {'p', 'p', 182}, /* ¶ */ ++ {'~', '.', 183}, /* · */ ++ {'1', '1', 185}, /* ¹ */ ++ {'~', '?', 191}, /* ¿ */ ++ {'A', '`', 192}, /* À */ ++ {'A', '^', 194}, /* Â */ ++ {'A', '~', 195}, /* Ã */ ++ {'A', '"', 196}, /* Ä */ ++ {'A', '@', 197}, /* Å */ ++ {'E', '`', 200}, /* È */ ++ {'E', '^', 202}, /* Ê */ ++ {'E', '"', 203}, /* Ë */ ++ {'I', '`', 204}, /* Ì */ ++ {'I', '^', 206}, /* Î */ ++ {'I', '"', 207}, /* Ï */ ++ {'N', '~', 209}, /* Ñ */ ++ {'O', '`', 210}, /* Ò */ ++ {'O', '^', 212}, /* Ô */ ++ {'O', '~', 213}, /* Õ */ ++ {'/', '\\', 215}, /* × - multiplication symbol in ISO 8859-1 */ ++ {'U', '`', 217}, /* Ù */ ++ {'U', '^', 219}, /* Û */ ++ {'I', 'p', 222}, /* Þ */ ++ {'a', '`', 224}, /* à */ ++ {'a', '^', 226}, /* â */ ++ {'a', '~', 227}, /* ã */ ++ {'a', '"', 228}, /* ä */ ++ {'a', '@', 229}, /* å */ ++ {'e', '`', 232}, /* è */ ++ {'e', '^', 234}, /* ê */ ++ {'e', '"', 235}, /* ë */ ++ {'i', '`', 236}, /* ì */ ++ {'i', '^', 238}, /* î */ ++ {'n', '~', 241}, /* ñ */ ++ {'o', '`', 242}, /* ò */ ++ {'o', '^', 244}, /* ô */ ++ {'o', '~', 245}, /* õ */ ++ {'u', '`', 249}, /* ù */ ++ {'u', '^', 251}, /* û */ ++ {'y', '"', 255}, /* x XX */ ++ + {NUL, NUL, NUL} + }; + +*** ../vim-7.1.192/src/version.c Thu Jan 3 16:31:17 2008 +--- src/version.c Thu Jan 3 17:52:51 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 193, + /**/ + +-- +Futility Factor: No experiment is ever a complete failure - it can always +serve as a negative example. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.194 b/7.1.194 new file mode 100644 index 00000000..b05ca9ed --- /dev/null +++ b/7.1.194 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.194 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.194 +Problem: ":echo glob('~/{}')" results in /home/user//. +Solution: Don't add a slash if there already is one. +Files: src/os_unix.c + + +*** ../vim-7.1.193/src/os_unix.c Sat Dec 1 17:18:45 2007 +--- src/os_unix.c Thu Jan 3 18:52:22 2008 +*************** +*** 5482,5488 **** + { + STRCPY(p, (*file)[i]); + if (dir) +! STRCAT(p, "/"); /* add '/' to a directory name */ + (*file)[j++] = p; + } + } +--- 5482,5488 ---- + { + STRCPY(p, (*file)[i]); + if (dir) +! add_pathsep(p); /* add '/' to a directory name */ + (*file)[j++] = p; + } + } +*** ../vim-7.1.193/src/version.c Thu Jan 3 17:53:41 2008 +--- src/version.c Thu Jan 3 18:54:41 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 194, + /**/ + +-- +ARTHUR: Will you ask your master if he wants to join my court at Camelot?! +GUARD #1: But then of course African swallows are not migratory. +GUARD #2: Oh, yeah... +GUARD #1: So they couldn't bring a coconut back anyway... + 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 /// diff --git a/7.1.195 b/7.1.195 new file mode 100644 index 00000000..37e3264f --- /dev/null +++ b/7.1.195 @@ -0,0 +1,75 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.195 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.195 +Problem: '0 mark doesn't work for "~/foo ~ foo". +Solution: Don't expand the whole file name, only "~/". +Files: src/mark.c + + +*** ../vim-7.1.194/src/mark.c Thu May 10 18:48:03 2007 +--- src/mark.c Thu Jan 3 20:17:29 2008 +*************** +*** 505,513 **** + { + /* + * First expand "~/" in the file name to the home directory. +! * Try to shorten the file name. + */ +! expand_env(fm->fname, NameBuff, MAXPATHL); + mch_dirname(IObuff, IOSIZE); + p = shorten_fname(NameBuff, IObuff); + +--- 505,528 ---- + { + /* + * First expand "~/" in the file name to the home directory. +! * Don't expand the whole name, it may contain other '~' chars. + */ +! if (fm->fname[0] == '~' && (fm->fname[1] == '/' +! #ifdef BACKSLASH_IN_FILENAME +! || fm->fname[1] == '\\' +! #endif +! )) +! { +! int len; +! +! expand_env((char_u *)"~/", NameBuff, MAXPATHL); +! len = STRLEN(NameBuff); +! vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1); +! } +! else +! vim_strncpy(NameBuff, fm->fname, MAXPATHL - 1); +! +! /* Try to shorten the file name. */ + mch_dirname(IObuff, IOSIZE); + p = shorten_fname(NameBuff, IObuff); + +*** ../vim-7.1.194/src/version.c Thu Jan 3 18:55:21 2008 +--- src/version.c Thu Jan 3 20:10:16 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 195, + /**/ + +-- +GUARD #2: Wait a minute -- supposing two swallows carried it together? +GUARD #1: No, they'd have to have it on a line. +GUARD #2: Well, simple! They'd just use a standard creeper! +GUARD #1: What, held under the dorsal guiding feathers? +GUARD #2: Well, why not? + 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 /// diff --git a/7.1.196 b/7.1.196 new file mode 100644 index 00000000..087577a7 --- /dev/null +++ b/7.1.196 @@ -0,0 +1,90 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.196 (extra) +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.196 (extra) +Problem: Win32 GUI: "\n" in a tooltip doesn't cause a line break. (Erik + Falor) +Solution: Use the TTM_SETMAXTIPWIDTH message. +Files: src/gui_w32.c + + +*** ../vim-7.1.195/src/gui_w32.c Thu Aug 30 12:24:21 2007 +--- src/gui_w32.c Thu Jan 3 13:56:26 2008 +*************** +*** 987,992 **** +--- 987,997 ---- + { + LPNMTTDISPINFOW lpdi = (LPNMTTDISPINFOW)lParam; + ++ /* Set the maximum width, this also enables using ++ * \n for line break. */ ++ SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, ++ 0, 500); ++ + tt_text = enc_to_ucs2(str, NULL); + lpdi->lpszText = tt_text; + /* can't show tooltip if failed */ +*************** +*** 996,1001 **** +--- 1001,1011 ---- + { + LPNMTTDISPINFO lpdi = (LPNMTTDISPINFO)lParam; + ++ /* Set the maximum width, this also enables using ++ * \n for line break. */ ++ SendMessage(lpdi->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, ++ 0, 500); ++ + if (STRLEN(str) < sizeof(lpdi->szText) + || ((tt_text = vim_strsave(str)) == NULL)) + vim_strncpy(lpdi->szText, str, +*************** +*** 4734,4745 **** + cur_beval->showState = ShS_NEUTRAL; + break; + case TTN_GETDISPINFO: +! { +! /* if you get there then we have new common controls */ +! NMTTDISPINFO_NEW *info = (NMTTDISPINFO_NEW *)pnmh; +! info->lpszText = (LPSTR)info->lParam; +! info->uFlags |= TTF_DI_SETITEM; +! } + break; + } + } +--- 4744,4755 ---- + cur_beval->showState = ShS_NEUTRAL; + break; + case TTN_GETDISPINFO: +! { +! /* if you get there then we have new common controls */ +! NMTTDISPINFO_NEW *info = (NMTTDISPINFO_NEW *)pnmh; +! info->lpszText = (LPSTR)info->lParam; +! info->uFlags |= TTF_DI_SETITEM; +! } + break; + } + } +*** ../vim-7.1.195/src/version.c Thu Jan 3 20:21:34 2008 +--- src/version.c Thu Jan 3 20:43:22 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 196, + /**/ + +-- +Shit makes the flowers grow and that's beautiful + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.197 b/7.1.197 new file mode 100644 index 00000000..e9b58c23 --- /dev/null +++ b/7.1.197 @@ -0,0 +1,62 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.197 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.197 +Problem: Mac: "make install" doesn't work when prefix defined. +Solution: Pass different arguments to "make installruntime". (Jjgod Jiang) +Files: src/Makefile + + +*** ../vim-7.1.196/src/Makefile Thu Jan 3 20:44:40 2008 +--- src/Makefile Thu Jan 3 18:30:02 2008 +*************** +*** 2559,2566 **** + # -mkdir $(DESTDIR)$(prefix)/$(APPDIR)/bin + srcdir=`pwd`; $(MAKE) -f Makefile installruntime \ + VIMEXE=$$srcdir/$(VIMTARGET) \ +! prefix=$(DESTDIR)$(prefix)/$(RESDIR)/vim \ +! VIMRTLOC=$(DESTDIR)$(prefix)/$(RESDIR)/vim/runtime + # Put the link back. + ln -s `pwd`/../runtime $(RESDIR)/vim + # Copy rgb.txt, Mac doesn't always have X11 +--- 2564,2574 ---- + # -mkdir $(DESTDIR)$(prefix)/$(APPDIR)/bin + srcdir=`pwd`; $(MAKE) -f Makefile installruntime \ + VIMEXE=$$srcdir/$(VIMTARGET) \ +! prefix=$(DESTDIR)$(prefix)/$(RESDIR)$(VIMDIR) \ +! exec_prefix=$(DESTDIR)$(prefix)/$(APPDIR)/Contents \ +! BINDIR=$(DESTDIR)$(prefix)/$(APPDIR)/Contents/MacOS \ +! VIMLOC=$(DESTDIR)$(prefix)/$(RESDIR)$(VIMDIR) \ +! VIMRTLOC=$(DESTDIR)$(prefix)/$(RESDIR)$(VIMDIR)/runtime + # Put the link back. + ln -s `pwd`/../runtime $(RESDIR)/vim + # Copy rgb.txt, Mac doesn't always have X11 +*** ../vim-7.1.196/src/version.c Thu Jan 3 20:44:35 2008 +--- src/version.c Fri Jan 4 11:52:46 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 197, + /**/ + +-- +CUSTOMER: Well, can you hang around a couple of minutes? He won't be + long. +MORTICIAN: Naaah, I got to go on to Robinson's -- they've lost nine today. +CUSTOMER: Well, when is your next round? +MORTICIAN: Thursday. +DEAD PERSON: I think I'll go for a walk. + 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 /// diff --git a/7.1.198 b/7.1.198 new file mode 100644 index 00000000..d5c6f14d --- /dev/null +++ b/7.1.198 @@ -0,0 +1,51 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.198 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.198 +Problem: Hang when using ":s/\n//gn". (Burak Gorkemli) +Solution: Set "skip_match". +Files: src/ex_cmds.c + + +*** ../vim-7.1.197/src/ex_cmds.c Wed Jan 2 13:58:17 2008 +--- src/ex_cmds.c Fri Jan 4 14:46:34 2008 +*************** +*** 4575,4580 **** +--- 4575,4581 ---- + { + matchcol = (colnr_T)STRLEN(sub_firstline); + nmatch = 1; ++ skip_match = TRUE; + } + sub_nsubs++; + did_sub = TRUE; +*** ../vim-7.1.197/src/version.c Fri Jan 4 11:54:11 2008 +--- src/version.c Fri Jan 4 14:52:09 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 198, + /**/ + +-- + [clop clop] +ARTHUR: Old woman! +DENNIS: Man! +ARTHUR: Man, sorry. What knight lives in that castle over there? +DENNIS: I'm thirty seven. +ARTHUR: What? +DENNIS: I'm thirty seven -- I'm not old! + 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 /// diff --git a/7.1.199 b/7.1.199 new file mode 100644 index 00000000..18d731e6 --- /dev/null +++ b/7.1.199 @@ -0,0 +1,105 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.199 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.199 +Problem: Can't do command line completion for a specific file name + extension. +Solution: When the pattern ends in "$" don't add a star for completion and + remove the "$" before matching with file names. +Files: runtime/doc/cmdline.txt, src/ex_getln.c + + +*** ../vim-7.1.198/runtime/doc/cmdline.txt Sat May 12 15:38:39 2007 +--- runtime/doc/cmdline.txt Fri Jan 4 15:13:06 2008 +*************** +*** 1,4 **** +! *cmdline.txt* For Vim version 7.1. Last change: 2006 Jul 18 + + + VIM REFERENCE MANUAL by Bram Moolenaar +--- 1,4 ---- +! *cmdline.txt* For Vim version 7.1. Last change: 2008 Jan 04 + + + VIM REFERENCE MANUAL by Bram Moolenaar +*************** +*** 316,322 **** + command-line is shown. (Note: the shifted arrow keys do not work on all + terminals) + +! *his* *:history* + :his[tory] Print the history of last entered commands. + {not in Vi} + {not available when compiled without the |+cmdline_hist| +--- 316,322 ---- + command-line is shown. (Note: the shifted arrow keys do not work on all + terminals) + +! *:his* *:history* + :his[tory] Print the history of last entered commands. + {not in Vi} + {not available when compiled without the |+cmdline_hist| +*************** +*** 447,452 **** +--- 447,457 ---- + + To completely ignore files with some extension use 'wildignore'. + ++ To match only files that end at the end of the typed text append a "$". For ++ example, to match only files that end in ".c": > ++ :e *.c$ ++ This will not match a file ending in ".cpp". Without the "$" it does match. ++ + The old value of an option can be obtained by hitting 'wildchar' just after + the '='. For example, typing 'wildchar' after ":set dir=" will insert the + current value of 'dir'. This overrules file name completion for the options +*** ../vim-7.1.198/src/ex_getln.c Wed Jan 2 21:54:33 2008 +--- src/ex_getln.c Fri Jan 4 15:05:31 2008 +*************** +*** 4078,4083 **** +--- 4078,4084 ---- + * ~ would be at the start of the file name, but not the tail. + * $ could be anywhere in the tail. + * ` could be anywhere in the file name. ++ * When the name ends in '$' don't add a star, remove the '$'. + */ + tail = gettail(retval); + if ((*retval != '~' || tail != retval) +*************** +*** 4085,4090 **** +--- 4086,4093 ---- + && vim_strchr(tail, '$') == NULL + && vim_strchr(retval, '`') == NULL) + retval[len++] = '*'; ++ else if (len > 0 && retval[len - 1] == '$') ++ --len; + retval[len] = NUL; + } + } +*** ../vim-7.1.198/src/version.c Fri Jan 4 14:52:14 2008 +--- src/version.c Fri Jan 4 15:14:29 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 199, + /**/ + +-- +ARTHUR: Well, I can't just call you `Man'. +DENNIS: Well, you could say `Dennis'. +ARTHUR: Well, I didn't know you were called `Dennis.' +DENNIS: Well, you didn't bother to find out, did 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 /// diff --git a/7.1.200 b/7.1.200 new file mode 100644 index 00000000..8a0a1261 --- /dev/null +++ b/7.1.200 @@ -0,0 +1,74 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.200 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.200 (after 7.1.177 and 7.1.182) +Problem: Compiler warnings for uninitialized variables. +Solution: Init variables. +Files: src/ex_cmds2.c, src/ex_docmd.c + + +*** ../vim-7.1.199/src/ex_cmds2.c Tue Jan 1 14:16:42 2008 +--- src/ex_cmds2.c Fri Jan 4 15:55:54 2008 +*************** +*** 94,100 **** + int save_redir_off = redir_off; + tasave_T typeaheadbuf; + int typeahead_saved = FALSE; +! int save_ignore_script; + # ifdef FEAT_EX_EXTRA + int save_ex_normal_busy; + # endif +--- 94,100 ---- + int save_redir_off = redir_off; + tasave_T typeaheadbuf; + int typeahead_saved = FALSE; +! int save_ignore_script = 0; + # ifdef FEAT_EX_EXTRA + int save_ex_normal_busy; + # endif +*** ../vim-7.1.199/src/ex_docmd.c Wed Jan 2 21:07:32 2008 +--- src/ex_docmd.c Fri Jan 4 15:57:28 2008 +*************** +*** 9765,9771 **** + win_T *tab_firstwin; + frame_T *tab_topframe; + int cur_arg_idx = 0; +! int next_arg_idx; + + if (ssop_flags & SSOP_BUFFERS) + only_save_windows = FALSE; /* Save ALL buffers */ +--- 9766,9772 ---- + win_T *tab_firstwin; + frame_T *tab_topframe; + int cur_arg_idx = 0; +! int next_arg_idx = 0; + + if (ssop_flags & SSOP_BUFFERS) + only_save_windows = FALSE; /* Save ALL buffers */ +*** ../vim-7.1.199/src/version.c Fri Jan 4 15:16:57 2008 +--- src/version.c Fri Jan 4 15:59:46 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 200, + /**/ + +-- +ARTHUR: I did say sorry about the `old woman,' but from the behind you + looked-- +DENNIS: What I object to is you automatically treat me like an inferior! +ARTHUR: Well, I AM king... + 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 /// diff --git a/7.1.201 b/7.1.201 new file mode 100644 index 00000000..6742191b --- /dev/null +++ b/7.1.201 @@ -0,0 +1,87 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.201 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.201 +Problem: When reading stdin 'fenc' and 'ff are not set. +Solution: Set the options after reading stdin. (Ben Schmidt) +Files: src/fileio.c + + +*** ../vim-7.1.200/src/fileio.c Wed Jan 2 21:07:32 2008 +--- src/fileio.c Fri Jan 4 16:18:27 2008 +*************** +*** 221,231 **** + { + int fd = 0; + int newfile = (flags & READ_NEW); +- int set_options = newfile || (eap != NULL && eap->read_edit); + int check_readonly; + int filtering = (flags & READ_FILTER); + int read_stdin = (flags & READ_STDIN); + int read_buffer = (flags & READ_BUFFER); + linenr_T read_buf_lnum = 1; /* next line to read from curbuf */ + colnr_T read_buf_col = 0; /* next char to read from this line */ + char_u c; +--- 221,232 ---- + { + int fd = 0; + int newfile = (flags & READ_NEW); + int check_readonly; + int filtering = (flags & READ_FILTER); + int read_stdin = (flags & READ_STDIN); + int read_buffer = (flags & READ_BUFFER); ++ int set_options = newfile || read_buffer ++ || (eap != NULL && eap->read_edit); + linenr_T read_buf_lnum = 1; /* next line to read from curbuf */ + colnr_T read_buf_col = 0; /* next char to read from this line */ + char_u c; +*************** +*** 650,657 **** + + if (set_options) + { +! curbuf->b_p_eol = TRUE; +! curbuf->b_start_eol = TRUE; + #ifdef FEAT_MBYTE + curbuf->b_p_bomb = FALSE; + curbuf->b_start_bomb = FALSE; +--- 651,663 ---- + + if (set_options) + { +! /* Don't change 'eol' if reading from buffer as it will already be +! * correctly set when reading stdin. */ +! if (!read_buffer) +! { +! curbuf->b_p_eol = TRUE; +! curbuf->b_start_eol = TRUE; +! } + #ifdef FEAT_MBYTE + curbuf->b_p_bomb = FALSE; + curbuf->b_start_bomb = FALSE; +*** ../vim-7.1.200/src/version.c Fri Jan 4 16:00:10 2008 +--- src/version.c Fri Jan 4 16:27:01 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 201, + /**/ + +-- +A mathematician is a device for turning coffee into theorems. + Paul Erdos +A computer programmer is a device for turning coffee into bugs. + Bram Moolenaar + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.202 b/7.1.202 new file mode 100644 index 00000000..5e7006de --- /dev/null +++ b/7.1.202 @@ -0,0 +1,83 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.202 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.202 +Problem: Incomplete utf-8 byte sequence is not checked for validity. +Solution: Check the bytes that are present for being valid. (Ben Schmidt) +Files: src/mbyte.c + + +*** ../vim-7.1.201/src/mbyte.c Thu Aug 30 13:51:52 2007 +--- src/mbyte.c Fri Jan 4 17:30:16 2008 +*************** +*** 1642,1648 **** + * Get the length of UTF-8 byte sequence "p[size]". Does not include any + * following composing characters. + * Returns 1 for "". +! * Returns 1 for an illegal byte sequence. + * Returns number > "size" for an incomplete byte sequence. + */ + int +--- 1642,1648 ---- + * Get the length of UTF-8 byte sequence "p[size]". Does not include any + * following composing characters. + * Returns 1 for "". +! * Returns 1 for an illegal byte sequence (also in incomplete byte seq.). + * Returns number > "size" for an incomplete byte sequence. + */ + int +*************** +*** 1652,1664 **** + { + int len; + int i; + + if (*p == NUL) + return 1; +! len = utf8len_tab[*p]; + if (len > size) +! return len; /* incomplete byte sequence. */ +! for (i = 1; i < len; ++i) + if ((p[i] & 0xc0) != 0x80) + return 1; + return len; +--- 1652,1665 ---- + { + int len; + int i; ++ int m; + + if (*p == NUL) + return 1; +! m = len = utf8len_tab[*p]; + if (len > size) +! m = size; /* incomplete byte sequence. */ +! for (i = 1; i < m; ++i) + if ((p[i] & 0xc0) != 0x80) + return 1; + return len; +*** ../vim-7.1.201/src/version.c Fri Jan 4 16:30:40 2008 +--- src/version.c Fri Jan 4 17:45:33 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 202, + /**/ + +-- +A computer programmer is a device for turning requirements into +undocumented features. It runs on cola, pizza and Dilbert cartoons. + Bram Moolenaar + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.203 b/7.1.203 new file mode 100644 index 00000000..92703946 --- /dev/null +++ b/7.1.203 @@ -0,0 +1,68 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.203 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.203 +Problem: When 'virtualedit' is "onemore" then "99|" works but ":normal 99|" + doesn't. (Andy Wokula) +Solution: Check for "onemore" flag in check_cursor_col(). +Files: src/misc2.c + + +*** ../vim-7.1.202/src/misc2.c Sat Nov 24 21:27:33 2007 +--- src/misc2.c Fri Jan 4 21:24:46 2008 +*************** +*** 507,517 **** + curwin->w_cursor.col = 0; + else if (curwin->w_cursor.col >= len) + { +! /* Allow cursor past end-of-line in Insert mode, restarting Insert +! * mode or when in Visual mode and 'selection' isn't "old" */ + if ((State & INSERT) || restart_edit + #ifdef FEAT_VISUAL + || (VIsual_active && *p_sel != 'o') + #endif + || virtual_active()) + curwin->w_cursor.col = len; +--- 508,523 ---- + curwin->w_cursor.col = 0; + else if (curwin->w_cursor.col >= len) + { +! /* Allow cursor past end-of-line when: +! * - in Insert mode or restarting Insert mode +! * - in Visual mode and 'selection' isn't "old" +! * - 'virtualedit' is set */ + if ((State & INSERT) || restart_edit + #ifdef FEAT_VISUAL + || (VIsual_active && *p_sel != 'o') ++ #endif ++ #ifdef FEAT_VIRTUALEDIT ++ || (ve_flags & VE_ONEMORE) + #endif + || virtual_active()) + curwin->w_cursor.col = len; +*** ../vim-7.1.202/src/version.c Fri Jan 4 17:46:46 2008 +--- src/version.c Fri Jan 4 21:22:29 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 203, + /**/ + +-- +`When any government, or any church for that matter, undertakes to say to + its subjects, "This you may not read, this you must not see, this you are + forbidden to know," the end result is tyranny and oppression no matter how + holy the motives' -- Robert A Heinlein, "If this goes on --" + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.204 b/7.1.204 new file mode 100644 index 00000000..085e88f5 --- /dev/null +++ b/7.1.204 @@ -0,0 +1,74 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.204 (extra) +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.205 b/7.1.205 new file mode 100644 index 00000000..a1c15ed7 --- /dev/null +++ b/7.1.205 @@ -0,0 +1,181 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.205 +Fcc: outbox +From: Bram Moolenaar +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 % :call MyFilter(v:prevcount) + < 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 or , ++ 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 :call MyMotion(v:operator) ++ < 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 % :call MyFilter(v:prevcount) + < 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 /// diff --git a/7.1.206 b/7.1.206 new file mode 100644 index 00000000..4531a002 --- /dev/null +++ b/7.1.206 @@ -0,0 +1,59 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.206 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.207 b/7.1.207 new file mode 100644 index 00000000..1eba2ccf --- /dev/null +++ b/7.1.207 @@ -0,0 +1,253 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.207 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.208 b/7.1.208 new file mode 100644 index 00000000..44f6633b --- /dev/null +++ b/7.1.208 @@ -0,0 +1,69 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.208 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.209 b/7.1.209 new file mode 100644 index 00000000..c62d2398 --- /dev/null +++ b/7.1.209 @@ -0,0 +1,71 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.209 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.210 b/7.1.210 new file mode 100644 index 00000000..aa92ccdd --- /dev/null +++ b/7.1.210 @@ -0,0 +1,74 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.210 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.211 b/7.1.211 new file mode 100644 index 00000000..38e3ea1d --- /dev/null +++ b/7.1.211 @@ -0,0 +1,748 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.211 +Fcc: outbox +From: Bram Moolenaar +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 +! " 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 +! " 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, "\\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, "\\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 /// diff --git a/7.1.212 b/7.1.212 new file mode 100644 index 00000000..a9aa7f55 --- /dev/null +++ b/7.1.212 @@ -0,0 +1,47 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.212 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.213 b/7.1.213 new file mode 100644 index 00000000..aee3248d --- /dev/null +++ b/7.1.213 @@ -0,0 +1,57 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.213 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.214 b/7.1.214 new file mode 100644 index 00000000..83786675 --- /dev/null +++ b/7.1.214 @@ -0,0 +1,266 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.214 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.215 b/7.1.215 new file mode 100644 index 00000000..ea4a830a --- /dev/null +++ b/7.1.215 @@ -0,0 +1,198 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.215 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.216 b/7.1.216 new file mode 100644 index 00000000..392d5d56 --- /dev/null +++ b/7.1.216 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.216 +Fcc: outbox +From: Bram Moolenaar +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 As --remote but wait for files to have been edited")); + main_msg(_("--remote-wait-silent Same, don't complain if there is no server")); + # ifdef FEAT_WINDOWS +! main_msg(_("--remote-tab As --remote but open tab page for each file")); + # endif + main_msg(_("--remote-send \tSend to a Vim server and exit")); + main_msg(_("--remote-expr \tEvaluate in a Vim server and print result")); +--- 3081,3087 ---- + main_msg(_("--remote-wait As --remote but wait for files to have been edited")); + main_msg(_("--remote-wait-silent Same, don't complain if there is no server")); + # ifdef FEAT_WINDOWS +! main_msg(_("--remote-tab[-wait][-silent] As --remote but use tab page per file")); + # endif + main_msg(_("--remote-send \tSend to a Vim server and exit")); + main_msg(_("--remote-expr \tEvaluate 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 /// diff --git a/7.1.217 b/7.1.217 new file mode 100644 index 00000000..de40e64c --- /dev/null +++ b/7.1.217 @@ -0,0 +1,228 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.217 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.218 b/7.1.218 new file mode 100644 index 00000000..859f0b72 --- /dev/null +++ b/7.1.218 @@ -0,0 +1,58 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.218 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.219 b/7.1.219 new file mode 100644 index 00000000..68e4cfa2 --- /dev/null +++ b/7.1.219 @@ -0,0 +1,378 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.219 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.220 b/7.1.220 new file mode 100644 index 00000000..1ba8f040 --- /dev/null +++ b/7.1.220 @@ -0,0 +1,136 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.220 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.221 b/7.1.221 new file mode 100644 index 00000000..14fc9473 --- /dev/null +++ b/7.1.221 @@ -0,0 +1,58 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.221 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.222 b/7.1.222 new file mode 100644 index 00000000..f092e76b --- /dev/null +++ b/7.1.222 @@ -0,0 +1,135 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.222 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.223 b/7.1.223 new file mode 100644 index 00000000..0fbfb584 --- /dev/null +++ b/7.1.223 @@ -0,0 +1,263 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.223 +Fcc: outbox +From: Bram Moolenaar +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 into . Caution, buffer may contain NUL. */ + p = buffer; + for (i = 0; i < len; ++i) +--- 5364,5370 ---- + } + vim_free(tempname); + +! # if defined(__CYGWIN__) || defined(__CYGWIN32__) + /* Translate into . 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 /// diff --git a/7.1.224 b/7.1.224 new file mode 100644 index 00000000..4e6c9d3d --- /dev/null +++ b/7.1.224 @@ -0,0 +1,73 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.224 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.225 b/7.1.225 new file mode 100644 index 00000000..acce0c55 --- /dev/null +++ b/7.1.225 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.225 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.226 b/7.1.226 new file mode 100644 index 00000000..eb3cb6b7 --- /dev/null +++ b/7.1.226 @@ -0,0 +1,68 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.226 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.227 b/7.1.227 new file mode 100644 index 00000000..042c4498 --- /dev/null +++ b/7.1.227 @@ -0,0 +1,188 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.227 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.228 b/7.1.228 new file mode 100644 index 00000000..bab4dff5 --- /dev/null +++ b/7.1.228 @@ -0,0 +1,51 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.228 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.229 b/7.1.229 new file mode 100644 index 00000000..c07e8e20 --- /dev/null +++ b/7.1.229 @@ -0,0 +1,55 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.229 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.230 b/7.1.230 new file mode 100644 index 00000000..3cd72706 --- /dev/null +++ b/7.1.230 @@ -0,0 +1,64 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.230 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.231 b/7.1.231 new file mode 100644 index 00000000..e9c78859 --- /dev/null +++ b/7.1.231 @@ -0,0 +1,291 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.231 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.232 b/7.1.232 new file mode 100644 index 00000000..092d6fa9 --- /dev/null +++ b/7.1.232 @@ -0,0 +1,70 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.232 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.233 b/7.1.233 new file mode 100644 index 00000000..b2f07e3f --- /dev/null +++ b/7.1.233 @@ -0,0 +1,109 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.233 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.234 b/7.1.234 new file mode 100644 index 00000000..03fa34da --- /dev/null +++ b/7.1.234 @@ -0,0 +1,210 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.234 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.235 b/7.1.235 new file mode 100644 index 00000000..4ea2e396 --- /dev/null +++ b/7.1.235 @@ -0,0 +1,199 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.235 +Fcc: outbox +From: Bram Moolenaar +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 /// diff --git a/7.1.236 b/7.1.236 new file mode 100644 index 00000000..32944c75 --- /dev/null +++ b/7.1.236 @@ -0,0 +1,920 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.236 +Fcc: outbox +From: Bram Moolenaar +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 . You + still need to finish the search command with 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 * \ /* 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 /// diff --git a/7.1.237 b/7.1.237 new file mode 100644 index 00000000..c631d95a --- /dev/null +++ b/7.1.237 @@ -0,0 +1,54 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.237 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.237 +Problem: Compiler warning on an Alpha processor in Motif code. +Solution: Change a typecast. (Adri Verhoef) +Files: src/gui_motif.c + + +*** ../vim-7.1.236/src/gui_motif.c Thu May 10 19:51:05 2007 +--- src/gui_motif.c Mon Jan 21 21:03:55 2008 +*************** +*** 3813,3819 **** + + XtAddCallback(frdp->find, XmNactivateCallback, + find_replace_callback, +! (XtPointer) (do_replace ? FRD_R_FINDNEXT : FRD_FINDNEXT)); + + if (do_replace) + { +--- 3813,3819 ---- + + XtAddCallback(frdp->find, XmNactivateCallback, + find_replace_callback, +! (do_replace ? (XtPointer)FRD_R_FINDNEXT : (XtPointer)FRD_FINDNEXT)); + + if (do_replace) + { +*** ../vim-7.1.236/src/version.c Sat Jan 19 15:55:51 2008 +--- src/version.c Tue Jan 22 11:05:12 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 237, + /**/ + +-- +I am always surprised in the Linux world how quickly solutions can be +obtained. (Imagine sending an email to Bill Gates, asking why Windows +crashed, and how to fix it... and then getting an answer that fixed the +problem... <0>_<0> !) -- Mark Langdon + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.238 b/7.1.238 new file mode 100644 index 00000000..e7b6a6fe --- /dev/null +++ b/7.1.238 @@ -0,0 +1,61 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.238 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.238 +Problem: Using the 'c' flag with searchpair() may cause it to fail. Using + the 'r' flag doesn't work when 'wrapscan' is set. (A.Politz) +Solution: Only use the 'c' flag for the first search, not for repeating. + When using 'r' imply 'W'. (Antony Scriven) +Files: src/eval.c + + +*** ../vim-7.1.237/src/eval.c Sat Jan 12 16:45:25 2008 +--- src/eval.c Tue Jan 22 11:42:28 2008 +*************** +*** 14189,14194 **** +--- 14189,14198 ---- + goto theend; + } + ++ /* Using 'r' implies 'W', otherwise it doesn't work. */ ++ if (flags & SP_REPEAT) ++ p_ws = FALSE; ++ + /* Optional fifth argument: skip expression */ + if (argvars[3].v_type == VAR_UNKNOWN + || argvars[4].v_type == VAR_UNKNOWN) +*************** +*** 14344,14349 **** +--- 14348,14356 ---- + incl(&pos); + } + foundpos = pos; ++ ++ /* clear the start flag to avoid getting stuck here */ ++ options &= ~SEARCH_START; + + /* If the skip pattern matches, ignore this match. */ + if (*skip != NUL) +*** ../vim-7.1.237/src/version.c Tue Jan 22 11:06:06 2008 +--- src/version.c Tue Jan 22 11:57:28 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 238, + /**/ + +-- +To keep milk from turning sour: Keep it in the cow. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.239 b/7.1.239 new file mode 100644 index 00000000..dca05345 --- /dev/null +++ b/7.1.239 @@ -0,0 +1,53 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.239 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.239 (after 7.1.233) +Problem: Compiler warning for sprintf() argument. +Solution: Add a typecast. (Nico Weber) +Files: src/ex_getln.c + + +*** ../vim-7.1.238/src/ex_getln.c Sat Jan 19 15:55:51 2008 +--- src/ex_getln.c Tue Jan 22 12:40:54 2008 +*************** +*** 4694,4700 **** + { + /* Completion from Insert mode, pass fake arguments. */ + keep = 0; +! sprintf((char *)num, "%d", STRLEN(xp->xp_pattern)); + args[1] = xp->xp_pattern; + } + else +--- 4694,4700 ---- + { + /* Completion from Insert mode, pass fake arguments. */ + keep = 0; +! sprintf((char *)num, "%d", (int)STRLEN(xp->xp_pattern)); + args[1] = xp->xp_pattern; + } + else +*** ../vim-7.1.238/src/version.c Tue Jan 22 11:58:41 2008 +--- src/version.c Tue Jan 22 12:42:36 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 239, + /**/ + +-- +We apologise again for the fault in the subtitles. Those responsible for +sacking the people who have just been sacked have been sacked. + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.240 b/7.1.240 new file mode 100644 index 00000000..7f690850 --- /dev/null +++ b/7.1.240 @@ -0,0 +1,186 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.240 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.240 +Problem: When "gUe" turns a German sharp s into SS the operation stops + before the end of the word. Latin2 has the same sharp s but it's + not changed to SS there. +Solution: Make sure all the characters are operated upon. Detect the sharp + s in latin2. Also fixes that changing case of a multi-byte + character that changes the byte cound doesn't always work. +Files: src/ops.c + + +*** ../vim-7.1.239/src/ops.c Wed Jan 16 20:01:14 2008 +--- src/ops.c Tue Jan 22 16:00:07 2008 +*************** +*** 2184,2189 **** +--- 2184,2191 ---- + } + #endif + ++ static int swapchars __ARGS((int op_type, pos_T *pos, int length)); ++ + /* + * Handle the (non-standard vi) tilde operator. Also for "gu", "gU" and "g?". + */ +*************** +*** 2194,2202 **** + pos_T pos; + #ifdef FEAT_VISUAL + struct block_def bd; +- int todo; + #endif +! int did_change = 0; + + if (u_save((linenr_T)(oap->start.lnum - 1), + (linenr_T)(oap->end.lnum + 1)) == FAIL) +--- 2196,2203 ---- + pos_T pos; + #ifdef FEAT_VISUAL + struct block_def bd; + #endif +! int did_change; + + if (u_save((linenr_T)(oap->start.lnum - 1), + (linenr_T)(oap->end.lnum + 1)) == FAIL) +*************** +*** 2210,2225 **** + { + block_prep(oap, &bd, pos.lnum, FALSE); + pos.col = bd.textcol; +! for (todo = bd.textlen; todo > 0; --todo) +! { +! # ifdef FEAT_MBYTE +! if (has_mbyte) +! todo -= (*mb_ptr2len)(ml_get_pos(&pos)) - 1; +! # endif +! did_change |= swapchar(oap->op_type, &pos); +! if (inc(&pos) == -1) /* at end of file */ +! break; +! } + # ifdef FEAT_NETBEANS_INTG + if (usingNetbeans && did_change) + { +--- 2211,2218 ---- + { + block_prep(oap, &bd, pos.lnum, FALSE); + pos.col = bd.textcol; +! did_change = swapchars(oap->op_type, &pos, bd.textlen); +! + # ifdef FEAT_NETBEANS_INTG + if (usingNetbeans && did_change) + { +*************** +*** 2249,2261 **** + else if (!oap->inclusive) + dec(&(oap->end)); + +! while (ltoreq(pos, oap->end)) +! { +! did_change |= swapchar(oap->op_type, &pos); +! if (inc(&pos) == -1) /* at end of file */ +! break; +! } +! + if (did_change) + { + changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, +--- 2242,2248 ---- + else if (!oap->inclusive) + dec(&(oap->end)); + +! did_change = swapchars(oap->op_type, &pos, oap->end.col - pos.col + 1); + if (did_change) + { + changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, +*************** +*** 2309,2314 **** +--- 2296,2337 ---- + } + + /* ++ * Invoke swapchar() on "length" bytes at position "pos". ++ * "pos" is advanced to just after the changed characters. ++ * "length" is rounded up to include the whole last multi-byte character. ++ * Also works correctly when the number of bytes changes. ++ * Returns TRUE if some character was changed. ++ */ ++ static int ++ swapchars(op_type, pos, length) ++ int op_type; ++ pos_T *pos; ++ int length; ++ { ++ int todo; ++ int did_change = 0; ++ ++ for (todo = length; todo > 0; --todo) ++ { ++ # ifdef FEAT_MBYTE ++ int pos_col = pos->col; ++ ++ if (has_mbyte) ++ /* we're counting bytes, not characters */ ++ todo -= (*mb_ptr2len)(ml_get_pos(pos)) - 1; ++ # endif ++ did_change |= swapchar(op_type, pos); ++ # ifdef FEAT_MBYTE ++ /* Changing German sharp s to SS increases the column. */ ++ todo += pos->col - pos_col; ++ # endif ++ if (inc(pos) == -1) /* at end of file */ ++ break; ++ } ++ return did_change; ++ } ++ ++ /* + * If op_type == OP_UPPER: make uppercase, + * if op_type == OP_LOWER: make lowercase, + * if op_type == OP_ROT13: do rot13 encoding, +*************** +*** 2330,2336 **** + return FALSE; + + #ifdef FEAT_MBYTE +! if (op_type == OP_UPPER && enc_latin1like && c == 0xdf) + { + pos_T sp = curwin->w_cursor; + +--- 2353,2360 ---- + return FALSE; + + #ifdef FEAT_MBYTE +! if (op_type == OP_UPPER && c == 0xdf +! && (enc_latin1like || STRCMP(p_enc, "iso-8859-2") == 0)) + { + pos_T sp = curwin->w_cursor; + +*** ../vim-7.1.239/src/version.c Tue Jan 22 12:44:03 2008 +--- src/version.c Tue Jan 22 15:36:36 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 240, + /**/ + +-- +ARTHUR: It is I, Arthur, son of Uther Pendragon, from the castle of Camelot. + King of all Britons, defeator of the Saxons, sovereign of all England! + [Pause] +SOLDIER: Get away! + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.241 b/7.1.241 new file mode 100644 index 00000000..4a04c690 --- /dev/null +++ b/7.1.241 @@ -0,0 +1,112 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.241 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.241 +Problem: Focus change events not always ignored. (Erik Falor) +Solution: Ignore K_IGNORE in Insert mode in a few more places. +Files: src/edit.c + + +*** ../vim-7.1.240/src/edit.c Wed Jan 16 20:01:14 2008 +--- src/edit.c Tue Jan 22 17:45:32 2008 +*************** +*** 703,712 **** + #endif + + /* +! * Get a character for Insert mode. + */ + lastc = c; /* remember previous char for CTRL-D */ +! c = safe_vgetc(); + + #ifdef FEAT_AUTOCMD + /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */ +--- 703,715 ---- + #endif + + /* +! * Get a character for Insert mode. Ignore K_IGNORE. + */ + lastc = c; /* remember previous char for CTRL-D */ +! do +! { +! c = safe_vgetc(); +! } while (c == K_IGNORE); + + #ifdef FEAT_AUTOCMD + /* Don't want K_CURSORHOLD for the second key, e.g., after CTRL-V. */ +*************** +*** 777,783 **** + /* Prepare for or stop CTRL-X mode. This doesn't do completion, but + * it does fix up the text when finishing completion. */ + compl_get_longest = FALSE; +! if (c != K_IGNORE && ins_compl_prep(c)) + continue; + #endif + +--- 780,786 ---- + /* Prepare for or stop CTRL-X mode. This doesn't do completion, but + * it does fix up the text when finishing completion. */ + compl_get_longest = FALSE; +! if (ins_compl_prep(c)) + continue; + #endif + +*************** +*** 4516,4530 **** + else + { + /* Need to get the character to have KeyTyped set. We'll put it +! * back with vungetc() below. */ + c = safe_vgetc(); + +! /* Don't interrupt completion when the character wasn't typed, +! * e.g., when doing @q to replay keys. */ +! if (c != Ctrl_R && KeyTyped) +! compl_interrupted = TRUE; +! +! vungetc(c); + } + } + if (compl_pending != 0 && !got_int) +--- 4519,4535 ---- + else + { + /* Need to get the character to have KeyTyped set. We'll put it +! * back with vungetc() below. But skip K_IGNORE. */ + c = safe_vgetc(); ++ if (c != K_IGNORE) ++ { ++ /* Don't interrupt completion when the character wasn't typed, ++ * e.g., when doing @q to replay keys. */ ++ if (c != Ctrl_R && KeyTyped) ++ compl_interrupted = TRUE; + +! vungetc(c); +! } + } + } + if (compl_pending != 0 && !got_int) +*** ../vim-7.1.240/src/version.c Tue Jan 22 16:01:25 2008 +--- src/version.c Tue Jan 22 17:48:46 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 241, + /**/ + +-- +The problem with political jokes is that they get elected. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.242 b/7.1.242 new file mode 100644 index 00000000..6aab9c87 --- /dev/null +++ b/7.1.242 @@ -0,0 +1,68 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.242 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.242 (after 7.1.005) +Problem: "cib" doesn't work properly on "(x)". (Tim Pope) +Solution: Use ltoreq() instead of lt(). Also fix "ciT" on "x". +Files: src/search.c + + +*** ../vim-7.1.241/src/search.c Sat Jan 19 15:55:51 2008 +--- src/search.c Sat Jan 26 13:56:06 2008 +*************** +*** 3637,3643 **** + oap->inclusive = FALSE; + if (sol) + incl(&curwin->w_cursor); +! else if (lt(start_pos, curwin->w_cursor)) + /* Include the character under the cursor. */ + oap->inclusive = TRUE; + else +--- 3637,3643 ---- + oap->inclusive = FALSE; + if (sol) + incl(&curwin->w_cursor); +! else if (ltoreq(start_pos, curwin->w_cursor)) + /* Include the character under the cursor. */ + oap->inclusive = TRUE; + else +*************** +*** 3754,3759 **** +--- 3754,3763 ---- + old_pos = curwin->w_cursor; + old_end = curwin->w_cursor; /* remember where we started */ + old_start = old_end; ++ #ifdef FEAT_VISUAL ++ if (!VIsual_active || *p_sel == 'e') ++ #endif ++ decl(&old_end); /* old_end is inclusive */ + + /* + * If we start on "" select that block. +*** ../vim-7.1.241/src/version.c Tue Jan 22 17:49:17 2008 +--- src/version.c Sat Jan 26 21:14:05 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 242, + /**/ + +-- +DENNIS: Oh, very nice. King, eh! I expect you've got a palace and fine + clothes and courtiers and plenty of food. And how d'you get that? By + exploiting the workers! By hanging on to outdated imperialist dogma + which perpetuates the social and economic differences in our society! + "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.243 b/7.1.243 new file mode 100644 index 00000000..102546c1 --- /dev/null +++ b/7.1.243 @@ -0,0 +1,165 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.243 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.243 (after 7.1.240) +Problem: "U" doesn't work on all text in Visual mode. (Adri Verhoef) +Solution: Loop over all the lines to be changed. Add tests for this. +Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok + + +*** ../vim-7.1.242/src/ops.c Tue Jan 22 16:01:25 2008 +--- src/ops.c Mon Feb 4 22:23:22 2008 +*************** +*** 2197,2203 **** + #ifdef FEAT_VISUAL + struct block_def bd; + #endif +! int did_change; + + if (u_save((linenr_T)(oap->start.lnum - 1), + (linenr_T)(oap->end.lnum + 1)) == FAIL) +--- 2197,2203 ---- + #ifdef FEAT_VISUAL + struct block_def bd; + #endif +! int did_change = FALSE; + + if (u_save((linenr_T)(oap->start.lnum - 1), + (linenr_T)(oap->end.lnum + 1)) == FAIL) +*************** +*** 2242,2248 **** + else if (!oap->inclusive) + dec(&(oap->end)); + +! did_change = swapchars(oap->op_type, &pos, oap->end.col - pos.col + 1); + if (did_change) + { + changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, +--- 2242,2259 ---- + else if (!oap->inclusive) + dec(&(oap->end)); + +! if (pos.lnum == oap->end.lnum) +! did_change = swapchars(oap->op_type, &pos, +! oap->end.col - pos.col + 1); +! else +! for (;;) +! { +! did_change |= swapchars(oap->op_type, &pos, +! pos.lnum == oap->end.lnum ? oap->end.col + 1: +! (int)STRLEN(ml_get_pos(&pos))); +! if (ltoreq(oap->end, pos) || inc(&pos) == -1) +! break; +! } + if (did_change) + { + changed_lines(oap->start.lnum, oap->start.col, oap->end.lnum + 1, +*************** +*** 2314,2330 **** + for (todo = length; todo > 0; --todo) + { + # ifdef FEAT_MBYTE +- int pos_col = pos->col; +- + if (has_mbyte) + /* we're counting bytes, not characters */ + todo -= (*mb_ptr2len)(ml_get_pos(pos)) - 1; + # endif + did_change |= swapchar(op_type, pos); +- # ifdef FEAT_MBYTE +- /* Changing German sharp s to SS increases the column. */ +- todo += pos->col - pos_col; +- # endif + if (inc(pos) == -1) /* at end of file */ + break; + } +--- 2325,2335 ---- +*** ../vim-7.1.242/src/testdir/test39.in Sun Jun 13 18:21:09 2004 +--- src/testdir/test39.in Wed Feb 6 13:57:37 2008 +*************** +*** 1,8 **** +--- 1,10 ---- + + Test Visual block mode commands ++ And test "U" in Visual mode, also on German sharp S. + + STARTTEST + :so small.vim ++ :so mbyte.vim + /^abcde + :" Test shift-right of a block + jlllljj>wlljlll> +*************** +*** 14,20 **** + Gllllkkklllrq + :" Test block-change + G$khhhhhkkcmno +! :$-4,$wq! test.out + ENDTEST + + abcdefghijklm +--- 16,37 ---- + Gllllkkklllrq + :" Test block-change + G$khhhhhkkcmno +! :$-4,$w! test.out +! :" gUe must uppercase a whole word, also when ß changes to SS +! Gothe youtußeuu endYpk0wgUe +! :" gUfx must uppercase until x, inclusive. +! O- youßtußexu -0fogUfx +! :" VU must uppercase a whole line +! YpkVU +! :" same, when it's the last line in the buffer +! YPGi111VUddP +! :" Uppercase two lines +! Oblah di +! doh dutVkUj +! :" Uppercase part of two lines +! ddppi333k0i222fyllvjfuUk +! :/^the/,$w >> test.out +! :qa! + ENDTEST + + abcdefghijklm +*** ../vim-7.1.242/src/testdir/test39.ok Sun Jun 13 18:59:28 2004 +--- src/testdir/test39.ok Tue Feb 5 22:25:38 2008 +*************** +*** 3,5 **** +--- 3,13 ---- + axyzqqqqef mno ghijklm + axyzqqqqefgmnoklm + abcdqqqqijklm ++ the YOUTUSSEUU end ++ - yOUSSTUSSEXu - ++ THE YOUTUSSEUU END ++ 111THE YOUTUSSEUU END ++ BLAH DI ++ DOH DUT ++ 222the yoUTUSSEUU END ++ 333THE YOUTUßeuu end +*** ../vim-7.1.242/src/version.c Sat Jan 26 21:15:00 2008 +--- src/version.c Wed Feb 6 14:41:00 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 243, + /**/ + +-- +It's totally unfair to suggest - as many have - that engineers are socially +inept. Engineers simply have different objectives when it comes to social +interaction. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.244 b/7.1.244 new file mode 100644 index 00000000..6c4c43f2 --- /dev/null +++ b/7.1.244 @@ -0,0 +1,58 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.244 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.244 +Problem: GUI may have part of the command line cut off. +Solution: Don't round the number of lines up, always round down. + (Tony Houghton, Scott Dillard) +Files: src/gui.c + + +*** ../vim-7.1.243/src/gui.c Sat Jan 19 15:55:51 2008 +--- src/gui.c Wed Feb 6 16:43:44 2008 +*************** +*** 1294,1304 **** + out_flush(); + + gui.num_cols = (pixel_width - gui_get_base_width()) / gui.char_width; +! gui.num_rows = (pixel_height - gui_get_base_height() +! #if !defined(FEAT_GUI_PHOTON) && !defined(FEAT_GUI_MSWIN) +! + (gui.char_height / 2) +! #endif +! ) / gui.char_height; + + gui_position_components(pixel_width); + +--- 1294,1300 ---- + out_flush(); + + gui.num_cols = (pixel_width - gui_get_base_width()) / gui.char_width; +! gui.num_rows = (pixel_height - gui_get_base_height()) / gui.char_height; + + gui_position_components(pixel_width); + +*** ../vim-7.1.243/src/version.c Wed Feb 6 14:43:50 2008 +--- src/version.c Wed Feb 6 17:32:35 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 244, + /**/ + +-- +A consultant is a person who takes your money and annoys your employees while +tirelessly searching for the best way to extend the consulting contract. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/7.1.245 b/7.1.245 new file mode 100644 index 00000000..ce7a7b51 --- /dev/null +++ b/7.1.245 @@ -0,0 +1,92 @@ +To: vim-dev@vim.org +Subject: Patch 7.1.245 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.245 +Problem: Pressing CTRL-\ three times causes Vim to quit. (Ranganath Rao). + Also for f CTRL-\ CTRL-\. +Solution: When going to cooked mode in mch_delay() set a flag to ignore + SIGQUIT. +Files: src/os_unix.c + + +*** ../vim-7.1.244/src/os_unix.c Sun Jan 13 16:30:23 2008 +--- src/os_unix.c Sun Feb 10 22:07:27 2008 +*************** +*** 195,200 **** +--- 195,201 ---- + static int show_shell_mess = TRUE; + #endif + static int deadly_signal = 0; /* The signal we caught */ ++ static int in_mch_delay = FALSE; /* sleeping in mch_delay() */ + + static int curr_tmode = TMODE_COOK; /* contains current terminal mode */ + +*************** +*** 538,544 **** + if (ignoreinput) + { + /* Go to cooked mode without echo, to allow SIGINT interrupting us +! * here */ + old_tmode = curr_tmode; + if (curr_tmode == TMODE_RAW) + settmode(TMODE_SLEEP); +--- 539,547 ---- + if (ignoreinput) + { + /* Go to cooked mode without echo, to allow SIGINT interrupting us +! * here. But we don't want QUIT to kill us (CTRL-\ used in a +! * shell may produce SIGQUIT). */ +! in_mch_delay = TRUE; + old_tmode = curr_tmode; + if (curr_tmode == TMODE_RAW) + settmode(TMODE_SLEEP); +*************** +*** 602,607 **** +--- 605,611 ---- + #endif + + settmode(old_tmode); ++ in_mch_delay = FALSE; + } + else + WaitForChar(msec); +*************** +*** 922,927 **** +--- 926,939 ---- + #endif + + #ifdef SIGHASARG ++ # ifdef SIGQUIT ++ /* While in mch_delay() we go to cooked mode to allow a CTRL-C to ++ * interrupt us. But in cooked mode we may also get SIGQUIT, e.g., when ++ * pressing CTRL-\, but we don't want Vim to exit then. */ ++ if (in_mch_delay && sigarg == SIGQUIT) ++ SIGRETURN; ++ # endif ++ + /* When SIGHUP, SIGQUIT, etc. are blocked: postpone the effect and return + * here. This avoids that a non-reentrant function is interrupted, e.g., + * free(). Calling free() again may then cause a crash. */ +*** ../vim-7.1.244/src/version.c Wed Feb 6 17:33:19 2008 +--- src/version.c Sun Feb 10 22:04:09 2008 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 245, + /**/ + +-- +Me? A skeptic? I trust you have proof. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// diff --git a/Makefile b/Makefile deleted file mode 100644 index e93db5a4..00000000 --- a/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# Makefile for source rpm: vim -# $Id$ -NAME := vim -SPECFILE = $(firstword $(wildcard *.spec)) - -define find-makefile-common -for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done -endef - -MAKEFILE_COMMON := $(shell $(find-makefile-common)) - -ifeq ($(MAKEFILE_COMMON),) -# attempt a checkout -define checkout-makefile-common -test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2 -endef - -MAKEFILE_COMMON := $(shell $(checkout-makefile-common)) -endif - -include $(MAKEFILE_COMMON) diff --git a/README.patches b/README.patches index 730f7038..159f3bba 100644 --- a/README.patches +++ b/README.patches @@ -25,6 +25,7 @@ Checksums for the patch files can be found in the file MD5. Collection of patches for Vim 7.1: SIZE NAME INCLUDES 91424 7.1.001-100.gz patches 7.1.001 to 7.1.100, gzip'ed + 75402 7.1.101-200.gz patches 7.1.101 to 7.1.200, gzip'ed Individual patches for Vim 7.1: @@ -106,6 +107,7 @@ Individual patches for Vim 7.1: 5259 7.1.074 crash when using string() on a recursively nested List 1686 7.1.075 ":let v:statusmsg" reads memory already freed 2376 7.1.076 a couple more strcpy() with overlapping arguments + 1551 7.1.077 "can_spell" is used without initializing it 2678 7.1.078 dropping file name on gvim containing CSI byte doesn't work 2922 7.1.079 "@" character in 'isfname' doesn't pick up umlauts for latin1 2960 7.1.080 (extra) Compiler warnings for gvimex.cpp @@ -155,6 +157,7 @@ Individual patches for Vim 7.1: 2599 7.1.124 (extra) Mac: may get empty buffer if dropping file on Vim.app 12060 7.1.125 the TermResponse autocommand event is not always triggered 13372 7.1.126 (extra) ":vimgrep */*" doesn't work if autocmd changes dir + 12461 7.1.126ne replacement for 7.1.126 without the (extra) 2319 7.1.127 memory leak when doing completing 2079 7.1.128 (extra) build problem with Cygwin 1740 7.1.129 (extra) Win32: Can't get long user name @@ -164,3 +167,113 @@ Individual patches for Vim 7.1: 1515 7.1.133 shorten_fname1() linked when it's not needed 10379 7.1.134 (extra) Win32: Can't build with VC8 3337 7.1.135 Win32: ":e c:/tmp/foo" and ":e c:/tmp//foo" create two buffers + 1522 7.1.136 memory leak when using Ruby syntax highlighting + 1553 7.1.137 build failure when using EXITFREE + 1836 7.1.138 Perl: Msg() doesn't stop when "q" is typed at the more prompt + 1557 7.1.139 fold truncated when ending Insert mode with CTRL-C + 1664 7.1.140 v:count can't be used in an expression mapping + 2806 7.1.141 GTK: can't use negative offset with -geom argument + 2161 7.1.142 ":redir @A>" doesn't work + 1723 7.1.143 uninitialized memory read when diffing three files + 1250 7.1.144 after ":diffup" cursor can be in the wrong position + 6160 7.1.145 stay in Insert completion mode depending on the char typed + 2838 7.1.146 VMS: writing fails for rare record organisation + 2079 7.1.147 (after 7.1.127) freeing memory twice completing user name + 2557 7.1.148 QNX and some other systems require testing for sys/types.h + 4823 7.1.149 completion menu messed up when using the scroll bar + 1759 7.1.150 Visual mode "p" doesn't work when 'clipboard' has "unnamed" + 2108 7.1.151 lalloc(0) error for line completion with 'ic' and 'inf' set + 3183 7.1.152 display problem when 'hls' and 'cursorcolumn' are set + 4610 7.1.153 compiler warnings on SGI + 1547 7.1.154 (after 7.1.152) compiler warning for signed/unsigned compare + 1594 7.1.155 crash when 'undolevels' is 0 and repeating "udd" + 4174 7.1.156 overlapping arguments for strcpy() during cmdline completion + 1541 7.1.157 :" in Ex mode at end of file results in an error message + 4629 7.1.158 (extra) Win32: with utf-8 and cp1250 Alt-y is the wrong char + 1646 7.1.159 overlapping arguments for a strcpy() + 1661 7.1.160 getting/losing focus may cause hit-enter prompt to be redrawn + 4347 7.1.161 compilation errors with tiny features and EXITFREE + 4691 7.1.162 crash when using a modifier before "while" or "for" + 2367 7.1.163 warning for the unknown option 'bufsecret' + 1576 7.1.164 reading past end of regexp pattern + 5538 7.1.165 crash related to getting X window ID + 2134 7.1.166 memory leak when using "gp" in Visual mode + 2528 7.1.167 xxd crashes when using "xxd -b -c 110" + 2989 7.1.168 (extra) Win32 GUI: when no focus click doesn't position cursor + 1926 7.1.169 using uninitialized memory when system() fails + 1722 7.1.170 overlapping arguments to strcpy() + 2324 7.1.171 reading one byte before allocated memory. + 1536 7.1.172 if 'buftype' is "acwrite" Vim still does overwrite check + 1928 7.1.173 accessing freed memory when using "\%^" pattern + 2197 7.1.174 writing NUL past end of a buffer + 4722 7.1.175 doesn't work with some combination of option settings + 2943 7.1.176 compiling with Aap fails if "compiledby" contains '<' or '>' + 5450 7.1.177 freeing memory twice when in debug mode while reading a script + 1567 7.1.178 "%" doesn't work on "/* comment *//* comment */" + 6581 7.1.179 configure doesn't find TCL 8.5 + 7099 7.1.180 regexp patterns are not sufficiently tested + 1878 7.1.181 accessing uninitialized memory in Farsi mode with ":s" + 5457 7.1.182 with tab pages and an argument list session file may be wrong + 2489 7.1.183 Internal error for ":echo matchstr('a', 'a\%[\&]')" + 2132 7.1.184 crash when deleting backwards over a line break in Insert mode + 3744 7.1.185 "gR" and then BS doesn't work properly with multi-byte chars + 3294 7.1.186 "expand('')" returns a bogus value after ":cd dir" + 2341 7.1.187 Win32 GUI: custom completion using system() doesn't work + 1688 7.1.188 "W10" message could be displayed in the second column + 1950 7.1.189 (after 7.1.104) need to call plain_vgetc() in ask_yesno() + 1685 7.1.190 cursor after end-of-line: "iA sentence.)" + 2007 7.1.191 Win32 GUI: when not in focus click in scrollbar doesn't work + 2605 7.1.192 CTRL-C doesn't stop duplicating text for "s" in Visual block + 2962 7.1.193 some of the Vim 5.x digraphs could be supported + 1650 7.1.194 Unix: ":echo glob('~/{}')" results in "/home/user//" + 2273 7.1.195 '0 mark doesn't work for "~/foo ~ foo" + 2642 7.1.196 (extra) Win32 GUI: "\n" in a tooltip doesn't cause line break + 2308 7.1.197 Mac: "make install" doesn't work when $prefix is set + 1460 7.1.198 hang when using ":s/\n//gn" + 3572 7.1.199 can't do command line completion for a file name extension + 2310 7.1.200 (after 7.1.177 and 7.1.182) compiler warnings + 2705 7.1.201 when reading stdin 'fenc' and 'ff' are not set + 2383 7.1.202 incomplete utf-8 byte sequence is not checked for validity + 2261 7.1.203 if 'virtualedit' is "onemore" then ":normal 99|" is not right + 2891 7.1.204 (extra) Win32: 'balloonexpr' tooltip disappears after 4 sec + 5481 7.1.205 can't get the operator in an ":omap" + 1690 7.1.206 compiler warnings when using MODIFIED_BY + 7708 7.1.207 netbeans: "remove" cannot delete one line + 2051 7.1.208 on Alpha get an unaligned access error + 2249 7.1.209 GTK GUI: when using the netrw plugin ":gui" causes a hang + 1923 7.1.210 listing mapping for 0xdb fails when 'encoding' is utf-8 + 25525 7.1.211 matchparen plugin may take so long it looks like Vim hangs + 1491 7.1.212 accessing a byte before a line + 1750 7.1.213 aborting ":tabedit" from the ATTENTION dialog leaves tab open + 8399 7.1.214 ":1s/g\n\zs1//" deletes characters from the first line + 6476 7.1.215 it's difficult to figure out the nesting of syntax items + 2360 7.1.216 variants of --remote-tab are not mentioned for "vim --help" + 7103 7.1.217 the "help-tags" tag may be missing from runtime/doc/tags + 1864 7.1.218 syntax region without "keepend" could be truncated + 12134 7.1.219 (after 7.1.215) synstack() doesn't work for one char region + 3928 7.1.220 cursor may end up on trail byte after ")" + 1978 7.1.221 when inserting a "(" the following highlighting may be wrong + 3531 7.1.222 (after 7.1.217) wildcards of ":helptags" are not expanded + 8138 7.1.223 glob() doesn't handle "'" when 'shell' is "sh" or "bash" + 2131 7.1.224 "vim -F -o one two" sets 'rightleft' in one window only + 1767 7.1.225 using unitialized value when XGetWMNormalHints() fails + 1957 7.1.226 command line completion fails for a file name with a '&' char + 5595 7.1.227 hang in syntax HL when moving over a ")" + 1678 7.1.228 with 'foldmethod' "indent" fold can't be closed after "3>>" + 1758 7.1.229 a fold is closed when backspacing in Insert mode + 2052 7.1.230 memory leak when executing SourceCmd autocommands + 8648 7.1.231 when shifting lines the change is acted upon multiple times + 2002 7.1.232 (after 7.1.207 and 7.1.211) compiler warnings with MSVC + 3249 7.1.233 crash with Insert mode completion for a user defined command + 6865 7.1.234 display problems when diff'ing three files + 5925 7.1.235 pattern matching is slow when using a lot of simple patterns + 28992 7.1.236 hang when using complicated pattern and 'hlsearch' or ":match" + 1704 7.1.237 compiler warning on an Alpha processor in Motif code + 1801 7.1.238 searchpair() may fail when using 'c' or 'r' flag + 1639 7.1.239 (after 7.1.233) compiler warning for sprintf() argument + 5157 7.1.240 "gUe" may stop before the end of the word + 3093 7.1.241 focus change events not always ignored + 2262 7.1.242 "cib" doesn't work properly on "(x)" + 4475 7.1.243 (after 7.1.240) "U" doesn't work on all text in Visual mode + 1847 7.1.244 GUI may have part of the command line cut off + 2767 7.1.245 pressing CTRL-\ three times causes Vim to quit diff --git a/gvim.desktop b/gvim.desktop index 794f4829..72bfdd81 100644 --- a/gvim.desktop +++ b/gvim.desktop @@ -59,5 +59,5 @@ Exec=gvim -f %f Icon=gvim Type=Application Terminal=0 -XClassHintResName=VIM +X-XClassHintResName=VIM MapNotify=false diff --git a/vim-7.1-ada.patch b/vim-7.1-ada.patch new file mode 100644 index 00000000..85034696 --- /dev/null +++ b/vim-7.1-ada.patch @@ -0,0 +1,7018 @@ +diff -urN vim71/runtime/autoload/adacomplete.vim vim71_ada/runtime/autoload/adacomplete.vim +--- vim71/runtime/autoload/adacomplete.vim 2007-05-05 19:34:16.000000000 +0200 ++++ vim71_ada/runtime/autoload/adacomplete.vim 2008-01-16 16:46:40.000000000 +0100 +@@ -1,13 +1,13 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada omnicompletion file + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ + " Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $ + " History: 24.05.2006 MK Unified Headers + " 26.05.2006 MK improved search for begin of word. + " 16.07.2006 MK Ada-Mode as vim-ball +diff -urN vim71/runtime/autoload/ada.vim vim71_ada/runtime/autoload/ada.vim +--- vim71/runtime/autoload/ada.vim 2007-05-05 20:02:22.000000000 +0200 ++++ vim71_ada/runtime/autoload/ada.vim 2008-01-16 16:46:40.000000000 +0100 +@@ -1,14 +1,16 @@ + "------------------------------------------------------------------------------ + " Description: Perform Ada specific completion & tagging. + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ +-" Maintainer: Martin Krischik ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" Maintainer: Martin Krischik ++" Taylor Venable + " Neil Bird +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $ + " History: 24.05.2006 MK Unified Headers + " 26.05.2006 MK ' should not be in iskeyword. + " 16.07.2006 MK Ada-Mode as vim-ball +@@ -17,6 +19,10 @@ + " 05.11.2006 MK Bram suggested not to use include protection for + " autoload + " 05.11.2006 MK Bram suggested to save on spaces ++" 08.07.2007 TV fix mapleader problems. ++" 09.05.2007 MK Session just won't work no matter how much ++" tweaking is done ++" 19.09.2007 NO still some mapleader problems + " Help Page: ft-ada-functions + "------------------------------------------------------------------------------ + +@@ -425,7 +431,15 @@ + execute '!ctags --excmd=number ' . l:Filename + endfunction ada#Create_Tags + +-function ada#Switch_Session (New_Session) "{{{1 ++" Section: ada#Switch_Session {{{1 ++" ++function ada#Switch_Session (New_Session) ++ " ++ " you should not save to much date into the seession since they will ++ " be sourced ++ " ++ set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize ++ + if a:New_Session != v:this_session + " + " We actualy got a new session - otherwise there +@@ -437,18 +451,23 @@ + + let v:this_session = a:New_Session + +- if filereadable (v:this_session) +- execute 'source ' . v:this_session +- endif ++ "if filereadable (v:this_session) ++ "execute 'source ' . v:this_session ++ "endif + + augroup ada_session + autocmd! + autocmd VimLeavePre * execute 'mksession! ' . v:this_session + augroup END ++ " ++ "if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open ++ "TlistOpen ++ "endif ++ + endif + + return +-endfunction ada#Switch_Session "}}}1 ++endfunction ada#Switch_Session + + " Section: GNAT Pretty Printer folding {{{1 + " +@@ -546,18 +565,23 @@ + \ a:Keys . + \" :" . a:Command . "" + else ++ if exists("g:mapleader") ++ let l:leader = g:mapleader ++ else ++ let l:leader = '\' ++ endif + execute + \ "50amenu " . + \ "Ada." . escape(a:Text, ' ') . +- \ "" . escape(g:mapleader . "a" . a:Keys , '\') . ++ \ "" . escape(l:leader . "a" . a:Keys , '\') . + \ " :" . a:Command . "" + execute + \ "nnoremap " . +- \ escape(g:mapleader . "a" . a:Keys , '\') . ++ \ escape(l:leader . "a" . a:Keys , '\') . + \" :" . a:Command + execute + \ "inoremap " . +- \ escape(g:mapleader . "a" . a:Keys , '\') . ++ \ escape(l:leader . "a" . a:Keys , '\') . + \" :" . a:Command + endif + return +@@ -566,10 +590,15 @@ + " Section: ada#Map_Popup {{{2 + " + function ada#Map_Popup (Text, Keys, Command) ++ if exists("g:mapleader") ++ let l:leader = g:mapleader ++ else ++ let l:leader = '\' ++ endif + execute + \ "50amenu " . + \ "PopUp." . escape(a:Text, ' ') . +- \ "" . escape(g:mapleader . "a" . a:Keys , '\') . ++ \ "" . escape(l:leader . "a" . a:Keys , '\') . + \ " :" . a:Command . "" + + call ada#Map_Menu (a:Text, a:Keys, a:Command) +diff -urN vim71/runtime/autoload/decada.vim vim71_ada/runtime/autoload/decada.vim +--- vim71/runtime/autoload/decada.vim 2007-05-05 19:25:32.000000000 +0200 ++++ vim71_ada/runtime/autoload/decada.vim 2008-01-16 16:46:41.000000000 +0100 +@@ -1,14 +1,14 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada/Dec Ada compiler file + " Language: Ada (Dec Ada) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $ + " History: 21.07.2006 MK New Dec Ada + " 15.10.2006 MK Bram's suggestion for runtime integration + " 05.11.2006 MK Bram suggested not to use include protection for +@@ -45,7 +45,7 @@ + call ada#Switch_Session (a:1) + elseif argc() == 0 && strlen (v:servername) > 0 + call ada#Switch_Session ( +- \ expand('~')[0:-2] . ".vimfiles.session]" . ++ \ expand('~')[0:-2] . ".vimfiles.session]decada_" . + \ v:servername . ".vim") + endif + return +diff -urN vim71/runtime/autoload/gnat.vim vim71_ada/runtime/autoload/gnat.vim +--- vim71/runtime/autoload/gnat.vim 2007-05-05 20:18:20.000000000 +0200 ++++ vim71_ada/runtime/autoload/gnat.vim 2008-01-16 16:46:46.000000000 +0100 +@@ -1,14 +1,15 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada/GNAT compiler file + " Language: Ada (GNAT) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ ++" Maintainer: Martin Krischi k ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $ + " History: 24.05.2006 MK Unified Headers + " 16.07.2006 MK Ada-Mode as vim-ball + " 05.08.2006 MK Add session support +@@ -16,6 +17,7 @@ + " 05.11.2006 MK Bram suggested not to use include protection for + " autoload + " 05.11.2006 MK Bram suggested to save on spaces ++" 19.09.2007 NO use project file only when there is a project + " Help Page: compiler-gnat + "------------------------------------------------------------------------------ + +@@ -71,13 +73,19 @@ + execute 'mksession! ' . v:this_session + endif + +- if strlen (self.Project_File) > 0 +- call ada#Switch_Session ( +- \ expand('~') . "/vimfiles/session/" . +- \ fnamemodify (self.Project_File, ":t:r") . ".vim") +- else +- call ada#Switch_Session ('') +- endif ++ "if strlen (self.Project_File) > 0 ++ "if has("vms") ++ "call ada#Switch_Session ( ++ "\ expand('~')[0:-2] . ".vimfiles.session]gnat_" . ++ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") ++ "else ++ "call ada#Switch_Session ( ++ "\ expand('~') . "/vimfiles/session/gnat_" . ++ "\ fnamemodify (self.Project_File, ":t:r") . ".vim") ++ "endif ++ "else ++ "call ada#Switch_Session ('') ++ "endif + + return + endfunction gnat#Set_Project_File " }}}1 +diff -urN vim71/runtime/compiler/decada.vim vim71_ada/runtime/compiler/decada.vim +--- vim71/runtime/compiler/decada.vim 2007-05-05 20:09:54.000000000 +0200 ++++ vim71_ada/runtime/compiler/decada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -1,16 +1,17 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada/Dec Ada compiler file + " Language: Ada (Dec Ada) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ ++" Maintainer: Martin Krischik ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $ + " History: 21.07.2006 MK New Dec Ada + " 15.10.2006 MK Bram's suggestion for runtime integration ++" 08.09.2006 MK Correct double load protection. + " Help Page: compiler-decada + "------------------------------------------------------------------------------ + +@@ -24,6 +25,13 @@ + + if !exists("g:decada") + let g:decada = decada#New () ++ ++ call ada#Map_Menu ( ++ \'Dec Ada.Build', ++ \'', ++ \'call decada.Make ()') ++ ++ call g:decada.Set_Session () + endif + + if exists(":CompilerSet") != 2 +@@ -33,16 +41,9 @@ + command -nargs=* CompilerSet setlocal + endif + +-call g:decada.Set_Session () +- + execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ') + execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ') + +-call ada#Map_Menu ( +- \'Dec Ada.Build', +- \'', +- \'call decada.Make ()') +- + finish " 1}}} + + "------------------------------------------------------------------------------ +diff -urN vim71/runtime/compiler/gnat.vim vim71_ada/runtime/compiler/gnat.vim +--- vim71/runtime/compiler/gnat.vim 2007-05-05 20:04:19.000000000 +0200 ++++ vim71_ada/runtime/compiler/gnat.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -1,17 +1,19 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada/GNAT compiler file + " Language: Ada (GNAT) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ ++" Maintainer: Martin Krischi k ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $ + " History: 24.05.2006 MK Unified Headers + " 16.07.2006 MK Ada-Mode as vim-ball + " 15.10.2006 MK Bram's suggestion for runtime integration ++" 19.09.2007 NO use project file only when there is a project + " Help Page: compiler-gnat + "------------------------------------------------------------------------------ + +@@ -46,6 +48,8 @@ + \ 'GNAT.Set Projectfile\.\.\.', + \ ':SetProject', + \ 'call gnat.Set_Project_File ()') ++ ++ call g:gnat.Set_Session () + endif + + if exists(":CompilerSet") != 2 +@@ -55,8 +59,6 @@ + command -nargs=* CompilerSet setlocal + endif + +-call g:gnat.Set_Session () +- + execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ') + execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ') + +diff -urN vim71/runtime/doc/ft_ada.txt vim71_ada/runtime/doc/ft_ada.txt +--- vim71/runtime/doc/ft_ada.txt 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/doc/ft_ada.txt 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,516 @@ ++*ft_ada.txt* Ada File type Plug-ins Last change: 2007 Seb 17 ++ ++ ++ ADA FILE TYPE PLUG-INS REFERENCE MANUAL~ ++ ++ADA *ada.vim* ++ ++1. Syntax Highlighting |ft-ada-syntax| ++2. Plug-in |ft-ada-plugin| ++3. Omni Completion |ft-ada-omni| ++ 3.1 Omni Completion with "gnat xref" |gnat-xref| ++ 3.2 Omni Completion with "ctags" |ada-ctags| ++4. Compiler Support |ada-compiler| ++ 4.1 GNAT |compiler-gnat| ++ 4.1 Dec Ada |compiler-decada| ++5. References |ada-reference| ++ 5.1 Options |ft-ada-options| ++ 5.2 Functions |ft-ada-functions| ++ 5.3 Commands |ft-ada-commands| ++ 5.4 Variables |ft-ada-variables| ++ 5.5 Constants |ft-ada-contstants| ++8. Extra Plug-ins |ada-extra-plugins| ++ ++============================================================================== ++1. Syntax Highlighting ~ ++ *ft-ada-syntax* ++ ++This mode is designed for the 2005 edition of Ada ("Ada 2005"), which includes ++support for objected-programming, protected types, and so on. It handles code ++written for the original Ada language ("Ada83", "Ada87", "Ada95") as well, ++though code which uses Ada 2005-only keywords will be wrongly colored (such ++code should be fixed anyway). For more information about Ada, see ++http://www.adapower.com. ++ ++The Ada mode handles a number of situations cleanly. ++ ++For example, it knows that the "-" in "-5" is a number, but the same character ++in "A-5" is an operator. Normally, a "with" or "use" clause referencing ++another compilation unit is coloured the same way as C's "#include" is coloured. ++If you have "Conditional" or "Repeat" groups coloured differently, then "end ++if" and "end loop" will be coloured as part of those respective groups. ++ ++You can set these to different colours using vim's "highlight" command (e.g., ++to change how loops are displayed, enter the command ":hi Repeat" followed by ++the colour specification; on simple terminals the colour specification ++ctermfg=White often shows well). ++ ++There are several options you can select in this Ada mode. See|ft-ada-options| ++for a complete list. ++ ++To enable them, assign a value to the option. For example, to turn one on: ++ > ++ > let g:ada_standard_types = 1 ++> ++To disable them use ":unlet". Example: ++> ++ > unlet g:ada_standard_types ++ ++You can just use ":" and type these into the command line to set these ++temporarily before loading an Ada file. You can make these option settings ++permanent by adding the "let" command(s), without a colon, to your "~/.vimrc" ++file. ++ ++Even on a slow (90Mhz) PC this mode works quickly, but if you find the ++performance unacceptable, turn on |g:ada_withuse_ordinary|. ++ ++Syntax folding instructions (|fold-syntax|) are added when |g:ada_folding| is ++set. ++ ++============================================================================== ++2. File type Plug-in ~ ++ *ft-ada-indent* *ft-ada-plugin* ++ ++The Ada plug-in provides support for: ++ ++ - auto indenting (|indent.txt|) ++ - insert completion (|i_CTRL-N|) ++ - user completion (|i_CTRL-X_CTRL-U|) ++ - tag searches (|tagsrch.txt|) ++ - Quick Fix (|quickfix.txt|) ++ - backspace handling (|'backspace'|) ++ - comment handling (|'comments'|, |'commentstring'|) ++ ++The plug-in only activates the features of the Ada mode whenever an Ada ++files is opened and add adds Ada related entries to the main and pop-up menu. ++ ++============================================================================== ++3. Omni Completion ~ ++ *ft-ada-omni* ++ ++The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either ++by "gnat xref -v" or the "exuberant Ctags (http://ctags.sourceforge.net). The ++complete function will automatically detect which tool was used to create the ++tags file. ++ ++------------------------------------------------------------------------------ ++3.1 Omni Completion with "gnat xref" ~ ++ *gnat-xref* ++ ++GNAT XREF uses the compiler internal information (ali-files) to produce the ++tags file. This has the advantage to be 100% correct and the option of deep ++nested analysis. However the code must compile, the generator is quite ++slow and the created tags file contains only the basic Ctags information for ++each entry - not enough for some of the more advanced Vim code browser ++plug-ins. ++ ++NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic ++ output - If nothing is printed then usually the parameters are wrong. ++ Here some important tips: ++ ++1) You need to compile your code first and use the "-aO" option to point to ++ your .ali files. ++2) "gnat xref -v ../Include/adacl.ads" won't work - use the "gnat xref -v ++ -aI../Include adacl.ads" instead. ++3) "gnat xref -v -aI../Include *.ad?" won't work - use "cd ../Include" and ++ then "gnat xref -v *.ad?" ++4) Project manager support is completely broken - don't even try "gnat xref ++ -Padacl.gpr". ++5) VIM is faster when the tags file is sorted - use "sort --unique ++ --ignore-case --output=tags tags" . ++6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark ++ the file assorted. ++ ++------------------------------------------------------------------------------ ++3.2 Omni Completion with "ctags"~ ++ *ada-ctags* ++ ++Exuberant Ctags uses it's own multi-language code parser. The parser is quite ++fast, produces a lot of extra informations (hence the name "Exuberant Ctags") ++and can run on files which currently do not compile. ++ ++There are also lots of other Vim-tools which use exuberant Ctags. ++ ++You will need to install a version of the Exuberant Ctags which has Ada ++support patched in. Such a version is available from the GNU Ada Project ++(http://gnuada.sourceforge.net). ++ ++The Ada parser for Exuberant Ctags is fairly new - don't expect complete ++support yet. ++ ++============================================================================== ++4. Compiler Support ~ ++ *ada-compiler* ++ ++The Ada mode supports more then one Ada compiler and will automatically load the ++compiler set in|g:ada_default_compiler|whenever an Ada source is opened. The ++provided compiler plug-ins are split into the actual compiler plug-in and a ++collection of support functions and variables. This allows the easy ++development of specialized compiler plug-ins fine tuned to your development ++environment. ++ ++------------------------------------------------------------------------------ ++4.1 GNAT ~ ++ *compiler-gnat* ++ ++GNAT is the only free (beer and speech) Ada compiler available. There are ++several version available which differentiate in the licence terms used. ++ ++The GNAT compiler plug-in will perform a compile on pressing and then ++immediately shows the result. You can set the project file to be used by ++setting: ++ > ++ > call g:gnat.Set_Project_File ('my_project.gpr') ++ ++Setting a project file will also create a Vim session (|views-sessions|) so - ++like with the GPS - opened files, window positions etc. will remembered ++separately for all projects. ++ ++ *gnat_members* ++GNAT OBJECT ~ ++ ++ *g:gnat.Make()* ++g:gnat.Make() ++ Calls|g:gnat.Make_Command|and displays the result inside a ++ |quickfix| window. ++ ++ *g:gnat.Pretty()* ++g:gnat.Pretty() ++ Calls|g:gnat.Pretty_Command| ++ ++ *g:gnat.Find()* ++g:gnat.Find() ++ Calls|g:gnat.Find_Command| ++ ++ *g:gnat.Tags()* ++g:gnat.Tags() ++ Calls|g:gnat.Tags_Command| ++ ++ *g:gnat.Set_Project_File()* ++g:gnat.Set_Project_File([{file}]) ++ Set gnat project file and load associated session. An open ++ project will be closed and the session written. If called ++ without file name the file selector opens for selection of a ++ project file. If called with an empty string then the project ++ and associated session are closed. ++ ++ *g:gnat.Project_File* ++g:gnat.Project_File string ++ Current project file. ++ ++ *g:gnat.Make_Command* ++g:gnat.Make_Command string ++ External command used for|g:gnat.Make()| (|'makeprg'|). ++ ++ *g:gnat.Pretty_Program* ++g:gnat.Pretty_Program string ++ External command used for|g:gnat.Pretty()| ++ ++ *g:gnat.Find_Program* ++g:gnat.Find_Program string ++ External command used for|g:gnat.Find()| ++ ++ *g:gnat.Tags_Command* ++g:gnat.Tags_Command string ++ External command used for|g:gnat.Tags()| ++ ++ *g:gnat.Error_Format* ++g:gnat.Error_Format string ++ Error format (|'errorformat'|) ++ ++------------------------------------------------------------------------------ ++4.2 Dec Ada ~ ++ *compiler-hpada* *compiler-decada* ++ *compiler-vaxada* *compiler-compaqada* ++ ++Dec Ada (also known by - in chronological order - VAX Ada, Dec Ada, Compaq Ada ++and HP Ada) is a fairly dated Ada 83 compiler. Support is basic: will ++compile the current unit. ++ ++The Dec Ada compiler expects the package name and not the file name to be ++passed a parameter. The compiler plug-in supports the usual file name ++convention to convert the file into a unit name. For separates both '-' and ++'__' are allowed. ++ ++ *decada_members* ++DEC ADA OBJECT ~ ++ ++ *g:decada.Make()* ++g:decada.Make() function ++ Calls|g:decada.Make_Command|and displays the result inside a ++ |quickfix| window. ++ ++ *g:decada.Unit_Name()* ++g:decada.Unit_Name() function ++ Get the Unit name for the current file. ++ ++ *g:decada.Make_Command* ++g:decada.Make_Command string ++ External command used for|g:decadat.Make()| (|'makeprg'|). ++ ++ *g:decada.Error_Format* ++g:decada.Error_Format| string ++ Error format (|'errorformat'|). ++ ++============================================================================== ++5. References ~ ++ *ada-reference* ++ ++------------------------------------------------------------------------------ ++5.1 Options ~ ++ *ft-ada-options* ++ ++ *g:ada_standard_types* ++g:ada_standard_types bool (true when exists) ++ Highlight types in package Standard (e.g., "Float") ++ ++ *g:ada_space_errors* ++ *g:ada_no_trail_space_error* ++ *g:ada_no_tab_space_error* ++ *g:ada_all_tab_usage* ++g:ada_space_errors bool (true when exists) ++ Highlight extraneous errors in spaces ... ++ g:ada_no_trail_space_error ++ - but ignore trailing spaces at the end of a line ++ g:ada_no_tab_space_error ++ - but ignore tabs after spaces ++ g:ada_all_tab_usage ++ - highlight all tab use ++ ++ *g:ada_line_errors* ++g:ada_line_errors bool (true when exists) ++ Highlight lines which are to long. Note: This highlighting ++ option is quite CPU intensive. ++ ++ *g:ada_rainbow_color* ++g:ada_rainbow_color bool (true when exists) ++ Use rainbow colours for '(' and ')'. You need the ++ rainbow_parenthesis for this to work ++ ++ *g:ada_folding* ++g:ada_folding set ('sigpft') ++ Use folding for Ada sources. ++ 's': activate syntax folding on load ++ 'p': fold packages ++ 'f': fold functions and procedures ++ 't': fold types ++ 'c': fold conditionals ++ 'g': activate gnat pretty print folding on load ++ 'i': lone 'is' folded with line above ++ 'b': lone 'begin' folded with line above ++ 'p': lone 'private' folded with line above ++ 'x': lone 'exception' folded with line above ++ 'i': activate indent folding on load ++ ++ Note: Syntax folding is in an early (unuseable) stage and ++ indent or gnat pretty folding is suggested. ++ ++ For gnat pretty folding to work the following settings are ++ suggested: -cl3 -M79 -c2 -c3 -c4 -A1 -A2 -A3 -A4 -A5 ++ ++ For indent folding to work the following settings are ++ suggested: shiftwidth=3 softtabstop=3 ++ ++ *g:ada_abbrev* ++g:ada_abbrev bool (true when exists) ++ Add some abbreviations. This feature more or less superseded ++ by the various completion methods. ++ ++ *g:ada_withuse_ordinary* ++g:ada_withuse_ordinary bool (true when exists) ++ Show "with" and "use" as ordinary keywords (when used to ++ reference other compilation units they're normally highlighted ++ specially). ++ ++ *g:ada_begin_preproc* ++g:ada_begin_preproc bool (true when exists) ++ Show all begin-like keywords using the colouring of C ++ preprocessor commands. ++ ++ *g:ada_omni_with_keywords* ++g:ada_omni_with_keywords ++ Add Keywords, Pragmas, Attributes to omni-completions ++ (|compl-omni|). Note: You can always complete then with user ++ completion (|i_CTRL-X_CTRL-U|). ++ ++ *g:ada_extended_tagging* ++g:ada_extended_tagging enum ('jump', 'list') ++ use extended tagging, two options are available ++ 'jump': use tjump to jump. ++ 'list': add tags quick fix list. ++ Normal tagging does not support function or operator ++ overloading as these features are not available in C and ++ tagging was originally developed for C. ++ ++ *g:ada_extended_completion* ++g:ada_extended_completion ++ Uses extended completion for and completions ++ (|i_CTRL-N|). In this mode the '.' is used as part of the ++ identifier so that 'Object.Method' or 'Package.Procedure' are ++ completed together. ++ ++ *g:ada_gnat_extensions* ++g:ada_gnat_extensions bool (true when exists) ++ Support GNAT extensions. ++ ++ *g:ada_with_gnat_project_files* ++g:ada_with_gnat_project_files bool (true when exists) ++ Add gnat project file keywords and Attributes. ++ ++ *g:ada_default_compiler* ++g:ada_default_compiler string ++ set default compiler. Currently supported is 'gnat' and ++ 'decada'. ++ ++An "exists" type is a boolean is considered true when the variable is defined ++and false when the variable is undefined. The value which the variable is ++set makes no difference. ++ ++------------------------------------------------------------------------------ ++5.3 Commands ~ ++ *ft-ada-commands* ++ ++:AdaRainbow *:AdaRainbow* ++ Toggles rainbow colour (|g:ada_rainbow_color|) mode for ++ '(' and ')' ++ ++:AdaLines *:AdaLines* ++ Toggles line error (|g:ada_line_errors|) display ++ ++:AdaSpaces *:AdaSpaces* ++ Toggles space error (|g:ada_space_errors|) display. ++ ++:AdaTagDir *:AdaTagDir* ++ Creates tags file for the directory of the current file. ++ ++:AdaTagFile *:AdaTagFile* ++ Creates tags file for the current file. ++ ++:AdaTypes *:AdaTypes* ++ Toggles standard types (|g:ada_standard_types|) colour. ++ ++:GnatFind *:GnatFind* ++ Calls |g:gnat.Find()| ++ ++:GnatPretty *:GnatPretty* ++ Calls |g:gnat.Pretty()| ++ ++:GnatTags *:GnatTags* ++ Calls |g:gnat.Tags()| ++ ++------------------------------------------------------------------------------ ++5.3 Variables ~ ++ *ft-ada-variables* ++ ++ *g:gnat* ++g:gnat object ++ Control object which manages GNAT compiles. The object ++ is created when the first Ada source code is loaded provided ++ that |g:ada_default_compiler|is set to 'gnat'. See|gnat_members| ++ for details. ++ ++ *g:decada* ++g:decada object ++ Control object which manages Dec Ada compiles. The object ++ is created when the first Ada source code is loaded provided ++ that |g:ada_default_compiler|is set to 'decada'. See ++ |decada_members|for details. ++ ++------------------------------------------------------------------------------ ++5.4 Constants ~ ++ *ft-ada-constants* ++ ft-ada-constants ++ ++All constants are locked. See |:lockvar| for details. ++ ++ *g:ada#WordRegex* ++g:ada#WordRegex string ++ Regular expression to search for Ada words ++ ++ *g:ada#DotWordRegex* ++g:ada#DotWordRegex string ++ Regular expression to search for Ada words separated by dots. ++ ++ *g:ada#Comment* ++g:ada#Comment string ++ Regular expression to search for Ada comments ++ ++ *g:ada#Keywords* ++g:ada#Keywords list of dictionaries ++ List of keywords, attributes etc. pp. in the format used by ++ omni completion. See |complete-items| for details. ++ ++ *g:ada#Ctags_Kinds* ++g:ada#Ctags_Kinds dictionary of lists ++ Dictionary of the various kinds of items which the Ada support ++ for Ctags generates. ++ ++------------------------------------------------------------------------------ ++5.2 Functions ~ ++ *ft-ada-functions* ++ ++ada#Word([{line}, {col}]) *ada#Word()* ++ Return full name of Ada entity under the cursor (or at given ++ line/column), stripping white space/newlines as necessary. ++ ++ada#List_Tag([{line}, {col}]) *ada#Listtags()* ++ List all occurrences of the Ada entity under the cursor (or at ++ given line/column) inside the quick-fix window ++ ++ada#Jump_Tag ({ident}, {mode}) *ada#Jump_Tag()* ++ List all occurrences of the Ada entity under the cursor (or at ++ given line/column) in the tag jump list. Mode can either be ++ 'tjump' or 'stjump'. ++ ++ada#Create_Tags ({option}) *ada#Create_Tags()* ++ Creates tag file using Ctags. The option can either be 'file' ++ for the current file, 'dir' for the directory of the current ++ file or a file name. ++ ++gnat#Insert_Tags_Header() *gnat#Insert_Tags_Header()* ++ Adds the tag file header (!_TAG_) information to the current ++ file which are missing from the GNAT XREF output. ++ ++ada#Switch_Syntax_Option ({option}) *ada#Switch_Syntax_Option()* ++ Toggles highlighting options on or off. Used for the Ada menu. ++ ++ *gnat#New()* ++gnat#New () ++ Create a new gnat object. See |g:gnat| for details. ++ ++ ++============================================================================== ++8. Extra Plugins ~ ++ *ada-extra-plugins* ++ ++You can optionally install the following extra plug-in. They work well with Ada ++and enhance the ability of the Ada mode.: ++ ++backup.vim ++ http://www.vim.org/scripts/script.php?script_id=1537 ++ Keeps as many backups as you like so you don't have to. ++ ++rainbow_parenthsis.vim ++ http://www.vim.org/scripts/script.php?script_id=1561 ++ Very helpful since Ada uses only '(' and ')'. ++ ++nerd_comments.vim ++ http://www.vim.org/scripts/script.php?script_id=1218 ++ Excellent commenting and uncommenting support for almost any ++ programming language. ++ ++matchit.vim ++ http://www.vim.org/scripts/script.php?script_id=39 ++ '%' jumping for any language. The normal '%' jump only works for '{}' ++ style languages. The Ada mode will set the needed search patters. ++ ++taglist.vim ++ http://www.vim.org/scripts/script.php?script_id=273 ++ Source code explorer sidebar. There is a patch for Ada available. ++ ++The GNU Ada Project distribution (http://gnuada.sourceforge.net) of Vim ++contains all of the above. ++ ++============================================================================== ++vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++vim: filetype=help +diff -urN vim71/runtime/ftplugin/ada.vim vim71_ada/runtime/ftplugin/ada.vim +--- vim71/runtime/ftplugin/ada.vim 2007-05-05 19:17:45.000000000 +0200 ++++ vim71_ada/runtime/ftplugin/ada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -1,14 +1,15 @@ + "------------------------------------------------------------------------------ + " Description: Perform Ada specific completion & tagging. + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ +-" Maintainer: Martin Krischik ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" Maintainer: Martin Krischik ++" Taylor Venable + " Neil Bird +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $ + " History: 24.05.2006 MK Unified Headers + " 26.05.2006 MK ' should not be in iskeyword. + " 16.07.2006 MK Ada-Mode as vim-ball +@@ -17,6 +18,7 @@ + " 05.11.2006 MK Bram suggested not to use include protection for + " autoload + " 05.11.2006 MK Bram suggested to save on spaces ++" 08.07.2007 TV fix default compiler problems. + " Help Page: ft-ada-plugin + "------------------------------------------------------------------------------ + " Provides mapping overrides for tag jumping that figure out the current +@@ -30,7 +32,7 @@ + endif + + " Don't load another plugin for this buffer +-let b:did_ftplugin = 38 ++let b:did_ftplugin = 45 + + " + " Temporarily set cpoptions to ensure the script loads OK +@@ -104,8 +106,17 @@ + \ s:notend . '\:\\s\+\' + endif + ++ + " Section: Compiler {{{1 + " ++if ! exists("g:ada_default_compiler") ++ if has("vms") ++ let g:ada_default_compiler = 'decada' ++ else ++ let g:ada_default_compiler = 'gnat' ++ endif ++endif ++ + if ! exists("current_compiler") || + \ current_compiler != g:ada_default_compiler + execute "compiler " . g:ada_default_compiler +diff -urN vim71/runtime/indent/ada.vim vim71_ada/runtime/indent/ada.vim +--- vim71/runtime/indent/ada.vim 2007-05-05 19:25:37.000000000 +0200 ++++ vim71_ada/runtime/indent/ada.vim 2008-01-16 16:37:02.000000000 +0100 +@@ -1,19 +1,21 @@ + "------------------------------------------------------------------------------ + " Description: Vim Ada indent file + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik +-" Maintainer: Martin Krischik ++" Maintainer: Martin Krischik + " Neil Bird +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ ++" Ned Okie ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ + " History: 24.05.2006 MK Unified Headers + " 16.07.2006 MK Ada-Mode as vim-ball + " 15.10.2006 MK Bram's suggestion for runtime integration + " 05.11.2006 MK Bram suggested to save on spaces ++" 19.09.2007 NO g: missing before ada#Comment + " Help Page: ft-vim-indent + "------------------------------------------------------------------------------ + " ToDo: +@@ -27,7 +29,7 @@ + finish + endif + +-let b:did_indent = 1 ++let b:did_indent = 45 + + setlocal indentexpr=GetAdaIndent() + setlocal indentkeys-=0{,0} +@@ -58,7 +60,7 @@ + " Seems to work OK as it 'starts' with the indent of the /previous/ line. + function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at) + let lnum = a:prev_lnum +- let line = substitute( getline(lnum), ada#Comment, '', '' ) ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) + while lnum > 1 + if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent + return a:prev_indent +@@ -72,7 +74,7 @@ + let lnum = prevnonblank(lnum - 1) + " Get previous non-blank/non-comment-only line + while 1 +- let line = substitute( getline(lnum), ada#Comment, '', '' ) ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) + if line !~ '^\s*$' && line !~ '^\s*#' + break + endif +@@ -116,7 +118,7 @@ + " Get previous non-blank/non-comment-only line + while 1 + let line = getline(lnum) +- let line = substitute( line, ada#Comment, '', '' ) ++ let line = substitute( line, g:ada#Comment, '', '' ) + if line !~ '^\s*$' + break + endif +@@ -143,7 +145,8 @@ + let lnum = prevnonblank(lnum - 1) + " Get previous non-blank/non-comment-only line + while 1 +- let line = substitute( getline(lnum), ada#Comment, '', '' ) ++ let line = substitute( getline(lnum), g:ada#Comment, '', '' ) ++ + if line !~ '^\s*$' && line !~ '^\s*#' + break + endif +@@ -222,7 +225,7 @@ + exe lnum + exe 'normal! $F)%' + if getline('.') =~ '^\s*(' +- " Dire layout - use previous indent (could check for ada#Comment here) ++ " Dire layout - use previous indent (could check for g:ada#Comment here) + let ind = indent( prevnonblank( line('.')-1 ) ) + else + let ind = indent('.') +diff -urN vim71/runtime/macros/svnignore.bash vim71_ada/runtime/macros/svnignore.bash +--- vim71/runtime/macros/svnignore.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/svnignore.bash 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,9 @@ ++#!/bin/bash ++ ++svn propedit \ ++ --editor-cmd="gvim -f" \ ++ svn:ignore \ ++ "${@}" ; ++ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/runtime/macros/svnignore.btm vim71_ada/runtime/macros/svnignore.btm +--- vim71/runtime/macros/svnignore.btm 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/svnignore.btm 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,27 @@ ++::!C:\Bin\4Portable\App\4\4nt.EXE ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: Description: Works like "tail -f" . ++:: $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++:: Maintainer: Martin Krischik ++:: Jason Heddings (vim at heddway dot com) ++:: $Author: karsten $ ++:: $Date: 2008/02/11 15:11:34 $ ++:: Version: 3.0 ++:: $Revision: 1.1 $ ++:: $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.btm $ ++:: History: 17.11.2007 Edit svn:ignore data ++:: Help Page: tail.txt ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++ ++svn propedit ^ ++ --editor-cmd="gvim -f" ^ ++ svn:ignore ^ ++ "%[$]" ++ ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: Copyright (C) 2006 Martin Krischik ++:: ++:: Vim is Charityware - see ":help license" or uganda.txt for licence details. ++:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ++:: vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++:: vim: filetype=btm encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/runtime/macros/svnignore.zsh vim71_ada/runtime/macros/svnignore.zsh +--- vim71/runtime/macros/svnignore.zsh 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/svnignore.zsh 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,29 @@ ++#!/bin/zsh ++#------------------------------------------------------------------------------ ++# Description: Works like "tail -f" . ++# $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++# Maintainer: Martin Krischik ++# Jason Heddings (vim at heddway dot com) ++# $Author: karsten $ ++# $Date: 2008/02/11 15:11:34 $ ++# Version: 3.0 ++# $Revision: 1.1 $ ++# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/svnignore.zsh $ ++# History: 17.11.2007 Edit svn:ignore data ++# Help Page: tail.txt ++#------------------------------------------------------------------------------ ++ ++setopt No_X_Trace; ++ ++svn propedit \ ++ --editor-cmd="gvim -f" \ ++ svn:ignore \ ++ "${=@}" ; ++ ++#------------------------------------------------------------------------------ ++# Copyright (C) 2006 Martin Krischik ++# ++# Vim is Charityware - see ":help license" or uganda.txt for licence details. ++#------------------------------------------------------------------------------ ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/runtime/macros/vim.bash vim71_ada/runtime/macros/vim.bash +--- vim71/runtime/macros/vim.bash 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/vim.bash 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,191 @@ ++#!/bin/echo usage: source ++########################################################### {{{1 ########### ++# Description: Set alias names for a custom installed vim/ctags. ++# Language: Bash Shell Script ++# $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++# Maintainer: Martin Krischik ++# $Author: karsten $ ++# $Date: 2008/02/11 15:11:34 $ ++# Version: 3.6 ++# $Revision: 1.1 $ ++# $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/macros/vim.bash $ ++# History: 26.07.2006 MK pretty new ++# Usage: copy to /etc/profile.d and make world executable ++########################################################### }}}1 ########### ++ ++ ++if ! type lxpm 2>/dev/null 1>/dev/null; then ++ ++ # Variablen ++ UName=$(uname) ++ ++ case "${UName}" in # {{{1 ++ (Linux*) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}2 ++ (CYGWIN*) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}2 ++ (SunOS) # {{{2 ++ if test -x "/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71"; ++ elif test -x "${HOME}/opt/gnat/tools/bin/vim"; then ++ declare -x VIM="${HOME}/opt/gnat/tools"; ++ declare -x VIMRUNTIME="${VIM}/share/vim/vim71" ++ PATH="${VIM}/bin:${PATH}" ++ else ++ unset VIM 1>/dev/null 2>/dev/null; ++ unset VIMRUNTIME 1>/dev/null 2>/dev/null; ++ fi ++ ;; # }}}2 ++ (*) # {{{2 ++ ;; # }}}2 ++ esac; # }}}1 ++ ++ # Simple Functions ++ ++ for i in ctags etags eview evim ex gview gvim gvimdiff rgview rgvim rview rvim view vim vimdiff vimtutor xxd; do # {{{1 ++ ++ case "${UName}" in # {{{2 ++ (MINGW*) # {{{3 ++ if test -n "${VIM}"; then ++ declare -x -f ${i}; ++ ++ eval "function ${i} () ++ { ++ ${VIM}/vim71/gvim.exe \"\${@}\" ++ return; ++ }" ++ else ++ unset -f ${i} 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}3 ++ (Linux|CYGWIN*) # {{{3 ++ if test -n "${VIM}"; then ++ declare -x -f ${i}; ++ ++ eval "function ${i} () ++ { ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/${i}\" \"\${@}\" ; ++ return; ++ }" ++ else ++ unset -f ${i} 1>/dev/null 2>/dev/null; ++ fi; ++ ;; # }}}3 ++ (*) # {{{3 ++ ;; # }}}3 ++ esac; # }}}2 ++ done; # }}}1 ++ ++ # Server Functions ++ ++ for i in lxpm med epm; do # {{{1 ++ declare -x -f ${i} ++ ++ case "${UName}" in # {{{2 ++ (MINGW*) # {{{3 ++ if test -n "${VIM}"; then ++ eval "function ${i} () ++ { ++ if test -z "\${1}"; then ++ ${VIM}/vim71/gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & ++ else ++ ${VIM}/vim71/gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & ++ fi; ++ return; ++ }" ++ else ++ eval "function ${i} () ++ { ++ if test -z "\${1}"; then ++ gvim.exe --servername ${i} 1>/dev/null 2>/dev/null & ++ else ++ gvim.exe --servername ${i} --remote-silent \"\${@}\" 1>/dev/null 2>/dev/null & ++ fi; ++ return; ++ }" ++ fi; ++ ;; # }}}3 ++ (Linux|CYGWIN*|SunOS) # {{{3 ++ if test -n "${VIM}"; then ++ eval "function ${i} () ++ { ++ if test -z \"\${1}\"; then ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" \"\${@}\" \ ++ >/dev/null 2>/dev/null & ++ else ++ LD_LIBRARY_PATH=\"\${LD_LIBRARY_PATH}:${VIM}/lib\" \ ++ \"${VIM}/bin/gvim\" --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" \ ++ >/dev/null 2>/dev/null & ++ fi ++ return; ++ }" ++ else ++ eval "function ${i} () ++ { ++ if test -z \"\${1}\"; then ++ gvim --servername \"${i} ${HOSTNAME}\" >/dev/null 2>/dev/null & ++ else ++ gvim --servername \"${i} ${HOSTNAME}\" --remote-silent \"\${@}\" >/dev/null 2>/dev/null & ++ fi ++ return; ++ }" ++ fi; ++ ;; # }}}3 ++ (*) # {{{3 ++ ;; # }}}3 ++ esac; # }}}2 ++ done; # }}}1 ++ ++ # Some applications read the EDITOR variable to determine your favourite text ++ # editor. So uncomment the line below and enter the editor of your choice :-) ++ if test -n "${VIM}"; then ++ declare -x EDITOR="${VIM}/bin/gvim -f"; ++ declare -x VISUAL="${VIM}/bin/gvim -f"; ++ else ++ declare -x EDITOR="$(which gvim) -f"; ++ declare -x VISUAL="$(which gvim) -f"; ++ fi; ++ # Unset local Variablen ++ ++ unset UName ++ ++ printf "\e[42m%-30.30s : \e[43m %-40.40s \e[m\n" "$(basename ${BASH_SOURCE:-${0}})" "VIM 7.0 symbols set." ++ ++fi; ++ ++########################################################### {{{1 ########### ++# Copyright (C) 2006 Martin Krischik ++# ++# This program is free software; you can redistribute it and/or ++# modify it under the terms of the GNU General Public License ++# as published by the Free Software Foundation; either version 2 ++# of the License, or (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ++########################################################### }}}1 ########### ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab ++# vim: filetype=sh encoding=utf-8 fileformat=unix foldmethod=marker +diff -urN vim71/runtime/macros/vim.zsh vim71_ada/runtime/macros/vim.zsh +--- vim71/runtime/macros/vim.zsh 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/macros/vim.zsh 2008-01-16 16:37:02.000000000 +0100 +@@ -0,0 +1,17 @@ ++#!/bin/echo usage: source ++ ++setopt No_Verbose ++setopt No_X_Trace ++setopt Typeset_Silent; ++ ++# ++# Bash script is zsh compatible ++# ++HOSTNAME="${HOSTNAME:-${HOST}}" ++BASH_SOURCE="$(basename ${0} .zsh).bash" ++source "$(dirname ${0})/${BASH_SOURCE}" ++unset BASH_SOURCE; ++ ++############################################################# {{{1 ########### ++# vim: textwidth=0 nowrap tabstop=8 shiftwidth=4 softtabstop=4 expandtab ++# vim: filetype=zsh encoding=utf-8 fileformat=unix foldmethod=marker nospell +diff -urN vim71/runtime/plugin/matchit.vim vim71_ada/runtime/plugin/matchit.vim +--- vim71/runtime/plugin/matchit.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/plugin/matchit.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,814 @@ ++" matchit.vim: (global plugin) Extended "%" matching ++" Last Change: Tue Oct 24 11:00 AM 2006 EDT ++" Maintainer: Benji Fisher PhD ++" Version: 1.12, for Vim 6.3+ ++" URL: http://www.vim.org/script.php?script_id=39 ++ ++" Documentation: ++" The documentation is in a separate file, matchit.txt . ++ ++" Credits: ++" Vim editor by Bram Moolenaar (Thanks, Bram!) ++" Original script and design by Raul Segura Acevedo ++" Support for comments by Douglas Potts ++" Support for back references and other improvements by Benji Fisher ++" Support for many languages by Johannes Zellner ++" Suggestions for improvement, bug reports, and support for additional ++" languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark ++" Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner. ++ ++" Debugging: ++" If you'd like to try the built-in debugging commands... ++" :MatchDebug to activate debugging for the current buffer ++" This saves the values of several key script variables as buffer-local ++" variables. See the MatchDebug() function, below, for details. ++ ++" TODO: I should think about multi-line patterns for b:match_words. ++" This would require an option: how many lines to scan (default 1). ++" This would be useful for Python, maybe also for *ML. ++" TODO: Maybe I should add a menu so that people will actually use some of ++" the features that I have implemented. ++" TODO: Eliminate the MultiMatch function. Add yet another argument to ++" Match_wrapper() instead. ++" TODO: Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1' ++" TODO: Make backrefs safer by using '\V' (very no-magic). ++" TODO: Add a level of indirection, so that custom % scripts can use my ++" work but extend it. ++ ++" allow user to prevent loading ++" and prevent duplicate loading ++if exists("loaded_matchit") || &cp ++ finish ++endif ++let loaded_matchit = 1 ++let s:last_mps = "" ++let s:last_words = "" ++ ++let s:save_cpo = &cpo ++set cpo&vim ++ ++nnoremap % :call Match_wrapper('',1,'n') ++nnoremap g% :call Match_wrapper('',0,'n') ++vnoremap % :call Match_wrapper('',1,'v') m'gv`` ++vnoremap g% :call Match_wrapper('',0,'v') m'gv`` ++onoremap % v:call Match_wrapper('',1,'o') ++onoremap g% v:call Match_wrapper('',0,'o') ++ ++" Analogues of [{ and ]} using matching patterns: ++nnoremap [% :call MultiMatch("bW", "n") ++nnoremap ]% :call MultiMatch("W", "n") ++vmap [% [%m'gv`` ++vmap ]% ]%m'gv`` ++" vnoremap [% :call MultiMatch("bW", "v") m'gv`` ++" vnoremap ]% :call MultiMatch("W", "v") m'gv`` ++onoremap [% v:call MultiMatch("bW", "o") ++onoremap ]% v:call MultiMatch("W", "o") ++ ++" text object: ++vmap a% [%v]% ++ ++" Auto-complete mappings: (not yet "ready for prime time") ++" TODO Read :help write-plugin for the "right" way to let the user ++" specify a key binding. ++" let g:match_auto = '' ++" let g:match_autoCR = '' ++" if exists("g:match_auto") ++" execute "inoremap " . g:match_auto . ' x"=Autocomplete()Pls' ++" endif ++" if exists("g:match_autoCR") ++" execute "inoremap " . g:match_autoCR . ' =Autocomplete()' ++" endif ++" if exists("g:match_gthhoh") ++" execute "inoremap " . g:match_gthhoh . ' :call Gthhoh()' ++" endif " gthhoh = "Get the heck out of here!" ++ ++let s:notslash = '\\\@" ++ endif ++ " In s:CleanUp(), we may need to check whether the cursor moved forward. ++ let startline = line(".") ++ let startcol = col(".") ++ " Use default behavior if called with a count or if no patterns are defined. ++ if v:count ++ exe "normal! " . v:count . "%" ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ elseif !exists("b:match_words") || b:match_words == "" ++ silent! normal! % ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ end ++ ++ " First step: if not already done, set the script variables ++ " s:do_BR flag for whether there are backrefs ++ " s:pat parsed version of b:match_words ++ " s:all regexp based on s:pat and the default groups ++ " ++ " Allow b:match_words = "GetVimMatchWords()" . ++ if b:match_words =~ ":" ++ let match_words = b:match_words ++ else ++ execute "let match_words =" b:match_words ++ endif ++" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion! ++ if (match_words != s:last_words) || (&mps != s:last_mps) || ++ \ exists("b:match_debug") ++ let s:last_words = match_words ++ let s:last_mps = &mps ++ if match_words !~ s:notslash . '\\\d' ++ let s:do_BR = 0 ++ let s:pat = match_words ++ else ++ let s:do_BR = 1 ++ let s:pat = s:ParseWords(match_words) ++ endif ++ " The next several lines were here before ++ " BF started messing with this script. ++ " quote the special chars in 'matchpairs', replace [,:] with \| and then ++ " append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif) ++ " let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+', ++ " \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>' ++ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . ++ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' ++ " s:all = pattern with all the keywords ++ let s:all = s:pat . (strlen(s:pat) ? "," : "") . default ++ let s:all = substitute(s:all, s:notslash . '\zs[,:]\+', '\\|', 'g') ++ let s:all = '\%(' . s:all . '\)' ++ " let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)' ++ if exists("b:match_debug") ++ let b:match_pat = s:pat ++ endif ++ endif ++ ++ " Second step: set the following local variables: ++ " matchline = line on which the cursor started ++ " curcol = number of characters before match ++ " prefix = regexp for start of line to start of match ++ " suffix = regexp for end of match to end of line ++ " Require match to end on or after the cursor and prefer it to ++ " start on or before the cursor. ++ let matchline = getline(startline) ++ if a:word != '' ++ " word given ++ if a:word !~ s:all ++ echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ endif ++ let matchline = a:word ++ let curcol = 0 ++ let prefix = '^\%(' ++ let suffix = '\)$' ++ " Now the case when "word" is not given ++ else " Find the match that ends on or after the cursor and set curcol. ++ let regexp = s:Wholematch(matchline, s:all, startcol-1) ++ let curcol = match(matchline, regexp) ++ let endcol = matchend(matchline, regexp) ++ let suf = strlen(matchline) - endcol ++ let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') ++ let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') ++ " If the match comes from the defaults, bail out. ++ if matchline !~ prefix . ++ \ substitute(s:pat, s:notslash.'\zs[,:]\+', '\\|', 'g') . suffix ++ silent! norm! % ++ return s:CleanUp(restore_options, a:mode, startline, startcol) ++ endif ++ endif ++ if exists("b:match_debug") ++ let b:match_match = matchstr(matchline, regexp) ++ let b:match_col = curcol+1 ++ endif ++ ++ " Third step: Find the group and single word that match, and the original ++ " (backref) versions of these. Then, resolve the backrefs. ++ " Set the following local variable: ++ " group = colon-separated list of patterns, one of which matches ++ " = ini:mid:fin or ini:fin ++ " ++ " Reconstruct the version with unresolved backrefs. ++ let patBR = substitute(match_words.',', ++ \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') ++ let patBR = substitute(patBR, s:notslash.'\zs:\{2,}', ':', 'g') ++ " Now, set group and groupBR to the matching group: 'if:endif' or ++ " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns ++ " group . "," . groupBR, and we pick it apart. ++ let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) ++ let i = matchend(group, s:notslash . ",") ++ let groupBR = strpart(group, i) ++ let group = strpart(group, 0, i-1) ++ " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix ++ if s:do_BR " Do the hard part: resolve those backrefs! ++ let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++ endif ++ if exists("b:match_debug") ++ let b:match_wholeBR = groupBR ++ let i = matchend(groupBR, s:notslash . ":") ++ let b:match_iniBR = strpart(groupBR, 0, i-1) ++ endif ++ ++ " Fourth step: Set the arguments for searchpair(). ++ let i = matchend(group, s:notslash . ":") ++ let j = matchend(group, '.*' . s:notslash . ":") ++ let ini = strpart(group, 0, i-1) ++ let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') ++ let fin = strpart(group, j) ++ "Un-escape the remaining , and : characters. ++ let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') ++ " searchpair() requires that these patterns avoid \(\) groups. ++ let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') ++ let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') ++ let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') ++ " Set mid. This is optimized for readability, not micro-efficiency! ++ if a:forward && matchline =~ prefix . fin . suffix ++ \ || !a:forward && matchline =~ prefix . ini . suffix ++ let mid = "" ++ endif ++ " Set flag. This is optimized for readability, not micro-efficiency! ++ if a:forward && matchline =~ prefix . fin . suffix ++ \ || !a:forward && matchline !~ prefix . ini . suffix ++ let flag = "bW" ++ else ++ let flag = "W" ++ endif ++ " Set skip. ++ if exists("b:match_skip") ++ let skip = b:match_skip ++ elseif exists("b:match_comment") " backwards compatibility and testing! ++ let skip = "r:" . b:match_comment ++ else ++ let skip = 's:comment\|string' ++ endif ++ let skip = s:ParseSkip(skip) ++ if exists("b:match_debug") ++ let b:match_ini = ini ++ let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin ++ endif ++ ++ " Fifth step: actually start moving the cursor and call searchpair(). ++ " Later, :execute restore_cursor to get to the original screen. ++ let restore_cursor = virtcol(".") . "|" ++ normal! g0 ++ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor ++ normal! H ++ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ execute restore_cursor ++ call cursor(0, curcol + 1) ++ " normal! 0 ++ " if curcol ++ " execute "normal!" . curcol . "l" ++ " endif ++ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) ++ let skip = "0" ++ else ++ execute "if " . skip . "| let skip = '0' | endif" ++ endif ++ let sp_return = searchpair(ini, mid, fin, flag, skip) ++ let final_position = "call cursor(" . line(".") . "," . col(".") . ")" ++ " Restore cursor position and original screen. ++ execute restore_cursor ++ normal! m' ++ if sp_return > 0 ++ execute final_position ++ endif ++ return s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin) ++endfun ++ ++" Restore options and do some special handling for Operator-pending mode. ++" The optional argument is the tail of the matching group. ++fun! s:CleanUp(options, mode, startline, startcol, ...) ++ execute "set" a:options ++ " Open folds, if appropriate. ++ if a:mode != "o" ++ if &foldopen =~ "percent" ++ normal! zv ++ endif ++ " In Operator-pending mode, we want to include the whole match ++ " (for example, d%). ++ " This is only a problem if we end up moving in the forward direction. ++ elseif (a:startline < line(".")) || ++ \ (a:startline == line(".") && a:startcol < col(".")) ++ if a:0 ++ " Check whether the match is a single character. If not, move to the ++ " end of the match. ++ let matchline = getline(".") ++ let currcol = col(".") ++ let regexp = s:Wholematch(matchline, a:1, currcol-1) ++ let endcol = matchend(matchline, regexp) ++ if endcol > currcol " This is NOT off by one! ++ execute "normal!" . (endcol - currcol) . "l" ++ endif ++ endif " a:0 ++ endif " a:mode != "o" && etc. ++ return 0 ++endfun ++ ++" Example (simplified HTML patterns): if ++" a:groupBR = '<\(\k\+\)>:' ++" a:prefix = '^.\{3}\(' ++" a:group = '<\(\k\+\)>:' ++" a:suffix = '\).\{2}$' ++" a:matchline = "12312" or "12312" ++" then extract "tag" from a:matchline and return ":" . ++fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++ if a:matchline !~ a:prefix . ++ \ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix ++ return a:group ++ endif ++ let i = matchend(a:groupBR, s:notslash . ':') ++ let ini = strpart(a:groupBR, 0, i-1) ++ let tailBR = strpart(a:groupBR, i) ++ let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, ++ \ a:groupBR) ++ let i = matchend(word, s:notslash . ":") ++ let wordBR = strpart(word, i) ++ let word = strpart(word, 0, i-1) ++ " Now, a:matchline =~ a:prefix . word . a:suffix ++ if wordBR != ini ++ let table = s:Resolve(ini, wordBR, "table") ++ else ++ " let table = "----------" ++ let table = "" ++ let d = 0 ++ while d < 10 ++ if tailBR =~ s:notslash . '\\' . d ++ " let table[d] = d ++ let table = table . d ++ else ++ let table = table . "-" ++ endif ++ let d = d + 1 ++ endwhile ++ endif ++ let d = 9 ++ while d ++ if table[d] != "-" ++ let backref = substitute(a:matchline, a:prefix.word.a:suffix, ++ \ '\'.table[d], "") ++ " Are there any other characters that should be escaped? ++ let backref = escape(backref, '*,:') ++ execute s:Ref(ini, d, "start", "len") ++ let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) ++ let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, ++ \ escape(backref, '\\'), 'g') ++ endif ++ let d = d-1 ++ endwhile ++ if exists("b:match_debug") ++ if s:do_BR ++ let b:match_table = table ++ let b:match_word = word ++ else ++ let b:match_table = "" ++ let b:match_word = "" ++ endif ++ endif ++ return ini . ":" . tailBR ++endfun ++ ++" Input a comma-separated list of groups with backrefs, such as ++" a:groups = '\(foo\):end\1,\(bar\):end\1' ++" and return a comma-separated list of groups with backrefs replaced: ++" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' ++fun! s:ParseWords(groups) ++ let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') ++ let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') ++ let parsed = "" ++ while groups =~ '[^,:]' ++ let i = matchend(groups, s:notslash . ':') ++ let j = matchend(groups, s:notslash . ',') ++ let ini = strpart(groups, 0, i-1) ++ let tail = strpart(groups, i, j-i-1) . ":" ++ let groups = strpart(groups, j) ++ let parsed = parsed . ini ++ let i = matchend(tail, s:notslash . ':') ++ while i != -1 ++ " In 'if:else:endif', ini='if' and word='else' and then word='endif'. ++ let word = strpart(tail, 0, i-1) ++ let tail = strpart(tail, i) ++ let i = matchend(tail, s:notslash . ':') ++ let parsed = parsed . ":" . s:Resolve(ini, word, "word") ++ endwhile " Now, tail has been used up. ++ let parsed = parsed . "," ++ endwhile " groups =~ '[^,:]' ++ return parsed ++endfun ++ ++" TODO I think this can be simplified and/or made more efficient. ++" TODO What should I do if a:start is out of range? ++" Return a regexp that matches all of a:string, such that ++" matchstr(a:string, regexp) represents the match for a:pat that starts ++" as close to a:start as possible, before being preferred to after, and ++" ends after a:start . ++" Usage: ++" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1) ++" let i = match(getline("."), regexp) ++" let j = matchend(getline("."), regexp) ++" let match = matchstr(getline("."), regexp) ++fun! s:Wholematch(string, pat, start) ++ let group = '\%(' . a:pat . '\)' ++ let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') ++ let len = strlen(a:string) ++ let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') ++ if a:string !~ prefix . group . suffix ++ let prefix = '' ++ endif ++ return prefix . group . suffix ++endfun ++ ++" No extra arguments: s:Ref(string, d) will ++" find the d'th occurrence of '\(' and return it, along with everything up ++" to and including the matching '\)'. ++" One argument: s:Ref(string, d, "start") returns the index of the start ++" of the d'th '\(' and any other argument returns the length of the group. ++" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be ++" executed, having the effect of ++" :let foo = s:Ref(string, d, "start") ++" :let bar = s:Ref(string, d, "len") ++fun! s:Ref(string, d, ...) ++ let len = strlen(a:string) ++ if a:d == 0 ++ let start = 0 ++ else ++ let cnt = a:d ++ let match = a:string ++ while cnt ++ let cnt = cnt - 1 ++ let index = matchend(match, s:notslash . '\\(') ++ if index == -1 ++ return "" ++ endif ++ let match = strpart(match, index) ++ endwhile ++ let start = len - strlen(match) ++ if a:0 == 1 && a:1 == "start" ++ return start - 2 ++ endif ++ let cnt = 1 ++ while cnt ++ let index = matchend(match, s:notslash . '\\(\|\\)') - 1 ++ if index == -2 ++ return "" ++ endif ++ " Increment if an open, decrement if a ')': ++ let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')' ++ " let cnt = stridx('0(', match[index]) + cnt ++ let match = strpart(match, index+1) ++ endwhile ++ let start = start - 2 ++ let len = len - start - strlen(match) ++ endif ++ if a:0 == 1 ++ return len ++ elseif a:0 == 2 ++ return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len ++ else ++ return strpart(a:string, start, len) ++ endif ++endfun ++ ++" Count the number of disjoint copies of pattern in string. ++" If the pattern is a literal string and contains no '0' or '1' characters ++" then s:Count(string, pattern, '0', '1') should be faster than ++" s:Count(string, pattern). ++fun! s:Count(string, pattern, ...) ++ let pat = escape(a:pattern, '\\') ++ if a:0 > 1 ++ let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") ++ let foo = substitute(a:string, pat, a:2, "g") ++ let foo = substitute(foo, '[^' . a:2 . ']', "", "g") ++ return strlen(foo) ++ endif ++ let result = 0 ++ let foo = a:string ++ let index = matchend(foo, pat) ++ while index != -1 ++ let result = result + 1 ++ let foo = strpart(foo, index) ++ let index = matchend(foo, pat) ++ endwhile ++ return result ++endfun ++ ++" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where ++" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first ++" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this ++" indicates that all other instances of '\1' in target are to be replaced ++" by '\3'. The hard part is dealing with nesting... ++" Note that ":" is an illegal character for source and target, ++" unless it is preceded by "\". ++fun! s:Resolve(source, target, output) ++ let word = a:target ++ let i = matchend(word, s:notslash . '\\\d') - 1 ++ let table = "----------" ++ while i != -2 " There are back references to be replaced. ++ let d = word[i] ++ let backref = s:Ref(a:source, d) ++ " The idea is to replace '\d' with backref. Before we do this, ++ " replace any \(\) groups in backref with :1, :2, ... if they ++ " correspond to the first, second, ... group already inserted ++ " into backref. Later, replace :1 with \1 and so on. The group ++ " number w+b within backref corresponds to the group number ++ " s within a:source. ++ " w = number of '\(' in word before the current one ++ let w = s:Count( ++ \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1') ++ let b = 1 " number of the current '\(' in backref ++ let s = d " number of the current '\(' in a:source ++ while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1') ++ \ && s < 10 ++ if table[s] == "-" ++ if w + b < 10 ++ " let table[s] = w + b ++ let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) ++ endif ++ let b = b + 1 ++ let s = s + 1 ++ else ++ execute s:Ref(backref, b, "start", "len") ++ let ref = strpart(backref, start, len) ++ let backref = strpart(backref, 0, start) . ":". table[s] ++ \ . strpart(backref, start+len) ++ let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') ++ endif ++ endwhile ++ let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) ++ let i = matchend(word, s:notslash . '\\\d') - 1 ++ endwhile ++ let word = substitute(word, s:notslash . '\zs:', '\\', 'g') ++ if a:output == "table" ++ return table ++ elseif a:output == "word" ++ return word ++ else ++ return table . word ++ endif ++endfun ++ ++" Assume a:comma = ",". Then the format for a:patterns and a:1 is ++" a:patterns = ",,..." ++" a:1 = ",,..." ++" If is the first pattern that matches a:string then return ++" if no optional arguments are given; return , if a:1 is given. ++fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) ++ let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) ++ let i = matchend(tail, s:notslash . a:comma) ++ if a:0 ++ let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) ++ let j = matchend(alttail, s:notslash . a:comma) ++ endif ++ let current = strpart(tail, 0, i-1) ++ if a:branch == "" ++ let currpat = current ++ else ++ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') ++ endif ++ while a:string !~ a:prefix . currpat . a:suffix ++ let tail = strpart(tail, i) ++ let i = matchend(tail, s:notslash . a:comma) ++ if i == -1 ++ return -1 ++ endif ++ let current = strpart(tail, 0, i-1) ++ if a:branch == "" ++ let currpat = current ++ else ++ let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') ++ endif ++ if a:0 ++ let alttail = strpart(alttail, j) ++ let j = matchend(alttail, s:notslash . a:comma) ++ endif ++ endwhile ++ if a:0 ++ let current = current . a:comma . strpart(alttail, 0, j-1) ++ endif ++ return current ++endfun ++ ++" Call this function to turn on debugging information. Every time the main ++" script is run, buffer variables will be saved. These can be used directly ++" or viewed using the menu items below. ++if !exists(":MatchDebug") ++ command! -nargs=0 MatchDebug call s:Match_debug() ++endif ++ ++fun! s:Match_debug() ++ let b:match_debug = 1 " Save debugging information. ++ " pat = all of b:match_words with backrefs parsed ++ amenu &Matchit.&pat :echo b:match_pat ++ " match = bit of text that is recognized as a match ++ amenu &Matchit.&match :echo b:match_match ++ " curcol = cursor column of the start of the matching text ++ amenu &Matchit.&curcol :echo b:match_col ++ " wholeBR = matching group, original version ++ amenu &Matchit.wh&oleBR :echo b:match_wholeBR ++ " iniBR = 'if' piece, original version ++ amenu &Matchit.ini&BR :echo b:match_iniBR ++ " ini = 'if' piece, with all backrefs resolved from match ++ amenu &Matchit.&ini :echo b:match_ini ++ " tail = 'else\|endif' piece, with all backrefs resolved from match ++ amenu &Matchit.&tail :echo b:match_tail ++ " fin = 'endif' piece, with all backrefs resolved from match ++ amenu &Matchit.&word :echo b:match_word ++ " '\'.d in ini refers to the same thing as '\'.table[d] in word. ++ amenu &Matchit.t&able :echo '0:' . b:match_table . ':9' ++endfun ++ ++" Jump to the nearest unmatched "(" or "if" or "" if a:spflag == "bW" ++" or the nearest unmatched "" or "endif" or ")" if a:spflag == "W". ++" Return a "mark" for the original position, so that ++" let m = MultiMatch("bW", "n") ... execute m ++" will return to the original position. If there is a problem, do not ++" move the cursor and return "", unless a count is given, in which case ++" go up or down as many levels as possible and again return "". ++" TODO This relies on the same patterns as % matching. It might be a good ++" idea to give it its own matching patterns. ++fun! s:MultiMatch(spflag, mode) ++ if !exists("b:match_words") || b:match_words == "" ++ return "" ++ end ++ let restore_options = (&ic ? "" : "no") . "ignorecase" ++ if exists("b:match_ignorecase") ++ let &ignorecase = b:match_ignorecase ++ endif ++ let startline = line(".") ++ let startcol = col(".") ++ ++ " First step: if not already done, set the script variables ++ " s:do_BR flag for whether there are backrefs ++ " s:pat parsed version of b:match_words ++ " s:all regexp based on s:pat and the default groups ++ " This part is copied and slightly modified from s:Match_wrapper(). ++ let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . ++ \ '\/\*:\*\/,#if\%(def\)\=:#else\>:#elif\>:#endif\>' ++ " Allow b:match_words = "GetVimMatchWords()" . ++ if b:match_words =~ ":" ++ let match_words = b:match_words ++ else ++ execute "let match_words =" b:match_words ++ endif ++ if (match_words != s:last_words) || (&mps != s:last_mps) || ++ \ exists("b:match_debug") ++ let s:last_words = match_words ++ let s:last_mps = &mps ++ if match_words !~ s:notslash . '\\\d' ++ let s:do_BR = 0 ++ let s:pat = match_words ++ else ++ let s:do_BR = 1 ++ let s:pat = s:ParseWords(match_words) ++ endif ++ let s:all = '\%(' . substitute(s:pat . (strlen(s:pat)?",":"") . default, ++ \ '[,:]\+','\\|','g') . '\)' ++ if exists("b:match_debug") ++ let b:match_pat = s:pat ++ endif ++ endif ++ ++ " Second step: figure out the patterns for searchpair() ++ " and save the screen, cursor position, and 'ignorecase'. ++ " - TODO: A lot of this is copied from s:Match_wrapper(). ++ " - maybe even more functionality should be split off ++ " - into separate functions! ++ let cdefault = (s:pat =~ '[^,]$' ? "," : "") . default ++ let open = substitute(s:pat . cdefault, ++ \ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g') ++ let open = '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '') ++ let close = substitute(s:pat . cdefault, ++ \ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g') ++ let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)' ++ if exists("b:match_skip") ++ let skip = b:match_skip ++ elseif exists("b:match_comment") " backwards compatibility and testing! ++ let skip = "r:" . b:match_comment ++ else ++ let skip = 's:comment\|string' ++ endif ++ let skip = s:ParseSkip(skip) ++ " let restore_cursor = line(".") . "G" . virtcol(".") . "|" ++ " normal! H ++ " let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ let restore_cursor = virtcol(".") . "|" ++ normal! g0 ++ let restore_cursor = line(".") . "G" . virtcol(".") . "|zs" . restore_cursor ++ normal! H ++ let restore_cursor = "normal!" . line(".") . "Gzt" . restore_cursor ++ execute restore_cursor ++ ++ " Third step: call searchpair(). ++ " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. ++ let openpat = substitute(open, '\(\\\@" or ... ++" and return "endif" or "endwhile" or "" or ... . ++" For now, this uses b:match_words and the same script variables ++" as s:Match_wrapper() . Later, it may get its own patterns, ++" either from a buffer variable or passed as arguments. ++" fun! s:Autocomplete() ++" echo "autocomplete not yet implemented :-(" ++" if !exists("b:match_words") || b:match_words == "" ++" return "" ++" end ++" let startpos = s:MultiMatch("bW") ++" ++" if startpos == "" ++" return "" ++" endif ++" " - TODO: figure out whether 'if' or '' matched, and construct ++" " - the appropriate closing. ++" let matchline = getline(".") ++" let curcol = col(".") - 1 ++" " - TODO: Change the s:all argument if there is a new set of match pats. ++" let regexp = s:Wholematch(matchline, s:all, curcol) ++" let suf = strlen(matchline) - matchend(matchline, regexp) ++" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(') ++" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$') ++" " Reconstruct the version with unresolved backrefs. ++" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g') ++" let patBR = substitute(patBR, ':\{2,}', ':', "g") ++" " Now, set group and groupBR to the matching group: 'if:endif' or ++" " 'while:endwhile' or whatever. ++" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) ++" let i = matchend(group, s:notslash . ",") ++" let groupBR = strpart(group, i) ++" let group = strpart(group, 0, i-1) ++" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix ++" if s:do_BR ++" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) ++" endif ++" " let g:group = group ++" ++" " - TODO: Construct the closing from group. ++" let fake = "end" . expand("") ++" execute startpos ++" return fake ++" endfun ++ ++" Close all open structures. "Get the heck out of here!" ++" fun! s:Gthhoh() ++" let close = s:Autocomplete() ++" while strlen(close) ++" put=close ++" let close = s:Autocomplete() ++" endwhile ++" endfun ++ ++" Parse special strings as typical skip arguments for searchpair(): ++" s:foo becomes (current syntax item) =~ foo ++" S:foo becomes (current syntax item) !~ foo ++" r:foo becomes (line before cursor) =~ foo ++" R:foo becomes (line before cursor) !~ foo ++fun! s:ParseSkip(str) ++ let skip = a:str ++ if skip[1] == ":" ++ if skip[0] == "s" ++ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . ++ \ strpart(skip,2) . "'" ++ elseif skip[0] == "S" ++ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . ++ \ strpart(skip,2) . "'" ++ elseif skip[0] == "r" ++ let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" ++ elseif skip[0] == "R" ++ let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'" ++ endif ++ endif ++ return skip ++endfun ++ ++let &cpo = s:save_cpo ++ ++" vim:sts=2:sw=2: +diff -urN vim71/runtime/plugin/taglist.vim vim71_ada/runtime/plugin/taglist.vim +--- vim71/runtime/plugin/taglist.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/plugin/taglist.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,4524 @@ ++" File: taglist.vim ++" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) ++" Version: 4.3 ++" Last Modified: February 18, 2007 ++" Copyright: Copyright (C) 2002-2006 Yegappan Lakshmanan ++" Permission is hereby granted to use and distribute this code, ++" with or without modifications, provided that this copyright ++" notice is copied with it. Like anything else that's free, ++" taglist.vim is provided *as is* and comes with no warranty of any ++" kind, either expressed or implied. In no event will the copyright ++" holder be liable for any damamges resulting from the use of this ++" software. ++" ++" The "Tag List" plugin is a source code browser plugin for Vim and provides ++" an overview of the structure of the programming language files and allows ++" you to efficiently browse through source code files for different ++" programming languages. You can visit the taglist plugin home page for more ++" information: ++" ++" http://vim-taglist.sourceforge.net ++" ++" You can subscribe to the taglist mailing list to post your questions ++" or suggestions for improvement or to report bugs. Visit the following ++" page for subscribing to the mailing list: ++" ++" http://groups.yahoo.com/group/taglist/ ++" ++" For more information about using this plugin, after installing the ++" taglist plugin, use the ":help taglist" command. ++" ++" Installation ++" ------------ ++" 1. Download the taglist.zip file and unzip the files to the $HOME/.vim ++" or the $HOME/vimfiles or the $VIM/vimfiles directory. This should ++" unzip the following two files (the directory structure should be ++" preserved): ++" ++" plugin/taglist.vim - main taglist plugin file ++" doc/taglist.txt - documentation (help) file ++" ++" Refer to the 'add-plugin', 'add-global-plugin' and 'runtimepath' ++" Vim help pages for more details about installing Vim plugins. ++" 2. Change to the $HOME/.vim/doc or $HOME/vimfiles/doc or ++" $VIM/vimfiles/doc directory, start Vim and run the ":helptags ." ++" command to process the taglist help file. ++" 3. If the exuberant ctags utility is not present in your PATH, then set the ++" Tlist_Ctags_Cmd variable to point to the location of the exuberant ctags ++" utility (not to the directory) in the .vimrc file. ++" 4. If you are running a terminal/console version of Vim and the ++" terminal doesn't support changing the window width then set the ++" 'Tlist_Inc_Winwidth' variable to 0 in the .vimrc file. ++" 5. Restart Vim. ++" 6. You can now use the ":TlistToggle" command to open/close the taglist ++" window. You can use the ":help taglist" command to get more ++" information about using the taglist plugin. ++" ++" ****************** Do not modify after this line ************************ ++ ++" Line continuation used here ++let s:cpo_save = &cpo ++set cpo&vim ++ ++if !exists('loaded_taglist') ++ " First time loading the taglist plugin ++ " ++ " To speed up the loading of Vim, the taglist plugin uses autoload ++ " mechanism to load the taglist functions. ++ " Only define the configuration variables, user commands and some ++ " auto-commands and finish sourcing the file ++ ++ " The taglist plugin requires the built-in Vim system() function. If this ++ " function is not available, then don't load the plugin. ++ if !exists('*system') ++ echomsg 'Taglist: Vim system() built-in function is not available. ' . ++ \ 'Plugin is not loaded.' ++ let loaded_taglist = 'no' ++ let &cpo = s:cpo_save ++ finish ++ endif ++ ++ " Location of the exuberant ctags tool ++ if !exists('Tlist_Ctags_Cmd') ++ if executable('exuberant-ctags') ++ " On Debian Linux, exuberant ctags is installed ++ " as exuberant-ctags ++ let Tlist_Ctags_Cmd = 'exuberant-ctags' ++ elseif executable(' exctags') ++ " On Free-BSD, exuberant ctags is installed as exctags ++ let Tlist_Ctags_ Cmd = 'exctags' ++ elseif executable('ctags') ++ let Tlist_Ctags_Cmd = 'ctags' ++ elseif executable('ctags.exe') ++ let Tlist_Ctags_Cmd = 'ctags.exe' ++ elseif executable('tags') ++ let Tlist_Ctags_Cmd = 'tags' ++ else ++ " echomsg 'Taglist: Exuberant ctags (http://ctags.sf.net) ' . ++ " \ 'not found in PATH. Plugin is not loaded.' ++ " Skip loading the plugin ++ let loaded_taglist = 'no' ++ let &cpo = s:cpo_save ++ finish ++ endif ++ endif ++ ++ ++ " Automatically open the taglist window on Vim startup ++ if !exists('Tlist_Auto_Open') ++ let Tlist_Auto_Open = 0 ++ endif ++ ++ " When the taglist window is toggle opened, move the cursor to the ++ " taglist window ++ if !exists('Tlist_GainFocus_On_ToggleOpen') ++ let Tlist_GainFocus_On_ToggleOpen = 0 ++ endif ++ ++ " Process files even when the taglist window is not open ++ if !exists('Tlist_Process_File_Always') ++ let Tlist_Process_File_Always = 0 ++ endif ++ ++ if !exists('Tlist_Show_Menu') ++ let Tlist_Show_Menu = 0 ++ endif ++ ++ " Tag listing sort type - 'name' or 'order' ++ if !exists('Tlist_Sort_Type') ++ let Tlist_Sort_Type = 'order' ++ endif ++ ++ " Tag listing window split (horizontal/vertical) control ++ if !exists('Tlist_Use_Horiz_Window') ++ let Tlist_Use_Horiz_Window = 0 ++ endif ++ ++ " Open the vertically split taglist window on the left or on the right ++ " side. This setting is relevant only if Tlist_Use_Horiz_Window is set to ++ " zero (i.e. only for vertically split windows) ++ if !exists('Tlist_Use_Right_Window') ++ let Tlist_Use_Right_Window = 0 ++ endif ++ ++ " Increase Vim window width to display vertically split taglist window. ++ " For MS-Windows version of Vim running in a MS-DOS window, this must be ++ " set to 0 otherwise the system may hang due to a Vim limitation. ++ if !exists('Tlist_Inc_Winwidth') ++ if (has('win16') || has('win95')) && !has('gui_running') ++ let Tlist_Inc_Winwidth = 0 ++ else ++ let Tlist_Inc_Winwidth = 1 ++ endif ++ endif ++ ++ " Vertically split taglist window width setting ++ if !exists('Tlist_WinWidth') ++ let Tlist_WinWidth = 30 ++ endif ++ ++ " Horizontally split taglist window height setting ++ if !exists('Tlist_WinHeight') ++ let Tlist_WinHeight = 10 ++ endif ++ ++ " Display tag prototypes or tag names in the taglist window ++ if !exists('Tlist_Display_Prototype') ++ let Tlist_Display_Prototype = 0 ++ endif ++ ++ " Display tag scopes in the taglist window ++ if !exists('Tlist_Display_Tag_Scope') ++ let Tlist_Display_Tag_Scope = 1 ++ endif ++ ++ " Use single left mouse click to jump to a tag. By default this is disabled. ++ " Only double click using the mouse will be processed. ++ if !exists('Tlist_Use_SingleClick') ++ let Tlist_Use_SingleClick = 0 ++ endif ++ ++ " Control whether additional help is displayed as part of the taglist or ++ " not. Also, controls whether empty lines are used to separate the tag ++ " tree. ++ if !exists('Tlist_Compact_Format') ++ let Tlist_Compact_Format = 0 ++ endif ++ ++ " Exit Vim if only the taglist window is currently open. By default, this is ++ " set to zero. ++ if !exists('Tlist_Exit_OnlyWindow') ++ let Tlist_Exit_OnlyWindow = 0 ++ endif ++ ++ " Automatically close the folds for the non-active files in the taglist ++ " window ++ if !exists('Tlist_File_Fold_Auto_Close') ++ let Tlist_File_Fold_Auto_Close = 0 ++ endif ++ ++ " Close the taglist window when a tag is selected ++ if !exists('Tlist_Close_On_Select') ++ let Tlist_Close_On_Select = 0 ++ endif ++ ++ " Automatically update the taglist window to display tags for newly ++ " edited files ++ if !exists('Tlist_Auto_Update') ++ let Tlist_Auto_Update = 1 ++ endif ++ ++ " Automatically highlight the current tag ++ if !exists('Tlist_Auto_Highlight_Tag') ++ let Tlist_Auto_Highlight_Tag = 1 ++ endif ++ ++ " Automatically highlight the current tag on entering a buffer ++ if !exists('Tlist_Highlight_Tag_On_BufEnter') ++ let Tlist_Highlight_Tag_On_BufEnter = 1 ++ endif ++ ++ " Enable fold column to display the folding for the tag tree ++ if !exists('Tlist_Enable_Fold_Column') ++ let Tlist_Enable_Fold_Column = 1 ++ endif ++ ++ " Display the tags for only one file in the taglist window ++ if !exists('Tlist_Show_One_File') ++ let Tlist_Show_One_File = 0 ++ endif ++ ++ if !exists('Tlist_Max_Submenu_Items') ++ let Tlist_Max_Submenu_Items = 20 ++ endif ++ ++ if !exists('Tlist_Max_Tag_Length') ++ let Tlist_Max_Tag_Length = 10 ++ endif ++ ++ " Do not change the name of the taglist title variable. The winmanager ++ " plugin relies on this name to determine the title for the taglist ++ " plugin. ++ let TagList_title = "__Tag_List__" ++ ++ " Taglist debug messages ++ let s:tlist_msg = '' ++ ++ " Define the taglist autocommand to automatically open the taglist window ++ " on Vim startup ++ if g:Tlist_Auto_Open ++ autocmd VimEnter * nested call s:Tlist_Window_Check_Auto_Open() ++ endif ++ ++ " Refresh the taglist ++ if g:Tlist_Process_File_Always ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ ++ if g:Tlist_Show_Menu ++ autocmd GUIEnter * call s:Tlist_Menu_Init() ++ endif ++ ++ " When the taglist buffer is created when loading a Vim session file, ++ " the taglist buffer needs to be initialized. The BufFilePost event ++ " is used to handle this case. ++ autocmd BufFilePost __Tag_List__ call s:Tlist_Vim_Session_Load() ++ ++ " Define the user commands to manage the taglist window ++ command! -nargs=0 -bar TlistToggle call s:Tlist_Window_Toggle() ++ command! -nargs=0 -bar TlistOpen call s:Tlist_Window_Open() ++ " For backwards compatiblity define the Tlist command ++ command! -nargs=0 -bar Tlist TlistToggle ++ command! -nargs=+ -complete=file TlistAddFiles ++ \ call s:Tlist_Add_Files() ++ command! -nargs=+ -complete=dir TlistAddFilesRecursive ++ \ call s:Tlist_Add_Files_Recursive() ++ command! -nargs=0 -bar TlistClose call s:Tlist_Window_Close() ++ command! -nargs=0 -bar TlistUpdate call s:Tlist_Update_Current_File() ++ command! -nargs=0 -bar TlistHighlightTag call s:Tlist_Window_Highlight_Tag( ++ \ fnamemodify(bufname('%'), ':p'), line('.'), 2, 1) ++ " For backwards compatiblity define the TlistSync command ++ command! -nargs=0 -bar TlistSync TlistHighlightTag ++ command! -nargs=* -complete=buffer TlistShowPrototype ++ \ echo Tlist_Get_Tag_Prototype_By_Line() ++ command! -nargs=* -complete=buffer TlistShowTag ++ \ echo Tlist_Get_Tagname_By_Line() ++ command! -nargs=* -complete=file TlistSessionLoad ++ \ call s:Tlist_Session_Load() ++ command! -nargs=* -complete=file TlistSessionSave ++ \ call s:Tlist_Session_Save() ++ command! -bar TlistLock let Tlist_Auto_Update=0 ++ command! -bar TlistUnlock let Tlist_Auto_Update=1 ++ ++ " Commands for enabling/disabling debug and to display debug messages ++ command! -nargs=? -complete=file -bar TlistDebug ++ \ call s:Tlist_Debug_Enable() ++ command! -nargs=0 -bar TlistUndebug call s:Tlist_Debug_Disable() ++ command! -nargs=0 -bar TlistMessages call s:Tlist_Debug_Show() ++ ++ " Define autocommands to autoload the taglist plugin when needed. ++ ++ " Trick to get the current script ID ++ map xx xx ++ let s:tlist_sid = substitute(maparg('xx'), '\(\d\+_\)xx$', ++ \ '\1', '') ++ unmap xx ++ ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Window_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined *' . s:tlist_sid . 'Tlist_Menu_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined Tlist_* source ' . ++ \ escape(expand(''), ' ') ++ exe 'autocmd FuncUndefined TagList_* source ' . ++ \ escape(expand(''), ' ') ++ ++ let loaded_taglist = 'fast_load_done' ++ ++ if g:Tlist_Show_Menu && has('gui_running') ++ call s:Tlist_Menu_Init() ++ endif ++ ++ " restore 'cpo' ++ let &cpo = s:cpo_save ++ finish ++endif ++ ++if !exists('s:tlist_sid') ++ " Two or more versions of taglist plugin are installed. Don't ++ " load this version of the plugin. ++ finish ++endif ++ ++unlet! s:tlist_sid ++ ++if loaded_taglist != 'fast_load_done' ++ " restore 'cpo' ++ let &cpo = s:cpo_save ++ finish ++endif ++ ++" Taglist plugin functionality is available ++let loaded_taglist = 'available' ++ ++"------------------- end of user configurable options -------------------- ++ ++" Default language specific settings for supported file types and tag types ++" ++" Variable name format: ++" ++" s:tlist_def_{vim_ftype}_settings ++" ++" vim_ftype - Filetype detected by Vim ++" ++" Value format: ++" ++" ;:;:;... ++" ++" ctags_ftype - File type supported by exuberant ctags ++" flag - Flag supported by exuberant ctags to generate a tag type ++" name - Name of the tag type used in the taglist window to display the ++" tags of this type ++" ++ ++" Ada language ++let s:tlist_def_ada_settings = 'ada;' . ++ \ 'P:package spec;' . ++ \ 'p:package body;' . ++ \ 'T:type spec;' . ++ \ 't:type;' . ++ \ 'U:subtype spec;' . ++ \ 'u:subtype;' . ++ \ 'c:component;' . ++ \ 'l:literal;' . ++ \ 'V:variable spec;' . ++ \ 'v:variable;' . ++ \ 'f:formal;' . ++ \ 'n:constant;' . ++ \ 'x:exception;' . ++ \ 'R:subprogram spec;' . ++ \ 'r:subprogram body;' . ++ \ 'K:task spec;' . ++ \ 'k:task body;' . ++ \ 'O:protected spec;' . ++ \ 'o:protected body;' . ++ \ 'E:entry spec;' . ++ \ 'e:entry body;' . ++ \ 'b:label;' . ++ \ 'i:identifier;' . ++ \ 'a:autovar;' . ++ \ 'y:annon' ++ ++" assembly language ++let s:tlist_def_asm_settings = 'asm;d:define;l:label;m:macro;t:type' ++ ++" aspperl language ++let s:tlist_def_aspperl_settings = 'asp;f:function;s:sub;v:variable' ++ ++" aspvbs language ++let s:tlist_def_aspvbs_settings = 'asp;f:function;s:sub;v:variable' ++ ++" awk language ++let s:tlist_def_awk_settings = 'awk;f:function' ++ ++" beta language ++let s:tlist_def_beta_settings = 'beta;f:fragment;s:slot;v:pattern' ++ ++" c language ++let s:tlist_def_c_settings = 'c;d:macro;g:enum;s:struct;u:union;t:typedef;' . ++ \ 'v:variable;f:function' ++ ++" c++ language ++let s:tlist_def_cpp_settings = 'c++;n:namespace;v:variable;d:macro;t:typedef;' . ++ \ 'c:class;g:enum;s:struct;u:union;f:function' ++ ++" c# language ++let s:tlist_def_cs_settings = 'c#;d:macro;t:typedef;n:namespace;c:class;' . ++ \ 'E:event;g:enum;s:struct;i:interface;' . ++ \ 'p:properties;m:method' ++ ++" cobol language ++let s:tlist_def_cobol_settings = 'cobol;d:data;f:file;g:group;p:paragraph;' . ++ \ 'P:program;s:section' ++ ++" eiffel language ++let s:tlist_def_eiffel_settings = 'eiffel;c:class;f:feature' ++ ++" erlang language ++let s:tlist_def_erlang_settings = 'erlang;d:macro;r:record;m:module;f:function' ++ ++" expect (same as tcl) language ++let s:tlist_def_expect_settings = 'tcl;c:class;f:method;p:procedure' ++ ++" fortran language ++let s:tlist_def_fortran_settings = 'fortran;p:program;b:block data;' . ++ \ 'c:common;e:entry;i:interface;k:type;l:label;m:module;' . ++ \ 'n:namelist;t:derived;v:variable;f:function;s:subroutine' ++ ++" HTML language ++let s:tlist_def_html_settings = 'html;a:anchor;f:javascript function' ++ ++" java language ++let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' . ++ \ 'f:field;m:method' ++ ++" javascript language ++let s:tlist_def_javascript_settings = 'javascript;f:function' ++ ++" lisp language ++let s:tlist_def_lisp_settings = 'lisp;f:function' ++ ++" lua language ++let s:tlist_def_lua_settings = 'lua;f:function' ++ ++" makefiles ++let s:tlist_def_make_settings = 'make;m:macro' ++ ++" pascal language ++let s:tlist_def_pascal_settings = 'pascal;f:function;p:procedure' ++ ++" perl language ++let s:tlist_def_perl_settings = 'perl;c:constant;l:label;p:package;s:subroutine' ++ ++" php language ++let s:tlist_def_php_settings = 'php;c:class;d:constant;v:variable;f:function' ++ ++" python language ++let s:tlist_def_python_settings = 'python;c:class;m:member;f:function' ++ ++" rexx language ++let s:tlist_def_rexx_settings = 'rexx;s:subroutine' ++ ++" ruby language ++let s:tlist_def_ruby_settings = 'ruby;c:class;f:method;F:function;' . ++ \ 'm:singleton method' ++ ++" scheme language ++let s:tlist_def_scheme_settings = 'scheme;s:set;f:function' ++ ++" shell language ++let s:tlist_def_sh_settings = 'sh;f:function' ++ ++" C shell language ++let s:tlist_def_csh_settings = 'sh;f:function' ++ ++" Z shell language ++let s:tlist_def_zsh_settings = 'sh;f:function' ++ ++" slang language ++let s:tlist_def_slang_settings = 'slang;n:namespace;f:function' ++ ++" sml language ++let s:tlist_def_sml_settings = 'sml;e:exception;c:functor;s:signature;' . ++ \ 'r:structure;t:type;v:value;f:function' ++ ++" sql language ++let s:tlist_def_sql_settings = 'sql;c:cursor;F:field;P:package;r:record;' . ++ \ 's:subtype;t:table;T:trigger;v:variable;f:function;p:procedure' ++ ++" tcl language ++let s:tlist_def_tcl_settings = 'tcl;c:class;f:method;m:method;p:procedure' ++ ++" vera language ++let s:tlist_def_vera_settings = 'vera;c:class;d:macro;e:enumerator;' . ++ \ 'f:function;g:enum;m:member;p:program;' . ++ \ 'P:prototype;t:task;T:typedef;v:variable;' . ++ \ 'x:externvar' ++ ++"verilog language ++let s:tlist_def_verilog_settings = 'verilog;m:module;c:constant;P:parameter;' . ++ \ 'e:event;r:register;t:task;w:write;p:port;v:variable;f:function' ++ ++" vim language ++let s:tlist_def_vim_settings = 'vim;a:autocmds;v:variable;f:function' ++ ++" yacc language ++let s:tlist_def_yacc_settings = 'yacc;l:label' ++ ++"------------------- end of language specific options -------------------- ++ ++" Vim window size is changed by the taglist plugin or not ++let s:tlist_winsize_chgd = -1 ++" Taglist window is maximized or not ++let s:tlist_win_maximized = 0 ++" Name of files in the taglist ++let s:tlist_file_names='' ++" Number of files in the taglist ++let s:tlist_file_count = 0 ++" Number of filetypes supported by taglist ++let s:tlist_ftype_count = 0 ++" Is taglist part of other plugins like winmanager or cream? ++let s:tlist_app_name = "none" ++" Are we displaying brief help text ++let s:tlist_brief_help = 1 ++" List of files removed on user request ++let s:tlist_removed_flist = "" ++" Index of current file displayed in the taglist window ++let s:tlist_cur_file_idx = -1 ++" Taglist menu is empty or not ++let s:tlist_menu_empty = 1 ++ ++" An autocommand is used to refresh the taglist window when entering any ++" buffer. We don't want to refresh the taglist window if we are entering the ++" file window from one of the taglist functions. The 'Tlist_Skip_Refresh' ++" variable is used to skip the refresh of the taglist window and is set ++" and cleared appropriately. ++let s:Tlist_Skip_Refresh = 0 ++ ++" Tlist_Window_Display_Help() ++function! s:Tlist_Window_Display_Help() ++ if s:tlist_app_name == "winmanager" ++ " To handle a bug in the winmanager plugin, add a space at the ++ " last line ++ call setline('$', ' ') ++ endif ++ ++ if s:tlist_brief_help ++ " Add the brief help ++ call append(0, '" Press to display help text') ++ else ++ " Add the extensive help ++ call append(0, '" : Jump to tag definition') ++ call append(1, '" o : Jump to tag definition in new window') ++ call append(2, '" p : Preview the tag definition') ++ call append(3, '" : Display tag prototype') ++ call append(4, '" u : Update tag list') ++ call append(5, '" s : Select sort field') ++ call append(6, '" d : Remove file from taglist') ++ call append(7, '" x : Zoom-out/Zoom-in taglist window') ++ call append(8, '" + : Open a fold') ++ call append(9, '" - : Close a fold') ++ call append(10, '" * : Open all folds') ++ call append(11, '" = : Close all folds') ++ call append(12, '" [[ : Move to the start of previous file') ++ call append(13, '" ]] : Move to the start of next file') ++ call append(14, '" q : Close the taglist window') ++ call append(15, '" : Remove help text') ++ endif ++endfunction ++ ++" Tlist_Window_Toggle_Help_Text() ++" Toggle taglist plugin help text between the full version and the brief ++" version ++function! s:Tlist_Window_Toggle_Help_Text() ++ if g:Tlist_Compact_Format ++ " In compact display mode, do not display help ++ return ++ endif ++ ++ " Include the empty line displayed after the help text ++ let brief_help_size = 1 ++ let full_help_size = 16 ++ ++ setlocal modifiable ++ ++ " Set report option to a huge value to prevent informational messages ++ " while deleting the lines ++ let old_report = &report ++ set report=99999 ++ ++ " Remove the currently highlighted tag. Otherwise, the help text ++ " might be highlighted by mistake ++ match none ++ ++ " Toggle between brief and full help text ++ if s:tlist_brief_help ++ let s:tlist_brief_help = 0 ++ ++ " Remove the previous help ++ exe '1,' . brief_help_size . ' delete _' ++ ++ " Adjust the start/end line numbers for the files ++ call s:Tlist_Window_Update_Line_Offsets(0, 1, full_help_size - brief_help_size) ++ else ++ let s:tlist_brief_help = 1 ++ ++ " Remove the previous help ++ exe '1,' . full_help_size . ' delete _' ++ ++ " Adjust the start/end line numbers for the files ++ call s:Tlist_Window_Update_Line_Offsets(0, 0, full_help_size - brief_help_size) ++ endif ++ ++ call s:Tlist_Window_Display_Help() ++ ++ " Restore the report option ++ let &report = old_report ++ ++ setlocal nomodifiable ++endfunction ++ ++" Taglist debug support ++let s:tlist_debug = 0 ++ ++" File for storing the debug messages ++let s:tlist_debug_file = '' ++ ++" Tlist_Debug_Enable ++" Enable logging of taglist debug messages. ++function! s:Tlist_Debug_Enable(...) ++ let s:tlist_debug = 1 ++ ++ " Check whether a valid file name is supplied. ++ if a:1 != '' ++ let s:tlist_debug_file = fnamemodify(a:1, ':p') ++ ++ " Empty the log file ++ exe 'redir! > ' . s:tlist_debug_file ++ redir END ++ ++ " Check whether the log file is present/created ++ if !filewritable(s:tlist_debug_file) ++ call s:Tlist_Warning_Msg('Taglist: Unable to create log file ' ++ \ . s:tlist_debug_file) ++ let s:tlist_debug_file = '' ++ endif ++ endif ++endfunction ++ ++" Tlist_Debug_Disable ++" Disable logging of taglist debug messages. ++function! s:Tlist_Debug_Disable(...) ++ let s:tlist_debug = 0 ++ let s:tlist_debug_file = '' ++endfunction ++ ++" Tlist_Debug_Show ++" Display the taglist debug messages in a new window ++function! s:Tlist_Debug_Show() ++ if s:tlist_msg == '' ++ call s:Tlist_Warning_Msg('Taglist: No debug messages') ++ return ++ endif ++ ++ " Open a new window to display the taglist debug messages ++ new taglist_debug.txt ++ " Delete all the lines (if the buffer already exists) ++ silent! %delete _ ++ " Add the messages ++ silent! put =s:tlist_msg ++ " Move the cursor to the first line ++ normal! gg ++endfunction ++ ++" Tlist_Log_Msg ++" Log the supplied debug message along with the time ++function! s:Tlist_Log_Msg(msg) ++ if s:tlist_debug ++ if s:tlist_debug_file != '' ++ exe 'redir >> ' . s:tlist_debug_file ++ silent echon strftime('%H:%M:%S') . ': ' . a:msg . "\n" ++ redir END ++ else ++ " Log the message into a variable ++ " Retain only the last 3000 characters ++ let len = strlen(s:tlist_msg) ++ if len > 3000 ++ let s:tlist_msg = strpart(s:tlist_msg, len - 3000) ++ endif ++ let s:tlist_msg = s:tlist_msg . strftime('%H:%M:%S') . ': ' . ++ \ a:msg . "\n" ++ endif ++ endif ++endfunction ++ ++" Tlist_Warning_Msg() ++" Display a message using WarningMsg highlight group ++function! s:Tlist_Warning_Msg(msg) ++ echohl WarningMsg ++ echomsg a:msg ++ echohl None ++endfunction ++ ++" Last returned file index for file name lookup. ++" Used to speed up file lookup ++let s:tlist_file_name_idx_cache = -1 ++ ++" Tlist_Get_File_Index() ++" Return the index of the specified filename ++function! s:Tlist_Get_File_Index(fname) ++ if s:tlist_file_count == 0 || a:fname == '' ++ return -1 ++ endif ++ ++ " If the new filename is same as the last accessed filename, then ++ " return that index ++ if s:tlist_file_name_idx_cache != -1 && ++ \ s:tlist_file_name_idx_cache < s:tlist_file_count ++ if s:tlist_{s:tlist_file_name_idx_cache}_filename == a:fname ++ " Same as the last accessed file ++ return s:tlist_file_name_idx_cache ++ endif ++ endif ++ ++ " First, check whether the filename is present ++ let s_fname = a:fname . "\n" ++ let i = stridx(s:tlist_file_names, s_fname) ++ if i == -1 ++ let s:tlist_file_name_idx_cache = -1 ++ return -1 ++ endif ++ ++ " Second, compute the file name index ++ let nl_txt = substitute(strpart(s:tlist_file_names, 0, i), "[^\n]", '', 'g') ++ let s:tlist_file_name_idx_cache = strlen(nl_txt) ++ return s:tlist_file_name_idx_cache ++endfunction ++ ++" Last returned file index for line number lookup. ++" Used to speed up file lookup ++let s:tlist_file_lnum_idx_cache = -1 ++ ++" Tlist_Window_Get_File_Index_By_Linenum() ++" Return the index of the filename present in the specified line number ++" Line number refers to the line number in the taglist window ++function! s:Tlist_Window_Get_File_Index_By_Linenum(lnum) ++ call s:Tlist_Log_Msg('Tlist_Window_Get_File_Index_By_Linenum (' . a:lnum . ')') ++ ++ " First try to see whether the new line number is within the range ++ " of the last returned file ++ if s:tlist_file_lnum_idx_cache != -1 && ++ \ s:tlist_file_lnum_idx_cache < s:tlist_file_count ++ if a:lnum >= s:tlist_{s:tlist_file_lnum_idx_cache}_start && ++ \ a:lnum <= s:tlist_{s:tlist_file_lnum_idx_cache}_end ++ return s:tlist_file_lnum_idx_cache ++ endif ++ endif ++ ++ let fidx = -1 ++ ++ if g:Tlist_Show_One_File ++ " Displaying only one file in the taglist window. Check whether ++ " the line is within the tags displayed for that file ++ if s:tlist_cur_file_idx != -1 ++ if a:lnum >= s:tlist_{s:tlist_cur_file_idx}_start ++ \ && a:lnum <= s:tlist_{s:tlist_cur_file_idx}_end ++ let fidx = s:tlist_cur_file_idx ++ endif ++ ++ endif ++ else ++ " Do a binary search in the taglist ++ let left = 0 ++ let right = s:tlist_file_count - 1 ++ ++ while left < right ++ let mid = (left + right) / 2 ++ ++ if a:lnum >= s:tlist_{mid}_start && a:lnum <= s:tlist_{mid}_end ++ let s:tlist_file_lnum_idx_cache = mid ++ return mid ++ endif ++ ++ if a:lnum < s:tlist_{mid}_start ++ let right = mid - 1 ++ else ++ let left = mid + 1 ++ endif ++ endwhile ++ ++ if left >= 0 && left < s:tlist_file_count ++ \ && a:lnum >= s:tlist_{left}_start ++ \ && a:lnum <= s:tlist_{left}_end ++ let fidx = left ++ endif ++ endif ++ ++ let s:tlist_file_lnum_idx_cache = fidx ++ ++ return fidx ++endfunction ++ ++" Tlist_Exe_Cmd_No_Acmds ++" Execute the specified Ex command after disabling autocommands ++function! s:Tlist_Exe_Cmd_No_Acmds(cmd) ++ let old_eventignore = &eventignore ++ set eventignore=all ++ exe a:cmd ++ let &eventignore = old_eventignore ++endfunction ++ ++" Tlist_Skip_File() ++" Check whether tag listing is supported for the specified file ++function! s:Tlist_Skip_File(filename, ftype) ++ " Skip buffers with no names and buffers with filetype not set ++ if a:filename == '' || a:ftype == '' ++ return 1 ++ endif ++ ++ " Skip files which are not supported by exuberant ctags ++ " First check whether default settings for this filetype are available. ++ " If it is not available, then check whether user specified settings are ++ " available. If both are not available, then don't list the tags for this ++ " filetype ++ let var = 's:tlist_def_' . a:ftype . '_settings' ++ if !exists(var) ++ let var = 'g:tlist_' . a:ftype . '_settings' ++ if !exists(var) ++ return 1 ++ endif ++ endif ++ ++ " Skip files which are not readable or files which are not yet stored ++ " to the disk ++ if !filereadable(a:filename) ++ return 1 ++ endif ++ ++ return 0 ++endfunction ++ ++" Tlist_User_Removed_File ++" Returns 1 if a file is removed by a user from the taglist ++function! s:Tlist_User_Removed_File(filename) ++ return stridx(s:tlist_removed_flist, a:filename . "\n") != -1 ++endfunction ++ ++" Tlist_Update_Remove_List ++" Update the list of user removed files from the taglist ++" add == 1, add the file to the removed list ++" add == 0, delete the file from the removed list ++function! s:Tlist_Update_Remove_List(filename, add) ++ if a:add ++ let s:tlist_removed_flist = s:tlist_removed_flist . a:filename . "\n" ++ else ++ let idx = stridx(s:tlist_removed_flist, a:filename . "\n") ++ let text_before = strpart(s:tlist_removed_flist, 0, idx) ++ let rem_text = strpart(s:tlist_removed_flist, idx) ++ let next_idx = stridx(rem_text, "\n") ++ let text_after = strpart(rem_text, next_idx + 1) ++ ++ let s:tlist_removed_flist = text_before . text_after ++ endif ++endfunction ++ ++" Tlist_FileType_Init ++" Initialize the ctags arguments and tag variable for the specified ++" file type ++function! s:Tlist_FileType_Init(ftype) ++ call s:Tlist_Log_Msg('Tlist_FileType_Init (' . a:ftype . ')') ++ " If the user didn't specify any settings, then use the default ++ " ctags args. Otherwise, use the settings specified by the user ++ let var = 'g:tlist_' . a:ftype . '_settings' ++ if exists(var) ++ " User specified ctags arguments ++ let settings = {var} . ';' ++ else ++ " Default ctags arguments ++ let var = 's:tlist_def_' . a:ftype . '_settings' ++ if !exists(var) ++ " No default settings for this file type. This filetype is ++ " not supported ++ return 0 ++ endif ++ let settings = s:tlist_def_{a:ftype}_settings . ';' ++ endif ++ ++ let msg = 'Taglist: Invalid ctags option setting - ' . settings ++ ++ " Format of the option that specifies the filetype and ctags arugments: ++ " ++ " ;flag1:name1;flag2:name2;flag3:name3 ++ " ++ ++ " Extract the file type to pass to ctags. This may be different from the ++ " file type detected by Vim ++ let pos = stridx(settings, ';') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let ctags_ftype = strpart(settings, 0, pos) ++ if ctags_ftype == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ " Make sure a valid filetype is supplied. If the user didn't specify a ++ " valid filetype, then the ctags option settings may be treated as the ++ " filetype ++ if ctags_ftype =~ ':' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ ++ " Remove the file type from settings ++ let settings = strpart(settings, pos + 1) ++ if settings == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ ++ " Process all the specified ctags flags. The format is ++ " flag1:name1;flag2:name2;flag3:name3 ++ let ctags_flags = '' ++ let cnt = 0 ++ while settings != '' ++ " Extract the flag ++ let pos = stridx(settings, ':') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let flag = strpart(settings, 0, pos) ++ if flag == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ " Remove the flag from settings ++ let settings = strpart(settings, pos + 1) ++ ++ " Extract the tag type name ++ let pos = stridx(settings, ';') ++ if pos == -1 ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let name = strpart(settings, 0, pos) ++ if name == '' ++ call s:Tlist_Warning_Msg(msg) ++ return 0 ++ endif ++ let settings = strpart(settings, pos + 1) ++ ++ let cnt = cnt + 1 ++ ++ let s:tlist_{a:ftype}_{cnt}_name = flag ++ let s:tlist_{a:ftype}_{cnt}_fullname = name ++ let ctags_flags = ctags_flags . flag ++ endwhile ++ ++ let s:tlist_{a:ftype}_ctags_args = '--language-force=' . ctags_ftype . ++ \ ' --' . ctags_ftype . '-types=' . ctags_flags ++ let s:tlist_{a:ftype}_count = cnt ++ let s:tlist_{a:ftype}_ctags_flags = ctags_flags ++ ++ " Save the filetype name ++ let s:tlist_ftype_{s:tlist_ftype_count}_name = a:ftype ++ let s:tlist_ftype_count = s:tlist_ftype_count + 1 ++ ++ return 1 ++endfunction ++ ++" Tlist_Get_Filetype ++" Determine the filetype for the specified file ++function! s:Tlist_Get_Filetype(fname) ++ " Ignore the filetype autocommands ++ let old_eventignore = &eventignore ++ set eventignore=FileType ++ ++ " Save the 'filetype', as this will be changed temporarily ++ let old_filetype = &filetype ++ ++ " Run the filetypedetect group of autocommands to determine ++ " the filetype ++ exe 'doautocmd filetypedetect BufRead ' . a:fname ++ ++ " Save the detected filetype ++ let ftype = &filetype ++ ++ " Restore the previous state ++ let &filetype = old_filetype ++ let &eventignore = old_eventignore ++ ++ return ftype ++endfunction ++ ++" Tlist_Get_Buffer_Filetype ++" Get the filetype for the specified buffer ++function! s:Tlist_Get_Buffer_Filetype(bnum) ++ if bufloaded(a:bnum) ++ " For loaded buffers, the 'filetype' is already determined ++ return getbufvar(a:bnum, '&filetype') ++ endif ++ ++ " For unloaded buffers, if the 'filetype' option is set, return it ++ let ftype = getbufvar(a:bnum, '&filetype') ++ if ftype != '' ++ return ftype ++ endif ++ ++ " Skip non-existent buffers ++ if !bufexists(a:bnum) ++ return '' ++ endif ++ ++ " For buffers whose filetype is not yet determined, try to determine ++ " the filetype ++ let bname = bufname(a:bnum) ++ ++ return s:Tlist_Get_Filetype(bname) ++endfunction ++ ++" Tlist_Discard_TagInfo ++" Discard the stored tag information for a file ++function! s:Tlist_Discard_TagInfo(fidx) ++ call s:Tlist_Log_Msg('Tlist_Discard_TagInfo (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ " Discard information about the tags defined in the file ++ let i = 1 ++ while i <= s:tlist_{a:fidx}_tag_count ++ let fidx_i = 's:tlist_' . a:fidx . '_' . i ++ unlet! {fidx_i}_tag ++ unlet! {fidx_i}_tag_name ++ unlet! {fidx_i}_tag_type ++ unlet! {fidx_i}_ttype_idx ++ unlet! {fidx_i}_tag_proto ++ unlet! {fidx_i}_tag_searchpat ++ unlet! {fidx_i}_tag_linenum ++ let i = i + 1 ++ endwhile ++ ++ let s:tlist_{a:fidx}_tag_count = 0 ++ ++ " Discard information about tag type groups ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ if s:tlist_{a:fidx}_{ttype} != '' ++ let fidx_ttype = 's:tlist_' . a:fidx . '_' . ttype ++ let {fidx_ttype} = '' ++ let {fidx_ttype}_offset = 0 ++ let cnt = {fidx_ttype}_count ++ let {fidx_ttype}_count = 0 ++ let j = 1 ++ while j <= cnt ++ unlet! {fidx_ttype}_{j} ++ let j = j + 1 ++ endwhile ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Discard the stored menu command also ++ let s:tlist_{a:fidx}_menu_cmd = '' ++endfunction ++ ++" Tlist_Window_Update_Line_Offsets ++" Update the line offsets for tags for files starting from start_idx ++" and displayed in the taglist window by the specified offset ++function! s:Tlist_Window_Update_Line_Offsets(start_idx, increment, offset) ++ let i = a:start_idx ++ ++ while i < s:tlist_file_count ++ if s:tlist_{i}_visible ++ " Update the start/end line number only if the file is visible ++ if a:increment ++ let s:tlist_{i}_start = s:tlist_{i}_start + a:offset ++ let s:tlist_{i}_end = s:tlist_{i}_end + a:offset ++ else ++ let s:tlist_{i}_start = s:tlist_{i}_start - a:offset ++ let s:tlist_{i}_end = s:tlist_{i}_end - a:offset ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++endfunction ++ ++" Tlist_Discard_FileInfo ++" Discard the stored information for a file ++function! s:Tlist_Discard_FileInfo(fidx) ++ call s:Tlist_Log_Msg('Tlist_Discard_FileInfo (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ call s:Tlist_Discard_TagInfo(a:fidx) ++ ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ unlet! s:tlist_{a:fidx}_{ttype} ++ unlet! s:tlist_{a:fidx}_{ttype}_offset ++ unlet! s:tlist_{a:fidx}_{ttype}_count ++ let i = i + 1 ++ endwhile ++ ++ unlet! s:tlist_{a:fidx}_filename ++ unlet! s:tlist_{a:fidx}_sort_type ++ unlet! s:tlist_{a:fidx}_filetype ++ unlet! s:tlist_{a:fidx}_mtime ++ unlet! s:tlist_{a:fidx}_start ++ unlet! s:tlist_{a:fidx}_end ++ unlet! s:tlist_{a:fidx}_valid ++ unlet! s:tlist_{a:fidx}_visible ++ unlet! s:tlist_{a:fidx}_tag_count ++ unlet! s:tlist_{a:fidx}_menu_cmd ++endfunction ++ ++" Tlist_Window_Remove_File_From_Display ++" Remove the specified file from display ++function! s:Tlist_Window_Remove_File_From_Display(fidx) ++ call s:Tlist_Log_Msg('Tlist_Window_Remove_File_From_Display (' . ++ \ s:tlist_{a:fidx}_filename . ')') ++ " If the file is not visible then no need to remove it ++ if !s:tlist_{a:fidx}_visible ++ return ++ endif ++ ++ " Remove the tags displayed for the specified file from the window ++ let start = s:tlist_{a:fidx}_start ++ " Include the empty line after the last line also ++ if g:Tlist_Compact_Format ++ let end = s:tlist_{a:fidx}_end ++ else ++ let end = s:tlist_{a:fidx}_end + 1 ++ endif ++ ++ setlocal modifiable ++ exe 'silent! ' . start . ',' . end . 'delete _' ++ setlocal nomodifiable ++ ++ " Correct the start and end line offsets for all the files following ++ " this file, as the tags for this file are removed ++ call s:Tlist_Window_Update_Line_Offsets(a:fidx + 1, 0, end - start + 1) ++endfunction ++ ++" Tlist_Remove_File ++" Remove the file under the cursor or the specified file index ++" user_request - User requested to remove the file from taglist ++function! s:Tlist_Remove_File(file_idx, user_request) ++ let fidx = a:file_idx ++ ++ if fidx == -1 ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ endif ++ call s:Tlist_Log_Msg('Tlist_Remove_File (' . ++ \ s:tlist_{fidx}_filename . ', ' . a:user_request . ')') ++ ++ let save_winnr = winnr() ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Taglist window is open, remove the file from display ++ ++ if save_winnr != winnum ++ let old_eventignore = &eventignore ++ set eventignore=all ++ exe winnum . 'wincmd w' ++ endif ++ ++ call s:Tlist_Window_Remove_File_From_Display(fidx) ++ ++ if save_winnr != winnum ++ exe save_winnr . 'wincmd w' ++ let &eventignore = old_eventignore ++ endif ++ endif ++ ++ let fname = s:tlist_{fidx}_filename ++ ++ if a:user_request ++ " As the user requested to remove the file from taglist, ++ " add it to the removed list ++ call s:Tlist_Update_Remove_List(fname, 1) ++ endif ++ ++ " Remove the file name from the taglist list of filenames ++ let idx = stridx(s:tlist_file_names, fname . "\n") ++ let text_before = strpart(s:tlist_file_names, 0, idx) ++ let rem_text = strpart(s:tlist_file_names, idx) ++ let next_idx = stridx(rem_text, "\n") ++ let text_after = strpart(rem_text, next_idx + 1) ++ let s:tlist_file_names = text_before . text_after ++ ++ call s:Tlist_Discard_FileInfo(fidx) ++ ++ " Shift all the file variables by one index ++ let i = fidx + 1 ++ ++ while i < s:tlist_file_count ++ let j = i - 1 ++ ++ let s:tlist_{j}_filename = s:tlist_{i}_filename ++ let s:tlist_{j}_sort_type = s:tlist_{i}_sort_type ++ let s:tlist_{j}_filetype = s:tlist_{i}_filetype ++ let s:tlist_{j}_mtime = s:tlist_{i}_mtime ++ let s:tlist_{j}_start = s:tlist_{i}_start ++ let s:tlist_{j}_end = s:tlist_{i}_end ++ let s:tlist_{j}_valid = s:tlist_{i}_valid ++ let s:tlist_{j}_visible = s:tlist_{i}_visible ++ let s:tlist_{j}_tag_count = s:tlist_{i}_tag_count ++ let s:tlist_{j}_menu_cmd = s:tlist_{i}_menu_cmd ++ ++ let k = 1 ++ while k <= s:tlist_{j}_tag_count ++ let s:tlist_{j}_{k}_tag = s:tlist_{i}_{k}_tag ++ let s:tlist_{j}_{k}_tag_name = s:tlist_{i}_{k}_tag_name ++ let s:tlist_{j}_{k}_tag_type = s:Tlist_Get_Tag_Type_By_Tag(i, k) ++ let s:tlist_{j}_{k}_ttype_idx = s:tlist_{i}_{k}_ttype_idx ++ let s:tlist_{j}_{k}_tag_proto = s:Tlist_Get_Tag_Prototype(i, k) ++ let s:tlist_{j}_{k}_tag_searchpat = s:Tlist_Get_Tag_SearchPat(i, k) ++ let s:tlist_{j}_{k}_tag_linenum = s:Tlist_Get_Tag_Linenum(i, k) ++ let k = k + 1 ++ endwhile ++ ++ let ftype = s:tlist_{i}_filetype ++ ++ let k = 1 ++ while k <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{k}_name ++ let s:tlist_{j}_{ttype} = s:tlist_{i}_{ttype} ++ let s:tlist_{j}_{ttype}_offset = s:tlist_{i}_{ttype}_offset ++ let s:tlist_{j}_{ttype}_count = s:tlist_{i}_{ttype}_count ++ if s:tlist_{j}_{ttype} != '' ++ let l = 1 ++ while l <= s:tlist_{j}_{ttype}_count ++ let s:tlist_{j}_{ttype}_{l} = s:tlist_{i}_{ttype}_{l} ++ let l = l + 1 ++ endwhile ++ endif ++ let k = k + 1 ++ endwhile ++ ++ " As the file and tag information is copied to the new index, ++ " discard the previous information ++ call s:Tlist_Discard_FileInfo(i) ++ ++ let i = i + 1 ++ endwhile ++ ++ " Reduce the number of files displayed ++ let s:tlist_file_count = s:tlist_file_count - 1 ++ ++ if g:Tlist_Show_One_File ++ " If the tags for only one file is displayed and if we just ++ " now removed that file, then invalidate the current file idx ++ if s:tlist_cur_file_idx == fidx ++ let s:tlist_cur_file_idx = -1 ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Goto_Window ++" Goto the taglist window ++function! s:Tlist_Window_Goto_Window() ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ if winnr() != winnum ++ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Create ++" Create a new taglist window. If it is already open, jump to it ++function! s:Tlist_Window_Create() ++ call s:Tlist_Log_Msg('Tlist_Window_Create()') ++ " If the window is open, jump to it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Jump to the existing window ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ return ++ endif ++ ++ " If used with winmanager don't open windows. Winmanager will handle ++ " the window/buffer management ++ if s:tlist_app_name == "winmanager" ++ return ++ endif ++ ++ " Create a new window. If user prefers a horizontal window, then open ++ " a horizontally split window. Otherwise open a vertically split ++ " window ++ if g:Tlist_Use_Horiz_Window ++ " Open a horizontally split window ++ let win_dir = 'botright' ++ " Horizontal window height ++ let win_size = g:Tlist_WinHeight ++ else ++ if s:tlist_winsize_chgd == -1 ++ " Open a vertically split window. Increase the window size, if ++ " needed, to accomodate the new window ++ if g:Tlist_Inc_Winwidth && ++ \ &columns < (80 + g:Tlist_WinWidth) ++ " Save the original window position ++ let s:tlist_pre_winx = getwinposx() ++ let s:tlist_pre_winy = getwinposy() ++ ++ " one extra column is needed to include the vertical split ++ let &columns= &columns + g:Tlist_WinWidth + 1 ++ ++ let s:tlist_winsize_chgd = 1 ++ else ++ let s:tlist_winsize_chgd = 0 ++ endif ++ endif ++ ++ if g:Tlist_Use_Right_Window ++ " Open the window at the rightmost place ++ let win_dir = 'botright vertical' ++ else ++ " Open the window at the leftmost place ++ let win_dir = 'topleft vertical' ++ endif ++ let win_size = g:Tlist_WinWidth ++ endif ++ ++ " If the tag listing temporary buffer already exists, then reuse it. ++ " Otherwise create a new buffer ++ let bufnum = bufnr(g:TagList_title) ++ if bufnum == -1 ++ " Create a new buffer ++ let wcmd = g:TagList_title ++ else ++ " Edit the existing buffer ++ let wcmd = '+buffer' . bufnum ++ endif ++ ++ " Create the taglist window ++ exe 'silent! ' . win_dir . ' ' . win_size . 'split ' . wcmd ++ ++ " Save the new window position ++ let s:tlist_winx = getwinposx() ++ let s:tlist_winy = getwinposy() ++ ++ " Initialize the taglist window ++ call s:Tlist_Window_Init() ++endfunction ++ ++" Tlist_Window_Zoom ++" Zoom (maximize/minimize) the taglist window ++function! s:Tlist_Window_Zoom() ++ if s:tlist_win_maximized ++ " Restore the window back to the previous size ++ if g:Tlist_Use_Horiz_Window ++ exe 'resize ' . g:Tlist_WinHeight ++ else ++ exe 'vert resize ' . g:Tlist_WinWidth ++ endif ++ let s:tlist_win_maximized = 0 ++ else ++ " Set the window size to the maximum possible without closing other ++ " windows ++ if g:Tlist_Use_Horiz_Window ++ resize ++ else ++ vert resize ++ endif ++ let s:tlist_win_maximized = 1 ++ endif ++endfunction ++ ++" Tlist_Ballon_Expr ++" When the mouse cursor is over a tag in the taglist window, display the ++" tag prototype (balloon) ++function! Tlist_Ballon_Expr() ++ " Get the file index ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(v:beval_lnum) ++ if fidx == -1 ++ return '' ++ endif ++ ++ " Get the tag output line for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, v:beval_lnum) ++ if tidx == 0 ++ return '' ++ endif ++ ++ " Get the tag search pattern and display it ++ return s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Window_Check_Width ++" Check the width of the taglist window. For horizontally split windows, the ++" 'winfixheight' option is used to fix the height of the window. For ++" vertically split windows, Vim doesn't support the 'winfixwidth' option. So ++" need to handle window width changes from this function. ++function! s:Tlist_Window_Check_Width() ++ let tlist_winnr = bufwinnr(g:TagList_title) ++ if tlist_winnr == -1 ++ return ++ endif ++ ++ let width = winwidth(tlist_winnr) ++ if width != g:Tlist_WinWidth ++ call s:Tlist_Log_Msg("Tlist_Window_Check_Width: Changing window " . ++ \ "width from " . width . " to " . g:Tlist_WinWidth) ++ let save_winnr = winnr() ++ if save_winnr != tlist_winnr ++ call s:Tlist_Exe_Cmd_No_Acmds(tlist_winnr . 'wincmd w') ++ endif ++ exe 'vert resize ' . g:Tlist_WinWidth ++ if save_winnr != tlist_winnr ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Exit_Only_Window ++" If the 'Tlist_Exit_OnlyWindow' option is set, then exit Vim if only the ++" taglist window is present. ++function! s:Tlist_Window_Exit_Only_Window() ++ " Before quitting Vim, delete the taglist buffer so that ++ " the '0 mark is correctly set to the previous buffer. ++ if v:version < 700 ++ if winbufnr(2) == -1 ++ bdelete ++ quit ++ endif ++ else ++ if winbufnr(2) == -1 ++ if tabpagenr('$') == 1 ++ " Only one tag page is present ++ bdelete ++ quit ++ else ++ " More than one tab page is present. Close only the current ++ " tab page ++ close ++ endif ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Init ++" Set the default options for the taglist window ++function! s:Tlist_Window_Init() ++ call s:Tlist_Log_Msg('Tlist_Window_Init()') ++ ++ " The 'readonly' option should not be set for the taglist buffer. ++ " If Vim is started as "view/gview" or if the ":view" command is ++ " used, then the 'readonly' option is set for all the buffers. ++ " Unset it for the taglist buffer ++ setlocal noreadonly ++ ++ " Set the taglist buffer filetype to taglist ++ setlocal filetype=taglist ++ ++ " Define taglist window element highlighting ++ syntax match TagListComment '^" .*' ++ syntax match TagListFileName '^[^" ].*$' ++ syntax match TagListTitle '^ \S.*$' ++ syntax match TagListTagScope '\s\[.\{-\}\]$' ++ ++ " Define the highlighting only if colors are supported ++ if has('gui_running') || &t_Co > 2 ++ " Colors to highlight various taglist window elements ++ " If user defined highlighting group exists, then use them. ++ " Otherwise, use default highlight groups. ++ if hlexists('MyTagListTagName') ++ highlight link TagListTagName MyTagListTagName ++ else ++ highlight default link TagListTagName Search ++ endif ++ " Colors to highlight comments and titles ++ if hlexists('MyTagListComment') ++ highlight link TagListComment MyTagListComment ++ else ++ highlight clear TagListComment ++ highlight default link TagListComment Comment ++ endif ++ if hlexists('MyTagListTitle') ++ highlight link TagListTitle MyTagListTitle ++ else ++ highlight clear TagListTitle ++ highlight default link TagListTitle Title ++ endif ++ if hlexists('MyTagListFileName') ++ highlight link TagListFileName MyTagListFileName ++ else ++ highlight clear TagListFileName ++ highlight default TagListFileName guibg=Grey ctermbg=darkgray ++ \ guifg=white ctermfg=white ++ endif ++ if hlexists('MyTagListTagScope') ++ highlight link TagListTagScope MyTagListTagScope ++ else ++ highlight clear TagListTagScope ++ highlight default link TagListTagScope Identifier ++ endif ++ else ++ highlight default TagListTagName term=reverse cterm=reverse ++ endif ++ ++ " Folding related settings ++ setlocal foldenable ++ setlocal foldminlines=0 ++ setlocal foldmethod=manual ++ setlocal foldlevel=9999 ++ if g:Tlist_Enable_Fold_Column ++ setlocal foldcolumn=3 ++ else ++ setlocal foldcolumn=0 ++ endif ++ setlocal foldtext=v:folddashes.getline(v:foldstart) ++ ++ if s:tlist_app_name != "winmanager" ++ " Mark buffer as scratch ++ silent! setlocal buftype=nofile ++ if s:tlist_app_name == "none" ++ silent! setlocal bufhidden=delete ++ endif ++ silent! setlocal noswapfile ++ " Due to a bug in Vim 6.0, the winbufnr() function fails for unlisted ++ " buffers. So if the taglist buffer is unlisted, multiple taglist ++ " windows will be opened. This bug is fixed in Vim 6.1 and above ++ if v:version >= 601 ++ silent! setlocal nobuflisted ++ endif ++ endif ++ ++ silent! setlocal nowrap ++ ++ " If the 'number' option is set in the source window, it will affect the ++ " taglist window. So forcefully disable 'number' option for the taglist ++ " window ++ silent! setlocal nonumber ++ ++ " Use fixed height when horizontally split window is used ++ if g:Tlist_Use_Horiz_Window ++ if v:version >= 602 ++ set winfixheight ++ endif ++ endif ++ if !g:Tlist_Use_Horiz_Window && v:version >= 700 ++ set winfixwidth ++ endif ++ ++ " Setup balloon evaluation to display tag prototype ++ if v:version >= 700 && has('balloon_eval') ++ setlocal balloonexpr=Tlist_Ballon_Expr() ++ set ballooneval ++ endif ++ ++ " Setup the cpoptions properly for the maps to work ++ let old_cpoptions = &cpoptions ++ set cpoptions&vim ++ ++ " Create buffer local mappings for jumping to the tags and sorting the list ++ nnoremap ++ \ :call Tlist_Window_Jump_To_Tag('useopen') ++ nnoremap o ++ \ :call Tlist_Window_Jump_To_Tag('newwin') ++ nnoremap p ++ \ :call Tlist_Window_Jump_To_Tag('preview') ++ nnoremap P ++ \ :call Tlist_Window_Jump_To_Tag('prevwin') ++ if v:version >= 700 ++ nnoremap t ++ \ :call Tlist_Window_Jump_To_Tag('checktab') ++ nnoremap ++ \ :call Tlist_Window_Jump_To_Tag('newtab') ++ endif ++ nnoremap <2-LeftMouse> ++ \ :call Tlist_Window_Jump_To_Tag('useopen') ++ nnoremap s ++ \ :call Tlist_Change_Sort('cmd', 'toggle', '') ++ nnoremap + :silent! foldopen ++ nnoremap - :silent! foldclose ++ nnoremap * :silent! %foldopen! ++ nnoremap = :silent! %foldclose ++ nnoremap :silent! foldopen ++ nnoremap :silent! foldclose ++ nnoremap :silent! %foldopen! ++ nnoremap :call Tlist_Window_Show_Info() ++ nnoremap u :call Tlist_Window_Update_File() ++ nnoremap d :call Tlist_Remove_File(-1, 1) ++ nnoremap x :call Tlist_Window_Zoom() ++ nnoremap [[ :call Tlist_Window_Move_To_File(-1) ++ nnoremap :call Tlist_Window_Move_To_File(-1) ++ nnoremap ]] :call Tlist_Window_Move_To_File(1) ++ nnoremap :call Tlist_Window_Move_To_File(1) ++ nnoremap :call Tlist_Window_Toggle_Help_Text() ++ nnoremap q :close ++ ++ " Insert mode mappings ++ inoremap ++ \ :call Tlist_Window_Jump_To_Tag('useopen') ++ " Windows needs return ++ inoremap ++ \ :call Tlist_Window_Jump_To_Tag('useopen') ++ inoremap o ++ \ :call Tlist_Window_Jump_To_Tag('newwin') ++ inoremap p ++ \ :call Tlist_Window_Jump_To_Tag('preview') ++ inoremap P ++ \ :call Tlist_Window_Jump_To_Tag('prevwin') ++ if v:version >= 700 ++ inoremap t ++ \ :call Tlist_Window_Jump_To_Tag('checktab') ++ inoremap ++ \ :call Tlist_Window_Jump_To_Tag('newtab') ++ endif ++ inoremap <2-LeftMouse> ++ \ :call Tlist_Window_Jump_To_Tag('useopen') ++ inoremap s ++ \ :call Tlist_Change_Sort('cmd', 'toggle', '') ++ inoremap + :silent! foldopen ++ inoremap - :silent! foldclose ++ inoremap * :silent! %foldopen! ++ inoremap = :silent! %foldclose ++ inoremap :silent! foldopen ++ inoremap :silent! foldclose ++ inoremap :silent! %foldopen! ++ inoremap :call ++ \ Tlist_Window_Show_Info() ++ inoremap u ++ \ :call Tlist_Window_Update_File() ++ inoremap d :call Tlist_Remove_File(-1, 1) ++ inoremap x :call Tlist_Window_Zoom() ++ inoremap [[ :call Tlist_Window_Move_To_File(-1) ++ inoremap :call Tlist_Window_Move_To_File(-1) ++ inoremap ]] :call Tlist_Window_Move_To_File(1) ++ inoremap :call Tlist_Window_Move_To_File(1) ++ inoremap :call Tlist_Window_Toggle_Help_Text() ++ inoremap q :close ++ ++ " Map single left mouse click if the user wants this functionality ++ if g:Tlist_Use_SingleClick == 1 ++ " Contributed by Bindu Wavell ++ " attempt to perform single click mapping, it would be much ++ " nicer if we could nnoremap ... however vim does ++ " not fire the when you use the mouse ++ " to enter a buffer. ++ let clickmap = ':if bufname("%") =~ "__Tag_List__" ' . ++ \ 'call Tlist_Window_Jump_To_Tag("useopen") ' . ++ \ ' endif ' ++ if maparg('', 'n') == '' ++ " no mapping for leftmouse ++ exe ':nnoremap ' . clickmap ++ else ++ " we have a mapping ++ let mapcmd = ':nnoremap ' ++ let mapcmd = mapcmd . substitute(substitute( ++ \ maparg('', 'n'), '|', '', 'g'), ++ \ '\c^', '', '') ++ let mapcmd = mapcmd . clickmap ++ exe mapcmd ++ endif ++ endif ++ ++ " Define the taglist autocommands ++ augroup TagListAutoCmds ++ autocmd! ++ " Display the tag prototype for the tag under the cursor. ++ autocmd CursorHold __Tag_List__ call s:Tlist_Window_Show_Info() ++ " Highlight the current tag periodically ++ autocmd CursorHold * silent call s:Tlist_Window_Highlight_Tag( ++ \ fnamemodify(bufname('%'), ':p'), line('.'), 1, 0) ++ ++ " Adjust the Vim window width when taglist window is closed ++ autocmd BufUnload __Tag_List__ call s:Tlist_Post_Close_Cleanup() ++ " Close the fold for this buffer when leaving the buffer ++ if g:Tlist_File_Fold_Auto_Close ++ autocmd BufEnter * silent ++ \ call s:Tlist_Window_Open_File_Fold(expand('')) ++ endif ++ " Exit Vim itself if only the taglist window is present (optional) ++ if g:Tlist_Exit_OnlyWindow ++ autocmd BufEnter __Tag_List__ nested ++ \ call s:Tlist_Window_Exit_Only_Window() ++ endif ++ if s:tlist_app_name != "winmanager" && ++ \ !g:Tlist_Process_File_Always && ++ \ (!has('gui_running') || !g:Tlist_Show_Menu) ++ " Auto refresh the taglist window ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ ++ if !g:Tlist_Use_Horiz_Window ++ if v:version < 700 ++ autocmd WinEnter * call s:Tlist_Window_Check_Width() ++ endif ++ endif ++ augroup end ++ ++ " Restore the previous cpoptions settings ++ let &cpoptions = old_cpoptions ++endfunction ++ ++" Tlist_Window_Refresh ++" Display the tags for all the files in the taglist window ++function! s:Tlist_Window_Refresh() ++ call s:Tlist_Log_Msg('Tlist_Window_Refresh()') ++ " Set report option to a huge value to prevent informational messages ++ " while deleting the lines ++ let old_report = &report ++ set report=99999 ++ ++ " Mark the buffer as modifiable ++ setlocal modifiable ++ ++ " Delete the contents of the buffer to the black-hole register ++ silent! %delete _ ++ ++ " As we have cleared the taglist window, mark all the files ++ " as not visible ++ let i = 0 ++ while i < s:tlist_file_count ++ let s:tlist_{i}_visible = 0 ++ let i = i + 1 ++ endwhile ++ ++ if g:Tlist_Compact_Format == 0 ++ " Display help in non-compact mode ++ call s:Tlist_Window_Display_Help() ++ endif ++ ++ " Mark the buffer as not modifiable ++ setlocal nomodifiable ++ ++ " Restore the report option ++ let &report = old_report ++ ++ " If the tags for only one file should be displayed in the taglist ++ " window, then no need to add the tags here. The bufenter autocommand ++ " will add the tags for that file. ++ if g:Tlist_Show_One_File ++ return ++ endif ++ ++ " List all the tags for the previously processed files ++ " Do this only if taglist is configured to display tags for more than ++ " one file. Otherwise, when Tlist_Show_One_File is configured, ++ " tags for the wrong file will be displayed. ++ let i = 0 ++ while i < s:tlist_file_count ++ call s:Tlist_Window_Refresh_File(s:tlist_{i}_filename, ++ \ s:tlist_{i}_filetype) ++ let i = i + 1 ++ endwhile ++ ++ if g:Tlist_Auto_Update ++ " Add and list the tags for all buffers in the Vim buffer list ++ let i = 1 ++ let last_bufnum = bufnr('$') ++ while i <= last_bufnum ++ if buflisted(i) ++ let fname = fnamemodify(bufname(i), ':p') ++ let ftype = s:Tlist_Get_Buffer_Filetype(i) ++ " If the file doesn't support tag listing, skip it ++ if !s:Tlist_Skip_File(fname, ftype) ++ call s:Tlist_Window_Refresh_File(fname, ftype) ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++ endif ++ ++ " If Tlist_File_Fold_Auto_Close option is set, then close all the folds ++ if g:Tlist_File_Fold_Auto_Close ++ " Close all the folds ++ silent! %foldclose ++ endif ++ ++ " Move the cursor to the top of the taglist window ++ normal! gg ++endfunction ++ ++" Tlist_Post_Close_Cleanup() ++" Close the taglist window and adjust the Vim window width ++function! s:Tlist_Post_Close_Cleanup() ++ call s:Tlist_Log_Msg('Tlist_Post_Close_Cleanup()') ++ " Mark all the files as not visible ++ let i = 0 ++ while i < s:tlist_file_count ++ let s:tlist_{i}_visible = 0 ++ let i = i + 1 ++ endwhile ++ ++ " Remove the taglist autocommands ++ silent! autocmd! TagListAutoCmds ++ ++ " Clear all the highlights ++ match none ++ ++ silent! syntax clear TagListTitle ++ silent! syntax clear TagListComment ++ silent! syntax clear TagListTagScope ++ ++ " Remove the left mouse click mapping if it was setup initially ++ if g:Tlist_Use_SingleClick ++ if hasmapto('') ++ nunmap ++ endif ++ endif ++ ++ if s:tlist_app_name != "winmanager" ++ if g:Tlist_Use_Horiz_Window || g:Tlist_Inc_Winwidth == 0 || ++ \ s:tlist_winsize_chgd != 1 || ++ \ &columns < (80 + g:Tlist_WinWidth) ++ " No need to adjust window width if using horizontally split taglist ++ " window or if columns is less than 101 or if the user chose not to ++ " adjust the window width ++ else ++ " If the user didn't manually move the window, then restore the window ++ " position to the pre-taglist position ++ if s:tlist_pre_winx != -1 && s:tlist_pre_winy != -1 && ++ \ getwinposx() == s:tlist_winx && ++ \ getwinposy() == s:tlist_winy ++ exe 'winpos ' . s:tlist_pre_winx . ' ' . s:tlist_pre_winy ++ endif ++ ++ " Adjust the Vim window width ++ let &columns= &columns - (g:Tlist_WinWidth + 1) ++ endif ++ endif ++ ++ let s:tlist_winsize_chgd = -1 ++ ++ " Reset taglist state variables ++ if s:tlist_app_name == "winmanager" ++ let s:tlist_app_name = "none" ++ endif ++ let s:tlist_window_initialized = 0 ++endfunction ++ ++" Tlist_Window_Refresh_File() ++" List the tags defined in the specified file in a Vim window ++function! s:Tlist_Window_Refresh_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Window_Refresh_File (' . a:filename . ')') ++ " First check whether the file already exists ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx != -1 ++ let file_listed = 1 ++ else ++ let file_listed = 0 ++ endif ++ ++ if !file_listed ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(a:filename) ++ return ++ endif ++ endif ++ ++ if file_listed && s:tlist_{fidx}_visible ++ " Check whether the file tags are currently valid ++ if s:tlist_{fidx}_valid ++ " Goto the first line in the file ++ exe s:tlist_{fidx}_start ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ endif ++ return ++ endif ++ ++ " Discard and remove the tags for this file from display ++ call s:Tlist_Discard_TagInfo(fidx) ++ call s:Tlist_Window_Remove_File_From_Display(fidx) ++ endif ++ ++ " Process and generate a list of tags defined in the file ++ if !file_listed || !s:tlist_{fidx}_valid ++ let ret_fidx = s:Tlist_Process_File(a:filename, a:ftype) ++ if ret_fidx == -1 ++ return ++ endif ++ let fidx = ret_fidx ++ endif ++ ++ " Set report option to a huge value to prevent informational messages ++ " while adding lines to the taglist window ++ let old_report = &report ++ set report=99999 ++ ++ if g:Tlist_Show_One_File ++ " Remove the previous file ++ if s:tlist_cur_file_idx != -1 ++ call s:Tlist_Window_Remove_File_From_Display(s:tlist_cur_file_idx) ++ let s:tlist_{s:tlist_cur_file_idx}_visible = 0 ++ let s:tlist_{s:tlist_cur_file_idx}_start = 0 ++ let s:tlist_{s:tlist_cur_file_idx}_end = 0 ++ endif ++ let s:tlist_cur_file_idx = fidx ++ endif ++ ++ " Mark the buffer as modifiable ++ setlocal modifiable ++ ++ " Add new files to the end of the window. For existing files, add them at ++ " the same line where they were previously present. If the file is not ++ " visible, then add it at the end ++ if s:tlist_{fidx}_start == 0 || !s:tlist_{fidx}_visible ++ if g:Tlist_Compact_Format ++ let s:tlist_{fidx}_start = line('$') ++ else ++ let s:tlist_{fidx}_start = line('$') + 1 ++ endif ++ endif ++ ++ let s:tlist_{fidx}_visible = 1 ++ ++ " Goto the line where this file should be placed ++ if g:Tlist_Compact_Format ++ exe s:tlist_{fidx}_start ++ else ++ exe s:tlist_{fidx}_start - 1 ++ endif ++ ++ let txt = fnamemodify(s:tlist_{fidx}_filename, ':t') . ' (' . ++ \ fnamemodify(s:tlist_{fidx}_filename, ':p:h') . ')' ++ if g:Tlist_Compact_Format == 0 ++ silent! put =txt ++ else ++ silent! put! =txt ++ " Move to the next line ++ exe line('.') + 1 ++ endif ++ let file_start = s:tlist_{fidx}_start ++ ++ " Add the tag names grouped by tag type to the buffer with a title ++ let i = 1 ++ let ttype_cnt = s:tlist_{a:ftype}_count ++ while i <= ttype_cnt ++ let ttype = s:tlist_{a:ftype}_{i}_name ++ " Add the tag type only if there are tags for that type ++ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype ++ let ttype_txt = {fidx_ttype} ++ if ttype_txt != '' ++ let txt = ' ' . s:tlist_{a:ftype}_{i}_fullname ++ if g:Tlist_Compact_Format == 0 ++ let ttype_start_lnum = line('.') + 1 ++ silent! put =txt ++ else ++ let ttype_start_lnum = line('.') ++ silent! put! =txt ++ endif ++ silent! put =ttype_txt ++ ++ let {fidx_ttype}_offset = ttype_start_lnum - file_start ++ ++ " create a fold for this tag type ++ let fold_start = ttype_start_lnum ++ let fold_end = fold_start + {fidx_ttype}_count ++ exe fold_start . ',' . fold_end . 'fold' ++ ++ " Adjust the cursor position ++ if g:Tlist_Compact_Format == 0 ++ exe ttype_start_lnum + {fidx_ttype}_count ++ else ++ exe ttype_start_lnum + {fidx_ttype}_count + 1 ++ endif ++ ++ if g:Tlist_Compact_Format == 0 ++ " Separate the tag types by a empty line ++ silent! put ='' ++ endif ++ endif ++ let i = i + 1 ++ endwhile ++ ++ if s:tlist_{fidx}_tag_count == 0 ++ if g:Tlist_Compact_Format == 0 ++ silent! put ='' ++ endif ++ endif ++ ++ let s:tlist_{fidx}_end = line('.') - 1 ++ ++ " Create a fold for the entire file ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'fold' ++ exe 'silent! ' . s:tlist_{fidx}_start . ',' . ++ \ s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Goto the starting line for this file, ++ exe s:tlist_{fidx}_start ++ ++ if s:tlist_app_name == "winmanager" ++ " To handle a bug in the winmanager plugin, add a space at the ++ " last line ++ call setline('$', ' ') ++ endif ++ ++ " Mark the buffer as not modifiable ++ setlocal nomodifiable ++ ++ " Restore the report option ++ let &report = old_report ++ ++ " Update the start and end line numbers for all the files following this ++ " file ++ let start = s:tlist_{fidx}_start ++ " include the empty line after the last line ++ if g:Tlist_Compact_Format ++ let end = s:tlist_{fidx}_end ++ else ++ let end = s:tlist_{fidx}_end + 1 ++ endif ++ call s:Tlist_Window_Update_Line_Offsets(fidx + 1, 1, end - start + 1) ++ ++ " Now that we have updated the taglist window, update the tags ++ " menu (if present) ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(1) ++ endif ++endfunction ++ ++" Tlist_Init_File ++" Initialize the variables for a new file ++function! s:Tlist_Init_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Init_File (' . a:filename . ')') ++ " Add new files at the end of the list ++ let fidx = s:tlist_file_count ++ let s:tlist_file_count = s:tlist_file_count + 1 ++ " Add the new file name to the taglist list of file names ++ let s:tlist_file_names = s:tlist_file_names . a:filename . "\n" ++ ++ " Initialize the file variables ++ let s:tlist_{fidx}_filename = a:filename ++ let s:tlist_{fidx}_sort_type = g:Tlist_Sort_Type ++ let s:tlist_{fidx}_filetype = a:ftype ++ let s:tlist_{fidx}_mtime = -1 ++ let s:tlist_{fidx}_start = 0 ++ let s:tlist_{fidx}_end = 0 ++ let s:tlist_{fidx}_valid = 0 ++ let s:tlist_{fidx}_visible = 0 ++ let s:tlist_{fidx}_tag_count = 0 ++ let s:tlist_{fidx}_menu_cmd = '' ++ ++ " Initialize the tag type variables ++ let i = 1 ++ while i <= s:tlist_{a:ftype}_count ++ let ttype = s:tlist_{a:ftype}_{i}_name ++ let s:tlist_{fidx}_{ttype} = '' ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = 0 ++ let i = i + 1 ++ endwhile ++ ++ return fidx ++endfunction ++ ++" Tlist_Get_Tag_Type_By_Tag ++" Return the tag type for the specified tag index ++function! s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) ++ let ttype_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_type' ++ ++ " Already parsed and have the tag name ++ if exists(ttype_var) ++ return {ttype_var} ++ endif ++ ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let {ttype_var} = s:Tlist_Extract_Tagtype(tag_line) ++ ++ return {ttype_var} ++endfunction ++ ++" Tlist_Get_Tag_Prototype ++function! s:Tlist_Get_Tag_Prototype(fidx, tidx) ++ let tproto_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_proto' ++ ++ " Already parsed and have the tag prototype ++ if exists(tproto_var) ++ return {tproto_var} ++ endif ++ ++ " Parse and extract the tag prototype ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = stridx(tag_line, '/^') + 2 ++ let end = stridx(tag_line, '/;"' . "\t") ++ if tag_line[end - 1] == '$' ++ let end = end -1 ++ endif ++ let tag_proto = strpart(tag_line, start, end - start) ++ let {tproto_var} = substitute(tag_proto, '\s*', '', '') ++ ++ return {tproto_var} ++endfunction ++ ++" Tlist_Get_Tag_SearchPat ++function! s:Tlist_Get_Tag_SearchPat(fidx, tidx) ++ let tpat_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_searchpat' ++ ++ " Already parsed and have the tag search pattern ++ if exists(tpat_var) ++ return {tpat_var} ++ endif ++ ++ " Parse and extract the tag search pattern ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = stridx(tag_line, '/^') + 2 ++ let end = stridx(tag_line, '/;"' . "\t") ++ if tag_line[end - 1] == '$' ++ let end = end -1 ++ endif ++ let {tpat_var} = '\V\^' . strpart(tag_line, start, end - start) . ++ \ (tag_line[end] == '$' ? '\$' : '') ++ ++ return {tpat_var} ++endfunction ++ ++" Tlist_Get_Tag_Linenum ++" Return the tag line number, given the tag index ++function! s:Tlist_Get_Tag_Linenum(fidx, tidx) ++ let tline_var = 's:tlist_' . a:fidx . '_' . a:tidx . '_tag_linenum' ++ ++ " Already parsed and have the tag line number ++ if exists(tline_var) ++ return {tline_var} ++ endif ++ ++ " Parse and extract the tag line number ++ let tag_line = s:tlist_{a:fidx}_{a:tidx}_tag ++ let start = strridx(tag_line, 'line:') + 5 ++ let end = strridx(tag_line, "\t") ++ if end < start ++ let {tline_var} = strpart(tag_line, start) + 0 ++ else ++ let {tline_var} = strpart(tag_line, start, end - start) + 0 ++ endif ++ ++ return {tline_var} ++endfunction ++ ++" Tlist_Parse_Tagline ++" Parse a tag line from the ctags output. Separate the tag output based on the ++" tag type and store it in the tag type variable. ++" The format of each line in the ctags output is: ++" ++" tag_namefile_nameex_cmd;"extension_fields ++" ++function! s:Tlist_Parse_Tagline(tag_line) ++ if a:tag_line == '' ++ " Skip empty lines ++ return ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Extract_Tagtype(a:tag_line) ++ ++ " Make sure the tag type is a valid and supported one ++ if ttype == '' || stridx(s:ctags_flags, ttype) == -1 ++ " Line is not in proper tags format or Tag type is not supported ++ return ++ endif ++ ++ " Update the total tag count ++ let s:tidx = s:tidx + 1 ++ ++ " The following variables are used to optimize this code. Vim is slow in ++ " using curly brace names. To reduce the amount of processing needed, the ++ " curly brace variables are pre-processed here ++ let fidx_tidx = 's:tlist_' . s:fidx . '_' . s:tidx ++ let fidx_ttype = 's:tlist_' . s:fidx . '_' . ttype ++ ++ " Update the count of this tag type ++ let ttype_idx = {fidx_ttype}_count + 1 ++ let {fidx_ttype}_count = ttype_idx ++ ++ " Store the ctags output for this tag ++ let {fidx_tidx}_tag = a:tag_line ++ ++ " Store the tag index and the tag type index (back pointers) ++ let {fidx_ttype}_{ttype_idx} = s:tidx ++ let {fidx_tidx}_ttype_idx = ttype_idx ++ ++ " Extract the tag name ++ let tag_name = strpart(a:tag_line, 0, stridx(a:tag_line, "\t")) ++ ++ " Extract the tag scope/prototype ++ if g:Tlist_Display_Prototype ++ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(s:fidx, s:tidx) ++ else ++ let ttxt = ' ' . tag_name ++ ++ " Add the tag scope, if it is available and is configured. Tag ++ " scope is the last field after the 'line:\t' field ++ if g:Tlist_Display_Tag_Scope ++ let tag_scope = s:Tlist_Extract_Tag_Scope(a:tag_line) ++ if tag_scope != '' ++ let ttxt = ttxt . ' [' . tag_scope . ']' ++ endif ++ endif ++ endif ++ ++ " Add this tag to the tag type variable ++ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" ++ ++ " Save the tag name ++ let {fidx_tidx}_tag_name = tag_name ++endfunction ++ ++" Tlist_Process_File ++" Get the list of tags defined in the specified file and store them ++" in Vim variables. Returns the file index where the tags are stored. ++function! s:Tlist_Process_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Process_File (' . a:filename . ', ' . ++ \ a:ftype . ')') ++ " Check whether this file is supported ++ if s:Tlist_Skip_File(a:filename, a:ftype) ++ return -1 ++ endif ++ ++ " If the tag types for this filetype are not yet created, then create ++ " them now ++ let var = 's:tlist_' . a:ftype . '_count' ++ if !exists(var) ++ if s:Tlist_FileType_Init(a:ftype) == 0 ++ return -1 ++ endif ++ endif ++ ++ " If this file is already processed, then use the cached values ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ " First time, this file is loaded ++ let fidx = s:Tlist_Init_File(a:filename, a:ftype) ++ else ++ " File was previously processed. Discard the tag information ++ call s:Tlist_Discard_TagInfo(fidx) ++ endif ++ ++ let s:tlist_{fidx}_valid = 1 ++ ++ " Exuberant ctags arguments to generate a tag list ++ let ctags_args = ' -f - --format=2 --excmd=pattern --fields=nks ' ++ ++ " Form the ctags argument depending on the sort type ++ if s:tlist_{fidx}_sort_type == 'name' ++ let ctags_args = ctags_args . '--sort=yes' ++ else ++ let ctags_args = ctags_args . '--sort=no' ++ endif ++ ++ " Add the filetype specific arguments ++ let ctags_args = ctags_args . ' ' . s:tlist_{a:ftype}_ctags_args ++ ++ " Ctags command to produce output with regexp for locating the tags ++ let ctags_cmd = g:Tlist_Ctags_Cmd . ctags_args ++ let ctags_cmd = ctags_cmd . ' "' . a:filename . '"' ++ ++ if &shellxquote == '"' ++ " Double-quotes within double-quotes will not work in the ++ " command-line.If the 'shellxquote' option is set to double-quotes, ++ " then escape the double-quotes in the ctags command-line. ++ let ctags_cmd = escape(ctags_cmd, '"') ++ endif ++ ++ " In Windows 95, if not using cygwin, disable the 'shellslash' ++ " option. Otherwise, this will cause problems when running the ++ " ctags command. ++ if has('win95') && !has('win32unix') ++ let old_shellslash = &shellslash ++ set noshellslash ++ endif ++ ++ if has('win32') && !has('win32unix') && !has('win95') ++ \ && (&shell =~ 'cmd.exe') ++ " Windows does not correctly deal with commands that have more than 1 ++ " set of double quotes. It will strip them all resulting in: ++ " 'C:\Program' is not recognized as an internal or external command ++ " operable program or batch file. To work around this, place the ++ " command inside a batch file and call the batch file. ++ " Do this only on Win2K, WinXP and above. ++ " Contributed by: David Fishburn. ++ let s:taglist_tempfile = fnamemodify(tempname(), ':h') . ++ \ '\taglist.cmd' ++ exe 'redir! > ' . s:taglist_tempfile ++ silent echo ctags_cmd ++ redir END ++ ++ call s:Tlist_Log_Msg('Cmd inside batch file: ' . ctags_cmd) ++ let ctags_cmd = '"' . s:taglist_tempfile . '"' ++ endif ++ ++ call s:Tlist_Log_Msg('Cmd: ' . ctags_cmd) ++ ++ " Run ctags and get the tag list ++ let cmd_output = system(ctags_cmd) ++ ++ " Restore the value of the 'shellslash' option. ++ if has('win95') && !has('win32unix') ++ let &shellslash = old_shellslash ++ endif ++ ++ if exists('s:taglist_tempfile') ++ " Delete the temporary cmd file created on MS-Windows ++ call delete(s:taglist_tempfile) ++ endif ++ ++ " Handle errors ++ if v:shell_error ++ let msg = "Taglist: Failed to generate tags for " . a:filename ++ call s:Tlist_Warning_Msg(msg) ++ if cmd_output != '' ++ call s:Tlist_Warning_Msg(cmd_output) ++ endif ++ return fidx ++ endif ++ ++ " Store the modification time for the file ++ let s:tlist_{fidx}_mtime = getftime(a:filename) ++ ++ " No tags for current file ++ if cmd_output == '' ++ call s:Tlist_Log_Msg('No tags defined in ' . a:filename) ++ return fidx ++ endif ++ ++ call s:Tlist_Log_Msg('Generated tags information for ' . a:filename) ++ ++ if v:version > 601 ++ " The following script local variables are used by the ++ " Tlist_Parse_Tagline() function. ++ let s:ctags_flags = s:tlist_{a:ftype}_ctags_flags ++ let s:fidx = fidx ++ let s:tidx = 0 ++ ++ " Process the ctags output one line at a time. The substitute() ++ " command is used to parse the tag lines instead of using the ++ " matchstr()/stridx()/strpart() functions for performance reason ++ call substitute(cmd_output, "\\([^\n]\\+\\)\n", ++ \ '\=s:Tlist_Parse_Tagline(submatch(1))', 'g') ++ ++ " Save the number of tags for this file ++ let s:tlist_{fidx}_tag_count = s:tidx ++ ++ " The following script local variables are no longer needed ++ unlet! s:ctags_flags ++ unlet! s:tidx ++ unlet! s:fidx ++ else ++ " Due to a bug in Vim earlier than version 6.1, ++ " we cannot use substitute() to parse the ctags output. ++ " Instead the slow str*() functions are used ++ let ctags_flags = s:tlist_{a:ftype}_ctags_flags ++ let tidx = 0 ++ ++ while cmd_output != '' ++ " Extract one line at a time ++ let idx = stridx(cmd_output, "\n") ++ let one_line = strpart(cmd_output, 0, idx) ++ " Remove the line from the tags output ++ let cmd_output = strpart(cmd_output, idx + 1) ++ ++ if one_line == '' ++ " Line is not in proper tags format ++ continue ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Extract_Tagtype(one_line) ++ ++ " Make sure the tag type is a valid and supported one ++ if ttype == '' || stridx(ctags_flags, ttype) == -1 ++ " Line is not in proper tags format or Tag type is not ++ " supported ++ continue ++ endif ++ ++ " Update the total tag count ++ let tidx = tidx + 1 ++ ++ " The following variables are used to optimize this code. Vim is ++ " slow in using curly brace names. To reduce the amount of ++ " processing needed, the curly brace variables are pre-processed ++ " here ++ let fidx_tidx = 's:tlist_' . fidx . '_' . tidx ++ let fidx_ttype = 's:tlist_' . fidx . '_' . ttype ++ ++ " Update the count of this tag type ++ let ttype_idx = {fidx_ttype}_count + 1 ++ let {fidx_ttype}_count = ttype_idx ++ ++ " Store the ctags output for this tag ++ let {fidx_tidx}_tag = one_line ++ ++ " Store the tag index and the tag type index (back pointers) ++ let {fidx_ttype}_{ttype_idx} = tidx ++ let {fidx_tidx}_ttype_idx = ttype_idx ++ ++ " Extract the tag name ++ let tag_name = strpart(one_line, 0, stridx(one_line, "\t")) ++ ++ " Extract the tag scope/prototype ++ if g:Tlist_Display_Prototype ++ let ttxt = ' ' . s:Tlist_Get_Tag_Prototype(fidx, tidx) ++ else ++ let ttxt = ' ' . tag_name ++ ++ " Add the tag scope, if it is available and is configured. Tag ++ " scope is the last field after the 'line:\t' field ++ if g:Tlist_Display_Tag_Scope ++ let tag_scope = s:Tlist_Extract_Tag_Scope(one_line) ++ if tag_scope != '' ++ let ttxt = ttxt . ' [' . tag_scope . ']' ++ endif ++ endif ++ endif ++ ++ " Add this tag to the tag type variable ++ let {fidx_ttype} = {fidx_ttype} . ttxt . "\n" ++ ++ " Save the tag name ++ let {fidx_tidx}_tag_name = tag_name ++ endwhile ++ ++ " Save the number of tags for this file ++ let s:tlist_{fidx}_tag_count = tidx ++ endif ++ ++ call s:Tlist_Log_Msg('Processed ' . s:tlist_{fidx}_tag_count . ++ \ ' tags in ' . a:filename) ++ ++ return fidx ++endfunction ++ ++" Tlist_Update_File ++" Update the tags for a file (if needed) ++function! Tlist_Update_File(filename, ftype) ++ call s:Tlist_Log_Msg('Tlist_Update_File (' . a:filename . ')') ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(a:filename, a:ftype) ++ return ++ endif ++ ++ " Convert the file name to a full path ++ let fname = fnamemodify(a:filename, ':p') ++ ++ " First check whether the file already exists ++ let fidx = s:Tlist_Get_File_Index(fname) ++ ++ if fidx != -1 && s:tlist_{fidx}_valid ++ " File exists and the tags are valid ++ " Check whether the file was modified after the last tags update ++ " If it is modified, then update the tags ++ if s:tlist_{fidx}_mtime == getftime(fname) ++ return ++ endif ++ else ++ " If the tags were removed previously based on a user request, ++ " as we are going to update the tags (based on the user request), ++ " remove the filename from the deleted list ++ call s:Tlist_Update_Remove_List(fname, 0) ++ endif ++ ++ " If the taglist window is opened, update it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ " Taglist window is not present. Just update the taglist ++ " and return ++ call s:Tlist_Process_File(fname, a:ftype) ++ else ++ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != -1 ++ " If tags for only one file are displayed and we are not ++ " updating the tags for that file, then no need to ++ " refresh the taglist window. Otherwise, the taglist ++ " window should be updated. ++ if s:tlist_{s:tlist_cur_file_idx}_filename != fname ++ call s:Tlist_Process_File(fname, a:ftype) ++ return ++ endif ++ endif ++ ++ " Save the current window number ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ " Save the cursor position ++ let save_line = line('.') ++ let save_col = col('.') ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(fname, a:ftype) ++ ++ " Restore the cursor position ++ if v:version >= 601 ++ call cursor(save_line, save_col) ++ else ++ exe save_line ++ exe 'normal! ' . save_col . '|' ++ endif ++ ++ if winnr() != save_winnr ++ " Go back to the original window ++ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') ++ endif ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(1) ++ endif ++endfunction ++ ++" Tlist_Window_Close ++" Close the taglist window ++function! s:Tlist_Window_Close() ++ call s:Tlist_Log_Msg('Tlist_Window_Close()') ++ " Make sure the taglist window exists ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Error: Taglist window is not open') ++ return ++ endif ++ ++ if winnr() == winnum ++ " Already in the taglist window. Close it and return ++ if winbufnr(2) != -1 ++ " If a window other than the taglist window is open, ++ " then only close the taglist window. ++ close ++ endif ++ else ++ " Goto the taglist window, close it and then come back to the ++ " original window ++ let curbufnr = bufnr('%') ++ exe winnum . 'wincmd w' ++ close ++ " Need to jump back to the original window only if we are not ++ " already in that window ++ let winnum = bufwinnr(curbufnr) ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ endif ++endfunction ++ ++" Tlist_Window_Mark_File_Window ++" Mark the current window as the file window to use when jumping to a tag. ++" Only if the current window is a non-plugin, non-preview and non-taglist ++" window ++function! s:Tlist_Window_Mark_File_Window() ++ if getbufvar('%', '&buftype') == '' && !&previewwindow ++ let w:tlist_file_window = "yes" ++ endif ++endfunction ++ ++" Tlist_Window_Open ++" Open and refresh the taglist window ++function! s:Tlist_Window_Open() ++ call s:Tlist_Log_Msg('Tlist_Window_Open()') ++ " If the window is open, jump to it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ " Jump to the existing window ++ if winnr() != winnum ++ exe winnum . 'wincmd w' ++ endif ++ return ++ endif ++ ++ if s:tlist_app_name == "winmanager" ++ " Taglist plugin is no longer part of the winmanager app ++ let s:tlist_app_name = "none" ++ endif ++ ++ " Get the filename and filetype for the specified buffer ++ let curbuf_name = fnamemodify(bufname('%'), ':p') ++ let curbuf_ftype = getbufvar('%', '&filetype') ++ let cur_lnum = line('.') ++ ++ " Mark the current window as the desired window to open a file when a tag ++ " is selected. ++ call s:Tlist_Window_Mark_File_Window() ++ ++ " Open the taglist window ++ call s:Tlist_Window_Create() ++ ++ call s:Tlist_Window_Refresh() ++ ++ if g:Tlist_Show_One_File ++ " Add only the current buffer and file ++ " ++ " If the file doesn't support tag listing, skip it ++ if !s:Tlist_Skip_File(curbuf_name, curbuf_ftype) ++ call s:Tlist_Window_Refresh_File(curbuf_name, curbuf_ftype) ++ endif ++ endif ++ ++ if g:Tlist_File_Fold_Auto_Close ++ " Open the fold for the current file, as all the folds in ++ " the taglist window are closed ++ let fidx = s:Tlist_Get_File_Index(curbuf_name) ++ if fidx != -1 ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ endif ++ endif ++ ++ " Highlight the current tag ++ call s:Tlist_Window_Highlight_Tag(curbuf_name, cur_lnum, 1, 1) ++endfunction ++ ++" Tlist_Window_Toggle() ++" Open or close a taglist window ++function! s:Tlist_Window_Toggle() ++ call s:Tlist_Log_Msg('Tlist_Window_Toggle()') ++ " If taglist window is open then close it. ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ call s:Tlist_Window_Close() ++ return ++ endif ++ ++ call s:Tlist_Window_Open() ++ ++ " Go back to the original window, if Tlist_GainFocus_On_ToggleOpen is not ++ " set ++ if !g:Tlist_GainFocus_On_ToggleOpen ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++endfunction ++ ++" Tlist_Process_Filelist ++" Process multiple files. Each filename is separated by "\n" ++" Returns the number of processed files ++function! s:Tlist_Process_Filelist(file_names) ++ let flist = a:file_names ++ ++ " Enable lazy screen updates ++ let old_lazyredraw = &lazyredraw ++ set lazyredraw ++ ++ " Keep track of the number of processed files ++ let fcnt = 0 ++ ++ " Process one file at a time ++ while flist != '' ++ let nl_idx = stridx(flist, "\n") ++ let one_file = strpart(flist, 0, nl_idx) ++ ++ " Remove the filename from the list ++ let flist = strpart(flist, nl_idx + 1) ++ ++ if one_file == '' ++ continue ++ endif ++ ++ " Skip directories ++ if isdirectory(one_file) ++ continue ++ endif ++ ++ let ftype = s:Tlist_Get_Filetype(one_file) ++ ++ echon "\r " ++ echon "\rProcessing tags for " . fnamemodify(one_file, ':p:t') ++ ++ let fcnt = fcnt + 1 ++ ++ call Tlist_Update_File(one_file, ftype) ++ endwhile ++ ++ " Clear the displayed informational messages ++ echon "\r " ++ ++ " Restore the previous state ++ let &lazyredraw = old_lazyredraw ++ ++ return fcnt ++endfunction ++ ++" Tlist_Process_Dir ++" Process the files in a directory matching the specified pattern ++function! s:Tlist_Process_Dir(dir_name, pat) ++ let flist = glob(a:dir_name . '/' . a:pat) . "\n" ++ ++ let fcnt = s:Tlist_Process_Filelist(flist) ++ ++ let len = strlen(a:dir_name) ++ if a:dir_name[len - 1] == '\' || a:dir_name[len - 1] == '/' ++ let glob_expr = a:dir_name . '*' ++ else ++ let glob_expr = a:dir_name . '/*' ++ endif ++ let all_files = glob(glob_expr) . "\n" ++ ++ while all_files != '' ++ let nl_idx = stridx(all_files, "\n") ++ let one_file = strpart(all_files, 0, nl_idx) ++ ++ let all_files = strpart(all_files, nl_idx + 1) ++ if one_file == '' ++ continue ++ endif ++ ++ " Skip non-directory names ++ if !isdirectory(one_file) ++ continue ++ endif ++ ++ echon "\r " ++ echon "\rProcessing files in directory " . fnamemodify(one_file, ':t') ++ let fcnt = fcnt + s:Tlist_Process_Dir(one_file, a:pat) ++ endwhile ++ ++ return fcnt ++endfunction ++ ++" Tlist_Add_Files_Recursive ++" Add files recursively from a directory ++function! s:Tlist_Add_Files_Recursive(dir, ...) ++ let dir_name = fnamemodify(a:dir, ':p') ++ if !isdirectory(dir_name) ++ call s:Tlist_Warning_Msg('Error: ' . dir_name . ' is not a directory') ++ return ++ endif ++ ++ if a:0 == 1 ++ " User specified file pattern ++ let pat = a:1 ++ else ++ " Default file pattern ++ let pat = '*' ++ endif ++ ++ echon "\r " ++ echon "\rProcessing files in directory " . fnamemodify(dir_name, ':t') ++ let fcnt = s:Tlist_Process_Dir(dir_name, pat) ++ ++ echon "\rAdded " . fcnt . " files to the taglist" ++endfunction ++ ++" Tlist_Add_Files ++" Add the specified list of files to the taglist ++function! s:Tlist_Add_Files(...) ++ let flist = '' ++ let i = 1 ++ ++ " Get all the files matching the file patterns supplied as argument ++ while i <= a:0 ++ let flist = flist . glob(a:{i}) . "\n" ++ let i = i + 1 ++ endwhile ++ ++ if flist == '' ++ call s:Tlist_Warning_Msg('Error: No matching files are found') ++ return ++ endif ++ ++ let fcnt = s:Tlist_Process_Filelist(flist) ++ echon "\rAdded " . fcnt . " files to the taglist" ++endfunction ++ ++" Tlist_Extract_Tagtype ++" Extract the tag type from the tag text ++function! s:Tlist_Extract_Tagtype(tag_line) ++ " The tag type is after the tag prototype field. The prototype field ++ " ends with the /;"\t string. We add 4 at the end to skip the characters ++ " in this special string.. ++ let start = strridx(a:tag_line, '/;"' . "\t") + 4 ++ let end = strridx(a:tag_line, 'line:') - 1 ++ let ttype = strpart(a:tag_line, start, end - start) ++ ++ return ttype ++endfunction ++ ++" Tlist_Extract_Tag_Scope ++" Extract the tag scope from the tag text ++function! s:Tlist_Extract_Tag_Scope(tag_line) ++ let start = strridx(a:tag_line, 'line:') ++ let end = strridx(a:tag_line, "\t") ++ if end <= start ++ return '' ++ endif ++ ++ let tag_scope = strpart(a:tag_line, end + 1) ++ let tag_scope = strpart(tag_scope, stridx(tag_scope, ':') + 1) ++ ++ return tag_scope ++endfunction ++ ++" Tlist_Refresh() ++" Refresh the taglist ++function! s:Tlist_Refresh() ++ call s:Tlist_Log_Msg('Tlist_Refresh (Skip_Refresh = ' . ++ \ s:Tlist_Skip_Refresh . ', ' . bufname('%') . ')') ++ " If we are entering the buffer from one of the taglist functions, then ++ " no need to refresh the taglist window again. ++ if s:Tlist_Skip_Refresh ++ " We still need to update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++ return ++ endif ++ ++ " If part of the winmanager plugin and not configured to process ++ " tags always and not configured to display the tags menu, then return ++ if (s:tlist_app_name == 'winmanager') && !g:Tlist_Process_File_Always ++ \ && !g:Tlist_Show_Menu ++ return ++ endif ++ ++ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help ++ if &buftype != '' ++ return ++ endif ++ ++ let filename = fnamemodify(bufname('%'), ':p') ++ let ftype = &filetype ++ ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(filename, ftype) ++ return ++ endif ++ ++ let tlist_win = bufwinnr(g:TagList_title) ++ ++ " If the taglist window is not opened and not configured to process ++ " tags always and not displaying the tags menu, then return ++ if tlist_win == -1 && !g:Tlist_Process_File_Always && !g:Tlist_Show_Menu ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(filename) ++ return ++ endif ++ ++ " If the taglist should not be auto updated, then return ++ if !g:Tlist_Auto_Update ++ return ++ endif ++ endif ++ ++ let cur_lnum = line('.') ++ ++ if fidx == -1 ++ " Update the tags for the file ++ let fidx = s:Tlist_Process_File(filename, ftype) ++ else ++ let mtime = getftime(filename) ++ if s:tlist_{fidx}_mtime != mtime ++ " Invalidate the tags listed for this file ++ let s:tlist_{fidx}_valid = 0 ++ ++ " Update the taglist and the window ++ call Tlist_Update_File(filename, ftype) ++ ++ " Store the new file modification time ++ let s:tlist_{fidx}_mtime = mtime ++ endif ++ endif ++ ++ " Update the taglist window ++ if tlist_win != -1 ++ " Disable screen updates ++ let old_lazyredraw = &lazyredraw ++ set nolazyredraw ++ ++ " Save the current window number ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ if !g:Tlist_Auto_Highlight_Tag || !g:Tlist_Highlight_Tag_On_BufEnter ++ " Save the cursor position ++ let save_line = line('.') ++ let save_col = col('.') ++ endif ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(filename, ftype) ++ ++ " Open the fold for the file ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen!" ++ ++ if g:Tlist_Highlight_Tag_On_BufEnter && g:Tlist_Auto_Highlight_Tag ++ if g:Tlist_Show_One_File && s:tlist_cur_file_idx != fidx ++ " If displaying tags for only one file in the taglist ++ " window and about to display the tags for a new file, ++ " then center the current tag line for the new file ++ let center_tag_line = 1 ++ else ++ let center_tag_line = 0 ++ endif ++ ++ " Highlight the current tag ++ call s:Tlist_Window_Highlight_Tag(filename, cur_lnum, 1, center_tag_line) ++ else ++ " Restore the cursor position ++ if v:version >= 601 ++ call cursor(save_line, save_col) ++ else ++ exe save_line ++ exe 'normal! ' . save_col . '|' ++ endif ++ endif ++ ++ " Jump back to the original window ++ if save_winnr != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds(save_winnr . 'wincmd w') ++ endif ++ ++ " Restore screen updates ++ let &lazyredraw = old_lazyredraw ++ endif ++ ++ " Update the taglist menu ++ if g:Tlist_Show_Menu ++ call s:Tlist_Menu_Update_File(0) ++ endif ++endfunction ++ ++" Tlist_Change_Sort() ++" Change the sort order of the tag listing ++" caller == 'cmd', command used in the taglist window ++" caller == 'menu', taglist menu ++" action == 'toggle', toggle sort from name to order and vice versa ++" action == 'set', set the sort order to sort_type ++function! s:Tlist_Change_Sort(caller, action, sort_type) ++ call s:Tlist_Log_Msg('Tlist_Change_Sort (caller = ' . a:caller . ++ \ ', action = ' . a:action . ', sort_type = ' . a:sort_type . ')') ++ if a:caller == 'cmd' ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ " Remove the previous highlighting ++ match none ++ elseif a:caller == 'menu' ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx == -1 ++ return ++ endif ++ endif ++ ++ if a:action == 'toggle' ++ let sort_type = s:tlist_{fidx}_sort_type ++ ++ " Toggle the sort order from 'name' to 'order' and vice versa ++ if sort_type == 'name' ++ let s:tlist_{fidx}_sort_type = 'order' ++ else ++ let s:tlist_{fidx}_sort_type = 'name' ++ endif ++ else ++ let s:tlist_{fidx}_sort_type = a:sort_type ++ endif ++ ++ " Invalidate the tags listed for this file ++ let s:tlist_{fidx}_valid = 0 ++ ++ if a:caller == 'cmd' ++ " Save the current line for later restoration ++ let curline = '\V\^' . getline('.') . '\$' ++ ++ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, ++ \ s:tlist_{fidx}_filetype) ++ ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Go back to the cursor line before the tag list is sorted ++ call search(curline, 'w') ++ ++ call s:Tlist_Menu_Update_File(1) ++ else ++ call s:Tlist_Menu_Remove_File() ++ ++ call s:Tlist_Refresh() ++ endif ++endfunction ++ ++" Tlist_Update_Current_File() ++" Update taglist for the current buffer by regenerating the tag list ++" Contributed by WEN Guopeng. ++function! s:Tlist_Update_Current_File() ++ call s:Tlist_Log_Msg('Tlist_Update_Current_File()') ++ if winnr() == bufwinnr(g:TagList_title) ++ " In the taglist window. Update the current file ++ call s:Tlist_Window_Update_File() ++ else ++ " Not in the taglist window. Update the current buffer ++ let filename = fnamemodify(bufname('%'), ':p') ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx != -1 ++ let s:tlist_{fidx}_valid = 0 ++ endif ++ call Tlist_Update_File(filename, &filetype) ++ endif ++endfunction ++ ++" Tlist_Window_Update_File() ++" Update the tags displayed in the taglist window ++function! s:Tlist_Window_Update_File() ++ call s:Tlist_Log_Msg('Tlist_Window_Update_File()') ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ " Remove the previous highlighting ++ match none ++ ++ " Save the current line for later restoration ++ let curline = '\V\^' . getline('.') . '\$' ++ ++ let s:tlist_{fidx}_valid = 0 ++ ++ " Update the taglist window ++ call s:Tlist_Window_Refresh_File(s:tlist_{fidx}_filename, ++ \ s:tlist_{fidx}_filetype) ++ ++ exe s:tlist_{fidx}_start . ',' . s:tlist_{fidx}_end . 'foldopen!' ++ ++ " Go back to the tag line before the list is updated ++ call search(curline, 'w') ++endfunction ++ ++" Tlist_Window_Get_Tag_Type_By_Linenum() ++" Return the tag type index for the specified line in the taglist window ++function! s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) ++ let ftype = s:tlist_{a:fidx}_filetype ++ ++ " Determine to which tag type the current line number belongs to using the ++ " tag type start line number and the number of tags in a tag type ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{i}_name ++ let start_lnum = ++ \ s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset ++ let end = start_lnum + s:tlist_{a:fidx}_{ttype}_count ++ if a:lnum >= start_lnum && a:lnum <= end ++ break ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Current line doesn't belong to any of the displayed tag types ++ if i > s:tlist_{ftype}_count ++ return '' ++ endif ++ ++ return ttype ++endfunction ++ ++" Tlist_Window_Get_Tag_Index() ++" Return the tag index for the specified line in the taglist window ++function! s:Tlist_Window_Get_Tag_Index(fidx, lnum) ++ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(a:fidx, a:lnum) ++ ++ " Current line doesn't belong to any of the displayed tag types ++ if ttype == '' ++ return 0 ++ endif ++ ++ " Compute the index into the displayed tags for the tag type ++ let ttype_lnum = s:tlist_{a:fidx}_start + s:tlist_{a:fidx}_{ttype}_offset ++ let tidx = a:lnum - ttype_lnum ++ if tidx == 0 ++ return 0 ++ endif ++ ++ " Get the corresponding tag line and return it ++ return s:tlist_{a:fidx}_{ttype}_{tidx} ++endfunction ++ ++" Tlist_Window_Highlight_Line ++" Highlight the current line ++function! s:Tlist_Window_Highlight_Line() ++ " Clear previously selected name ++ match none ++ ++ " Highlight the current line ++ if g:Tlist_Display_Prototype == 0 ++ let pat = '/\%' . line('.') . 'l\s\+\zs.*/' ++ else ++ let pat = '/\%' . line('.') . 'l.*/' ++ endif ++ ++ exe 'match TagListTagName ' . pat ++endfunction ++ ++" Tlist_Window_Open_File ++" Open the specified file in either a new window or an existing window ++" and place the cursor at the specified tag pattern ++function! s:Tlist_Window_Open_File(win_ctrl, filename, tagpat) ++ call s:Tlist_Log_Msg('Tlist_Window_Open_File (' . a:filename . ',' . ++ \ a:win_ctrl . ')') ++ let prev_Tlist_Skip_Refresh = s:Tlist_Skip_Refresh ++ let s:Tlist_Skip_Refresh = 1 ++ ++ if s:tlist_app_name == "winmanager" ++ " Let the winmanager edit the file ++ call WinManagerFileEdit(a:filename, a:win_ctrl == 'newwin') ++ else ++ ++ if a:win_ctrl == 'newtab' ++ " Create a new tab ++ exe 'tabnew ' . escape(a:filename, ' ') ++ " Open the taglist window in the new tab ++ call s:Tlist_Window_Open() ++ endif ++ ++ if a:win_ctrl == 'checktab' ++ " Check whether the file is present in any of the tabs. ++ " If the file is present in the current tab, then use the ++ " current tab. ++ if bufwinnr(a:filename) != -1 ++ let file_present_in_tab = 1 ++ let i = tabpagenr() ++ else ++ let i = 1 ++ let bnum = bufnr(a:filename) ++ let file_present_in_tab = 0 ++ while i <= tabpagenr('$') ++ if index(tabpagebuflist(i), bnum) != -1 ++ let file_present_in_tab = 1 ++ break ++ endif ++ let i += 1 ++ endwhile ++ endif ++ ++ if file_present_in_tab ++ " Goto the tab containing the file ++ exe 'tabnext ' . i ++ else ++ " Open a new tab ++ exe 'tabnew ' . escape(a:filename, ' ') ++ ++ " Open the taglist window ++ call s:Tlist_Window_Open() ++ endif ++ endif ++ ++ let winnum = -1 ++ if a:win_ctrl == 'prevwin' ++ " Open the file in the previous window, if it is usable ++ let cur_win = winnr() ++ wincmd p ++ if &buftype == '' && !&previewwindow ++ exe "edit " . escape(a:filename, ' ') ++ let winnum = winnr() ++ else ++ " Previous window is not usable ++ exe cur_win . 'wincmd w' ++ endif ++ endif ++ ++ " Goto the window containing the file. If the window is not there, open a ++ " new window ++ if winnum == -1 ++ let winnum = bufwinnr(a:filename) ++ endif ++ ++ if winnum == -1 ++ " Locate the previously used window for opening a file ++ let fwin_num = 0 ++ let first_usable_win = 0 ++ ++ let i = 1 ++ let bnum = winbufnr(i) ++ while bnum != -1 ++ if getwinvar(i, 'tlist_file_window') == 'yes' ++ let fwin_num = i ++ break ++ endif ++ if first_usable_win == 0 && ++ \ getbufvar(bnum, '&buftype') == '' && ++ \ !getwinvar(i, '&previewwindow') ++ " First non-taglist, non-plugin and non-preview window ++ let first_usable_win = i ++ endif ++ let i = i + 1 ++ let bnum = winbufnr(i) ++ endwhile ++ ++ " If a previously used window is not found, then use the first ++ " non-taglist window ++ if fwin_num == 0 ++ let fwin_num = first_usable_win ++ endif ++ ++ if fwin_num != 0 ++ " Jump to the file window ++ exe fwin_num . "wincmd w" ++ ++ " If the user asked to jump to the tag in a new window, then split ++ " the existing window into two. ++ if a:win_ctrl == 'newwin' ++ split ++ endif ++ exe "edit " . escape(a:filename, ' ') ++ else ++ " Open a new window ++ if g:Tlist_Use_Horiz_Window ++ exe 'leftabove split ' . escape(a:filename, ' ') ++ else ++ if winbufnr(2) == -1 ++ " Only the taglist window is present ++ if g:Tlist_Use_Right_Window ++ exe 'leftabove vertical split ' . ++ \ escape(a:filename, ' ') ++ else ++ exe 'rightbelow vertical split ' . ++ \ escape(a:filename, ' ') ++ endif ++ ++ " Go to the taglist window to change the window size to ++ " the user configured value ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ if g:Tlist_Use_Horiz_Window ++ exe 'resize ' . g:Tlist_WinHeight ++ else ++ exe 'vertical resize ' . g:Tlist_WinWidth ++ endif ++ " Go back to the file window ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ else ++ " A plugin or help window is also present ++ wincmd w ++ exe 'leftabove split ' . escape(a:filename, ' ') ++ endif ++ endif ++ endif ++ " Mark the window, so that it can be reused. ++ call s:Tlist_Window_Mark_File_Window() ++ else ++ if v:version >= 700 ++ " If the file is opened in more than one window, then check ++ " whether the last accessed window has the selected file. ++ " If it does, then use that window. ++ let lastwin_bufnum = winbufnr(winnr('#')) ++ if bufnr(a:filename) == lastwin_bufnum ++ let winnum = winnr('#') ++ endif ++ endif ++ exe winnum . 'wincmd w' ++ ++ " If the user asked to jump to the tag in a new window, then split the ++ " existing window into two. ++ if a:win_ctrl == 'newwin' ++ split ++ endif ++ endif ++ endif ++ ++ " Jump to the tag ++ if a:tagpat != '' ++ " Add the current cursor position to the jump list, so that user can ++ " jump back using the ' and ` marks. ++ mark ' ++ silent call search(a:tagpat, 'w') ++ ++ " Bring the line to the middle of the window ++ normal! z. ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ endif ++ ++ " If the user selects to preview the tag then jump back to the ++ " taglist window ++ if a:win_ctrl == 'preview' ++ " Go back to the taglist window ++ let winnum = bufwinnr(g:TagList_title) ++ exe winnum . 'wincmd w' ++ else ++ " If the user has selected to close the taglist window, when a ++ " tag is selected, close the taglist window ++ if g:Tlist_Close_On_Select ++ call s:Tlist_Window_Goto_Window() ++ close ++ ++ " Go back to the window displaying the selected file ++ let wnum = bufwinnr(a:filename) ++ if wnum != -1 && wnum != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds(wnum . 'wincmd w') ++ endif ++ endif ++ endif ++ ++ let s:Tlist_Skip_Refresh = prev_Tlist_Skip_Refresh ++endfunction ++ ++" Tlist_Window_Jump_To_Tag() ++" Jump to the location of the current tag ++" win_ctrl == useopen - Reuse the existing file window ++" win_ctrl == newwin - Open a new window ++" win_ctrl == preview - Preview the tag ++" win_ctrl == prevwin - Open in previous window ++" win_ctrl == newtab - Open in new tab ++function! s:Tlist_Window_Jump_To_Tag(win_ctrl) ++ call s:Tlist_Log_Msg('Tlist_Window_Jump_To_Tag(' . a:win_ctrl . ')') ++ " Do not process comment lines and empty lines ++ let curline = getline('.') ++ if curline =~ '^\s*$' || curline[0] == '"' ++ return ++ endif ++ ++ " If inside a closed fold, then use the first line of the fold ++ " and jump to the file. ++ let lnum = foldclosed('.') ++ if lnum == -1 ++ " Jump to the selected tag or file ++ let lnum = line('.') ++ else ++ " Open the closed fold ++ .foldopen! ++ endif ++ ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) ++ if fidx == -1 ++ return ++ endif ++ ++ " Get the tag output for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) ++ if tidx != 0 ++ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, tidx) ++ ++ " Highlight the tagline ++ call s:Tlist_Window_Highlight_Line() ++ else ++ " Selected a line which is not a tag name. Just edit the file ++ let tagpat = '' ++ endif ++ ++ call s:Tlist_Window_Open_File(a:win_ctrl, s:tlist_{fidx}_filename, tagpat) ++endfunction ++ ++" Tlist_Window_Show_Info() ++" Display information about the entry under the cursor ++function! s:Tlist_Window_Show_Info() ++ call s:Tlist_Log_Msg('Tlist_Window_Show_Info()') ++ ++ " Clear the previously displayed line ++ echo ++ ++ " Do not process comment lines and empty lines ++ let curline = getline('.') ++ if curline =~ '^\s*$' || curline[0] == '"' ++ return ++ endif ++ ++ " If inside a fold, then don't display the prototype ++ if foldclosed('.') != -1 ++ return ++ endif ++ ++ let lnum = line('.') ++ ++ " Get the file index ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(lnum) ++ if fidx == -1 ++ return ++ endif ++ ++ if lnum == s:tlist_{fidx}_start ++ " Cursor is on a file name ++ let fname = s:tlist_{fidx}_filename ++ if strlen(fname) > 50 ++ let fname = fnamemodify(fname, ':t') ++ endif ++ echo fname . ', Filetype=' . s:tlist_{fidx}_filetype . ++ \ ', Tag count=' . s:tlist_{fidx}_tag_count ++ return ++ endif ++ ++ " Get the tag output line for the current tag ++ let tidx = s:Tlist_Window_Get_Tag_Index(fidx, lnum) ++ if tidx == 0 ++ " Cursor is on a tag type ++ let ttype = s:Tlist_Window_Get_Tag_Type_By_Linenum(fidx, lnum) ++ if ttype == '' ++ return ++ endif ++ ++ let ttype_name = '' ++ ++ let ftype = s:tlist_{fidx}_filetype ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ if ttype == s:tlist_{ftype}_{i}_name ++ let ttype_name = s:tlist_{ftype}_{i}_fullname ++ break ++ endif ++ let i = i + 1 ++ endwhile ++ ++ echo 'Tag type=' . ttype_name . ++ \ ', Tag count=' . s:tlist_{fidx}_{ttype}_count ++ return ++ endif ++ ++ " Get the tag search pattern and display it ++ echo s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Find_Nearest_Tag_Idx ++" Find the tag idx nearest to the supplied line number ++" Returns -1, if a tag couldn't be found for the specified line number ++function! s:Tlist_Find_Nearest_Tag_Idx(fidx, linenum) ++ let sort_type = s:tlist_{a:fidx}_sort_type ++ ++ let left = 1 ++ let right = s:tlist_{a:fidx}_tag_count ++ ++ if sort_type == 'order' ++ " Tags sorted by order, use a binary search. ++ " The idea behind this function is taken from the ctags.vim script (by ++ " Alexey Marinichev) available at the Vim online website. ++ ++ " If the current line is the less than the first tag, then no need to ++ " search ++ let first_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, 1) ++ ++ if a:linenum < first_lnum ++ return -1 ++ endif ++ ++ while left < right ++ let middle = (right + left + 1) / 2 ++ let middle_lnum = s:Tlist_Get_Tag_Linenum(a:fidx, middle) ++ ++ if middle_lnum == a:linenum ++ let left = middle ++ break ++ endif ++ ++ if middle_lnum > a:linenum ++ let right = middle - 1 ++ else ++ let left = middle ++ endif ++ endwhile ++ else ++ " Tags sorted by name, use a linear search. (contributed by Dave ++ " Eggum). ++ " Look for a tag with a line number less than or equal to the supplied ++ " line number. If multiple tags are found, then use the tag with the ++ " line number closest to the supplied line number. IOW, use the tag ++ " with the highest line number. ++ let closest_lnum = 0 ++ let final_left = 0 ++ while left <= right ++ let lnum = s:Tlist_Get_Tag_Linenum(a:fidx, left) ++ ++ if lnum < a:linenum && lnum > closest_lnum ++ let closest_lnum = lnum ++ let final_left = left ++ elseif lnum == a:linenum ++ let closest_lnum = lnum ++ let final_left = left ++ break ++ else ++ let left = left + 1 ++ endif ++ endwhile ++ if closest_lnum == 0 ++ return -1 ++ endif ++ if left >= right ++ let left = final_left ++ endif ++ endif ++ ++ return left ++endfunction ++ ++" Tlist_Window_Highlight_Tag() ++" Highlight the current tag ++" cntx == 1, Called by the taglist plugin itself ++" cntx == 2, Forced by the user through the TlistHighlightTag command ++" center = 1, move the tag line to the center of the taglist window ++function! s:Tlist_Window_Highlight_Tag(filename, cur_lnum, cntx, center) ++ " Highlight the current tag only if the user configured the ++ " taglist plugin to do so or if the user explictly invoked the ++ " command to highlight the current tag. ++ if !g:Tlist_Auto_Highlight_Tag && a:cntx == 1 ++ return ++ endif ++ ++ if a:filename == '' ++ return ++ endif ++ ++ " Make sure the taglist window is present ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Error: Taglist window is not open') ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ return ++ endif ++ ++ " If the file is currently not displayed in the taglist window, then retrn ++ if !s:tlist_{fidx}_visible ++ return ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return ++ endif ++ ++ " Ignore all autocommands ++ let old_ei = &eventignore ++ set eventignore=all ++ ++ " Save the original window number ++ let org_winnr = winnr() ++ ++ if org_winnr == winnum ++ let in_taglist_window = 1 ++ else ++ let in_taglist_window = 0 ++ endif ++ ++ " Go to the taglist window ++ if !in_taglist_window ++ exe winnum . 'wincmd w' ++ endif ++ ++ " Clear previously selected name ++ match none ++ ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, a:cur_lnum) ++ if tidx == -1 ++ " Make sure the current tag line is visible in the taglist window. ++ " Calling the winline() function makes the line visible. Don't know ++ " of a better way to achieve this. ++ let lnum = line('.') ++ ++ if lnum < s:tlist_{fidx}_start || lnum > s:tlist_{fidx}_end ++ " Move the cursor to the beginning of the file ++ exe s:tlist_{fidx}_start ++ endif ++ ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ ++ call winline() ++ ++ if !in_taglist_window ++ exe org_winnr . 'wincmd w' ++ endif ++ ++ " Restore the autocommands ++ let &eventignore = old_ei ++ return ++ endif ++ ++ " Extract the tag type ++ let ttype = s:Tlist_Get_Tag_Type_By_Tag(fidx, tidx) ++ ++ " Compute the line number ++ " Start of file + Start of tag type + offset ++ let lnum = s:tlist_{fidx}_start + s:tlist_{fidx}_{ttype}_offset + ++ \ s:tlist_{fidx}_{tidx}_ttype_idx ++ ++ " Goto the line containing the tag ++ exe lnum ++ ++ " Open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++ ++ if a:center ++ " Move the tag line to the center of the taglist window ++ normal! z. ++ else ++ " Make sure the current tag line is visible in the taglist window. ++ " Calling the winline() function makes the line visible. Don't know ++ " of a better way to achieve this. ++ call winline() ++ endif ++ ++ " Highlight the tag name ++ call s:Tlist_Window_Highlight_Line() ++ ++ " Go back to the original window ++ if !in_taglist_window ++ exe org_winnr . 'wincmd w' ++ endif ++ ++ " Restore the autocommands ++ let &eventignore = old_ei ++ return ++endfunction ++ ++" Tlist_Get_Tag_Prototype_By_Line ++" Get the prototype for the tag on or before the specified line number in the ++" current buffer ++function! Tlist_Get_Tag_Prototype_By_Line(...) ++ if a:0 == 0 ++ " Arguments are not supplied. Use the current buffer name ++ " and line number ++ let filename = bufname('%') ++ let linenr = line('.') ++ elseif a:0 == 2 ++ " Filename and line number are specified ++ let filename = a:1 ++ let linenr = a:2 ++ if linenr !~ '\d\+' ++ " Invalid line number ++ return "" ++ endif ++ else ++ " Sufficient arguments are not supplied ++ let msg = 'Usage: Tlist_Get_Tag_Prototype_By_Line ' . ++ \ '' ++ call s:Tlist_Warning_Msg(msg) ++ return "" ++ endif ++ ++ " Expand the file to a fully qualified name ++ let filename = fnamemodify(filename, ':p') ++ if filename == '' ++ return "" ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ return "" ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return "" ++ endif ++ ++ " Get the tag text using the line number ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) ++ if tidx == -1 ++ return "" ++ endif ++ ++ return s:Tlist_Get_Tag_Prototype(fidx, tidx) ++endfunction ++ ++" Tlist_Get_Tagname_By_Line ++" Get the tag name on or before the specified line number in the ++" current buffer ++function! Tlist_Get_Tagname_By_Line(...) ++ if a:0 == 0 ++ " Arguments are not supplied. Use the current buffer name ++ " and line number ++ let filename = bufname('%') ++ let linenr = line('.') ++ elseif a:0 == 2 ++ " Filename and line number are specified ++ let filename = a:1 ++ let linenr = a:2 ++ if linenr !~ '\d\+' ++ " Invalid line number ++ return "" ++ endif ++ else ++ " Sufficient arguments are not supplied ++ let msg = 'Usage: Tlist_Get_Tagname_By_Line ' ++ call s:Tlist_Warning_Msg(msg) ++ return "" ++ endif ++ ++ " Make sure the current file has a name ++ let filename = fnamemodify(filename, ':p') ++ if filename == '' ++ return "" ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 ++ return "" ++ endif ++ ++ " If there are no tags for this file, then no need to proceed further ++ if s:tlist_{fidx}_tag_count == 0 ++ return "" ++ endif ++ ++ " Get the tag name using the line number ++ let tidx = s:Tlist_Find_Nearest_Tag_Idx(fidx, linenr) ++ if tidx == -1 ++ return "" ++ endif ++ ++ return s:tlist_{fidx}_{tidx}_tag_name ++endfunction ++ ++" Tlist_Window_Move_To_File ++" Move the cursor to the beginning of the current file or the next file ++" or the previous file in the taglist window ++" dir == -1, move to start of current or previous function ++" dir == 1, move to start of next function ++function! s:Tlist_Window_Move_To_File(dir) ++ if foldlevel('.') == 0 ++ " Cursor is on a non-folded line (it is not in any of the files) ++ " Move it to a folded line ++ if a:dir == -1 ++ normal! zk ++ else ++ " While moving down to the start of the next fold, ++ " no need to do go to the start of the next file. ++ normal! zj ++ return ++ endif ++ endif ++ ++ let fidx = s:Tlist_Window_Get_File_Index_By_Linenum(line('.')) ++ if fidx == -1 ++ return ++ endif ++ ++ let cur_lnum = line('.') ++ ++ if a:dir == -1 ++ if cur_lnum > s:tlist_{fidx}_start ++ " Move to the beginning of the current file ++ exe s:tlist_{fidx}_start ++ return ++ endif ++ ++ if fidx != 0 ++ " Move to the beginning of the previous file ++ let fidx = fidx - 1 ++ else ++ " Cursor is at the first file, wrap around to the last file ++ let fidx = s:tlist_file_count - 1 ++ endif ++ ++ exe s:tlist_{fidx}_start ++ return ++ else ++ " Move to the beginning of the next file ++ let fidx = fidx + 1 ++ ++ if fidx >= s:tlist_file_count ++ " Cursor is at the last file, wrap around to the first file ++ let fidx = 0 ++ endif ++ ++ if s:tlist_{fidx}_start != 0 ++ exe s:tlist_{fidx}_start ++ endif ++ return ++ endif ++endfunction ++ ++" Tlist_Session_Load ++" Load a taglist session (information about all the displayed files ++" and the tags) from the specified file ++function! s:Tlist_Session_Load(...) ++ if a:0 == 0 || a:1 == '' ++ call s:Tlist_Warning_Msg('Usage: TlistSessionLoad ') ++ return ++ endif ++ ++ let sessionfile = a:1 ++ ++ if !filereadable(sessionfile) ++ let msg = 'Taglist: Error - Unable to open file ' . sessionfile ++ call s:Tlist_Warning_Msg(msg) ++ return ++ endif ++ ++ " Mark the current window as the file window ++ call s:Tlist_Window_Mark_File_Window() ++ ++ " Source the session file ++ exe 'source ' . sessionfile ++ ++ let new_file_count = g:tlist_file_count ++ unlet! g:tlist_file_count ++ ++ let i = 0 ++ while i < new_file_count ++ let ftype = g:tlist_{i}_filetype ++ unlet! g:tlist_{i}_filetype ++ ++ if !exists('s:tlist_' . ftype . '_count') ++ if s:Tlist_FileType_Init(ftype) == 0 ++ let i = i + 1 ++ continue ++ endif ++ endif ++ ++ let fname = g:tlist_{i}_filename ++ unlet! g:tlist_{i}_filename ++ ++ let fidx = s:Tlist_Get_File_Index(fname) ++ if fidx != -1 ++ let s:tlist_{fidx}_visible = 0 ++ let i = i + 1 ++ continue ++ else ++ " As we are loading the tags from the session file, if this ++ " file was previously deleted by the user, now we need to ++ " add it back. So remove the file from the deleted list. ++ call s:Tlist_Update_Remove_List(fname, 0) ++ endif ++ ++ let fidx = s:Tlist_Init_File(fname, ftype) ++ ++ let s:tlist_{fidx}_filename = fname ++ ++ let s:tlist_{fidx}_sort_type = g:tlist_{i}_sort_type ++ unlet! g:tlist_{i}_sort_type ++ ++ let s:tlist_{fidx}_filetype = ftype ++ let s:tlist_{fidx}_mtime = getftime(fname) ++ ++ let s:tlist_{fidx}_start = 0 ++ let s:tlist_{fidx}_end = 0 ++ ++ let s:tlist_{fidx}_valid = 1 ++ ++ let s:tlist_{fidx}_tag_count = g:tlist_{i}_tag_count ++ unlet! g:tlist_{i}_tag_count ++ ++ let j = 1 ++ while j <= s:tlist_{fidx}_tag_count ++ let s:tlist_{fidx}_{j}_tag = g:tlist_{i}_{j}_tag ++ let s:tlist_{fidx}_{j}_tag_name = g:tlist_{i}_{j}_tag_name ++ let s:tlist_{fidx}_{j}_ttype_idx = g:tlist_{i}_{j}_ttype_idx ++ unlet! g:tlist_{i}_{j}_tag ++ unlet! g:tlist_{i}_{j}_tag_name ++ unlet! g:tlist_{i}_{j}_ttype_idx ++ let j = j + 1 ++ endwhile ++ ++ let j = 1 ++ while j <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{j}_name ++ ++ if exists('g:tlist_' . i . '_' . ttype) ++ let s:tlist_{fidx}_{ttype} = g:tlist_{i}_{ttype} ++ unlet! g:tlist_{i}_{ttype} ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = g:tlist_{i}_{ttype}_count ++ unlet! g:tlist_{i}_{ttype}_count ++ ++ let k = 1 ++ while k <= s:tlist_{fidx}_{ttype}_count ++ let s:tlist_{fidx}_{ttype}_{k} = g:tlist_{i}_{ttype}_{k} ++ unlet! g:tlist_{i}_{ttype}_{k} ++ let k = k + 1 ++ endwhile ++ else ++ let s:tlist_{fidx}_{ttype} = '' ++ let s:tlist_{fidx}_{ttype}_offset = 0 ++ let s:tlist_{fidx}_{ttype}_count = 0 ++ endif ++ ++ let j = j + 1 ++ endwhile ++ ++ let i = i + 1 ++ endwhile ++ ++ " If the taglist window is open, then update it ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum != -1 ++ let save_winnr = winnr() ++ ++ " Goto the taglist window ++ call s:Tlist_Window_Goto_Window() ++ ++ " Refresh the taglist window ++ call s:Tlist_Window_Refresh() ++ ++ " Go back to the original window ++ if save_winnr != winnr() ++ call s:Tlist_Exe_Cmd_No_Acmds('wincmd p') ++ endif ++ endif ++endfunction ++ ++" Tlist_Session_Save ++" Save a taglist session (information about all the displayed files ++" and the tags) into the specified file ++function! s:Tlist_Session_Save(...) ++ if a:0 == 0 || a:1 == '' ++ call s:Tlist_Warning_Msg('Usage: TlistSessionSave ') ++ return ++ endif ++ ++ let sessionfile = a:1 ++ ++ if s:tlist_file_count == 0 ++ " There is nothing to save ++ call s:Tlist_Warning_Msg('Warning: Taglist is empty. Nothing to save.') ++ return ++ endif ++ ++ if filereadable(sessionfile) ++ let ans = input('Do you want to overwrite ' . sessionfile . ' (Y/N)?') ++ if ans !=? 'y' ++ return ++ endif ++ ++ echo "\n" ++ endif ++ ++ let old_verbose = &verbose ++ set verbose&vim ++ ++ exe 'redir! > ' . sessionfile ++ ++ silent! echo '" Taglist session file. This file is auto-generated.' ++ silent! echo '" File information' ++ silent! echo 'let tlist_file_count = ' . s:tlist_file_count ++ ++ let i = 0 ++ ++ while i < s:tlist_file_count ++ " Store information about the file ++ silent! echo 'let tlist_' . i . "_filename = '" . ++ \ s:tlist_{i}_filename . "'" ++ silent! echo 'let tlist_' . i . '_sort_type = "' . ++ \ s:tlist_{i}_sort_type . '"' ++ silent! echo 'let tlist_' . i . '_filetype = "' . ++ \ s:tlist_{i}_filetype . '"' ++ silent! echo 'let tlist_' . i . '_tag_count = ' . ++ \ s:tlist_{i}_tag_count ++ " Store information about all the tags ++ let j = 1 ++ while j <= s:tlist_{i}_tag_count ++ let txt = escape(s:tlist_{i}_{j}_tag, '"\\') ++ silent! echo 'let tlist_' . i . '_' . j . '_tag = "' . txt . '"' ++ silent! echo 'let tlist_' . i . '_' . j . '_tag_name = "' . ++ \ s:tlist_{i}_{j}_tag_name . '"' ++ silent! echo 'let tlist_' . i . '_' . j . '_ttype_idx' . ' = ' . ++ \ s:tlist_{i}_{j}_ttype_idx ++ let j = j + 1 ++ endwhile ++ ++ " Store information about all the tags grouped by their type ++ let ftype = s:tlist_{i}_filetype ++ let j = 1 ++ while j <= s:tlist_{ftype}_count ++ let ttype = s:tlist_{ftype}_{j}_name ++ if s:tlist_{i}_{ttype}_count != 0 ++ let txt = substitute(s:tlist_{i}_{ttype}, "\n", "\\\\n", 'g') ++ silent! echo 'let tlist_' . i . '_' . ttype . ' = "' . ++ \ txt . '"' ++ silent! echo 'let tlist_' . i . '_' . ttype . '_count = ' . ++ \ s:tlist_{i}_{ttype}_count ++ let k = 1 ++ while k <= s:tlist_{i}_{ttype}_count ++ silent! echo 'let tlist_' . i . '_' . ttype . '_' . k . ++ \ ' = ' . s:tlist_{i}_{ttype}_{k} ++ let k = k + 1 ++ endwhile ++ endif ++ let j = j + 1 ++ endwhile ++ ++ silent! echo ++ ++ let i = i + 1 ++ endwhile ++ ++ redir END ++ ++ let &verbose = old_verbose ++endfunction ++ ++" Tlist_Buffer_Removed ++" A buffer is removed from the Vim buffer list. Remove the tags defined ++" for that file ++function! s:Tlist_Buffer_Removed(filename) ++ call s:Tlist_Log_Msg('Tlist_Buffer_Removed (' . a:filename . ')') ++ ++ " Make sure a valid filename is supplied ++ if a:filename == '' ++ return ++ endif ++ ++ " Get tag list index of the specified file ++ let fidx = s:Tlist_Get_File_Index(a:filename) ++ if fidx == -1 ++ " File not present in the taglist ++ return ++ endif ++ ++ " Remove the file from the list ++ call s:Tlist_Remove_File(fidx, 0) ++endfunction ++ ++" When a buffer is deleted, remove the file from the taglist ++autocmd BufDelete * silent call s:Tlist_Buffer_Removed(expand(':p')) ++ ++" Tlist_Window_Open_File_Fold ++" Open the fold for the specified file and close the fold for all the ++" other files ++function! s:Tlist_Window_Open_File_Fold(acmd_file) ++ call s:Tlist_Log_Msg('Tlist_Window_Open_File_Fold (' . a:acmd_file . ')') ++ ++ " Make sure the taglist window is present ++ let winnum = bufwinnr(g:TagList_title) ++ if winnum == -1 ++ call s:Tlist_Warning_Msg('Taglist: Error - Taglist window is not open') ++ return ++ endif ++ ++ " Save the original window number ++ let org_winnr = winnr() ++ if org_winnr == winnum ++ let in_taglist_window = 1 ++ else ++ let in_taglist_window = 0 ++ endif ++ ++ if in_taglist_window ++ " When entering the taglist window, no need to update the folds ++ return ++ endif ++ ++ " Go to the taglist window ++ if !in_taglist_window ++ call s:Tlist_Exe_Cmd_No_Acmds(winnum . 'wincmd w') ++ endif ++ ++ " Close all the folds ++ silent! %foldclose ++ ++ " Get tag list index of the specified file ++ let fname = fnamemodify(a:acmd_file, ":p") ++ if filereadable(fname) ++ let fidx = s:Tlist_Get_File_Index(fname) ++ if fidx != -1 ++ " Open the fold for the file ++ exe "silent! " . s:tlist_{fidx}_start . "," . ++ \ s:tlist_{fidx}_end . "foldopen" ++ endif ++ endif ++ ++ " Go back to the original window ++ if !in_taglist_window ++ call s:Tlist_Exe_Cmd_No_Acmds(org_winnr . 'wincmd w') ++ endif ++endfunction ++ ++" Tlist_Window_Check_Auto_Open ++" Open the taglist window automatically on Vim startup. ++" Open the window only when files present in any of the Vim windows support ++" tags. ++function! s:Tlist_Window_Check_Auto_Open() ++ let open_window = 0 ++ ++ let i = 1 ++ let buf_num = winbufnr(i) ++ while buf_num != -1 ++ let filename = fnamemodify(bufname(buf_num), ':p') ++ if !s:Tlist_Skip_File(filename, getbufvar(buf_num, '&filetype')) ++ let open_window = 1 ++ break ++ endif ++ let i = i + 1 ++ let buf_num = winbufnr(i) ++ endwhile ++ ++ if open_window ++ call s:Tlist_Window_Toggle() ++ endif ++endfunction ++ ++function! s:Tlist_Menu_Add_Base_Menu() ++ call s:Tlist_Log_Msg('Adding the base menu') ++ ++ " Add the menu ++ anoremenu T&ags.Refresh\ menu :call Tlist_Menu_Refresh() ++ anoremenu T&ags.Sort\ menu\ by.Name ++ \ :call Tlist_Change_Sort('menu', 'set', 'name') ++ anoremenu T&ags.Sort\ menu\ by.Order ++ \ :call Tlist_Change_Sort('menu', 'set', 'order') ++ anoremenu T&ags.-SEP1- : ++ ++ if &mousemodel =~ 'popup' ++ anoremenu PopUp.T&ags.Refresh\ menu ++ \ :call Tlist_Menu_Refresh() ++ anoremenu PopUp.T&ags.Sort\ menu\ by.Name ++ \ :call Tlist_Change_Sort('menu', 'set', 'name') ++ anoremenu PopUp.T&ags.Sort\ menu\ by.Order ++ \ :call Tlist_Change_Sort('menu', 'set', 'order') ++ anoremenu PopUp.T&ags.-SEP1- : ++ endif ++endfunction ++ ++let s:menu_char_prefix = ++ \ '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ++ ++" Tlist_Menu_Get_Tag_Type_Cmd ++" Get the menu command for the specified tag type ++" fidx - File type index ++" ftype - File Type ++" add_ttype_name - To add or not to add the tag type name to the menu entries ++" ttype_idx - Tag type index ++function! s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, ttype_idx) ++ " Curly brace variable name optimization ++ let ftype_ttype_idx = a:ftype . '_' . a:ttype_idx ++ ++ let ttype = s:tlist_{ftype_ttype_idx}_name ++ if a:add_ttype_name ++ " If the tag type name contains space characters, escape it. This ++ " will be used to create the menu entries. ++ let ttype_fullname = escape(s:tlist_{ftype_ttype_idx}_fullname, ' ') ++ endif ++ ++ " Curly brace variable name optimization ++ let fidx_ttype = a:fidx . '_' . ttype ++ ++ " Number of tag entries for this tag type ++ let tcnt = s:tlist_{fidx_ttype}_count ++ if tcnt == 0 " No entries for this tag type ++ return '' ++ endif ++ ++ let mcmd = '' ++ ++ " Create the menu items for the tags. ++ " Depending on the number of tags of this type, split the menu into ++ " multiple sub-menus, if needed. ++ if tcnt > g:Tlist_Max_Submenu_Items ++ let j = 1 ++ while j <= tcnt ++ let final_index = j + g:Tlist_Max_Submenu_Items - 1 ++ if final_index > tcnt ++ let final_index = tcnt ++ endif ++ ++ " Extract the first and last tag name and form the ++ " sub-menu name ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ let first_tag = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let tidx = s:tlist_{fidx_ttype}_{final_index} ++ let last_tag = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ " Truncate the names, if they are greater than the ++ " max length ++ let first_tag = strpart(first_tag, 0, g:Tlist_Max_Tag_Length) ++ let last_tag = strpart(last_tag, 0, g:Tlist_Max_Tag_Length) ++ ++ " Form the menu command prefix ++ let m_prefix = 'anoremenu T\&ags.' ++ if a:add_ttype_name ++ let m_prefix = m_prefix . ttype_fullname . '.' ++ endif ++ let m_prefix = m_prefix . first_tag . '\.\.\.' . last_tag . '.' ++ ++ " Character prefix used to number the menu items (hotkey) ++ let m_prefix_idx = 0 ++ ++ while j <= final_index ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ ++ let tname = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let mcmd = mcmd . m_prefix . '\&' . ++ \ s:menu_char_prefix[m_prefix_idx] . '\.' . ++ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . ++ \ tidx . ')|' ++ ++ let m_prefix_idx = m_prefix_idx + 1 ++ let j = j + 1 ++ endwhile ++ endwhile ++ else ++ " Character prefix used to number the menu items (hotkey) ++ let m_prefix_idx = 0 ++ ++ let m_prefix = 'anoremenu T\&ags.' ++ if a:add_ttype_name ++ let m_prefix = m_prefix . ttype_fullname . '.' ++ endif ++ let j = 1 ++ while j <= tcnt ++ let tidx = s:tlist_{fidx_ttype}_{j} ++ ++ let tname = s:tlist_{a:fidx}_{tidx}_tag_name ++ ++ let mcmd = mcmd . m_prefix . '\&' . ++ \ s:menu_char_prefix[m_prefix_idx] . '\.' . ++ \ tname . ' :call Tlist_Menu_Jump_To_Tag(' . tidx ++ \ . ')|' ++ ++ let m_prefix_idx = m_prefix_idx + 1 ++ let j = j + 1 ++ endwhile ++ endif ++ ++ return mcmd ++endfunction ++ ++" Update the taglist menu with the tags for the specified file ++function! s:Tlist_Menu_File_Refresh(fidx) ++ call s:Tlist_Log_Msg('Refreshing the tag menu for ' . s:tlist_{a:fidx}_filename) ++ " The 'B' flag is needed in the 'cpoptions' option ++ let old_cpoptions = &cpoptions ++ set cpoptions&vim ++ ++ exe s:tlist_{a:fidx}_menu_cmd ++ ++ " Update the popup menu (if enabled) ++ if &mousemodel =~ 'popup' ++ let cmd = substitute(s:tlist_{a:fidx}_menu_cmd, ' T\\&ags\.', ++ \ ' PopUp.T\\\&ags.', "g") ++ exe cmd ++ endif ++ ++ " The taglist menu is not empty now ++ let s:tlist_menu_empty = 0 ++ ++ " Restore the 'cpoptions' settings ++ let &cpoptions = old_cpoptions ++endfunction ++ ++" Tlist_Menu_Update_File ++" Add the taglist menu ++function! s:Tlist_Menu_Update_File(clear_menu) ++ if !has('gui_running') ++ " Not running in GUI mode ++ return ++ endif ++ ++ call s:Tlist_Log_Msg('Updating the tag menu, clear_menu = ' . a:clear_menu) ++ ++ " Remove the tags menu ++ if a:clear_menu ++ call s:Tlist_Menu_Remove_File() ++ ++ endif ++ ++ let fname = escape(fnamemodify(bufname('%'), ':t'), '.') ++ if fname != '' ++ exe 'anoremenu T&ags.' . fname . ' ' ++ anoremenu T&ags.-SEP2- : ++ endif ++ ++ " Skip buffers with 'buftype' set to nofile, nowrite, quickfix or help ++ if &buftype != '' ++ return ++ endif ++ ++ let filename = fnamemodify(bufname('%'), ':p') ++ let ftype = &filetype ++ ++ " If the file doesn't support tag listing, skip it ++ if s:Tlist_Skip_File(filename, ftype) ++ return ++ endif ++ ++ let fidx = s:Tlist_Get_File_Index(filename) ++ if fidx == -1 || !s:tlist_{fidx}_valid ++ " Check whether this file is removed based on user request ++ " If it is, then don't display the tags for this file ++ if s:Tlist_User_Removed_File(filename) ++ return ++ endif ++ ++ " Process the tags for the file ++ let fidx = s:Tlist_Process_File(filename, ftype) ++ if fidx == -1 ++ return ++ endif ++ endif ++ ++ if !s:tlist_{fidx}_tag_count ++ return ++ endif ++ ++ if s:tlist_{fidx}_menu_cmd != '' ++ " Update the menu with the cached command ++ call s:Tlist_Menu_File_Refresh(fidx) ++ ++ return ++ endif ++ ++ " We are going to add entries to the tags menu, so the menu won't be ++ " empty ++ let s:tlist_menu_empty = 0 ++ ++ let cmd = '' ++ ++ " Determine whether the tag type name needs to be added to the menu ++ " If more than one tag type is present in the taglisting for a file, ++ " then the tag type name needs to be present ++ let add_ttype_name = -1 ++ let i = 1 ++ while i <= s:tlist_{ftype}_count && add_ttype_name < 1 ++ let ttype = s:tlist_{ftype}_{i}_name ++ if s:tlist_{fidx}_{ttype}_count ++ let add_ttype_name = add_ttype_name + 1 ++ endif ++ let i = i + 1 ++ endwhile ++ ++ " Process the tags by the tag type and get the menu command ++ let i = 1 ++ while i <= s:tlist_{ftype}_count ++ let mcmd = s:Tlist_Menu_Get_Tag_Type_Cmd(fidx, ftype, add_ttype_name, i) ++ if mcmd != '' ++ let cmd = cmd . mcmd ++ endif ++ ++ let i = i + 1 ++ endwhile ++ ++ " Cache the menu command for reuse ++ let s:tlist_{fidx}_menu_cmd = cmd ++ ++ " Update the menu ++ call s:Tlist_Menu_File_Refresh(fidx) ++endfunction ++ ++" Tlist_Menu_Remove_File ++" Remove the tags displayed in the tags menu ++function! s:Tlist_Menu_Remove_File() ++ if !has('gui_running') || s:tlist_menu_empty ++ return ++ endif ++ ++ call s:Tlist_Log_Msg('Removing the tags menu for a file') ++ ++ " Cleanup the Tags menu ++ silent! unmenu T&ags ++ if &mousemodel =~ 'popup' ++ silent! unmenu PopUp.T&ags ++ endif ++ ++ " Add a dummy menu item to retain teared off menu ++ noremenu T&ags.Dummy l ++ ++ silent! unmenu! T&ags ++ if &mousemodel =~ 'popup' ++ silent! unmenu! PopUp.T&ags ++ endif ++ ++ call s:Tlist_Menu_Add_Base_Menu() ++ ++ " Remove the dummy menu item ++ unmenu T&ags.Dummy ++ ++ let s:tlist_menu_empty = 1 ++endfunction ++ ++" Tlist_Menu_Refresh ++" Refresh the taglist menu ++function! s:Tlist_Menu_Refresh() ++ call s:Tlist_Log_Msg('Refreshing the tags menu') ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx != -1 ++ " Invalidate the cached menu command ++ let s:tlist_{fidx}_menu_cmd = '' ++ endif ++ ++ " Update the taglist, menu and window ++ call s:Tlist_Update_Current_File() ++endfunction ++ ++" Tlist_Menu_Jump_To_Tag ++" Jump to the selected tag ++function! s:Tlist_Menu_Jump_To_Tag(tidx) ++ let fidx = s:Tlist_Get_File_Index(fnamemodify(bufname('%'), ':p')) ++ if fidx == -1 ++ return ++ endif ++ ++ let tagpat = s:Tlist_Get_Tag_SearchPat(fidx, a:tidx) ++ if tagpat == '' ++ return ++ endif ++ ++ " Add the current cursor position to the jump list, so that user can ++ " jump back using the ' and ` marks. ++ mark ' ++ ++ silent call search(tagpat, 'w') ++ ++ " Bring the line to the middle of the window ++ normal! z. ++ ++ " If the line is inside a fold, open the fold ++ if foldclosed('.') != -1 ++ .foldopen ++ endif ++endfunction ++ ++" Tlist_Menu_Init ++" Initialize the taglist menu ++function! s:Tlist_Menu_Init() ++ call s:Tlist_Menu_Add_Base_Menu() ++ ++ " Automatically add the tags defined in the current file to the menu ++ augroup TagListMenuCmds ++ autocmd! ++ ++ if !g:Tlist_Process_File_Always ++ autocmd BufEnter * call s:Tlist_Refresh() ++ endif ++ autocmd BufLeave * call s:Tlist_Menu_Remove_File() ++ augroup end ++ ++ call s:Tlist_Menu_Update_File(0) ++endfunction ++ ++" Tlist_Vim_Session_Load ++" Initialize the taglist window/buffer, which is created when loading ++" a Vim session file. ++function! s:Tlist_Vim_Session_Load() ++ call s:Tlist_Log_Msg('Tlist_Vim_Session_Load') ++ ++ " Initialize the taglist window ++ call s:Tlist_Window_Init() ++ ++ " Refresh the taglist window ++ call s:Tlist_Window_Refresh() ++endfunction ++ ++" Tlist_Set_App ++" Set the name of the external plugin/application to which taglist ++" belongs. ++" Taglist plugin is part of another plugin like cream or winmanager. ++function! Tlist_Set_App(name) ++ if a:name == "" ++ return ++ endif ++ ++ let s:tlist_app_name = a:name ++endfunction ++ ++" Winmanager integration ++ ++" Initialization required for integration with winmanager ++function! TagList_Start() ++ " If current buffer is not taglist buffer, then don't proceed ++ if bufname('%') != '__Tag_List__' ++ return ++ endif ++ ++ call Tlist_Set_App('winmanager') ++ ++ " Get the current filename from the winmanager plugin ++ let bufnum = WinManagerGetLastEditedFile() ++ if bufnum != -1 ++ let filename = fnamemodify(bufname(bufnum), ':p') ++ let ftype = getbufvar(bufnum, '&filetype') ++ endif ++ ++ " Initialize the taglist window, if it is not already initialized ++ if !exists('s:tlist_window_initialized') || !s:tlist_window_initialized ++ call s:Tlist_Window_Init() ++ call s:Tlist_Window_Refresh() ++ let s:tlist_window_initialized = 1 ++ endif ++ ++ " Update the taglist window ++ if bufnum != -1 ++ if !s:Tlist_Skip_File(filename, ftype) && g:Tlist_Auto_Update ++ call s:Tlist_Window_Refresh_File(filename, ftype) ++ endif ++ endif ++endfunction ++ ++function! TagList_IsValid() ++ return 0 ++endfunction ++ ++function! TagList_WrapUp() ++ return 0 ++endfunction ++ ++" restore 'cpo' ++let &cpo = s:cpo_save ++unlet s:cpo_save ++ +diff -urN vim71/runtime/syntax/ada.vim vim71_ada/runtime/syntax/ada.vim +--- vim71/runtime/syntax/ada.vim 2007-05-05 20:22:26.000000000 +0200 ++++ vim71_ada/runtime/syntax/ada.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -1,17 +1,17 @@ + "---------------------------------------------------------------------------- + " Description: Vim Ada syntax file + " Language: Ada (2005) +-" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ ++" $Id: vim-7.1-ada.patch,v 1.1 2008/02/11 15:11:34 karsten Exp $ + " Copyright: Copyright (C) 2006 Martin Krischik + " Maintainer: Martin Krischik + " David A. Wheeler + " Simon Bradley + " Contributors: Preben Randhol. +-" $Author: karsten $ +-" $Date: 2008/02/11 15:11:34 $ +-" Version: 4.2 +-" $Revision: 1.1 $ +-" $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ ++" $Author: karsten $ ++" $Date: 2008/02/11 15:11:34 $ ++" Version: 4.5 ++" $Revision: 1.1 $ ++" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $ + " http://www.dwheeler.com/vim + " History: 24.05.2006 MK Unified Headers + " 26.05.2006 MK ' should not be in iskeyword. +@@ -98,7 +98,8 @@ + " + if exists("g:ada_rainbow_color") + syntax match adaSpecial "[:;.,]" +- runtime plugin/Rainbow_Parenthsis.vim ++ call rainbow_parenthsis#LoadRound () ++ call rainbow_parenthsis#Activate () + else + syntax match adaSpecial "[:;().,]" + endif +@@ -159,7 +160,7 @@ + " Section: end {{{1 + " Unless special ("end loop", "end if", etc.), "end" marks the end of a + " begin, package, task etc. Assiging it to adaEnd. +-syntax match adaEnd "\" ++syntax match adaEnd /\/ + + syntax keyword adaPreproc pragma + +diff -urN vim71/runtime/syntax/bush.vim vim71_ada/runtime/syntax/bush.vim +--- vim71/runtime/syntax/bush.vim 1970-01-01 01:00:00.000000000 +0100 ++++ vim71_ada/runtime/syntax/bush.vim 2008-01-16 16:37:03.000000000 +0100 +@@ -0,0 +1,309 @@ ++" Vim syntax file ++" Language: BUSH / AdaScript ++" Maintainer: Ken O. Burtch ++" URL: http://www.pegasoft.ca/bush ++" Last Change: 2004-06-29 ++ ++" Former Maintainer: Simon Bradley ++" (was ) ++" Other contributors: Preben Randhol. ++" The formal spec of Ada95 (ARM) is the "Ada95 Reference Manual". ++" For more Ada95 info, see http://www.gnuada.org and http://www.adapower.com. ++ ++" This vim syntax file works on vim 5.6, 5.7, 5.8 and 6.x. ++" It implements Bram Moolenaar's April 25, 2001 recommendations to make ++" the syntax file maximally portable across different versions of vim. ++" If vim 6.0+ is available, ++" this syntax file takes advantage of the vim 6.0 advanced pattern-matching ++" functions to avoid highlighting uninteresting leading spaces in ++" some expressions containing "with" and "use". ++ ++" For version 5.x: Clear all syntax items ++" For version 6.x: Quit when a syntax file was already loaded ++if version < 600 ++ syntax clear ++elseif exists("b:current_syntax") ++ finish ++endif ++ ++" Ada is entirely case-insensitive. ++syn case ignore ++ ++" We don't need to look backwards to highlight correctly; ++" this speeds things up greatly. ++syn sync minlines=1 maxlines=1 ++ ++" Highlighting commands. There are 69 reserved words in total in Ada95. ++" Some keywords are used in more than one way. For example: ++" 1. "end" is a general keyword, but "end if" ends a Conditional. ++" 2. "then" is a conditional, but "and then" is an operator. ++ ++ ++" Standard Exceptions (including I/O). ++" We'll highlight the standard exceptions, similar to vim's Python mode. ++" It's possible to redefine the standard exceptions as something else, ++" but doing so is very bad practice, so simply highlighting them makes sense. ++syn keyword adaException Constraint_Error Program_Error Storage_Error ++syn keyword adaException Tasking_Error ++syn keyword adaException Status_Error Mode_Error Name_Error Use_Error ++syn keyword adaException Device_Error End_Error Data_Error Layout_Error ++syn keyword adaException Length_Error Pattern_Error Index_Error ++syn keyword adaException Translation_Error ++syn keyword adaException Time_Error Argument_Error ++syn keyword adaException Tag_Error ++syn keyword adaException Picture_Error ++" Interfaces ++syn keyword adaException Terminator_Error Conversion_Error ++syn keyword adaException Pointer_Error Dereference_Error Update_Error ++" This isn't in the Ada spec, but a GNAT extension. ++syn keyword adaException Assert_Failure ++" We don't list ALL exceptions defined in particular compilers (e.g., GNAT), ++" because it's quite reasonable to define those phrases as non-exceptions. ++ ++ ++" We don't normally highlight types in package Standard ++" (Integer, Character, Float, etc.). I don't think it looks good ++" with the other type keywords, and many Ada programs define ++" so many of their own types that it looks inconsistent. ++" However, if you want this highlighting, turn on "ada_standard_types". ++" For package Standard's definition, see ARM section A.1. ++ ++if exists("ada_standard_types") ++ syn keyword adaBuiltinType Boolean Integer Natural Positive Float ++ syn keyword adaBuiltinType Character Wide_Character ++ syn keyword adaBuiltinType String Wide_String ++ syn keyword adaBuiltinType Duration ++ " These aren't listed in ARM section A.1's code, but they're noted as ++ " options in ARM sections 3.5.4 and 3.5.7: ++ syn keyword adaBuiltinType Short_Integer Short_Short_Integer ++ syn keyword adaBuiltinType Long_Integer Long_Long_Integer ++ syn keyword adaBuiltinType Short_Float Short_Short_Float ++ syn keyword adaBuiltinType Long_Float Long_Long_Float ++ " BUSH-specific types ++ syn keyword adaBuiltinType command ++ syn keyword adaBuiltinType socket_type ++ syn keyword adaBuiltinType unbounded_string ++ syn keyword adaBuiltinType universal_typeless ++ syn keyword adaBuiltinType universal_string ++ syn keyword adaBuiltinType universal_numeric ++endif ++ ++" There are MANY other predefined types; they've not been added, because ++" determining when they're a type requires context in general. ++" One potential addition would be Unbounded_String. ++ ++ ++syn keyword adaLabel others ++ ++syn keyword adaOperator abs mod not rem xor ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "\" ++syn match adaOperator "[-+*/<>&]" ++syn keyword adaOperator ** ++syn match adaOperator "[/<>]=" ++syn keyword adaOperator => ++syn match adaOperator "\.\." ++syn match adaOperator "=" ++ ++" We won't map "adaAssignment" by default, but we need to map ":=" to ++" something or the "=" inside it will be mislabelled as an operator. ++" Note that in Ada, assignment (:=) is not considered an operator. ++syn match adaAssignment ":=" ++ ++" Handle the box, <>, specially: ++syn keyword adaSpecial <> ++ ++" Numbers, including floating point, exponents, and alternate bases. ++syn match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>" ++syn match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\=" ++ ++" Identify leading numeric signs. In "A-5" the "-" is an operator, ++" but in "A:=-5" the "-" is a sign. This handles "A3+-5" (etc.) correctly. ++" This assumes that if you put a don't put a space after +/- when it's used ++" as an operator, you won't put a space before it either -- which is true ++" in code I've seen. ++syn match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1 ++ ++" Labels for the goto statement. ++syn region adaLabel start="<<" end=">>" ++ ++" Boolean Constants. ++syn keyword adaBoolean true false ++ ++" Warn people who try to use C/C++ notation erroneously: ++syn match adaError "//" ++syn match adaError "/\*" ++syn match adaError "==" ++ ++ ++if exists("ada_space_errors") ++ if !exists("ada_no_trail_space_error") ++ syn match adaSpaceError excludenl "\s\+$" ++ endif ++ if !exists("ada_no_tab_space_error") ++ syn match adaSpaceError " \+\t"me=e-1 ++ endif ++endif ++ ++" Unless special ("end loop", "end if", etc.), "end" marks the end of a ++" begin, package, task etc. Assiging it to adaEnd. ++syn match adaEnd "\" ++ ++syn keyword adaPreproc pragma ++ ++syn keyword adaRepeat exit for loop reverse while ++syn match adaRepeat "\" ++ ++syn keyword adaStatement accept delay goto raise requeue return ++syn keyword adaStatement terminate ++" BUSH-specific statements ++syn keyword adaStatement cd ++syn keyword adaStatement clear ++syn keyword adaStatement env ++syn keyword adaStatement inkey ++syn keyword adaStatement jobs ++syn keyword adaStatement logout ++syn keyword adaStatement pwd ++syn keyword adaStatement step ++syn keyword adaStatement trace ++syn keyword adaStatement typeset ++syn keyword adaStatement unset ++syn keyword adaStatement wait ++syn keyword adaStatement history ++syn keyword adaStatement "?" ++syn match adaStatement "\" ++ ++" Handle Ada's record keywords. ++" 'record' usually starts a structure, but "with null record;" does not, ++" and 'end record;' ends a structure. The ordering here is critical - ++" 'record;' matches a "with null record", so make it a keyword (this can ++" match when the 'with' or 'null' is on a previous line). ++" We see the "end" in "end record" before the word record, so we match that ++" pattern as adaStructure (and it won't match the "record;" pattern). ++syn match adaStructure "\" ++syn match adaStructure "\" ++syn match adaKeyword "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn match adaConditional "\" ++syn keyword adaConditional if case select ++syn keyword adaConditional elsif when ++ ++syn keyword adaKeyword all do exception in is new null out ++syn keyword adaKeyword separate until ++ ++" These keywords begin various constructs, and you _might_ want to ++" highlight them differently. ++syn keyword adaBegin begin body declare entry function generic ++syn keyword adaBegin package procedure protected renames task ++ ++ ++if exists("ada_withuse_ordinary") ++" Don't be fancy. Display "with" and "use" as ordinary keywords in all cases. ++ syn keyword adaKeyword with use ++else ++ " Highlight "with" and "use" clauses like C's "#include" when they're used ++ " to reference other compilation units; otherwise they're ordinary keywords. ++ " If we have vim 6.0 or later, we'll use its advanced pattern-matching ++ " capabilities so that we won't match leading spaces. ++ syn match adaKeyword "\" ++ syn match adaKeyword "\" ++ if version < 600 ++ syn match adaBeginWith "^\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syn match adaSemiWith ";\s*\(\(with\(\s\+type\)\=\)\|\(use\)\)\>"lc=1 contains=adaInc ++ else ++ syn match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ syn match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc ++ endif ++ syn match adaInc "\" contained contains=NONE ++ syn match adaInc "\" contained contains=NONE ++ syn match adaInc "\" contained contains=NONE ++ " Recognize "with null record" as a keyword (even the "record"). ++ syn match adaKeyword "\" ++ " Consider generic formal parameters of subprograms and packages as keywords. ++ if version < 600 ++ syn match adaKeyword ";\s*with\s\+\(function\|procedure\|package\)\>" ++ syn match adaKeyword "^\s*with\s\+\(function\|procedure\|package\)\>" ++ else ++ syn match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ syn match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>" ++ endif ++endif ++ ++ ++" String and character constants. ++syn region adaString start=+"+ skip=+""+ end=+"+ ++syn match adaCharacter "'.'" ++ ++" Todo (only highlighted in comments) ++syn keyword adaTodo contained TODO FIXME XXX ++ ++" Comments. ++syn region adaComment oneline contains=adaTodo start="--" end="$" ++ ++ ++ ++" Define the default highlighting. ++" For version 5.7 and earlier: only when not done already ++" For version 5.8 and later: only when an item doesn't have highlighting yet ++if version >= 508 || !exists("did_ada_syn_inits") ++ if version < 508 ++ let did_ada_syn_inits = 1 ++ command -nargs=+ HiLink hi link ++ else ++ command -nargs=+ HiLink hi def link ++ endif ++ ++ " The default methods for highlighting. Can be overridden later. ++ HiLink adaCharacter Character ++ HiLink adaComment Comment ++ HiLink adaConditional Conditional ++ HiLink adaKeyword Keyword ++ HiLink adaLabel Label ++ HiLink adaNumber Number ++ HiLink adaSign Number ++ HiLink adaOperator Operator ++ HiLink adaPreproc PreProc ++ HiLink adaRepeat Repeat ++ HiLink adaSpecial Special ++ HiLink adaStatement Statement ++ HiLink adaString String ++ HiLink adaStructure Structure ++ HiLink adaTodo Todo ++ HiLink adaType Type ++ HiLink adaTypedef Typedef ++ HiLink adaStorageClass StorageClass ++ HiLink adaBoolean Boolean ++ HiLink adaException Exception ++ HiLink adaInc Include ++ HiLink adaError Error ++ HiLink adaSpaceError Error ++ HiLink adaBuiltinType Type ++ ++ if exists("ada_begin_preproc") ++ " This is the old default display: ++ HiLink adaBegin PreProc ++ HiLink adaEnd PreProc ++ else ++ " This is the new default display: ++ HiLink adaBegin Keyword ++ HiLink adaEnd Keyword ++ endif ++ ++ delcommand HiLink ++endif ++ ++let b:current_syntax = "ada" ++ ++" vim: ts=8 diff --git a/vim.spec b/vim.spec index 8a3d0f25..62900a38 100644 --- a/vim.spec +++ b/vim.spec @@ -1,6 +1,8 @@ # used for CVS snapshots: %define CVSDATE %{nil} +%if %{?WITH_SELINUX:0}%{!?WITH_SELINUX:1} %define WITH_SELINUX 1 +%endif %define desktop_file 1 %if %{desktop_file} %define desktop_file_utils_version 0.2.93 @@ -15,7 +17,7 @@ #used for pre-releases: %define beta %{nil} %define vimdir vim71%{?beta} -%define patchlevel 135 +%define patchlevel 245 Summary: The VIM editor URL: http://www.vim.org/ @@ -186,6 +188,113 @@ Patch132: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.132 Patch133: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.133 Patch134: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.134 Patch135: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.135 +Patch136: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.136 +Patch137: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.137 +Patch138: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.138 +Patch139: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.139 +Patch140: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.140 +Patch141: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.141 +Patch142: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.142 +Patch143: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.143 +Patch144: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.144 +Patch145: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.145 +Patch146: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.146 +Patch147: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.147 +Patch148: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.148 +Patch149: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.149 +Patch150: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.150 +Patch151: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.151 +Patch152: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.152 +Patch153: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.153 +Patch154: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.154 +Patch155: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.155 +Patch156: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.156 +Patch157: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.157 +Patch158: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.158 +Patch159: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.159 +Patch160: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.160 +Patch161: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.161 +Patch162: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.162 +Patch163: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.163 +Patch164: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.164 +Patch165: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.165 +Patch166: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.166 +Patch167: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.167 +Patch168: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.168 +Patch169: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.169 +Patch170: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.170 +Patch171: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.171 +Patch172: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.172 +Patch173: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.173 +Patch174: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.174 +Patch175: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.175 +Patch176: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.176 +Patch177: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.177 +Patch178: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.178 +Patch179: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.179 +Patch180: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.180 +Patch181: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.181 +Patch182: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.182 +Patch183: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.183 +Patch184: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.184 +Patch185: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.185 +Patch186: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.186 +Patch187: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.187 +Patch188: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.188 +Patch189: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.189 +Patch190: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.190 +Patch191: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.191 +Patch192: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.192 +Patch193: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.193 +Patch194: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.194 +Patch195: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.195 +Patch196: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.196 +Patch197: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.197 +Patch198: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.198 +Patch199: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.199 +Patch200: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.200 +Patch201: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.201 +Patch202: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.202 +Patch203: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.203 +Patch204: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.204 +Patch205: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.205 +Patch206: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.206 +Patch207: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.207 +Patch208: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.208 +Patch209: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.209 +Patch210: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.210 +Patch211: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.211 +Patch212: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.212 +Patch213: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.213 +Patch214: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.214 +Patch215: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.215 +Patch216: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.216 +Patch217: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.217 +Patch218: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.218 +Patch219: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.219 +Patch220: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.220 +Patch221: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.221 +Patch222: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.222 +Patch223: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.223 +Patch224: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.224 +Patch225: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.225 +Patch226: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.226 +Patch227: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.227 +Patch228: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.228 +Patch229: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.229 +Patch230: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.230 +Patch231: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.231 +Patch232: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.232 +Patch233: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.233 +Patch234: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.234 +Patch235: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.235 +Patch236: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.236 +Patch237: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.237 +Patch238: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.238 +Patch239: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.239 +Patch240: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.240 +Patch241: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.241 +Patch242: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.242 Patch3000: vim-7.0-syntax.patch Patch3002: vim-7.1-nowarnings.patch @@ -198,6 +307,8 @@ Patch3009: vim-7.0-warning.patch Patch3010: vim-7.0-syncolor.patch Patch3011: vim-7.0-vimspelltypo.patch Patch3012: vim-7.0-specedit.patch +# Remove this one when the runtime files get updated (#246378): +Patch3013: vim-7.1-ada.patch # Patch3100: vim-selinux.patch Patch3101: vim-selinux2.patch @@ -265,7 +376,7 @@ package is installed. %package enhanced Summary: A version of the VIM editor which includes recent enhancements Group: Applications/Editors -Requires: vim-common = %{epoch}:%{version}-%{release} +Requires: vim-common = %{epoch}:%{version}-%{release} which Provides: vim = %{version}-%{release} %description enhanced @@ -453,6 +564,113 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch133 -p0 %patch134 -p0 %patch135 -p0 +%patch136 -p0 +%patch137 -p0 +%patch138 -p0 +%patch139 -p0 +%patch140 -p0 +%patch141 -p0 +%patch142 -p0 +%patch143 -p0 +%patch144 -p0 +%patch145 -p0 +%patch146 -p0 +%patch147 -p0 +%patch148 -p0 +%patch149 -p0 +%patch150 -p0 +%patch151 -p0 +%patch152 -p0 +%patch153 -p0 +%patch154 -p0 +%patch155 -p0 +%patch156 -p0 +%patch157 -p0 +%patch158 -p0 +%patch159 -p0 +%patch160 -p0 +%patch161 -p0 +%patch162 -p0 +%patch163 -p0 +%patch164 -p0 +%patch165 -p0 +%patch166 -p0 +%patch167 -p0 +%patch168 -p0 +%patch169 -p0 +%patch170 -p0 +%patch171 -p0 +%patch172 -p0 +%patch173 -p0 +%patch174 -p0 +%patch175 -p0 +%patch176 -p0 +%patch177 -p0 +%patch178 -p0 +%patch179 -p0 +%patch180 -p0 +%patch181 -p0 +%patch182 -p0 +%patch183 -p0 +%patch184 -p0 +%patch185 -p0 +%patch186 -p0 +%patch187 -p0 +%patch188 -p0 +%patch189 -p0 +%patch190 -p0 +%patch191 -p0 +%patch192 -p0 +%patch193 -p0 +%patch194 -p0 +%patch195 -p0 +%patch196 -p0 +%patch197 -p0 +%patch198 -p0 +%patch199 -p0 +%patch200 -p0 +%patch201 -p0 +%patch202 -p0 +%patch203 -p0 +%patch204 -p0 +%patch205 -p0 +%patch206 -p0 +%patch207 -p0 +%patch208 -p0 +%patch209 -p0 +%patch210 -p0 +%patch211 -p0 +%patch212 -p0 +%patch213 -p0 +%patch214 -p0 +%patch215 -p0 +%patch216 -p0 +%patch217 -p0 +%patch218 -p0 +%patch219 -p0 +%patch220 -p0 +%patch221 -p0 +%patch222 -p0 +%patch223 -p0 +%patch224 -p0 +%patch225 -p0 +%patch226 -p0 +%patch227 -p0 +%patch228 -p0 +%patch229 -p0 +%patch230 -p0 +%patch231 -p0 +%patch232 -p0 +%patch233 -p0 +%patch234 -p0 +%patch235 -p0 +%patch236 -p0 +%patch237 -p0 +%patch238 -p0 +%patch239 -p0 +%patch240 -p0 +%patch241 -p0 +%patch242 -p0 # install spell files @@ -472,6 +690,7 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk %patch3010 -p1 %patch3011 -p1 %patch3012 -p1 +%patch3013 -p1 %if %{WITH_SELINUX} %patch3100 -p1 @@ -839,6 +1058,42 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/icons/hicolor/*/apps/* %changelog +* Mon Feb 11 2008 Karsten Hopp 7.1.245-1 +- patchlevel 245 + +* Sun Jan 27 2008 Karsten Hopp 7.1.242-1 +- patchlevel 242 + +* Fri Jan 18 2008 Karsten Hopp 7.1.233-2 +- silence taglist plugin (#429200) + +* Fri Jan 18 2008 Karsten Hopp 7.1.233-1 +- patchlevel 233 +- fix ada patch + +* Wed Jan 16 2008 Karsten Hopp 7.1.230-2 +- add newer ada runtime files to fix bugzilla #246378 + +* Wed Jan 16 2008 Karsten Hopp 7.1.230-1 +- patchlevel 230, fixes memory leak + +* Mon Jan 14 2008 Karsten Hopp 7.1.228-1 +- patchlevel 228 +- allow overwriting WITH_SELING at build time (#427710) + +* Thu Jan 10 2008 Karsten Hopp 7.1.214-1 +- patchlevel 214 + +* Mon Jan 07 2008 Karsten Hopp 7.1.211-1 +- patchlevel 211 + +* Sat Dec 22 2007 Karsten Hopp 7.1.175-1 +- patchlevel 175 + +* Thu Nov 22 2007 Karsten Hopp 7.1.159-1 +- patchlevel 159 +- vim-enhanced requires which for vimtutor (#395371) + * Thu Oct 04 2007 Karsten Hopp 7.1.135-1 - patchlevel 135