diff options
| -rw-r--r-- | config.def.h | 122 | ||||
| -rw-r--r-- | vis.c | 49 |
2 files changed, 42 insertions, 129 deletions
diff --git a/config.def.h b/config.def.h index 6532858..6940cae 100644 --- a/config.def.h +++ b/config.def.h @@ -12,9 +12,6 @@ */ enum { VIS_MODE_BASIC, - VIS_MODE_MARK, - VIS_MODE_MARK_LINE, - VIS_MODE_MARK_SET, VIS_MODE_MOVE, VIS_MODE_TEXTOBJ, VIS_MODE_INNER_TEXTOBJ, @@ -140,6 +137,8 @@ static KeyBinding vis_movements[] = { { "," , totill_reverse,{ NULL } }, { "/" , prompt_search,{ .s = "/" } }, { "?" , prompt_search,{ .s = "?" } }, + { "`" , mark, { NULL } }, + { "'" , mark_line, { NULL } }, { /* empty last element, array terminator */ }, }; @@ -239,100 +238,6 @@ static KeyBinding vis_operator_options[] = { { /* empty last element, array terminator */ }, }; -static KeyBinding vis_marks[] = { - { "`a'", mark, { .i = MARK_a } }, - { "`b'", mark, { .i = MARK_b } }, - { "`c'", mark, { .i = MARK_c } }, - { "`d'", mark, { .i = MARK_d } }, - { "`e'", mark, { .i = MARK_e } }, - { "`f'", mark, { .i = MARK_f } }, - { "`g'", mark, { .i = MARK_g } }, - { "`h'", mark, { .i = MARK_h } }, - { "`i'", mark, { .i = MARK_i } }, - { "`j'", mark, { .i = MARK_j } }, - { "`k'", mark, { .i = MARK_k } }, - { "`l'", mark, { .i = MARK_l } }, - { "`m'", mark, { .i = MARK_m } }, - { "`n'", mark, { .i = MARK_n } }, - { "`o'", mark, { .i = MARK_o } }, - { "`p'", mark, { .i = MARK_p } }, - { "`q'", mark, { .i = MARK_q } }, - { "`r'", mark, { .i = MARK_r } }, - { "`s'", mark, { .i = MARK_s } }, - { "`t'", mark, { .i = MARK_t } }, - { "`u'", mark, { .i = MARK_u } }, - { "`v'", mark, { .i = MARK_v } }, - { "`w'", mark, { .i = MARK_w } }, - { "`x'", mark, { .i = MARK_x } }, - { "`y'", mark, { .i = MARK_y } }, - { "`z'", mark, { .i = MARK_z } }, - { "`<'", mark, { .i = MARK_SELECTION_START } }, - { "`>'", mark, { .i = MARK_SELECTION_END } }, - { /* empty last element, array terminator */ }, -}; - -static KeyBinding vis_marks_line[] = { - { "'a", mark_line, { .i = MARK_a } }, - { "'b", mark_line, { .i = MARK_b } }, - { "'c", mark_line, { .i = MARK_c } }, - { "'d", mark_line, { .i = MARK_d } }, - { "'e", mark_line, { .i = MARK_e } }, - { "'f", mark_line, { .i = MARK_f } }, - { "'g", mark_line, { .i = MARK_g } }, - { "'h", mark_line, { .i = MARK_h } }, - { "'i", mark_line, { .i = MARK_i } }, - { "'j", mark_line, { .i = MARK_j } }, - { "'k", mark_line, { .i = MARK_k } }, - { "'l", mark_line, { .i = MARK_l } }, - { "'m", mark_line, { .i = MARK_m } }, - { "'n", mark_line, { .i = MARK_n } }, - { "'o", mark_line, { .i = MARK_o } }, - { "'p", mark_line, { .i = MARK_p } }, - { "'q", mark_line, { .i = MARK_q } }, - { "'r", mark_line, { .i = MARK_r } }, - { "'s", mark_line, { .i = MARK_s } }, - { "'t", mark_line, { .i = MARK_t } }, - { "'u", mark_line, { .i = MARK_u } }, - { "'v", mark_line, { .i = MARK_v } }, - { "'w", mark_line, { .i = MARK_w } }, - { "'x", mark_line, { .i = MARK_x } }, - { "'y", mark_line, { .i = MARK_y } }, - { "'z", mark_line, { .i = MARK_z } }, - { "'<", mark_line, { .i = MARK_SELECTION_START } }, - { "'>", mark_line, { .i = MARK_SELECTION_END } }, - { /* empty last element, array terminator */ }, -}; - -static KeyBinding vis_marks_set[] = { - { "ma", mark_set, { .i = MARK_a } }, - { "mb", mark_set, { .i = MARK_b } }, - { "mc", mark_set, { .i = MARK_c } }, - { "md", mark_set, { .i = MARK_d } }, - { "me", mark_set, { .i = MARK_e } }, - { "mf", mark_set, { .i = MARK_f } }, - { "mg", mark_set, { .i = MARK_g } }, - { "mh", mark_set, { .i = MARK_h } }, - { "mi", mark_set, { .i = MARK_i } }, - { "mj", mark_set, { .i = MARK_j } }, - { "mk", mark_set, { .i = MARK_k } }, - { "ml", mark_set, { .i = MARK_l } }, - { "mm", mark_set, { .i = MARK_m } }, - { "mn", mark_set, { .i = MARK_n } }, - { "mo", mark_set, { .i = MARK_o } }, - { "mp", mark_set, { .i = MARK_p } }, - { "mq", mark_set, { .i = MARK_q } }, - { "mr", mark_set, { .i = MARK_r } }, - { "ms", mark_set, { .i = MARK_s } }, - { "mt", mark_set, { .i = MARK_t } }, - { "mu", mark_set, { .i = MARK_u } }, - { "mv", mark_set, { .i = MARK_v } }, - { "mw", mark_set, { .i = MARK_w } }, - { "mx", mark_set, { .i = MARK_x } }, - { "my", mark_set, { .i = MARK_y } }, - { "mz", mark_set, { .i = MARK_z } }, - { /* empty last element, array terminator */ }, -}; - static KeyBinding vis_mode_normal[] = { { "<Escape>", cursors_clear, { } }, { "<C-k>", cursors_new, { .i = -1 } }, @@ -397,6 +302,7 @@ static KeyBinding vis_mode_normal[] = { { "q", macro_record, { NULL } }, { "@", macro_replay, { NULL } }, { "gv", selection_restore, { NULL } }, + { "m", mark_set, { NULL } }, { /* empty last element, array terminator */ }, }; @@ -613,21 +519,9 @@ static Mode vis_modes[] = { .parent = NULL, .default_bindings = basic_movement, }, - [VIS_MODE_MARK] = { - .name = "MARK", - .common_prefix = true, - .parent = &vis_modes[VIS_MODE_BASIC], - .default_bindings = vis_marks, - }, - [VIS_MODE_MARK_LINE] = { - .name = "MARK-LINE", - .common_prefix = true, - .parent = &vis_modes[VIS_MODE_MARK], - .default_bindings = vis_marks_line, - }, [VIS_MODE_MOVE] = { .name = "MOVE", - .parent = &vis_modes[VIS_MODE_MARK_LINE], + .parent = &vis_modes[VIS_MODE_BASIC], .default_bindings = vis_movements, }, [VIS_MODE_INNER_TEXTOBJ] = { @@ -655,16 +549,10 @@ static Mode vis_modes[] = { .leave = vis_mode_operator_leave, .input = vis_mode_operator_input, }, - [VIS_MODE_MARK_SET] = { - .name = "MARK-SET", - .common_prefix = true, - .parent = &vis_modes[VIS_MODE_OPERATOR], - .default_bindings = vis_marks_set, - }, [VIS_MODE_NORMAL] = { .name = "NORMAL", .isuser = true, - .parent = &vis_modes[VIS_MODE_MARK_SET], + .parent = &vis_modes[VIS_MODE_OPERATOR], .default_bindings = vis_mode_normal, }, [VIS_MODE_VISUAL] = { @@ -725,12 +725,6 @@ static size_t search_backward(Text *txt, size_t pos) { return text_search_backward(txt, pos, vis->search_pattern); } -static const char *mark_set(const char *keys, const Arg *arg) { - size_t pos = view_cursor_get(vis->win->view); - vis->win->file->marks[arg->i] = text_mark_set(vis->win->file->text, pos); - return keys; -} - static size_t mark_goto(File *txt, size_t pos) { return text_mark_get(txt->text, txt->marks[vis->action.mark]); } @@ -1123,17 +1117,48 @@ static const char *reg(const char *keys, const Arg *arg) { return key2register(keys, &vis->action.reg); } +static const char *key2mark(const char *keys, int *mark) { + *mark = -1; + if (!keys[0]) + return NULL; + if (keys[0] >= 'a' && keys[0] <= 'z') + *mark = keys[0] - 'a'; + else if (keys[0] == '<') + *mark = MARK_SELECTION_START; + else if (keys[0] == '>') + *mark = MARK_SELECTION_END; + return keys+1; +} + +static const char *mark_set(const char *keys, const Arg *arg) { + int mark; + keys = key2mark(keys, &mark); + if (mark != -1) { + size_t pos = view_cursor_get(vis->win->view); + vis->win->file->marks[mark] = text_mark_set(vis->win->file->text, pos); + } + return keys; +} + static const char *mark(const char *keys, const Arg *arg) { - vis->action.mark = arg->i; - vis->action.movement = &moves[MOVE_MARK]; - action_do(&vis->action); + int mark; + keys = key2mark(keys, &mark); + if (mark != -1) { + vis->action.mark = mark; + vis->action.movement = &moves[MOVE_MARK]; + action_do(&vis->action); + } return keys; } static const char *mark_line(const char *keys, const Arg *arg) { - vis->action.mark = arg->i; - vis->action.movement = &moves[MOVE_MARK_LINE]; - action_do(&vis->action); + int mark; + keys = key2mark(keys, &mark); + if (mark != -1) { + vis->action.mark = mark; + vis->action.movement = &moves[MOVE_MARK_LINE]; + action_do(&vis->action); + } return keys; } |
