summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-01-16 20:21:23 +0100
committerBram Moolenaar <Bram@vim.org>2021-01-16 20:21:23 +0100
commite2edc2ed4a9a229870b1e1811b0ecf045b84e429 (patch)
tree52eb7e738360094d273506de9f81427de4ff0913
parent70250fb4d2ffc2e92db224c6374db418f70691fd (diff)
patch 8.2.2366: when using ":sleep" the cursor is always displayedv8.2.2366
Problem: When using ":sleep" the cursor is always displayed. Solution: Do not display the cursor when using ":sleep!". (Jeremy Lerner, closes #7688)
-rw-r--r--runtime/doc/index.txt2
-rw-r--r--runtime/doc/various.txt4
-rw-r--r--src/ex_cmds.h2
-rw-r--r--src/ex_docmd.c13
-rw-r--r--src/normal.c4
-rw-r--r--src/proto/ex_docmd.pro2
-rw-r--r--src/term.c2
-rw-r--r--src/testdir/Make_all.mak2
-rw-r--r--src/testdir/test_sleep.vim26
-rw-r--r--src/version.c2
10 files changed, 49 insertions, 10 deletions
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt
index 91d22de74b..aec4ca04af 100644
--- 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'
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
index a895a5eb50..c116d69f2c 100644
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -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".
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index 75bb7fb943..30f5221400 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -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,
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 7fe33d8e5f..9562e6be3a 100644
--- 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)
{
diff --git a/src/normal.c b/src/normal.c
index faf6ffbb47..a5f5794c52 100644
--- 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;
/*
diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro
index 46030a5fd5..94770f2e3c 100644
--- 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);
diff --git a/src/term.c b/src/term.c
index 5d1228dd7d..47e5dfd1eb 100644
--- 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.
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 364221fd92..b769499328 100644
--- 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 \
diff --git a/src/testdir/test_sleep.vim b/src/testdir/test_sleep.vim
new file mode 100644
index 0000000000..f71855fd4b
--- /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
diff --git a/src/version.c b/src/version.c
index d0010406d5..0367430ffe 100644
--- 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,