diff --git a/7.0.023 b/7.0.023 new file mode 100644 index 0000000..9eaf127 --- /dev/null +++ b/7.0.023 @@ -0,0 +1,170 @@ +To: vim-dev@vim.org +Subject: Patch 7.0.023 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.0.023 +Problem: Crash when doing spell completion in an empty line and pressing + CTRL-E. +Solution: Check for a zero pointer. (James Vega) + Also handle a situation without a matching pattern better, report + "No matches" instead of remaining in undefined CTRL-X mode. And + get out of CTRL-X mode when typing a letter. +Files: src/edit.c + + +*** ../vim-7.0.022/src/edit.c Sat May 13 15:27:57 2006 +--- src/edit.c Thu Jun 22 16:44:01 2006 +*************** +*** 719,727 **** + #ifdef FEAT_INS_EXPAND + /* + * Special handling of keys while the popup menu is visible or wanted +! * and the cursor is still in the completed word. + */ +! if (compl_started && pum_wanted() && curwin->w_cursor.col >= compl_col) + { + /* BS: Delete one character from "compl_leader". */ + if ((c == K_BS || c == Ctrl_H) +--- 721,734 ---- + #ifdef FEAT_INS_EXPAND + /* + * Special handling of keys while the popup menu is visible or wanted +! * and the cursor is still in the completed word. Only when there is +! * a match, skip this when no matches were found. + */ +! if (compl_started +! && pum_wanted() +! && curwin->w_cursor.col >= compl_col +! && (compl_shown_match == NULL +! || compl_shown_match != compl_shown_match->cp_next)) + { + /* BS: Delete one character from "compl_leader". */ + if ((c == K_BS || c == Ctrl_H) +*************** +*** 3393,3408 **** + ptr = compl_leader; + else + ptr = compl_orig_text; +! p = compl_orig_text; +! for (temp = 0; p[temp] != NUL && p[temp] == ptr[temp]; ++temp) +! ; + #ifdef FEAT_MBYTE +! if (temp > 0) +! temp -= (*mb_head_off)(compl_orig_text, p + temp); + #endif +! for (p += temp; *p != NUL; mb_ptr_adv(p)) +! AppendCharToRedobuff(K_BS); +! AppendToRedobuffLit(ptr + temp, -1); + } + + #ifdef FEAT_CINDENT +--- 3401,3421 ---- + ptr = compl_leader; + else + ptr = compl_orig_text; +! if (compl_orig_text != NULL) +! { +! p = compl_orig_text; +! for (temp = 0; p[temp] != NUL && p[temp] == ptr[temp]; +! ++temp) +! ; + #ifdef FEAT_MBYTE +! if (temp > 0) +! temp -= (*mb_head_off)(compl_orig_text, p + temp); + #endif +! for (p += temp; *p != NUL; mb_ptr_adv(p)) +! AppendCharToRedobuff(K_BS); +! } +! if (ptr != NULL) +! AppendToRedobuffLit(ptr + temp, -1); + } + + #ifdef FEAT_CINDENT +*************** +*** 4650,4659 **** + (int)STRLEN(compl_pattern), curs_col); + if (compl_xp.xp_context == EXPAND_UNSUCCESSFUL + || compl_xp.xp_context == EXPAND_NOTHING) +! return FAIL; +! startcol = (int)(compl_xp.xp_pattern - compl_pattern); +! compl_col = startcol; +! compl_length = curs_col - startcol; + } + else if (ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OMNI) + { +--- 4663,4680 ---- + (int)STRLEN(compl_pattern), curs_col); + if (compl_xp.xp_context == EXPAND_UNSUCCESSFUL + || compl_xp.xp_context == EXPAND_NOTHING) +! { +! compl_col = curs_col; +! compl_length = 0; +! vim_free(compl_pattern); +! compl_pattern = NULL; +! } +! else +! { +! startcol = (int)(compl_xp.xp_pattern - compl_pattern); +! compl_col = startcol; +! compl_length = curs_col - startcol; +! } + } + else if (ctrl_x_mode == CTRL_X_FUNCTION || ctrl_x_mode == CTRL_X_OMNI) + { +*************** +*** 4707,4717 **** + else + compl_col = spell_word_start(startcol); + if (compl_col >= (colnr_T)startcol) +! return FAIL; +! spell_expand_check_cap(compl_col); + /* Need to obtain "line" again, it may have become invalid. */ + line = ml_get(curwin->w_cursor.lnum); +- compl_length = (int)curs_col - compl_col; + compl_pattern = vim_strnsave(line + compl_col, compl_length); + if (compl_pattern == NULL) + #endif +--- 4728,4744 ---- + else + compl_col = spell_word_start(startcol); + if (compl_col >= (colnr_T)startcol) +! { +! compl_length = 0; +! compl_col = curs_col; +! } +! else +! { +! spell_expand_check_cap(compl_col); +! compl_length = (int)curs_col - compl_col; +! } + /* Need to obtain "line" again, it may have become invalid. */ + line = ml_get(curwin->w_cursor.lnum); + compl_pattern = vim_strnsave(line + compl_col, compl_length); + if (compl_pattern == NULL) + #endif +*** ../vim-7.0.022/src/version.c Tue Jun 20 21:08:02 2006 +--- src/version.c Thu Jun 22 16:34:42 2006 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 23, + /**/ + +-- +BEDEVERE: Look! It's the old man from scene 24 - what's he Doing here? +ARTHUR: He is the keeper of the Bridge. He asks each traveler five + questions ... +GALAHAD: Three questions. + "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 ///