@@ -124,8 +124,11 @@ bool Navigator::LeftByCharNoLoop(Context* ctx) {
124124bool Navigator::Rewind (Context* ctx) {
125125 BeginMove (ctx);
126126 // take a jump leftwards when there are multiple spans,
127- // but not from the middle of a span.
128- if (spans_.Count () > 1 && spans_.HasVertex (ctx->caret_pos ())) {
127+ // but not from the middle of a span
128+ size_t caret_pos = ctx->caret_pos ();
129+ if (stop_before_delimiter_)
130+ caret_pos = SkipDelimiterForward (caret_pos);
131+ if (spans_.Count () > 1 && spans_.HasVertex (caret_pos)) {
129132 size_t confirmed_pos = ctx->composition ().GetConfirmedPosition ();
130133 JumpLeft (ctx, confirmed_pos, true );
131134 } else {
@@ -136,7 +139,10 @@ bool Navigator::Rewind(Context* ctx) {
136139
137140bool Navigator::Forward (Context* ctx) {
138141 BeginMove (ctx);
139- if (spans_.Count () > 1 && spans_.HasVertex (ctx->caret_pos ())) {
142+ size_t caret_pos = SkipDelimiterForward (ctx->caret_pos ());
143+ if (stop_before_delimiter_)
144+ caret_pos = SkipDelimiterForward (caret_pos);
145+ if (spans_.Count () > 1 && spans_.HasVertex (caret_pos)) {
140146 size_t confirmed_pos = ctx->composition ().GetConfirmedPosition ();
141147 JumpRight (ctx, confirmed_pos, true );
142148 } else {
@@ -201,6 +207,8 @@ void Navigator::BeginMove(Context* ctx) {
201207bool Navigator::JumpLeft (Context* ctx, size_t start_pos, bool loop) {
202208 DLOG (INFO) << " jump left." ;
203209 size_t caret_pos = ctx->caret_pos ();
210+ if (stop_before_delimiter_)
211+ caret_pos = SkipDelimiterForward (caret_pos);
204212 size_t end_of_translation = spans_.end ();
205213 size_t end_of_input = ctx->input ().length ();
206214 size_t new_pos =
@@ -228,6 +236,8 @@ bool Navigator::JumpLeft(Context* ctx, size_t start_pos, bool loop) {
228236bool Navigator::JumpRight (Context* ctx, size_t start_pos, bool loop) {
229237 DLOG (INFO) << " jump right." ;
230238 size_t caret_pos = ctx->caret_pos ();
239+ if (stop_before_delimiter_)
240+ caret_pos = SkipDelimiterForward (caret_pos);
231241 size_t end_of_translation = spans_.end ();
232242 size_t end_of_input = ctx->input ().length ();
233243 size_t new_pos =
@@ -304,4 +314,11 @@ size_t Navigator::SkipDelimiterBackward(size_t pos) {
304314 return pos;
305315}
306316
317+ size_t Navigator::SkipDelimiterForward (size_t pos) {
318+ while (pos < input_.length () - 1 &&
319+ delimiters_.find (input_[pos]) != string::npos)
320+ pos++;
321+ return pos;
322+ }
323+
307324} // namespace rime
0 commit comments