vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit 93f4d4701d34b370ec1a7e20a751013ac1bfe17e parent d156e39a7e770ec8ef951c3042dd40b1db9c79bb Author: Marc André Tanner <mat@brain-dump.org> Date: Fri, 23 Oct 2015 21:02:13 +0200 vis: introduce vis_textobject API Diffstat:
| M | vis.c | | | 40 | ++++++++-------------------------------- |
| M | vis.h | | | 31 | +++++++++++++++++++++++++++++++ |
2 files changed, 39 insertions(+), 32 deletions(-)
diff --git a/vis.c b/vis.c @@ -166,36 +166,6 @@ static Movement moves[] = { [MOVE_WINDOW_LINE_BOTTOM] = { .view = view_lines_bottom, .type = LINEWISE|JUMP|IDEMPOTENT }, }; -/* these can be passed as int argument to textobj(&(const Arg){ .i = TEXT_OBJ_* }) */ -enum { - TEXT_OBJ_INNER_WORD, - TEXT_OBJ_OUTER_WORD, - TEXT_OBJ_INNER_LONGWORD, - TEXT_OBJ_OUTER_LONGWORD, - TEXT_OBJ_SENTENCE, - TEXT_OBJ_PARAGRAPH, - TEXT_OBJ_OUTER_SQUARE_BRACKET, - TEXT_OBJ_INNER_SQUARE_BRACKET, - TEXT_OBJ_OUTER_CURLY_BRACKET, - TEXT_OBJ_INNER_CURLY_BRACKET, - TEXT_OBJ_OUTER_ANGLE_BRACKET, - TEXT_OBJ_INNER_ANGLE_BRACKET, - TEXT_OBJ_OUTER_PARANTHESE, - TEXT_OBJ_INNER_PARANTHESE, - TEXT_OBJ_OUTER_QUOTE, - TEXT_OBJ_INNER_QUOTE, - TEXT_OBJ_OUTER_SINGLE_QUOTE, - TEXT_OBJ_INNER_SINGLE_QUOTE, - TEXT_OBJ_OUTER_BACKTICK, - TEXT_OBJ_INNER_BACKTICK, - TEXT_OBJ_OUTER_ENTIRE, - TEXT_OBJ_INNER_ENTIRE, - TEXT_OBJ_OUTER_FUNCTION, - TEXT_OBJ_INNER_FUNCTION, - TEXT_OBJ_OUTER_LINE, - TEXT_OBJ_INNER_LINE, -}; - static TextObject textobjs[] = { [TEXT_OBJ_INNER_WORD] = { text_object_word }, [TEXT_OBJ_OUTER_WORD] = { text_object_word_outer }, @@ -947,8 +917,7 @@ static const char *movement(Vis *vis, const char *keys, const Arg *arg) { } static const char *textobj(Vis *vis, const char *keys, const Arg *arg) { - vis->action.textobj = &textobjs[arg->i]; - action_do(vis, &vis->action); + vis_textobject(vis, arg->i); return keys; } @@ -2824,3 +2793,10 @@ out: va_end(ap); } + +void vis_textobject(Vis *vis, enum VisTextObject textobj) { + if (textobj < LENGTH(textobjs)) { + vis->action.textobj = &textobjs[textobj]; + action_do(vis, &vis->action); + } +} diff --git a/vis.h b/vis.h @@ -106,6 +106,37 @@ enum VisMotion { void vis_motion(Vis*, enum VisMotion, ...); +enum VisTextObject { + TEXT_OBJ_INNER_WORD, + TEXT_OBJ_OUTER_WORD, + TEXT_OBJ_INNER_LONGWORD, + TEXT_OBJ_OUTER_LONGWORD, + TEXT_OBJ_SENTENCE, + TEXT_OBJ_PARAGRAPH, + TEXT_OBJ_OUTER_SQUARE_BRACKET, + TEXT_OBJ_INNER_SQUARE_BRACKET, + TEXT_OBJ_OUTER_CURLY_BRACKET, + TEXT_OBJ_INNER_CURLY_BRACKET, + TEXT_OBJ_OUTER_ANGLE_BRACKET, + TEXT_OBJ_INNER_ANGLE_BRACKET, + TEXT_OBJ_OUTER_PARANTHESE, + TEXT_OBJ_INNER_PARANTHESE, + TEXT_OBJ_OUTER_QUOTE, + TEXT_OBJ_INNER_QUOTE, + TEXT_OBJ_OUTER_SINGLE_QUOTE, + TEXT_OBJ_INNER_SINGLE_QUOTE, + TEXT_OBJ_OUTER_BACKTICK, + TEXT_OBJ_INNER_BACKTICK, + TEXT_OBJ_OUTER_ENTIRE, + TEXT_OBJ_INNER_ENTIRE, + TEXT_OBJ_OUTER_FUNCTION, + TEXT_OBJ_INNER_FUNCTION, + TEXT_OBJ_OUTER_LINE, + TEXT_OBJ_INNER_LINE, +}; + +void vis_textobject(Vis*, enum VisTextObject); + bool vis_signal_handler(Vis*, int signum, const siginfo_t *siginfo, const void *context);