]> granicus.if.org Git - vim/commitdiff
patch 8.2.2366: when using ":sleep" the cursor is always displayed v8.2.2366
authorBram Moolenaar <Bram@vim.org>
Sat, 16 Jan 2021 19:21:23 +0000 (20:21 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 16 Jan 2021 19:21:23 +0000 (20:21 +0100)
Problem:    When using ":sleep" the cursor is always displayed.
Solution:   Do not display the cursor when using ":sleep!". (Jeremy Lerner,
            closes #7688)

runtime/doc/index.txt
runtime/doc/various.txt
src/ex_cmds.h
src/ex_docmd.c
src/normal.c
src/proto/ex_docmd.pro
src/term.c
src/testdir/Make_all.mak
src/testdir/test_sleep.vim [new file with mode: 0644]
src/version.c

index 91d22de74b1c2dd94ec33fcbba6df85e499a020c..aec4ca04af704bcc10aaedc8495fb97d1145b9eb 100644 (file)
@@ -1590,6 +1590,8 @@ tag               command         action ~
 |:sign|                :sig[n]         manipulate signs
 |:silent|      :sil[ent]       run a command silently
 |:sleep|       :sl[eep]        do nothing for a few seconds
+|:sleep!|      :sl[eep]!       do nothing for a few seconds, without the
+                               cursor visible
 |:slast|       :sla[st]        split window and go to last file in the
                                argument list
 |:smagic|      :sm[agic]       :substitute with 'magic'
index a895a5eb50b882a3223a13f5458b675da9543936..c116d69f2c39e8ee02b2144b8f2f9a4ed37047e6 100644 (file)
@@ -707,12 +707,12 @@ K                 Run a program to lookup the keyword under the
                        not more than one line.
 
 [N]gs                                                  *gs* *:sl* *:sleep*
-:[N]sl[eep] [N]        [m]     Do nothing for [N] seconds.  When [m] is included,
+:[N]sl[eep] [N][m]     Do nothing for [N] seconds.  When [m] is included,
                        sleep for [N] milliseconds.  The count for "gs" always
                        uses seconds.  The default is one second. >
                             :sleep          "sleep for one second
                             :5sleep         "sleep for five seconds
-                            :sleep 100m     "sleep for a hundred milliseconds
+                            :sleep 100m     "sleep for 100 milliseconds
                             10gs            "sleep for ten seconds
 <                      Can be interrupted with CTRL-C (CTRL-Break on
                        MS-Windows).  "gs" stands for "goto sleep".
index 75bb7fb943422ab99c6aa07ab41226e8f120c0f7..30f5221400277ab2f0354d3b6681009b40c002ea 100644 (file)
@@ -1365,7 +1365,7 @@ EXCMD(CMD_silent, "silent",       ex_wrongmodifier,
        EX_NEEDARG|EX_EXTRA|EX_BANG|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
        ADDR_NONE),
 EXCMD(CMD_sleep,       "sleep",        ex_sleep,
-       EX_RANGE|EX_COUNT|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
+       EX_BANG|EX_RANGE|EX_COUNT|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
        ADDR_OTHER),
 EXCMD(CMD_slast,       "slast",        ex_last,
        EX_EXTRA|EX_BANG|EX_CMDARG|EX_ARGOPT|EX_TRLBAR,
index 7fe33d8e5f4b0fa74247573db6f577979b2428b6..9562e6be3a8323aeee5d6ebb8d1a7baf66edf2bf 100644 (file)
@@ -7225,14 +7225,17 @@ ex_sleep(exarg_T *eap)
        case NUL: len *= 1000L; break;
        default: semsg(_(e_invarg2), eap->arg); return;
     }
-    do_sleep(len);
+
+    // Hide the cursor if invoked with !
+    do_sleep(len, eap->forceit);
 }
 
 /*
  * Sleep for "msec" milliseconds, but keep checking for a CTRL-C every second.
+ * Hide the cursor if "hide_cursor" is TRUE.
  */
     void
-do_sleep(long msec)
+do_sleep(long msec, int hide_cursor)
 {
     long       done = 0;
     long       wait_now;
@@ -7244,7 +7247,11 @@ do_sleep(long msec)
     ELAPSED_INIT(start_tv);
 # endif
 
-    cursor_on();
+    if (hide_cursor)
+        cursor_off();
+    else
+        cursor_on();
+
     out_flush_cursor(FALSE, FALSE);
     while (!got_int && done < msec)
     {
index faf6ffbb470f86c43d495aec177975fa1bc432e2..a5f5794c528bdc90dade862046f40abbdd9cdff6 100644 (file)
@@ -993,7 +993,7 @@ getcount:
                // something different from CTRL-N.  Can't be avoided.
                while ((c = vpeekc()) <= 0 && towait > 0L)
                {
-                   do_sleep(towait > 50L ? 50L : towait);
+                   do_sleep(towait > 50L ? 50L : towait, FALSE);
                    towait -= 50L;
                }
                if (c > 0)
@@ -6230,7 +6230,7 @@ nv_g_cmd(cmdarg_T *cap)
      * "gs": Goto sleep.
      */
     case 's':
-       do_sleep(cap->count1 * 1000L);
+       do_sleep(cap->count1 * 1000L, FALSE);
        break;
 
     /*
index 46030a5fd54e6f3629c4358de44a530f498366e3..94770f2e3c0b70b602311a979b27516b63f52367 100644 (file)
@@ -42,7 +42,7 @@ void free_cd_dir(void);
 void post_chdir(cdscope_T scope);
 int changedir_func(char_u *new_dir, int forceit, cdscope_T scope);
 void ex_cd(exarg_T *eap);
-void do_sleep(long msec);
+void do_sleep(long msec, int hide_cursor);
 void ex_may_print(exarg_T *eap);
 void ex_redraw(exarg_T *eap);
 int vim_mkdir_emsg(char_u *name, int prot);
index 5d1228dd7d2ff7f4e3646a492ff71f1d03f31f74..47e5dfd1eb406b16c48d65cfcb078ed089db2c6d 100644 (file)
@@ -2713,7 +2713,7 @@ out_str_cf(char_u *s)
                else
                {
                    ++p;
-                   do_sleep(duration);
+                   do_sleep(duration, FALSE);
                }
 # else
                // Rely on the terminal library to sleep.
index 364221fd92ffc103a10d5c691481c37a0bbe8845..b769499328fba3a4fbb3a8b5b4d597d1eadf6016 100644 (file)
@@ -246,6 +246,7 @@ NEW_TESTS = \
        test_shortpathname \
        test_signals \
        test_signs \
+       test_sleep \
        test_smartindent \
        test_sort \
        test_sound \
@@ -472,6 +473,7 @@ NEW_TESTS_RES = \
        test_shortpathname.res \
        test_signals.res \
        test_signs.res \
+       test_sleep.res \
        test_smartindent.res \
        test_sort.res \
        test_sound.res \
diff --git a/src/testdir/test_sleep.vim b/src/testdir/test_sleep.vim
new file mode 100644 (file)
index 0000000..f71855f
--- /dev/null
@@ -0,0 +1,26 @@
+" Test for sleep and sleep! commands
+
+func! s:get_time_ms()
+  let timestr = reltimestr(reltime())
+  let dotidx = stridx(timestr, '.')
+  let sec = str2nr(timestr[:dotidx])
+  let msec = str2nr(timestr[dotidx + 1:])
+  return (sec * 1000) + (msec / 1000)
+endfunc
+
+func! s:assert_takes_longer(cmd, time_ms)
+  let start = s:get_time_ms()
+  execute a:cmd
+  let end = s:get_time_ms()
+  call assert_true(end - start >=# a:time_ms)
+endfun
+
+func! Test_sleep_bang()
+  call s:assert_takes_longer('sleep 50m', 50)
+  call s:assert_takes_longer('sleep! 50m', 50)
+  call s:assert_takes_longer('sl 50m', 50)
+  call s:assert_takes_longer('sl! 50m', 50)
+  call s:assert_takes_longer('1sleep', 1000)
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
index d0010406d55093e8131b8fcf6147cf71b4395dcc..0367430ffe5e9217d36931a58f2c78ef6895bfb7 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2366,
 /**/
     2365,
 /**/