updated for version 7.0153
diff --git a/src/spell.c b/src/spell.c
index be5dc95..d65be90 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -10035,19 +10035,38 @@
sp->ts_state = STATE_FINAL;
break;
}
+
+ /* Don't swap if the first character is not a word character.
+ * SWAP3 etc. also don't make sense then. */
+ if (!spell_iswordp(p, curbuf))
+ {
+ sp->ts_state = STATE_REP_INI;
+ break;
+ }
+
#ifdef FEAT_MBYTE
if (has_mbyte)
{
n = mb_cptr2len(p);
c = mb_ptr2char(p);
- c2 = mb_ptr2char(p + n);
+ if (!spell_iswordp(p + n, curbuf))
+ c2 = c; /* don't swap non-word char */
+ else
+ c2 = mb_ptr2char(p + n);
}
else
#endif
- c2 = p[1];
+ {
+ if (!spell_iswordp(p + 1, curbuf))
+ c2 = c; /* don't swap non-word char */
+ else
+ c2 = p[1];
+ }
+
+ /* When characters are identical, swap won't do anything.
+ * Also get here if the second char is not a word character. */
if (c == c2)
{
- /* Characters are identical, swap won't do anything. */
sp->ts_state = STATE_SWAP3;
break;
}
@@ -10107,20 +10126,28 @@
c = mb_ptr2char(p);
fl = mb_cptr2len(p + n);
c2 = mb_ptr2char(p + n);
- c3 = mb_ptr2char(p + n + fl);
+ if (!spell_iswordp(p + n + fl, curbuf))
+ c3 = c; /* don't swap non-word char */
+ else
+ c3 = mb_ptr2char(p + n + fl);
}
else
#endif
{
c = *p;
c2 = p[1];
- c3 = p[2];
+ if (!spell_iswordp(p + 2, curbuf))
+ c3 = c; /* don't swap non-word char */
+ else
+ c3 = p[2];
}
/* When characters are identical: "121" then SWAP3 result is
* identical, ROT3L result is same as SWAP: "211", ROT3L
* result is same as SWAP on next char: "112". Thus skip all
- * swapping. Also skip when c3 is NUL. */
+ * swapping. Also skip when c3 is NUL.
+ * Also get here when the third character is not a word
+ * character. Second character may any char: "a.b" -> "b.a" */
if (c == c3 || c3 == NUL)
{
sp->ts_state = STATE_REP_INI;
@@ -10165,6 +10192,7 @@
mch_memmove(p + fl + tl, p, n);
mb_char2bytes(c, p);
mb_char2bytes(c2, p + tl);
+ p = p + tl;
}
else
#endif
@@ -10172,6 +10200,16 @@
c = *p;
*p = p[2];
p[2] = c;
+ ++p;
+ }
+
+ if (!spell_iswordp(p, curbuf))
+ {
+ /* Middle char is not a word char, skip the rotate.
+ * First and third char were already checked at swap
+ * and swap3. */
+ sp->ts_state = STATE_REP_INI;
+ break;
}
/* Rotate three characters left: "123" -> "231". We change