aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.def.h6
-rw-r--r--main.c12
-rw-r--r--text-motions.c12
-rw-r--r--text-motions.h3
-rw-r--r--vis-motions.c8
-rw-r--r--vis.h2
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,