mirror of
https://github.com/neovim/neovim.git
synced 2025-09-19 17:58:18 +00:00
normal: Extract some functions from normal_finish_command
- `normal_need_redraw_mode_message` - `normal_redraw_mode_message`
This commit is contained in:
@@ -572,6 +572,76 @@ static bool normal_need_aditional_char(NormalState *s)
|
|||||||
|| ((cmdchar == 'a' || cmdchar == 'i') && (pending_op || VIsual_active)));
|
|| ((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
|
// TODO(tarruda): Split into a "normal pending" state that can handle K_EVENT
|
||||||
static void normal_get_additional_char(NormalState *s)
|
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.
|
// Don't wait when emsg_silent is non-zero.
|
||||||
// Also wait a bit after an error message, e.g. for "^O:".
|
// Also wait a bit after an error message, e.g. for "^O:".
|
||||||
// Don't redraw the screen, it would remove the message.
|
// Don't redraw the screen, it would remove the message.
|
||||||
if (((p_smd && msg_silent == 0 && (restart_edit != 0 || (VIsual_active
|
if (normal_need_redraw_mode_message(s)) {
|
||||||
&& s->old_pos.lnum == curwin->w_cursor.lnum
|
normal_redraw_mode_message(s);
|
||||||
&& 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finish up after executing a Normal mode command.
|
// Finish up after executing a Normal mode command.
|
||||||
|
Reference in New Issue
Block a user