patch 7.4.1759
Problem:    When using feedkeys() in a timer the inserted characters are not
            used right away.
Solution:   Break the wait loop when characters have been added to typebuf.
            use this for testing CursorHoldI.
diff --git a/src/os_unix.c b/src/os_unix.c
index 58a27da..f8cf691 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -397,7 +397,7 @@
 
     if (wtime >= 0)
     {
-	while (WaitForChar(wtime) == 0)		/* no character available */
+	while (!WaitForChar(wtime))		/* no character available */
 	{
 	    if (do_resize)
 		handle_resize();
@@ -420,7 +420,7 @@
 	 * flush all the swap files to disk.
 	 * Also done when interrupted by SIGWINCH.
 	 */
-	if (WaitForChar(p_ut) == 0)
+	if (!WaitForChar(p_ut))
 	{
 #ifdef FEAT_AUTOCMD
 	    if (trigger_cursorhold() && maxlen >= 3
@@ -448,7 +448,7 @@
 	 * We want to be interrupted by the winch signal
 	 * or by an event on the monitored file descriptors.
 	 */
-	if (WaitForChar(-1L) == 0)
+	if (!WaitForChar(-1L))
 	{
 	    if (do_resize)	    /* interrupted by SIGWINCH signal */
 		handle_resize();
@@ -482,7 +482,7 @@
 }
 
 /*
- * return non-zero if a character is available
+ * Return non-zero if a character is available.
  */
     int
 mch_char_avail(void)
@@ -5210,7 +5210,7 @@
 	/* See above for type of argv. */
 	execvp(argv[0], argv);
 
-	perror("executing job failed");
+	// perror("executing job failed");
 	_exit(EXEC_FAILED);	    /* exec failed, return failure code */
     }
 
@@ -5359,6 +5359,7 @@
  * "msec" == -1 will block forever.
  * Invokes timer callbacks when needed.
  * When a GUI is being used, this will never get called -- webb
+ * Returns TRUE when a character is available.
  */
     static int
 WaitForChar(long msec)
@@ -5367,6 +5368,7 @@
     long    due_time;
     long    remaining = msec;
     int	    break_loop = FALSE;
+    int	    tb_change_cnt = typebuf.tb_change_cnt;
 
     /* When waiting very briefly don't trigger timers. */
     if (msec >= 0 && msec < 10L)
@@ -5377,6 +5379,11 @@
 	/* Trigger timers and then get the time in msec until the next one is
 	 * due.  Wait up to that time. */
 	due_time = check_due_timer();
+	if (typebuf.tb_change_cnt != tb_change_cnt)
+	{
+	    /* timer may have used feedkeys() */
+	    return FALSE;
+	}
 	if (due_time <= 0 || (msec > 0 && due_time > remaining))
 	    due_time = remaining;
 	if (WaitForCharOrMouse(due_time, &break_loop))