diff --git a/strans.c b/strans.c index 6135023..94b6f9f 100644 --- a/strans.c +++ b/strans.c @@ -848,6 +848,8 @@ searchkey(u32int ks, u32int mod, Str *com) if(ks == Kback){ if(search.raw.n != 0) spopr(&search.raw); + else if(search.back.n != 0) + sclear(&search.back); /* the reach undone, in its turn */ else if(search.seed.n != 0) spopr(&search.seed); else{ diff --git a/tests/engine_test.c b/tests/engine_test.c index c9468dd..3691c7f 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -2005,6 +2005,21 @@ engine_hanja_reaches_back(struct ct *t) CT_EQ_INT(t, 0, takeback); } + /* Backspace gives the reach back before it eats what was typed. */ + surround = mkstr("민"); + im.pre = mkstr("국"); + sclear(&com); + CT_CHECK(t, keystroke('h', Mctrl, &com)); + checkstr(t, "the reach joined the reading", "민국", &search.text); + CT_CHECK(t, keystroke(Kback, 0, &com)); + checkstr(t, "the client's syllable goes back first", "국", + &search.text); + CT_EQ_INT(t, 0, search.back.n); + sclear(&com); + CT_CHECK(t, keystroke(Kret, 0, &com)); + checkstr(t, "only what was typed is committed", "국", &com); + CT_EQ_INT(t, 0, takeback); + /* Nothing pending is no reading, and reaches into nothing. */ surround = mkstr("민"); sclear(&im.pre);