diff options
-rw-r--r-- | runtime/doc/index.txt | 2 | ||||
-rw-r--r-- | runtime/doc/various.txt | 4 | ||||
-rw-r--r-- | src/ex_cmds.h | 2 | ||||
-rw-r--r-- | src/ex_docmd.c | 13 | ||||
-rw-r--r-- | src/normal.c | 4 | ||||
-rw-r--r-- | src/proto/ex_docmd.pro | 2 | ||||
-rw-r--r-- | src/term.c | 2 | ||||
-rw-r--r-- | src/testdir/Make_all.mak | 2 | ||||
-rw-r--r-- | src/testdir/test_sleep.vim | 26 | ||||
-rw-r--r-- | src/version.c | 2 |
10 files changed, 49 insertions, 10 deletions
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt index 91d22de74..aec4ca04a 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 a895a5eb5..c116d69f2 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 75bb7fb94..30f522140 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 7fe33d8e5..9562e6be3 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 faf6ffbb4..a5f5794c5 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 46030a5fd..94770f2e3 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 5d1228dd7..47e5dfd1e 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 364221fd9..b76949932 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 000000000..f71855fd4 --- /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 d0010406d..0367430ff 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, |