1
0
forked from aniani/vim

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)
This commit is contained in:
Bram Moolenaar 2011-05-19 17:25:41 +02:00
parent 496f9517cb
commit e659c95b01
8 changed files with 57 additions and 8 deletions

View File

@ -299,6 +299,8 @@ Name triggered by ~
|InsertEnter| starting Insert mode |InsertEnter| starting Insert mode
|InsertChange| when typing <Insert> while in Insert or Replace mode |InsertChange| when typing <Insert> while in Insert or Replace mode
|InsertLeave| when leaving Insert mode |InsertLeave| when leaving Insert mode
|InsertCharPre| when a character was typed in Insert mode, before
inserting it
|ColorScheme| after loading a color scheme |ColorScheme| after loading a color scheme
@ -657,6 +659,17 @@ InsertChange When typing <Insert> while in Insert or
indicates the new mode. indicates the new mode.
Be careful not to move the cursor or do Be careful not to move the cursor or do
anything else that the user does not expect. 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*
InsertEnter Just before starting Insert mode. Also for InsertEnter Just before starting Insert mode. Also for
Replace mode and Virtual Replace mode. The Replace mode and Virtual Replace mode. The

View File

@ -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* *char-variable*
v:char Argument for evaluating 'formatexpr' and used for the typed v:char Argument for evaluating 'formatexpr' and used for the typed
character when using <expr> in an abbreviation |:map-<expr>|. 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* *charconvert_from-variable*
v:charconvert_from v:charconvert_from

View File

@ -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 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 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 Be very careful about side effects! The expression is evaluated while
obtaining characters, you may very well make the command dysfunctional. obtaining characters, you may very well make the command dysfunctional.

View File

@ -1381,10 +1381,45 @@ docomplete:
goto do_intr; goto do_intr;
#endif #endif
normalchar:
/* /*
* Insert a nomal character. * 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 #ifdef FEAT_SMARTINDENT
/* Try to perform smart-indenting. */ /* Try to perform smart-indenting. */
ins_try_si(c); ins_try_si(c);
@ -3491,11 +3526,7 @@ ins_compl_addfrommatch()
return; return;
} }
p += len; p += len;
#ifdef FEAT_MBYTE c = PTR2CHAR(p);
c = mb_ptr2char(p);
#else
c = *p;
#endif
ins_compl_addleader(c); ins_compl_addleader(c);
} }

View File

@ -352,7 +352,7 @@ static struct vimvar
{VV_NAME("swapname", VAR_STRING), VV_RO}, {VV_NAME("swapname", VAR_STRING), VV_RO},
{VV_NAME("swapchoice", VAR_STRING), 0}, {VV_NAME("swapchoice", VAR_STRING), 0},
{VV_NAME("swapcommand", VAR_STRING), VV_RO}, {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_win", VAR_NUMBER), 0},
{VV_NAME("mouse_lnum", VAR_NUMBER), 0}, {VV_NAME("mouse_lnum", VAR_NUMBER), 0},
{VV_NAME("mouse_col", VAR_NUMBER), 0}, {VV_NAME("mouse_col", VAR_NUMBER), 0},

View File

@ -7662,6 +7662,7 @@ static struct event_name
{"InsertChange", EVENT_INSERTCHANGE}, {"InsertChange", EVENT_INSERTCHANGE},
{"InsertEnter", EVENT_INSERTENTER}, {"InsertEnter", EVENT_INSERTENTER},
{"InsertLeave", EVENT_INSERTLEAVE}, {"InsertLeave", EVENT_INSERTLEAVE},
{"InsertCharPre", EVENT_INSERTCHARPRE},
{"MenuPopup", EVENT_MENUPOPUP}, {"MenuPopup", EVENT_MENUPOPUP},
{"QuickFixCmdPost", EVENT_QUICKFIXCMDPOST}, {"QuickFixCmdPost", EVENT_QUICKFIXCMDPOST},
{"QuickFixCmdPre", EVENT_QUICKFIXCMDPRE}, {"QuickFixCmdPre", EVENT_QUICKFIXCMDPRE},

View File

@ -709,6 +709,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
196,
/**/ /**/
195, 195,
/**/ /**/

View File

@ -1274,6 +1274,7 @@ enum auto_event
EVENT_WINENTER, /* after entering a window */ EVENT_WINENTER, /* after entering a window */
EVENT_WINLEAVE, /* before leaving a window */ EVENT_WINLEAVE, /* before leaving a window */
EVENT_ENCODINGCHANGED, /* after changing the 'encoding' option */ EVENT_ENCODINGCHANGED, /* after changing the 'encoding' option */
EVENT_INSERTCHARPRE, /* before inserting a char */
EVENT_CURSORHOLD, /* cursor in same position for a while */ EVENT_CURSORHOLD, /* cursor in same position for a while */
EVENT_CURSORHOLDI, /* idem, in Insert mode */ EVENT_CURSORHOLDI, /* idem, in Insert mode */
EVENT_FUNCUNDEFINED, /* if calling a function which doesn't exist */ EVENT_FUNCUNDEFINED, /* if calling a function which doesn't exist */