diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-09-16 22:56:03 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-09-16 22:56:03 +0200 |
commit | 0e57dd859ecb1e8a3b91509d2f4343e839340eb8 (patch) | |
tree | 50e5f097f3fe10851e7af017cea6cdef35b12402 /src/main.c | |
parent | 69198cb8c08f124729c41a4681f2d142228a9139 (diff) | |
download | vim-git-0e57dd859ecb1e8a3b91509d2f4343e839340eb8.tar.gz |
patch 8.1.2047: cannot check the current statev8.1.2047
Problem: Cannot check the current state.
Solution: Add the state() function.
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/src/main.c b/src/main.c index 51e3915d9..42aa99034 100644 --- a/src/main.c +++ b/src/main.c @@ -1031,20 +1031,21 @@ is_not_a_term() // When TRUE in a safe state when starting to wait for a character. static int was_safe = FALSE; +static oparg_T *current_oap = NULL; /* - * Trigger SafeState if currently in a safe state for main_loop(). + * Return TRUE if an operator was started but not finished yet. + * Includes typing a count or a register name. */ - static void -may_trigger_safestate_main(oparg_T *oap) + int +op_pending(void) { - may_trigger_safestate( - !finish_op - && oap->prev_opcount > 0 - && oap->prev_count0 == 0 - && oap->op_type == OP_NOP - && oap->regname == NUL - && restart_edit == 0); + return !(current_oap != NULL + && !finish_op + && current_oap->prev_opcount == 0 + && current_oap->prev_count0 == 0 + && current_oap->op_type == OP_NOP + && current_oap->regname == NUL); } /* @@ -1100,15 +1101,19 @@ main_loop( int cmdwin, /* TRUE when working in the command-line window */ int noexmode) /* TRUE when return on entering Ex mode */ { - oparg_T oa; /* operator arguments */ - volatile int previous_got_int = FALSE; /* "got_int" was TRUE */ + oparg_T oa; // operator arguments + oparg_T *prev_oap; // operator arguments + volatile int previous_got_int = FALSE; // "got_int" was TRUE #ifdef FEAT_CONCEAL - /* these are static to avoid a compiler warning */ + // these are static to avoid a compiler warning static linenr_T conceal_old_cursor_line = 0; static linenr_T conceal_new_cursor_line = 0; static int conceal_update_lines = FALSE; #endif + prev_oap = current_oap; + current_oap = &oa; + #if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD) /* Setup to catch a terminating error from the X server. Just ignore * it, restore the state and continue. This might not always work @@ -1276,7 +1281,7 @@ main_loop( // If nothing is pending and we are going to wait for the user to // type a character, trigger SafeState. - may_trigger_safestate_main(&oa); + may_trigger_safestate(!op_pending() && restart_edit == 0); #if defined(FEAT_DIFF) // Updating diffs from changed() does not always work properly, @@ -1430,7 +1435,7 @@ main_loop( if (exmode_active) { if (noexmode) /* End of ":global/path/visual" commands */ - return; + goto theend; do_exmode(exmode_active == EXMODE_VIM); } else @@ -1457,6 +1462,9 @@ main_loop( } } } + +theend: + current_oap = prev_oap; } |