diff options
author | Bram Moolenaar <Bram@vim.org> | 2011-05-19 17:25:41 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2011-05-19 17:25:41 +0200 |
commit | e659c95b01b04b353e60d728d32bcb17f8ff832c (patch) | |
tree | 3323ea64a3ce4a6129ba7d0de5114e0ded35b6c8 | |
parent | 496f9517cb2630cd902be85e51e3ab395a194e85 (diff) |
updated for version 7.3.196v7.3.196
Problem: Can't intercept a character that is going to be inserted.
Solution: Add the InsertCharPre autocommand event. (Jakson A. Aquino)
-rw-r--r-- | runtime/doc/autocmd.txt | 13 | ||||
-rw-r--r-- | runtime/doc/eval.txt | 1 | ||||
-rw-r--r-- | runtime/doc/map.txt | 2 | ||||
-rw-r--r-- | src/edit.c | 43 | ||||
-rw-r--r-- | src/eval.c | 2 | ||||
-rw-r--r-- | src/fileio.c | 1 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 1 |
8 files changed, 57 insertions, 8 deletions
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index d40df23416..145ecf624b 100644 --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -299,6 +299,8 @@ Name triggered by ~ |InsertEnter| starting Insert mode |InsertChange| when typing <Insert> while in Insert or Replace mode |InsertLeave| when leaving Insert mode +|InsertCharPre| when a character was typed in Insert mode, before + inserting it |ColorScheme| after loading a color scheme @@ -657,6 +659,17 @@ InsertChange When typing <Insert> while in Insert or indicates the new mode. Be careful not to move the cursor or do anything else that the user does not expect. + *InsertCharPre* +InsertCharPre When a character is typed in Insert mode, + before inserting the char. + The |v:char| variable indicates the char typed + and can be changed during the event to insert + a different character. When |v:char| is set + to more than one character this text is + inserted literally. + It is not allowed to change the text |textlock|. + The event is not triggered when 'paste' is + set. *InsertEnter* InsertEnter Just before starting Insert mode. Also for Replace mode and Virtual Replace mode. The diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 50da2de66d..db5ae56360 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1293,6 +1293,7 @@ v:beval_winnr The number of the window, over which the mouse pointer is. Only *v:char* *char-variable* v:char Argument for evaluating 'formatexpr' and used for the typed character when using <expr> in an abbreviation |:map-<expr>|. + It is also used by the |InsertPreChar| event. *v:charconvert_from* *charconvert_from-variable* v:charconvert_from diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt index ec21d15ff0..ceb29013d0 100644 --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -226,7 +226,7 @@ text before the cursor and start omni completion when some condition is met. For abbreviations |v:char| is set to the character that was typed to trigger the abbreviation. You can use this to decide how to expand the {lhs}. You -can't change v:char and you should not insert it. +you should not either insert or change the v:char. Be very careful about side effects! The expression is evaluated while obtaining characters, you may very well make the command dysfunctional. diff --git a/src/edit.c b/src/edit.c index a43c0a2c16..711bfccc9f 100644 --- 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); } diff --git a/src/eval.c b/src/eval.c index 64ed72ae0b..2432ad3950 100644 --- a/src/eval.c +++ b/src/eval.c @@ -352,7 +352,7 @@ static struct vimvar {VV_NAME("swapname", VAR_STRING), VV_RO}, {VV_NAME("swapchoice", VAR_STRING), 0}, {VV_NAME("swapcommand", VAR_STRING), VV_RO}, - {VV_NAME("char", VAR_STRING), VV_RO}, + {VV_NAME("char", VAR_STRING), 0}, {VV_NAME("mouse_win", VAR_NUMBER), 0}, {VV_NAME("mouse_lnum", VAR_NUMBER), 0}, {VV_NAME("mouse_col", VAR_NUMBER), 0}, diff --git a/src/fileio.c b/src/fileio.c index b4fbdfbac9..6355c7911b 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -7662,6 +7662,7 @@ static struct event_name {"InsertChange", EVENT_INSERTCHANGE}, {"InsertEnter", EVENT_INSERTENTER}, {"InsertLeave", EVENT_INSERTLEAVE}, + {"InsertCharPre", EVENT_INSERTCHARPRE}, {"MenuPopup", EVENT_MENUPOPUP}, {"QuickFixCmdPost", EVENT_QUICKFIXCMDPOST}, {"QuickFixCmdPre", EVENT_QUICKFIXCMDPRE}, diff --git a/src/version.c b/src/version.c index 968bbb355b..66de09ee53 100644 --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 196, +/**/ 195, /**/ 194, @@ -1274,6 +1274,7 @@ enum auto_event EVENT_WINENTER, /* after entering a window */ EVENT_WINLEAVE, /* before leaving a window */ EVENT_ENCODINGCHANGED, /* after changing the 'encoding' option */ + EVENT_INSERTCHARPRE, /* before inserting a char */ EVENT_CURSORHOLD, /* cursor in same position for a while */ EVENT_CURSORHOLDI, /* idem, in Insert mode */ EVENT_FUNCUNDEFINED, /* if calling a function which doesn't exist */ |