To: vim_dev@googlegroups.com Subject: Patch 7.3.196 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.196 Problem: Can't intercept a character that is going to be inserted. Solution: Add the InsertCharPre autocommand event. (Jakson A. Aquino) Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt, runtime/doc/map.txt, src/edit.c, src/eval.c, src/fileio.c, src/vim.h *** ../mercurial/vim73/runtime/doc/autocmd.txt 2011-04-28 19:01:26.000000000 +0200 --- runtime/doc/autocmd.txt 2011-05-19 17:12:17.000000000 +0200 *************** *** 299,304 **** --- 299,306 ---- |InsertEnter| starting Insert mode |InsertChange| when typing 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,662 **** --- 659,675 ---- 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 *** ../mercurial/vim73/runtime/doc/eval.txt 2011-05-19 12:22:41.000000000 +0200 --- runtime/doc/eval.txt 2011-05-19 16:55:58.000000000 +0200 *************** *** 1293,1298 **** --- 1293,1299 ---- *v:char* *char-variable* v:char Argument for evaluating 'formatexpr' and used for the typed character when using in an abbreviation |:map-|. + It is also used by the |InsertPreChar| event. *v:charconvert_from* *charconvert_from-variable* v:charconvert_from *** ../mercurial/vim73/runtime/doc/map.txt 2011-05-10 17:17:38.000000000 +0200 --- runtime/doc/map.txt 2011-05-19 16:40:34.000000000 +0200 *************** *** 226,232 **** 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. Be very careful about side effects! The expression is evaluated while obtaining characters, you may very well make the command dysfunctional. --- 226,232 ---- 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 ! 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. *** ../mercurial/vim73/src/edit.c 2011-05-10 14:22:10.000000000 +0200 --- src/edit.c 2011-05-19 17:20:53.000000000 +0200 *************** *** 1381,1390 **** goto do_intr; #endif /* * Insert a nomal character. */ ! normalchar: #ifdef FEAT_SMARTINDENT /* Try to perform smart-indenting. */ ins_try_si(c); --- 1381,1425 ---- goto do_intr; #endif + normalchar: /* * Insert a nomal character. */ ! #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,3501 **** return; } p += len; ! #ifdef FEAT_MBYTE ! c = mb_ptr2char(p); ! #else ! c = *p; ! #endif ins_compl_addleader(c); } --- 3526,3532 ---- return; } p += len; ! c = PTR2CHAR(p); ins_compl_addleader(c); } *** ../mercurial/vim73/src/eval.c 2011-05-19 14:59:07.000000000 +0200 --- src/eval.c 2011-05-19 16:40:39.000000000 +0200 *************** *** 352,358 **** {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("mouse_win", VAR_NUMBER), 0}, {VV_NAME("mouse_lnum", VAR_NUMBER), 0}, {VV_NAME("mouse_col", VAR_NUMBER), 0}, --- 352,358 ---- {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), 0}, {VV_NAME("mouse_win", VAR_NUMBER), 0}, {VV_NAME("mouse_lnum", VAR_NUMBER), 0}, {VV_NAME("mouse_col", VAR_NUMBER), 0}, *** ../mercurial/vim73/src/fileio.c 2011-05-10 16:41:13.000000000 +0200 --- src/fileio.c 2011-05-19 16:40:39.000000000 +0200 *************** *** 7662,7667 **** --- 7662,7668 ---- {"InsertChange", EVENT_INSERTCHANGE}, {"InsertEnter", EVENT_INSERTENTER}, {"InsertLeave", EVENT_INSERTLEAVE}, + {"InsertCharPre", EVENT_INSERTCHARPRE}, {"MenuPopup", EVENT_MENUPOPUP}, {"QuickFixCmdPost", EVENT_QUICKFIXCMDPOST}, {"QuickFixCmdPre", EVENT_QUICKFIXCMDPRE}, *** ../mercurial/vim73/src/vim.h 2011-05-10 16:41:13.000000000 +0200 --- src/vim.h 2011-05-19 16:40:39.000000000 +0200 *************** *** 1274,1279 **** --- 1274,1280 ---- 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 */ *** ../vim-7.3.195/src/version.c 2011-05-19 16:35:05.000000000 +0200 --- src/version.c 2011-05-19 17:15:41.000000000 +0200 *************** *** 711,712 **** --- 711,714 ---- { /* Add new patch number below this line */ + /**/ + 196, /**/ -- I AM THANKFUL... ...for the mess to clean after a party because it means I have been surrounded by friends. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///