changeset 23648:b7d3c79075c5 v8.2.2366

patch 8.2.2366: when using ":sleep" the cursor is always displayed Commit: https://github.com/vim/vim/commit/e2edc2ed4a9a229870b1e1811b0ecf045b84e429 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 16 20:21:23 2021 +0100 patch 8.2.2366: when using ":sleep" the cursor is always displayed Problem: When using ":sleep" the cursor is always displayed. Solution: Do not display the cursor when using ":sleep!". (Jeremy Lerner, closes #7688)
author Bram Moolenaar <Bram@vim.org>
date Sat, 16 Jan 2021 20:30:04 +0100
parents 6e03d7d78631
children fb80a74c1069
files 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 src/version.c
diffstat 10 files changed, 49 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/index.txt
+++ b/runtime/doc/index.txt
@@ -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'
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -707,12 +707,12 @@ K			Run a program to lookup the keyword 
 			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".
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -1365,7 +1365,7 @@ EXCMD(CMD_silent,	"silent",	ex_wrongmodi
 	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,
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -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)
     {
--- a/src/normal.c
+++ b/src/normal.c
@@ -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;
 
     /*
--- a/src/proto/ex_docmd.pro
+++ b/src/proto/ex_docmd.pro
@@ -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);
--- a/src/term.c
+++ b/src/term.c
@@ -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.
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -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 \
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_sleep.vim
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2366,
+/**/
     2365,
 /**/
     2364,