Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/rime/gear/navigator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ Navigator::Navigator(const Ticket& ticket)
Config* config = engine_->schema()->config();
LoadConfig(config, "navigator", Horizontal);
LoadConfig(config, "navigator/vertical", Vertical);
config->GetBool("navigator/stop_before_delimiter", &stop_before_delimiter_);
if (stop_before_delimiter_) {
config->GetString("speller/delimiter", &delimiters_);
}

select_connection_ = engine_->context()->select_notifier().connect(
[this](Context* ctx) { OnSelect(ctx); });
Expand Down Expand Up @@ -212,6 +216,9 @@ bool Navigator::JumpLeft(Context* ctx, size_t start_pos, bool loop) {
: (std::max)(start_pos, spans_.PreviousStop(end_of_input))
// 跳至前一個切分點
: (std::max)(start_pos, spans_.PreviousStop(caret_pos));
if (stop_before_delimiter_ && IsAfterDelimiter(new_pos) &&
caret_pos != new_pos - 1)
new_pos--;
Comment thread
ksqsf marked this conversation as resolved.
Outdated
if (new_pos != caret_pos) {
ctx->set_caret_pos(new_pos);
return true;
Expand All @@ -231,6 +238,9 @@ bool Navigator::JumpRight(Context* ctx, size_t start_pos, bool loop) {
: (caret_pos >= end_of_translation) ? end_of_input
// 跳至後一個切分點
: spans_.NextStop(caret_pos);
if (stop_before_delimiter_ && IsAfterDelimiter(new_pos) &&
caret_pos != new_pos - 1)
new_pos--;
Comment thread
ksqsf marked this conversation as resolved.
Outdated
if (new_pos != caret_pos) {
ctx->set_caret_pos(new_pos);
return true;
Expand Down Expand Up @@ -290,4 +300,16 @@ bool Navigator::GoToEnd(Context* ctx) {
return false;
}

bool Navigator::IsAfterDelimiter(size_t pos) {
Comment thread
ksqsf marked this conversation as resolved.
Outdated
if (pos == 0)
return false;
return delimiters_.find(input_[pos - 1]) != string::npos;
}

bool Navigator::IsBeforeDelimiter(size_t pos) {
Comment thread
ksqsf marked this conversation as resolved.
Outdated
if (pos >= input_.length() - 1)
return false;
return delimiters_.find(input_[pos]) != string::npos;
}

} // namespace rime
6 changes: 6 additions & 0 deletions src/rime/gear/navigator.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ class Navigator : public Processor, public KeyBindingProcessor<Navigator, 2> {
Spans spans_;

connection select_connection_;

private:
string delimiters_;
bool stop_before_delimiter_ = false;
bool IsBeforeDelimiter(size_t pos);
bool IsAfterDelimiter(size_t pos);
};

} // namespace rime
Expand Down
Loading