Hi Bram,
attached patch fixes this issue from todo.txt:

8   Add an event like CursorHold that is triggered repeatedly, not just
once after typing something.
Need for CursorHold that retriggers.  Use a key that doesn't do anything,
or a function that resets did_cursorhold.


regards,
Christian

-- 
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
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -286,6 +286,8 @@
 |FocusLost|            Vim lost input focus
 |CursorHold|           the user doesn't press a key for a while
 |CursorHoldI|          the user doesn't press a key for a while in Insert mode
+|CursorHoldR|          the user doesn't press a key for a while (triggers
+                       continuosly)
 |CursorMoved|          the cursor was moved in Normal mode
 |CursorMovedI|         the cursor was moved in Insert mode
 
@@ -474,8 +476,9 @@
                                specified with 'updatetime'.  Not re-triggered
                                until the user has pressed a key (i.e. doesn't
                                fire every 'updatetime' ms if you leave Vim to
-                               make some coffee. :)  See |CursorHold-example|
-                               for previewing tags.
+                               make some coffee. :) Use the |CursorHoldR|
+                               autocommand if you want it to be retriggered.
+                               See |CursorHold-example| for previewing tags.
                                This event is only triggered in Normal mode.
                                It is not triggered when waiting for a command
                                argument to be typed, or a movement after an
@@ -494,6 +497,8 @@
                                versions}
                                                        *CursorHoldI*
 CursorHoldI                    Just like CursorHold, but in Insert mode.
+                                                       *CursorHoldR*
+CursorHoldR                    Just like CursorHold, but triggers continuosly.
 
                                                        *CursorMoved*
 CursorMoved                    After the cursor was moved in Normal mode.
diff --git a/src/fileio.c b/src/fileio.c
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -7684,6 +7684,7 @@
     {"ColorScheme",    EVENT_COLORSCHEME},
     {"CursorHold",     EVENT_CURSORHOLD},
     {"CursorHoldI",    EVENT_CURSORHOLDI},
+    {"CursorHoldR",    EVENT_CURSORHOLDR},
     {"CursorMoved",    EVENT_CURSORMOVED},
     {"CursorMovedI",   EVENT_CURSORMOVEDI},
     {"EncodingChanged",        EVENT_ENCODINGCHANGED},
@@ -9086,8 +9087,16 @@
                            ? EVENT_CURSORHOLD : EVENT_CURSORHOLDI)] != NULL);
 }
 
+    int
+has_cursorholdr()
+{
+    return (first_autopat[(int)EVENT_CURSORHOLDR] != NULL);
+}
+
+
 /*
- * Return TRUE if the CursorHold event can be triggered.
+ * Return 1 if the CursorHold event can be triggered.
+ * Return 2 if the CursorHoldR event can be triggered.
  */
     int
 trigger_cursorhold()
@@ -9102,7 +9111,16 @@
     {
        state = get_real_state();
        if (state == NORMAL_BUSY || (state & INSERT) != 0)
-           return TRUE;
+           return 1;
+    }
+    else if (has_cursorholdr() && !Recording
+#ifdef FEAT_INS_EXPAND
+           && !ins_compl_active()
+#endif
+           )
+    {
+       if (get_real_state() == NORMAL_BUSY)
+           return 2;
     }
     return FALSE;
 }
diff --git a/src/getchar.c b/src/getchar.c
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -3066,7 +3066,8 @@
        if (p[0] == NUL || (p[0] == K_SPECIAL && !script
 #ifdef FEAT_AUTOCMD
                    /* timeout may generate K_CURSORHOLD */
-                   && (i < 2 || p[1] != KS_EXTRA || p[2] != (int)KE_CURSORHOLD)
+                   && (i < 2 || p[1] != KS_EXTRA ||
+                       (p[2] != (int)KE_CURSORHOLD && p[2] != (int) 
KE_CURSORHOLDR))
 #endif
 #if defined(WIN3264) && !defined(FEAT_GUI)
                    /* Win32 console passes modifiers */
diff --git a/src/gui.c b/src/gui.c
--- a/src/gui.c
+++ b/src/gui.c
@@ -2725,7 +2725,8 @@
        /* Put K_CURSORHOLD in the input buffer. */
        buf[0] = CSI;
        buf[1] = KS_EXTRA;
-       buf[2] = (int)KE_CURSORHOLD;
+       buf[2] = (int)trigger_cursorhold() == 1 ?
+           KE_CURSORHOLD : KE_CURSORHOLDR;
        add_to_input_buf(buf, 3);
 
        retval = OK;
diff --git a/src/keymap.h b/src/keymap.h
--- a/src/keymap.h
+++ b/src/keymap.h
@@ -258,6 +258,7 @@
 
     , KE_DROP          /* DnD data is available */
     , KE_CURSORHOLD    /* CursorHold event */
+    , KE_CURSORHOLDR   /* CursorHoldR event */
     , KE_NOP           /* doesn't do something */
     , KE_FOCUSGAINED   /* focus gained */
     , KE_FOCUSLOST     /* focus lost */
@@ -458,6 +459,7 @@
 #define K_FOCUSLOST    TERMCAP2KEY(KS_EXTRA, KE_FOCUSLOST)
 
 #define K_CURSORHOLD   TERMCAP2KEY(KS_EXTRA, KE_CURSORHOLD)
+#define K_CURSORHOLDR  TERMCAP2KEY(KS_EXTRA, KE_CURSORHOLDR)
 
 /* Bits for modifier mask */
 /* 0x01 cannot be used, because the modifier must be 0x02 or higher */
diff --git a/src/normal.c b/src/normal.c
--- a/src/normal.c
+++ b/src/normal.c
@@ -184,6 +184,7 @@
 #endif
 #ifdef FEAT_AUTOCMD
 static void    nv_cursorhold __ARGS((cmdarg_T *cap));
+static void    nv_cursorholdr __ARGS((cmdarg_T *cap));
 #endif
 
 static char *e_noident = N_("E349: No identifier under cursor");
@@ -452,6 +453,7 @@
 #endif
 #ifdef FEAT_AUTOCMD
     {K_CURSORHOLD, nv_cursorhold, NV_KEEPREG,          0},
+    {K_CURSORHOLDR, nv_cursorholdr, NV_KEEPREG,                0},
 #endif
 };
 
@@ -779,7 +781,7 @@
     }
 
 #ifdef FEAT_AUTOCMD
-    if (c == K_CURSORHOLD)
+    if (c == K_CURSORHOLD || c == K_CURSORHOLDR)
     {
        /* Save the count values so that ca.opcount and ca.count0 are exactly
         * the same when coming back here after handling K_CURSORHOLD. */
@@ -1318,7 +1320,8 @@
 #ifdef FEAT_CMDL_INFO
     if (oap->op_type == OP_NOP && oap->regname == 0
 # ifdef FEAT_AUTOCMD
-           && ca.cmdchar != K_CURSORHOLD
+           && ca.cmdchar != K_CURSORHOLD 
+           && ca.cmdchar != K_CURSORHOLDR
 # endif
            )
        clear_showcmd();
@@ -3888,7 +3891,7 @@
        K_RIGHTMOUSE, K_RIGHTDRAG, K_RIGHTRELEASE,
        K_MOUSEDOWN, K_MOUSEUP, K_MOUSELEFT, K_MOUSERIGHT,
        K_X1MOUSE, K_X1DRAG, K_X1RELEASE, K_X2MOUSE, K_X2DRAG, K_X2RELEASE,
-       K_CURSORHOLD,
+       K_CURSORHOLD, K_CURSORHOLDR,
        0
     };
 #endif
@@ -9524,7 +9527,18 @@
     cmdarg_T   *cap;
 {
     apply_autocmds(EVENT_CURSORHOLD, NULL, NULL, FALSE, curbuf);
+    if (has_cursorholdr()) /* also apply CursorHoldR autocmd */
+       apply_autocmds(EVENT_CURSORHOLDR, NULL, NULL, FALSE, curbuf);
     did_cursorhold = TRUE;
     cap->retval |= CA_COMMAND_BUSY;    /* don't call edit() now */
 }
-#endif
+
+    static void
+nv_cursorholdr(cap)
+    cmdarg_T   *cap;
+{
+    apply_autocmds(EVENT_CURSORHOLDR, NULL, NULL, FALSE, curbuf);
+    did_cursorhold = TRUE;
+    cap->retval |= CA_COMMAND_BUSY;    /* don't call edit() now */
+}
+#endif
diff --git a/src/os_amiga.c b/src/os_amiga.c
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -154,7 +154,8 @@
            {
                buf[0] = K_SPECIAL;
                buf[1] = KS_EXTRA;
-               buf[2] = (int)KE_CURSORHOLD;
+               buf[2] = (int)trigger_cursorhold() == 1 ?
+                   KE_CURSORHOLD : KE_CURSORHOLDR;
                return 3;
            }
 #endif
diff --git a/src/os_msdos.c b/src/os_msdos.c
--- a/src/os_msdos.c
+++ b/src/os_msdos.c
@@ -1037,7 +1037,8 @@
            {
                buf[0] = K_SPECIAL;
                buf[1] = KS_EXTRA;
-               buf[2] = (int)KE_CURSORHOLD;
+               buf[2] = (int)trigger_cursorhold() == 1 ?
+                   KE_CURSORHOLD : KE_CURSORHOLDR;
                return 3;
            }
 #endif
diff --git a/src/os_unix.c b/src/os_unix.c
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -404,7 +404,8 @@
            {
                buf[0] = K_SPECIAL;
                buf[1] = KS_EXTRA;
-               buf[2] = (int)KE_CURSORHOLD;
+               buf[2] = (int)trigger_cursorhold() == 1 ?
+                   KE_CURSORHOLD : KE_CURSORHOLDR;
                return 3;
            }
 #endif
diff --git a/src/os_win32.c b/src/os_win32.c
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1430,7 +1430,8 @@
            {
                buf[0] = K_SPECIAL;
                buf[1] = KS_EXTRA;
-               buf[2] = (int)KE_CURSORHOLD;
+               buf[2] = (int)trigger_cursorhold() == 1 ?
+                   KE_CURSORHOLD : KE_CURSORHOLDR;
                return 3;
            }
 #endif
diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro
--- a/src/proto/fileio.pro
+++ b/src/proto/fileio.pro
@@ -40,6 +40,7 @@
 int apply_autocmds __ARGS((event_T event, char_u *fname, char_u *fname_io, int 
force, buf_T *buf));
 int apply_autocmds_retval __ARGS((event_T event, char_u *fname, char_u 
*fname_io, int force, buf_T *buf, int *retval));
 int has_cursorhold __ARGS((void));
+int has_cursorholdr __ARGS((void));
 int trigger_cursorhold __ARGS((void));
 int has_cursormoved __ARGS((void));
 int has_cursormovedI __ARGS((void));
diff --git a/src/vim.h b/src/vim.h
--- a/src/vim.h
+++ b/src/vim.h
@@ -1284,6 +1284,7 @@
     EVENT_ENCODINGCHANGED,     /* after changing the 'encoding' option */
     EVENT_CURSORHOLD,          /* cursor in same position for a while */
     EVENT_CURSORHOLDI,         /* idem, in Insert mode */
+    EVENT_CURSORHOLDR,         /* idem, repeatedly */
     EVENT_FUNCUNDEFINED,       /* if calling a function which doesn't exist */
     EVENT_REMOTEREPLY,         /* upon string reception from a remote vim */
     EVENT_SWAPEXISTS,          /* found existing swap file */

Raspunde prin e-mail lui