To: vim-dev@vim.org Subject: Patch 7.2.090 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 7.2.090 Problem: User command containing 0x80 in multi-byte character does not work properly. (Yasuhiro Matsumoto) Solution: Undo replacement of K_SPECIAL and CSI characters when executing the command. Files: src/ex_docmd.c *** ../vim-7.2.089/src/ex_docmd.c Tue Dec 9 11:17:23 2008 --- src/ex_docmd.c Wed Jan 28 15:34:19 2009 *************** *** 5482,5487 **** --- 5482,5490 ---- return OK; } + /* + * ":command ..." + */ static void ex_command(eap) exarg_T *eap; *************** *** 5914,5919 **** --- 5917,5923 ---- char_u *start; char_u *end; + char_u *ksp; size_t len, totlen; size_t split_len = 0; *************** *** 5930,5945 **** /* * Replace <> in the command by the arguments. */ buf = NULL; for (;;) { ! p = cmd->uc_rep; ! q = buf; totlen = 0; ! while ((start = vim_strchr(p, '<')) != NULL ! && (end = vim_strchr(start + 1, '>')) != NULL) { /* Include the '>' */ ++end; --- 5934,5984 ---- /* * Replace <> in the command by the arguments. + * First round: "buf" is NULL, compute length, allocate "buf". + * Second round: copy result into "buf". */ buf = NULL; for (;;) { ! p = cmd->uc_rep; /* source */ ! q = buf; /* destinateion */ totlen = 0; ! ! for (;;) { + start = vim_strchr(p, '<'); + if (start != NULL) + end = vim_strchr(start + 1, '>'); + if (buf != NULL) + { + ksp = vim_strchr(p, K_SPECIAL); + if (ksp != NULL && (start == NULL || ksp < start || end == NULL) + && ((ksp[1] == KS_SPECIAL && ksp[2] == KE_FILLER) + # ifdef FEAT_GUI + || (ksp[1] == KS_EXTRA && ksp[2] == (int)KE_CSI) + # endif + )) + { + /* K_SPECIAL han been put in the buffer as K_SPECIAL + * KS_SPECIAL KE_FILLER, like for mappings, but + * do_cmdline() doesn't handle that, so convert it back. + * Also change K_SPECIAL KS_EXTRA KE_CSI into CSI. */ + len = ksp - p; + if (len > 0) + { + mch_memmove(q, p, len); + q += len; + } + *q++ = ksp[1] == KS_SPECIAL ? K_SPECIAL : CSI; + p = ksp + 3; + continue; + } + } + + /* break if there no is found */ + if (start == NULL || end == NULL) + break; + /* Include the '>' */ ++end; *** ../vim-7.2.089/src/version.c Wed Jan 28 14:17:21 2009 --- src/version.c Wed Jan 28 15:37:40 2009 *************** *** 678,679 **** --- 678,681 ---- { /* Add new patch number below this line */ + /**/ + 90, /**/ -- How To Keep A Healthy Level Of Insanity: 17. When the money comes out the ATM, scream "I won!, I won! 3rd time this week!!!!!" /// 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 ///