diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2015-10-26 21:50:31 +0100 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2015-10-27 11:13:07 +0100 |
| commit | 6a7e5a3cfc86db049f595bd20d20041d7346e4ef (patch) | |
| tree | f1b2b108738935bac9048e78ba27d55cd91a9e47 /vis.c | |
| parent | bc9909f4cd9355c197944ee320eed3971431f699 (diff) | |
| download | vis-6a7e5a3cfc86db049f595bd20d20041d7346e4ef.tar.gz vis-6a7e5a3cfc86db049f595bd20d20041d7346e4ef.tar.xz | |
vis: introduce vis_prompt_enter API
This is a really bad API/abtraction but at least it
allows us to hide some implementation details.
Diffstat (limited to 'vis.c')
| -rw-r--r-- | vis.c | 23 |
1 files changed, 19 insertions, 4 deletions
@@ -126,6 +126,7 @@ typedef struct { /* command definitions for the ':'-prompt */ enum CmdOpt opt; /* command option flags */ } Command; +static void mode_set(Vis *vis, Mode *new_mode); /** window / file handling */ static void file_free(Vis *vis, File *file) { @@ -766,7 +767,7 @@ static void vis_mode_operator_leave(Vis *vis, Mode *new) { static void vis_mode_operator_input(Vis *vis, const char *str, size_t len) { /* invalid operator */ action_reset(vis, &vis->action); - vis_mode_set(vis, vis->mode_prev); + mode_set(vis, vis->mode_prev); } static void vis_mode_visual_enter(Vis *vis, Mode *old) { @@ -1513,7 +1514,7 @@ static void action_do(Vis *vis, Action *a) { if (a->op == &ops[OP_CHANGE]) vis_mode_switch(vis, VIS_MODE_INSERT); else if (vis->mode == &vis_modes[VIS_MODE_OPERATOR]) - vis_mode_set(vis, vis->mode_prev); + mode_set(vis, vis->mode_prev); else if (vis->mode->visual) vis_mode_switch(vis, VIS_MODE_NORMAL); text_snapshot(txt); @@ -1536,7 +1537,7 @@ static void action_reset(Vis *vis, Action *a) { a->reg = NULL; } -void vis_mode_set(Vis *vis, Mode *new_mode) { +static void mode_set(Vis *vis, Mode *new_mode) { if (vis->mode == new_mode) return; if (vis->mode->leave) @@ -2851,7 +2852,7 @@ bool vis_operator(Vis *vis, enum VisOperator id) { } void vis_mode_switch(Vis *vis, enum VisMode mode) { - vis_mode_set(vis, &vis_modes[mode]); + mode_set(vis, &vis_modes[mode]); } bool vis_motion(Vis *vis, enum VisMotion motion, ...) { @@ -3075,3 +3076,17 @@ void vis_insert_nl(Vis *vis) { if (vis->autoindent) copy_indent_from_previous_line(vis->win); } + +void vis_prompt_enter(Vis *vis) { + char *s = vis_prompt_get(vis); + /* it is important to switch back to the previous mode, which hides + * the prompt and more importantly resets vis->win to the currently + * focused editor window *before* anything is executed which depends + * on vis->win. + */ + mode_set(vis, vis->mode_before_prompt); + if (s && *s && vis_prompt_cmd(vis, vis->prompt_type, s) && vis->running) + vis_mode_switch(vis, VIS_MODE_NORMAL); + free(s); + vis_draw(vis); +} |
