| To: vim-dev@vim.org |
| Subject: Patch 7.0.035 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=ISO-8859-1 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.0.035 |
| Problem: Insert mode completion works when typed but not when replayed from |
| a register. (Hari Krishna Dara) |
| Also: Mappings for Insert mode completion don't always work. |
| Solution: When finding a non-completion key in the input don't interrupt |
| completion when it wasn't typed. |
| Do use mappings when checking for typeahead while still finding |
| completions. Avoids that completion is interrupted too soon. |
| Use "compl_pending" in a different way. |
| Files: src/edit.c |
| |
| |
| |
| |
| |
| *** 4166,4173 **** |
| { |
| if (compl_shows_dir == FORWARD && compl_shown_match->cp_next != NULL) |
| { |
| - if (compl_pending != 0) |
| - --compl_pending; |
| compl_shown_match = compl_shown_match->cp_next; |
| found_end = (compl_first_match != NULL |
| && (compl_shown_match->cp_next == compl_first_match |
| --- 4166,4171 ---- |
| |
| *** 4176,4189 **** |
| else if (compl_shows_dir == BACKWARD |
| && compl_shown_match->cp_prev != NULL) |
| { |
| - if (compl_pending != 0) |
| - ++compl_pending; |
| found_end = (compl_shown_match == compl_first_match); |
| compl_shown_match = compl_shown_match->cp_prev; |
| found_end |= (compl_shown_match == compl_first_match); |
| } |
| else |
| { |
| if (advance) |
| { |
| if (compl_shows_dir == BACKWARD) |
| --- 4174,4197 ---- |
| else if (compl_shows_dir == BACKWARD |
| && compl_shown_match->cp_prev != NULL) |
| { |
| found_end = (compl_shown_match == compl_first_match); |
| compl_shown_match = compl_shown_match->cp_prev; |
| found_end |= (compl_shown_match == compl_first_match); |
| } |
| else |
| { |
| + if (!allow_get_expansion) |
| + { |
| + if (advance) |
| + { |
| + if (compl_shows_dir == BACKWARD) |
| + compl_pending -= todo + 1; |
| + else |
| + compl_pending += todo + 1; |
| + } |
| + return -1; |
| + } |
| + |
| if (advance) |
| { |
| if (compl_shows_dir == BACKWARD) |
| |
| *** 4191,4204 **** |
| else |
| ++compl_pending; |
| } |
| - if (!allow_get_expansion) |
| - return -1; |
| |
| /* Find matches. */ |
| num_matches = ins_compl_get_exp(&compl_startpos); |
| ! if (compl_pending != 0 && compl_direction == compl_shows_dir |
| && advance) |
| ! compl_shown_match = compl_curr_match; |
| found_end = FALSE; |
| } |
| if ((compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0 |
| --- 4199,4225 ---- |
| else |
| ++compl_pending; |
| } |
| |
| /* Find matches. */ |
| num_matches = ins_compl_get_exp(&compl_startpos); |
| ! |
| ! /* handle any pending completions */ |
| ! while (compl_pending != 0 && compl_direction == compl_shows_dir |
| && advance) |
| ! { |
| ! if (compl_pending > 0 && compl_shown_match->cp_next != NULL) |
| ! { |
| ! compl_shown_match = compl_shown_match->cp_next; |
| ! --compl_pending; |
| ! } |
| ! if (compl_pending < 0 && compl_shown_match->cp_prev != NULL) |
| ! { |
| ! compl_shown_match = compl_shown_match->cp_prev; |
| ! ++compl_pending; |
| ! } |
| ! else |
| ! break; |
| ! } |
| found_end = FALSE; |
| } |
| if ((compl_shown_match->cp_flags & ORIGINAL_TEXT) == 0 |
| |
| *** 4307,4315 **** |
| return; |
| count = 0; |
| |
| ! ++no_mapping; |
| c = vpeekc_any(); |
| - --no_mapping; |
| if (c != NUL) |
| { |
| if (vim_is_ctrl_x_key(c) && c != Ctrl_X && c != Ctrl_R) |
| --- 4328,4336 ---- |
| return; |
| count = 0; |
| |
| ! /* Check for a typed key. Do use mappings, otherwise vim_is_ctrl_x_key() |
| ! * can't do its work correctly. */ |
| c = vpeekc_any(); |
| if (c != NUL) |
| { |
| if (vim_is_ctrl_x_key(c) && c != Ctrl_X && c != Ctrl_R) |
| |
| *** 4319,4330 **** |
| (void)ins_compl_next(FALSE, ins_compl_key2count(c), |
| c != K_UP && c != K_DOWN); |
| } |
| ! else if (c != Ctrl_R) |
| ! compl_interrupted = TRUE; |
| } |
| if (compl_pending != 0 && !got_int) |
| ! (void)ins_compl_next(FALSE, compl_pending > 0 |
| ! ? compl_pending : -compl_pending, TRUE); |
| } |
| |
| /* |
| --- 4340,4366 ---- |
| (void)ins_compl_next(FALSE, ins_compl_key2count(c), |
| c != K_UP && c != K_DOWN); |
| } |
| ! 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) |
| ! { |
| ! int todo = compl_pending > 0 ? compl_pending : -compl_pending; |
| ! |
| ! compl_pending = 0; |
| ! (void)ins_compl_next(FALSE, todo, TRUE); |
| ! } |
| } |
| |
| /* |
| |
| |
| |
| *** 668,669 **** |
| --- 668,671 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 35, |
| /**/ |
| |
| -- |
| So when I saw the post to comp.editors, I rushed over to the FTP site to |
| grab it. So I yank apart the tarball, light x candles, where x= the |
| vim version multiplied by the md5sum of the source divided by the MAC of |
| my NIC (8A3FA78155A8A1D346C3C4A), put on black robes, dim the lights, |
| wave a dead chicken over the hard drive, and summon the power of GNU GCC |
| with the magic words "make config ; make!". |
| [Jason Spence, compiling Vim 5.0] |
| |
| /// 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 /// |