| To: vim-dev@vim.org |
| Subject: Patch 7.2.262 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.2.262 |
| Problem: When using custom completion for a user command the pattern string |
| goes beyond the cursor position. (Hari Krishna Dara) |
| Solution: Truncate the string at the cursor position. |
| Files: src/ex_getln.c, src/structs.h |
| |
| |
| |
| |
| |
| *** 3266,3272 **** |
| int i, j; |
| char_u *p1; |
| char_u *p2; |
| - int oldlen; |
| int difflen; |
| int v; |
| |
| --- 3266,3271 ---- |
| |
| *** 3291,3297 **** |
| out_flush(); |
| |
| i = (int)(xp->xp_pattern - ccline.cmdbuff); |
| ! oldlen = ccline.cmdpos - i; |
| |
| if (type == WILD_NEXT || type == WILD_PREV) |
| { |
| --- 3290,3296 ---- |
| out_flush(); |
| |
| i = (int)(xp->xp_pattern - ccline.cmdbuff); |
| ! xp->xp_pattern_len = ccline.cmdpos - i; |
| |
| if (type == WILD_NEXT || type == WILD_PREV) |
| { |
| |
| *** 3305,3322 **** |
| /* |
| * Translate string into pattern and expand it. |
| */ |
| ! if ((p1 = addstar(&ccline.cmdbuff[i], oldlen, xp->xp_context)) == NULL) |
| p2 = NULL; |
| else |
| { |
| ! p2 = ExpandOne(xp, p1, vim_strnsave(&ccline.cmdbuff[i], oldlen), |
| WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT|WILD_ESCAPE |
| |options, type); |
| vim_free(p1); |
| /* longest match: make sure it is not shorter (happens with :help */ |
| if (p2 != NULL && type == WILD_LONGEST) |
| { |
| ! for (j = 0; j < oldlen; ++j) |
| if (ccline.cmdbuff[i + j] == '*' |
| || ccline.cmdbuff[i + j] == '?') |
| break; |
| --- 3304,3323 ---- |
| /* |
| * Translate string into pattern and expand it. |
| */ |
| ! if ((p1 = addstar(xp->xp_pattern, xp->xp_pattern_len, |
| ! xp->xp_context)) == NULL) |
| p2 = NULL; |
| else |
| { |
| ! p2 = ExpandOne(xp, p1, |
| ! vim_strnsave(&ccline.cmdbuff[i], xp->xp_pattern_len), |
| WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT|WILD_ESCAPE |
| |options, type); |
| vim_free(p1); |
| /* longest match: make sure it is not shorter (happens with :help */ |
| if (p2 != NULL && type == WILD_LONGEST) |
| { |
| ! for (j = 0; j < xp->xp_pattern_len; ++j) |
| if (ccline.cmdbuff[i + j] == '*' |
| || ccline.cmdbuff[i + j] == '?') |
| break; |
| |
| *** 3331,3337 **** |
| |
| if (p2 != NULL && !got_int) |
| { |
| ! difflen = (int)STRLEN(p2) - oldlen; |
| if (ccline.cmdlen + difflen > ccline.cmdbufflen - 4) |
| { |
| v = realloc_cmdbuff(ccline.cmdlen + difflen); |
| --- 3332,3338 ---- |
| |
| if (p2 != NULL && !got_int) |
| { |
| ! difflen = (int)STRLEN(p2) - xp->xp_pattern_len; |
| if (ccline.cmdlen + difflen > ccline.cmdbufflen - 4) |
| { |
| v = realloc_cmdbuff(ccline.cmdlen + difflen); |
| |
| *** 3620,3625 **** |
| --- 3621,3627 ---- |
| expand_T *xp; |
| { |
| xp->xp_pattern = NULL; |
| + xp->xp_pattern_len = 0; |
| xp->xp_backslash = XP_BS_NONE; |
| #ifndef BACKSLASH_IN_FILENAME |
| xp->xp_shell = FALSE; |
| |
| *** 4311,4318 **** |
| } |
| |
| /* add star to file name, or convert to regexp if not exp. files. */ |
| ! file_str = addstar(xp->xp_pattern, |
| ! (int)(str + col - xp->xp_pattern), xp->xp_context); |
| if (file_str == NULL) |
| return EXPAND_UNSUCCESSFUL; |
| |
| --- 4313,4320 ---- |
| } |
| |
| /* add star to file name, or convert to regexp if not exp. files. */ |
| ! xp->xp_pattern_len = (int)(str + col - xp->xp_pattern); |
| ! file_str = addstar(xp->xp_pattern, xp->xp_pattern_len, xp->xp_context); |
| if (file_str == NULL) |
| return EXPAND_UNSUCCESSFUL; |
| |
| |
| *** 4781,4787 **** |
| 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. */ |
| --- 4783,4789 ---- |
| sprintf((char *)num, "%d", ccline.cmdpos); |
| args[1] = ccline.cmdbuff; |
| } |
| ! args[0] = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len); |
| args[2] = num; |
| |
| /* Save the cmdline, we don't know what the function may do. */ |
| |
| *** 4797,4802 **** |
| --- 4799,4805 ---- |
| if (ccline.cmdbuff != NULL) |
| ccline.cmdbuff[ccline.cmdlen] = keep; |
| |
| + vim_free(args[0]); |
| return ret; |
| } |
| |
| |
| |
| |
| *** 432,437 **** |
| --- 432,438 ---- |
| { |
| int xp_context; /* type of expansion */ |
| char_u *xp_pattern; /* start of item to expand */ |
| + int xp_pattern_len; /* bytes in xp_pattern before cursor */ |
| #if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL) |
| char_u *xp_arg; /* completion function */ |
| int xp_scriptID; /* SID for completion function */ |
| |
| |
| |
| *** 678,679 **** |
| --- 678,681 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 262, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 252. You vote for foreign officials. |
| |
| /// 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 /// |