@@ -216,9 +216,8 @@ bool Navigator::JumpLeft(Context* ctx, size_t start_pos, bool loop) {
216216 : (std::max)(start_pos, spans_.PreviousStop (end_of_input))
217217 // 跳至前一個切分點
218218 : (std::max)(start_pos, spans_.PreviousStop (caret_pos));
219- if (stop_before_delimiter_ && IsAfterDelimiter (new_pos) &&
220- caret_pos != new_pos - 1 )
221- new_pos--;
219+ if (stop_before_delimiter_)
220+ new_pos = SkipDelimiterBackward (new_pos);
222221 if (new_pos != caret_pos) {
223222 ctx->set_caret_pos (new_pos);
224223 return true ;
@@ -238,9 +237,8 @@ bool Navigator::JumpRight(Context* ctx, size_t start_pos, bool loop) {
238237 : (caret_pos >= end_of_translation) ? end_of_input
239238 // 跳至後一個切分點
240239 : spans_.NextStop (caret_pos);
241- if (stop_before_delimiter_ && IsAfterDelimiter (new_pos) &&
242- caret_pos != new_pos - 1 )
243- new_pos--;
240+ if (stop_before_delimiter_)
241+ new_pos = SkipDelimiterBackward (new_pos);
244242 if (new_pos != caret_pos) {
245243 ctx->set_caret_pos (new_pos);
246244 return true ;
@@ -300,16 +298,10 @@ bool Navigator::GoToEnd(Context* ctx) {
300298 return false ;
301299}
302300
303- bool Navigator::IsAfterDelimiter (size_t pos) {
304- if (pos == 0 )
305- return false ;
306- return delimiters_.find (input_[pos - 1 ]) != string::npos;
307- }
308-
309- bool Navigator::IsBeforeDelimiter (size_t pos) {
310- if (pos >= input_.length () - 1 )
311- return false ;
312- return delimiters_.find (input_[pos]) != string::npos;
301+ size_t Navigator::SkipDelimiterBackward (size_t pos) {
302+ while (pos > 0 && delimiters_.find (input_[pos - 1 ]) != string::npos)
303+ pos--;
304+ return pos;
313305}
314306
315307} // namespace rime
0 commit comments