Mercurial > vim
diff src/edit.c @ 2845:d641f141f937 v7.3.196
updated for version 7.3.196
Problem: Can't intercept a character that is going to be inserted.
Solution: Add the InsertCharPre autocommand event. (Jakson A. Aquino)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Thu, 19 May 2011 17:25:41 +0200 |
parents | 5381eb5b1eb9 |
children | 44ffd0a8abcd |
line wrap: on
line diff
--- a/src/edit.c +++ b/src/edit.c @@ -1381,10 +1381,45 @@ docomplete: goto do_intr; #endif +normalchar: /* * Insert a nomal character. */ -normalchar: +#ifdef FEAT_AUTOCMD + if (!p_paste) + { + /* Trigger the InsertCharPre event. Lock the text to avoid + * weird things from happening. */ + set_vim_var_char(c); + ++textlock; + if (apply_autocmds(EVENT_INSERTCHARPRE, NULL, NULL, + FALSE, curbuf)) + { + /* Get the new value of v:char. If it is more than one + * character insert it literally. */ + char_u *s = get_vim_var_str(VV_CHAR); + if (MB_CHARLEN(s) > 1) + { + if (stop_arrow() != FAIL) + { + ins_str(s); + AppendToRedobuffLit(s, -1); + } + c = NUL; + } + else + c = PTR2CHAR(s); + } + + set_vim_var_string(VV_CHAR, NULL, -1); + --textlock; + + /* If the new value is an empty string then don't insert a + * char. */ + if (c == NUL) + break; + } +#endif #ifdef FEAT_SMARTINDENT /* Try to perform smart-indenting. */ ins_try_si(c); @@ -3491,11 +3526,7 @@ ins_compl_addfrommatch() return; } p += len; -#ifdef FEAT_MBYTE - c = mb_ptr2char(p); -#else - c = *p; -#endif + c = PTR2CHAR(p); ins_compl_addleader(c); }