summaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-09-16 22:56:03 +0200
committerBram Moolenaar <Bram@vim.org>2019-09-16 22:56:03 +0200
commit0e57dd859ecb1e8a3b91509d2f4343e839340eb8 (patch)
tree50e5f097f3fe10851e7af017cea6cdef35b12402 /src/main.c
parent69198cb8c08f124729c41a4681f2d142228a9139 (diff)
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.c38
1 files changed, 23 insertions, 15 deletions
diff --git a/src/main.c b/src/main.c
index 51e3915d96..42aa990343 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;
}