diff --git a/src/util/tagged_string.cpp b/src/util/tagged_string.cpp
index 7e925435..b0688098 100644
--- a/src/util/tagged_string.cpp
+++ b/src/util/tagged_string.cpp
@@ -232,7 +232,25 @@ void cursor_to_index_range(const String& str, size_t cursor, size_t& start, size
size_t cursor_to_index(const String& str, size_t cursor, Movement dir) {
size_t start, end;
cursor_to_index_range(str, cursor, start, end);
- // TODO: If at i there is return a position inside the tags
+ if (dir == MOVE_MID) {
+ // find the middle between start and end
+ // if the string in between contains a pair "" or "" returns the middle
+ // otherwise returns start
+ for (size_t i = start ; i < end ; ) {
+ if (str.GetChar(i) == _('<')) {
+ String tag1 = tag_at(str, i);
+ i = skip_tag(str, i);
+ if (str.GetChar(i) == _('<')) {
+ String tag2 = tag_at(str, i);
+ if (_("<") + tag2 + _(">") == anti_tag(tag1)) {
+ return i;
+ }
+ }
+ } else {
+ i++;
+ }
+ }
+ }
// This allows formating to be enabled without a selection
return dir == MOVE_RIGHT ? end - 1 : start;
}