From ca0b1fe1a590aa640fb20fcdfde3aeed3a0eac03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 4 Apr 2017 09:22:26 +0200 Subject: vis: add motions to move by codepoints Some people might prefer this for behavior. Except for that and debugging purposes using `ga` and `g8` it is not yet that useful. --- config.def.h | 6 ++++-- main.c | 12 ++++++++++++ text-motions.c | 12 ++++++++++++ text-motions.h | 3 +++ vis-motions.c | 8 ++++++++ vis.h | 2 ++ 6 files changed, 41 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index 1fba42a..ffc9577 100644 --- a/config.def.h +++ b/config.def.h @@ -62,8 +62,10 @@ static const KeyBinding bindings_motions[] = { { "F", ACTION(TO_LEFT) }, { "f", ACTION(TO_RIGHT) }, { "go", ACTION(CURSOR_BYTE) }, - { "gh", ACTION(CURSOR_BYTE_LEFT) }, - { "gl", ACTION(CURSOR_BYTE_RIGHT) }, + { "gH", ACTION(CURSOR_BYTE_LEFT) }, + { "gL", ACTION(CURSOR_BYTE_RIGHT) }, + { "gh", ACTION(CURSOR_CODEPOINT_PREV) }, + { "gl", ACTION(CURSOR_CODEPOINT_NEXT) }, { "g0", ACTION(CURSOR_SCREEN_LINE_BEGIN) }, { "g_", ACTION(CURSOR_LINE_FINISH) }, { "G", ACTION(CURSOR_LINE_LAST) }, diff --git a/main.c b/main.c index b5a9d9e..031c796 100644 --- a/main.c +++ b/main.c @@ -134,6 +134,8 @@ enum { VIS_ACTION_CURSOR_CHAR_NEXT, VIS_ACTION_CURSOR_LINE_CHAR_PREV, VIS_ACTION_CURSOR_LINE_CHAR_NEXT, + VIS_ACTION_CURSOR_CODEPOINT_PREV, + VIS_ACTION_CURSOR_CODEPOINT_NEXT, VIS_ACTION_CURSOR_WORD_START_PREV, VIS_ACTION_CURSOR_WORD_START_NEXT, VIS_ACTION_CURSOR_WORD_END_PREV, @@ -332,6 +334,16 @@ static const KeyAction vis_action[] = { VIS_HELP("Move cursor right, to the next character on the same line") movement, { .i = VIS_MOVE_LINE_CHAR_NEXT } }, + [VIS_ACTION_CURSOR_CODEPOINT_PREV] = { + "vis-motion-codepoint-prev", + VIS_HELP("Move to the previous Unicode codepoint") + movement, { .i = VIS_MOVE_CODEPOINT_PREV } + }, + [VIS_ACTION_CURSOR_CODEPOINT_NEXT] = { + "vis-motion-codepoint-next", + VIS_HELP("Move to the next Unicode codepoint") + movement, { .i = VIS_MOVE_CODEPOINT_NEXT } + }, [VIS_ACTION_CURSOR_WORD_START_PREV] = { "vis-motion-word-start-prev", VIS_HELP("Move cursor words backwards") diff --git a/text-motions.c b/text-motions.c index ee8220e..210e1f4 100644 --- a/text-motions.c +++ b/text-motions.c @@ -39,6 +39,18 @@ size_t text_char_prev(Text *txt, size_t pos) { return it.pos; } +size_t text_codepoint_next(Text *txt, size_t pos) { + Iterator it = text_iterator_get(txt, pos); + text_iterator_codepoint_next(&it, NULL); + return it.pos; +} + +size_t text_codepoint_prev(Text *txt, size_t pos) { + Iterator it = text_iterator_get(txt, pos); + text_iterator_codepoint_prev(&it, NULL); + return it.pos; +} + static size_t find_next(Text *txt, size_t pos, const char *s, bool line) { if (!s) return pos; diff --git a/text-motions.h b/text-motions.h index cca84c1..5df4e32 100644 --- a/text-motions.h +++ b/text-motions.h @@ -16,6 +16,9 @@ size_t text_end(Text*, size_t pos); size_t text_char_next(Text*, size_t pos); size_t text_char_prev(Text*, size_t pos); +size_t text_codepoint_next(Text*, size_t pos); +size_t text_codepoint_prev(Text*, size_t pos); + /* find the given substring either in forward or backward direction. * does not wrap around at file start / end. if no match is found return * original position */ diff --git a/vis-motions.c b/vis-motions.c index 1ceb958..0166117 100644 --- a/vis-motions.c +++ b/vis-motions.c @@ -491,6 +491,14 @@ const Movement vis_motions[] = { .txt = text_line_char_next, .type = CHARWISE, }, + [VIS_MOVE_CODEPOINT_PREV] = { + .txt = text_codepoint_prev, + .type = CHARWISE, + }, + [VIS_MOVE_CODEPOINT_NEXT] = { + .txt = text_codepoint_next, + .type = CHARWISE, + }, [VIS_MOVE_WORD_NEXT] = { .vis = word_next, .type = CHARWISE|IDEMPOTENT, diff --git a/vis.h b/vis.h index 8f74a36..9b9fbb9 100644 --- a/vis.h +++ b/vis.h @@ -269,6 +269,8 @@ enum VisMotion { VIS_MOVE_CHAR_NEXT, VIS_MOVE_LINE_CHAR_PREV, VIS_MOVE_LINE_CHAR_NEXT, + VIS_MOVE_CODEPOINT_PREV, + VIS_MOVE_CODEPOINT_NEXT, VIS_MOVE_WORD_NEXT, VIS_MOVE_WORD_START_NEXT, VIS_MOVE_WORD_END_PREV, -- cgit v1.2.3