diff options
Diffstat (limited to 'src/spell.c')
-rw-r--r-- | src/spell.c | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/src/spell.c b/src/spell.c index 985077753..a11372ab3 100644 --- a/src/spell.c +++ b/src/spell.c @@ -256,6 +256,8 @@ * WF_NEEDCOMP >> 8 word only valid in compound * WF_NOSUGGEST >> 8 word not used for suggestions * WF_COMPROOT >> 8 word already a compound + * WF_NOCOMPBEF >> 8 no compounding before this word + * WF_NOCOMPAFT >> 8 no compounding after this word * * <pflags> 1 byte bitmask of: * WFP_RARE rare prefix @@ -345,6 +347,8 @@ typedef long idx_T; #define WF_NEEDCOMP 0x0200 /* word only valid in compound */ #define WF_NOSUGGEST 0x0400 /* word not to be suggested */ #define WF_COMPROOT 0x0800 /* already compounded word, COMPOUNDROOT */ +#define WF_NOCOMPBEF 0x1000 /* no compounding before this word */ +#define WF_NOCOMPAFT 0x2000 /* no compounding after this word */ /* only used for su_badflags */ #define WF_MIXCAP 0x20 /* mix of upper and lower case: macaRONI */ @@ -1500,6 +1504,13 @@ find_word(mip, mode) && slang->sl_compsylmax == MAXWLEN) continue; + /* Don't allow compounding on a side where an affix was added, + * unless COMPOUNDPERMITFLAG was used. */ + if (mip->mi_complen > 0 && (flags & WF_NOCOMPBEF)) + continue; + if (!word_ends && (flags & WF_NOCOMPAFT)) + continue; + /* Quickly check if compounding is possible with this flag. */ if (!byte_in_str(mip->mi_complen == 0 ? slang->sl_compstartflags @@ -1634,12 +1645,16 @@ find_word(mip, mode) mip->mi_compoff = wlen; find_word(mip, FIND_KEEPCOMPOUND); +#if 0 /* Disabled, a prefix must not appear halfway a compound word, + unless the COMPOUNDPERMITFLAG is used and then it can't be a + postponed prefix. */ if (!slang->sl_nobreak || mip->mi_result == SP_BAD) { /* Check for following word with prefix. */ mip->mi_compoff = c; find_prefix(mip, FIND_COMPOUND); } +#endif } if (!slang->sl_nobreak) @@ -6702,7 +6717,7 @@ store_aff_word(spin, word, afflist, affile, ht, xht, comb, flags, else use_flags = flags; - /* Obey a "COMPOUNDFORBID" flag of the affix: don't + /* Obey a "COMPOUNDFORBIDFLAG" of the affix: don't * use the compound flags. */ use_pfxlist = pfxlist; if (pfxlist != NULL @@ -6730,13 +6745,29 @@ store_aff_word(spin, word, afflist, affile, ht, xht, comb, flags, use_pfxlist += pfxlen; } + /* When compounding is supported and there is no + * "COMPOUNDPERMITFLAG" then forbid compounding on the + * side where the affix is applied. */ + if (spin->si_compflags != NULL + && (affile->af_comppermit == 0 + || ae->ae_flags == NULL + || !flag_in_afflist( + affile->af_flagtype, ae->ae_flags, + affile->af_comppermit))) + { + if (xht != NULL) + use_flags |= WF_NOCOMPAFT; + else + use_flags |= WF_NOCOMPBEF; + } + /* Store the modified word. */ if (store_word(spin, newword, use_flags, spin->si_region, use_pfxlist, FALSE) == FAIL) retval = FAIL; /* When added a suffix and combining is allowed also - * try adding prefixes additionally. */ + * try adding prefixes additionally. RECURSIVE! */ if (xht != NULL && ah->ah_combine) if (store_aff_word(spin, newword, afflist, affile, xht, NULL, TRUE, @@ -9210,9 +9241,15 @@ init_spellfile() vim_strncpy(buf, curbuf->b_p_spl, lend - curbuf->b_p_spl); else { + /* Create the "spell" directory if it doesn't exist yet. */ + l = STRLEN(buf); + vim_snprintf((char *)buf + l, MAXPATHL - l, "/spell"); + if (!filewritable(buf) != 2) + vim_mkdir(buf, 0755); + l = STRLEN(buf); vim_snprintf((char *)buf + l, MAXPATHL - l, - "/spell/%.*s", (int)(lend - lstart), lstart); + "/%.*s", (int)(lend - lstart), lstart); } l = STRLEN(buf); fname = LANGP_ENTRY(curbuf->b_langp, 0)->lp_slang->sl_fname; @@ -9947,7 +9984,6 @@ spell_suggest(count) STRCAT(p, sug.su_badptr + stp->st_orglen); ml_replace(curwin->w_cursor.lnum, p, FALSE); curwin->w_cursor.col = c; - changed_bytes(curwin->w_cursor.lnum, c); /* For redo we use a change-word command. */ ResetRedobuff(); @@ -9955,6 +9991,9 @@ spell_suggest(count) AppendToRedobuffLit(p + c, stp->st_wordlen + sug.su_badlen - stp->st_orglen); AppendCharToRedobuff(ESC); + + /* After this "p" may be invalid. */ + changed_bytes(curwin->w_cursor.lnum, c); } } else |