To: vim-dev@vim.org Subject: Patch 7.0.013 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.0.013 Problem: Insert mode completion: using CTRL-L to add an extra character also deselects the current match, making it impossible to use CTRL-L a second time. Solution: Keep the current match. Also make CTRL-L work at the original text, using the first displayed match. Files: src/edit.c *** ../vim-7.0.012/src/edit.c Wed May 10 15:22:49 2006 --- src/edit.c Thu May 11 10:38:54 2006 *************** *** 751,757 **** continue; } ! /* Pressing CTRL-Y selects the current match. Shen * compl_enter_selects is set the Enter key does the same. */ if (c == Ctrl_Y || (compl_enter_selects && (c == CAR || c == K_KENTER || c == NL))) --- 751,757 ---- continue; } ! /* Pressing CTRL-Y selects the current match. When * compl_enter_selects is set the Enter key does the same. */ if (c == Ctrl_Y || (compl_enter_selects && (c == CAR || c == K_KENTER || c == NL))) *************** *** 3046,3052 **** ins_compl_delete(); ins_bytes(compl_leader + curwin->w_cursor.col - compl_col); compl_used_match = FALSE; - compl_enter_selects = FALSE; if (compl_started) ins_compl_set_original_text(compl_leader); --- 3046,3051 ---- *************** *** 3076,3081 **** --- 3075,3081 ---- compl_restarting = FALSE; } + #if 0 /* disabled, made CTRL-L, BS and typing char jump to original text. */ if (!compl_used_match) { /* Go to the original text, since none of the matches is inserted. */ *************** *** 3087,3092 **** --- 3087,3094 ---- compl_curr_match = compl_shown_match; compl_shows_dir = compl_direction; } + #endif + compl_enter_selects = !compl_used_match; /* Show the popup menu with a different set of matches. */ ins_compl_show_pum(); *************** *** 3175,3184 **** char_u *p; int len = curwin->w_cursor.col - compl_col; int c; p = compl_shown_match->cp_str; if ((int)STRLEN(p) <= len) /* the match is too short */ ! return; p += len; #ifdef FEAT_MBYTE c = mb_ptr2char(p); --- 3177,3208 ---- char_u *p; int len = curwin->w_cursor.col - compl_col; int c; + compl_T *cp; p = compl_shown_match->cp_str; if ((int)STRLEN(p) <= len) /* the match is too short */ ! { ! /* When still at the original match use the first entry that matches ! * the leader. */ ! if (compl_shown_match->cp_flags & ORIGINAL_TEXT) ! { ! p = NULL; ! for (cp = compl_shown_match->cp_next; cp != NULL ! && cp != compl_first_match; cp = cp->cp_next) ! { ! if (ins_compl_equal(cp, compl_leader, ! (int)STRLEN(compl_leader))) ! { ! p = cp->cp_str; ! break; ! } ! } ! if (p == NULL || (int)STRLEN(p) <= len) ! return; ! } ! else ! return; ! } p += len; #ifdef FEAT_MBYTE c = mb_ptr2char(p); *************** *** 4100,4105 **** --- 4124,4144 ---- && compl_shown_match->cp_next != NULL && compl_shown_match->cp_next != compl_first_match) compl_shown_match = compl_shown_match->cp_next; + + /* If we didn't find it searching forward, and compl_shows_dir is + * backward, find the last match. */ + if (compl_shows_dir == BACKWARD + && !ins_compl_equal(compl_shown_match, + compl_leader, (int)STRLEN(compl_leader)) + && (compl_shown_match->cp_next == NULL + || compl_shown_match->cp_next == compl_first_match)) + { + while (!ins_compl_equal(compl_shown_match, + compl_leader, (int)STRLEN(compl_leader)) + && compl_shown_match->cp_prev != NULL + && compl_shown_match->cp_prev != compl_first_match) + compl_shown_match = compl_shown_match->cp_prev; + } } if (allow_get_expansion && insert_match *** ../vim-7.0.012/src/version.c Thu May 11 19:30:09 2006 --- src/version.c Fri May 12 19:03:32 2006 *************** *** 668,669 **** --- 668,671 ---- { /* Add new patch number below this line */ + /**/ + 13, /**/ -- I'm writing a book. I've got the page numbers done. /// 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 ///