Sorry, it was included another patch.
Check below's patch.

https://gist.github.com/1303356 

diff -r 37ecb8ff4560 src/edit.c
--- a/src/edit.c Thu Oct 20 22:22:38 2011 +0200
+++ b/src/edit.c Fri Oct 21 16:19:52 2011 +0900
@@ -784,7 +784,17 @@
  * completion: Add to "compl_leader". */
  if (ins_compl_accept_char(c))
  {
-    ins_compl_addleader(c);
+    set_vim_var_char(c);
+    ++textlock;
+    if (apply_autocmds(EVENT_INSERTCHARPRE, NULL, NULL,
+   FALSE, curbuf))
+    {
+ c = PTR2CHAR(get_vim_var_str(VV_CHAR));
+    }
+    if (c)
+ ins_compl_addleader(c);
+    set_vim_var_string(VV_CHAR, NULL, -1);
+    --textlock;
     continue;
  }
 
@@ -1393,31 +1403,37 @@
 #ifdef FEAT_AUTOCMD
     if (!p_paste)
     {
+ int executed;
  /* 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))
+ executed = apply_autocmds(EVENT_INSERTCHARPRE, NULL, NULL,
+    FALSE, curbuf);
+ --textlock;
+ if (executed)
  {
     /* 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)
     {
- if (stop_arrow() != FAIL)
+ char_u *str = get_vim_var_str(VV_CHAR);
+ char_u *ptr = str;
+ while (*ptr != NUL)
  {
-    ins_str(s);
-    AppendToRedobuffLit(s, -1);
+    c = PTR2CHAR(ptr);
+    if (c == CAR || c == K_KENTER || c == NL)
+ ins_eol(c);
+    else
+ ins_char(c);
+    ptr += (*mb_ptr2len)(ptr);
  }
- c = NUL;
+ AppendToRedobuffLit(str, -1);
     }
-    else
- c = PTR2CHAR(s);
+    c = NUL;
  }
 
  set_vim_var_string(VV_CHAR, NULL, -1);
- --textlock;
 
  /* If the new value is an empty string then don't insert a
  * char. */
@@ -5867,6 +5883,8 @@
      * Don't do this when 'cindent' or 'indentexpr' is set, because we 
might
      * need to re-indent at a ':', or any other character (but not what
      * 'paste' is set)..
+     * Don't do this when there is InsertCharPre autocommand defined,
+     * because we need to fire the event for every character.
      */
 #ifdef USE_ON_FLY_SCROLL
     dont_scroll = FALSE; /* allow scrolling here */
@@ -5884,6 +5902,9 @@
 #ifdef FEAT_RIGHTLEFT
     && !p_ri
 #endif
+#ifdef FEAT_AUTOCMD
+    && !has_insertcharpre()
+#endif
        )
     {
 #define INPUT_BUFLEN 100
diff -r 37ecb8ff4560 src/fileio.c
--- a/src/fileio.c Thu Oct 20 22:22:38 2011 +0200
+++ b/src/fileio.c Fri Oct 21 16:19:52 2011 +0900
@@ -9092,6 +9097,15 @@
     return (first_autopat[(int)EVENT_CURSORMOVEDI] != NULL);
 }
 
+/*
+ * Return TRUE when there is a InsertCharPre autocommand defined.
+ */
+    int
+has_insertcharpre()
+{
+    return (first_autopat[(int)EVENT_INSERTCHARPRE] != NULL);
+}
+
     static int
 apply_autocmds_group(event, fname, fname_io, force, group, buf, eap)
     event_T event;
diff -r 37ecb8ff4560 src/proto/fileio.pro
--- a/src/proto/fileio.pro Thu Oct 20 22:22:38 2011 +0200
+++ b/src/proto/fileio.pro Fri Oct 21 16:19:52 2011 +0900
@@ -43,6 +43,7 @@
 int trigger_cursorhold __ARGS((void));
 int has_cursormoved __ARGS((void));
 int has_cursormovedI __ARGS((void));
+int has_insertcharpre __ARGS((void));
 void block_autocmds __ARGS((void));
 void unblock_autocmds __ARGS((void));
 int has_autocmd __ARGS((event_T event, char_u *sfname, buf_T *buf));

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui