diff options
-rw-r--r-- | src/nvim/normal.c | 118 |
1 files changed, 72 insertions, 46 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c index de884acdcb..de575c0234 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -572,6 +572,76 @@ static bool normal_need_aditional_char(NormalState *s) || ((cmdchar == 'a' || cmdchar == 'i') && (pending_op || VIsual_active))); } +static bool normal_need_redraw_mode_message(NormalState *s) +{ + return ( + ( + // 'showmode' is set and messages can be printed + p_smd && msg_silent == 0 + // must restart insert mode(ctrl+o or ctrl+l) or we just entered visual + // mode + && (restart_edit != 0 || (VIsual_active + && s->old_pos.lnum == curwin->w_cursor.lnum + && s->old_pos.col == curwin->w_cursor.col)) + // command-line must be cleared or redrawn + && (clear_cmdline || redraw_cmdline) + // some message was printed or scrolled + && (msg_didout || (msg_didany && msg_scroll)) + // it is fine to remove the current message + && !msg_nowait + // the command was the result of direct user input and not a mapping + && KeyTyped + ) + || + // must restart insert mode, not in visual mode and error message is + // being shown + (restart_edit != 0 && !VIsual_active && (msg_scroll && emsg_on_display)) + ) + // no register was used + && s->oa.regname == 0 + && !(s->ca.retval & CA_COMMAND_BUSY) + && stuff_empty() + && typebuf_typed() + && emsg_silent == 0 + && !did_wait_return + && s->oa.op_type == OP_NOP; +} + +static void normal_redraw_mode_message(NormalState *s) +{ + int save_State = State; + + // Draw the cursor with the right shape here + if (restart_edit != 0) { + State = INSERT; + } + + // If need to redraw, and there is a "keep_msg", redraw before the + // delay + if (must_redraw && keep_msg != NULL && !emsg_on_display) { + char_u *kmsg; + + kmsg = keep_msg; + keep_msg = NULL; + // showmode() will clear keep_msg, but we want to use it anyway + update_screen(0); + // now reset it, otherwise it's put in the history again + keep_msg = kmsg; + msg_attr(kmsg, keep_msg_attr); + xfree(kmsg); + } + setcursor(); + ui_flush(); + if (msg_scroll || emsg_on_display) { + os_delay(1000L, true); // wait at least one second + } + os_delay(3000L, false); // wait up to three seconds + State = save_State; + + msg_scroll = false; + emsg_on_display = false; +} + // TODO(tarruda): Split into a "normal pending" state that can handle K_EVENT static void normal_get_additional_char(NormalState *s) { @@ -838,52 +908,8 @@ static void normal_finish_command(NormalState *s) // Don't wait when emsg_silent is non-zero. // Also wait a bit after an error message, e.g. for "^O:". // Don't redraw the screen, it would remove the message. - if (((p_smd && msg_silent == 0 && (restart_edit != 0 || (VIsual_active - && s->old_pos.lnum == curwin->w_cursor.lnum - && s->old_pos.col == curwin->w_cursor.col)) - && (clear_cmdline || redraw_cmdline) - && (msg_didout || (msg_didany && msg_scroll)) - && !msg_nowait - && KeyTyped) || (restart_edit != 0 && !VIsual_active && (msg_scroll - || emsg_on_display))) - && s->oa.regname == 0 - && !(s->ca.retval & CA_COMMAND_BUSY) - && stuff_empty() - && typebuf_typed() - && emsg_silent == 0 - && !did_wait_return - && s->oa.op_type == OP_NOP) { - int save_State = State; - - // Draw the cursor with the right shape here - if (restart_edit != 0) { - State = INSERT; - } - - // If need to redraw, and there is a "keep_msg", redraw before the - // delay - if (must_redraw && keep_msg != NULL && !emsg_on_display) { - char_u *kmsg; - - kmsg = keep_msg; - keep_msg = NULL; - // showmode() will clear keep_msg, but we want to use it anyway - update_screen(0); - // now reset it, otherwise it's put in the history again - keep_msg = kmsg; - msg_attr(kmsg, keep_msg_attr); - xfree(kmsg); - } - setcursor(); - ui_flush(); - if (msg_scroll || emsg_on_display) { - os_delay(1000L, true); // wait at least one second - } - os_delay(3000L, false); // wait up to three seconds - State = save_State; - - msg_scroll = false; - emsg_on_display = false; + if (normal_need_redraw_mode_message(s)) { + normal_redraw_mode_message(s); } // Finish up after executing a Normal mode command. |