feat: ranged candidate replace
Adds candidate attribute `replace_start`, which allows a candidate to replace a middle part of the original text.
This commit is contained in:
parent
a82e6ba002
commit
4e346fc097
|
@ -39,6 +39,7 @@ type is defined as:
|
||||||
struct arif_cand {
|
struct arif_cand {
|
||||||
char const *text;
|
char const *text;
|
||||||
int len;
|
int len;
|
||||||
|
int replace_start;
|
||||||
int replace_len;
|
int replace_len;
|
||||||
char const *transform;
|
char const *transform;
|
||||||
int transform_len;
|
int transform_len;
|
||||||
|
@ -57,7 +58,8 @@ is its length in bytes.
|
||||||
Member
|
Member
|
||||||
.I replace_len
|
.I replace_len
|
||||||
is the number of leading bytes of the original text that are meant to
|
is the number of leading bytes of the original text that are meant to
|
||||||
be replaced by the candidate.
|
be replaced by the candidate, starting from byte offset
|
||||||
|
.IR replace_start .
|
||||||
.PP
|
.PP
|
||||||
Should the original text passed to
|
Should the original text passed to
|
||||||
.BR arif_query ()
|
.BR arif_query ()
|
||||||
|
|
|
@ -227,13 +227,14 @@ copy_candidate (
|
||||||
char const *text = menu->candidates[candidate_idx].text;
|
char const *text = menu->candidates[candidate_idx].text;
|
||||||
int text_len = strlen(text);
|
int text_len = strlen(text);
|
||||||
char const *line = composition->preedit;
|
char const *line = composition->preedit;
|
||||||
int line_len = strlen(line);
|
int line_len = composition->length;
|
||||||
|
|
||||||
char *buf = malloc(text_len + line_len);
|
char *buf = malloc(text_len + line_len);
|
||||||
assert(buf != NULL);
|
assert(buf != NULL);
|
||||||
|
|
||||||
dest->text = memcpy(buf, text, text_len);
|
dest->text = memcpy(buf, text, text_len);
|
||||||
dest->len = text_len;
|
dest->len = text_len;
|
||||||
|
dest->replace_start = composition->sel_start;
|
||||||
dest->replace_len = composition->sel_end - composition->sel_start;
|
dest->replace_len = composition->sel_end - composition->sel_start;
|
||||||
dest->transform = memcpy(buf + text_len, line, line_len);
|
dest->transform = memcpy(buf + text_len, line, line_len);
|
||||||
dest->transform_len = line_len;
|
dest->transform_len = line_len;
|
||||||
|
|
|
@ -64,6 +64,7 @@ typedef int (arif_engine_query_func) (
|
||||||
struct arif_cand {
|
struct arif_cand {
|
||||||
char const *text;
|
char const *text;
|
||||||
int len;
|
int len;
|
||||||
|
int replace_start;
|
||||||
int replace_len;
|
int replace_len;
|
||||||
char const *transform;
|
char const *transform;
|
||||||
int transform_len;
|
int transform_len;
|
||||||
|
|
|
@ -131,6 +131,7 @@ copy_candidate (
|
||||||
*dest = (struct arif_cand) {
|
*dest = (struct arif_cand) {
|
||||||
.text = src->text,
|
.text = src->text,
|
||||||
.len = src->len,
|
.len = src->len,
|
||||||
|
.replace_start = src->replace_start,
|
||||||
.replace_len = src->replace_len,
|
.replace_len = src->replace_len,
|
||||||
.transform = src->transform,
|
.transform = src->transform,
|
||||||
.transform_len = src->transform_len,
|
.transform_len = src->transform_len,
|
||||||
|
|
|
@ -87,12 +87,19 @@ arif_rl_complete(
|
||||||
char *match = malloc(sizeof(char) * (len + 1));
|
char *match = malloc(sizeof(char) * (len + 1));
|
||||||
assert(match != NULL);
|
assert(match != NULL);
|
||||||
|
|
||||||
memcpy(match, text, skip);
|
|
||||||
memcpy(match + skip, cand->text, cand->len);
|
|
||||||
memcpy(match + skip + cand->len, line + cand->replace_len,
|
|
||||||
len - cand->len - skip);
|
|
||||||
match[len] = '\0';
|
match[len] = '\0';
|
||||||
comp_list[idx] = match;
|
comp_list[idx] = memcpy(match, text, skip);
|
||||||
|
|
||||||
|
int offset = skip;
|
||||||
|
memcpy(match + offset, line, cand->replace_start);
|
||||||
|
|
||||||
|
offset += cand->replace_start;
|
||||||
|
memcpy(match + offset, cand->text, cand->len);
|
||||||
|
|
||||||
|
offset += cand->len;
|
||||||
|
memcpy(match + offset,
|
||||||
|
line + cand->replace_start + cand->replace_len,
|
||||||
|
len - offset);
|
||||||
}
|
}
|
||||||
comp_list[num + 1] = NULL;
|
comp_list[num + 1] = NULL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue