Mercurial > vim
changeset 3547:65f905eb14cd v7.3.534
updated for version 7.3.534
Problem: When using an InsertCharPre autocommand autoindent fails.
Solution: Proper handling of v:char. (Alexey Radkov)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Fri, 01 Jun 2012 14:57:51 +0200 |
parents | ca491641ac81 |
children | 7a6efa56f306 |
files | src/edit.c src/version.c |
diffstat | 2 files changed, 28 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/edit.c +++ b/src/edit.c @@ -10108,22 +10108,40 @@ get_nolist_virtcol() do_insert_char_pre(c) int c; { - char_u *res; + char_u *res; +#ifdef FEAT_MBYTE + char_u buf[MB_MAXBYTES + 1]; +#else + char_u buf[2]; +#endif /* Return quickly when there is nothing to do. */ if (!has_insertcharpre()) return NULL; +#ifdef FEAT_MBYTE + if (has_mbyte) + buf[(*mb_char2bytes)(c, buf)] = NUL; + else +#endif + { + buf[0] = c; + buf[1] = NUL; + } + /* Lock the text to avoid weird things from happening. */ ++textlock; - set_vim_var_char(c); /* set v:char */ - + set_vim_var_string(VV_CHAR, buf, -1); /* set v:char */ + + res = NULL; if (apply_autocmds(EVENT_INSERTCHARPRE, NULL, NULL, FALSE, curbuf)) - /* Get the new value of v:char. It may be empty or more than one - * character. */ - res = vim_strsave(get_vim_var_str(VV_CHAR)); - else - res = NULL; + { + /* Get the value of v:char. It may be empty or more than one + * character. Only use it when changed, otherwise continue with the + * original character to avoid breaking autoindent. */ + if (STRCMP(buf, get_vim_var_str(VV_CHAR)) != 0) + res = vim_strsave(get_vim_var_str(VV_CHAR)); + } set_vim_var_string(VV_CHAR, NULL, -1); /* clear v:char */ --textlock;