forked from aniani/vim
updated for version 7.0133
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
*** ca_ES.orig.aff Sat Aug 13 18:01:36 2005
|
*** ca_ES.orig.aff Sat Aug 13 18:33:44 2005
|
||||||
--- ca_ES.aff Sat Aug 13 18:01:32 2005
|
--- ca_ES.aff Sat Aug 13 18:33:44 2005
|
||||||
***************
|
***************
|
||||||
*** 44,48 ****
|
*** 44,48 ****
|
||||||
|
|
||||||
@@ -30,8 +30,8 @@
|
|||||||
! REP l l<>l
|
! REP l l<>l
|
||||||
! REP l<>l l
|
! REP l<>l l
|
||||||
|
|
||||||
*** ca_ES.orig.dic Sat Aug 13 18:01:55 2005
|
*** ca_ES.orig.dic Sat Aug 13 18:33:44 2005
|
||||||
--- ca_ES.dic Sat Aug 13 18:01:51 2005
|
--- ca_ES.dic Sat Aug 13 18:33:44 2005
|
||||||
***************
|
***************
|
||||||
*** 25312,25314 ****
|
*** 25312,25314 ****
|
||||||
caos/E
|
caos/E
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
*** gl_ES.orig.aff Tue Aug 16 17:55:38 2005
|
*** gl_ES.orig.aff Tue Aug 16 17:59:15 2005
|
||||||
--- gl_ES.aff Tue Aug 16 17:57:03 2005
|
--- gl_ES.aff Tue Aug 16 17:59:15 2005
|
||||||
***************
|
***************
|
||||||
*** 2,3 ****
|
*** 2,3 ****
|
||||||
--- 2,11 ----
|
--- 2,11 ----
|
||||||
|
@@ -4689,7 +4689,7 @@ dozet:
|
|||||||
|
|
||||||
case '?': /* "z?": suggestions for a badly spelled word */
|
case '?': /* "z?": suggestions for a badly spelled word */
|
||||||
if (!checkclearopq(cap->oap))
|
if (!checkclearopq(cap->oap))
|
||||||
spell_suggest();
|
spell_suggest((int)cap->count0);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
301
src/spell.c
301
src/spell.c
@@ -377,6 +377,7 @@ struct slang_S
|
|||||||
regprog_T *sl_compprog; /* COMPOUNDFLAGS turned into a regexp progrm
|
regprog_T *sl_compprog; /* COMPOUNDFLAGS turned into a regexp progrm
|
||||||
* (NULL when no compounding) */
|
* (NULL when no compounding) */
|
||||||
char_u *sl_compstartflags; /* flags for first compound word */
|
char_u *sl_compstartflags; /* flags for first compound word */
|
||||||
|
char_u *sl_compallflags; /* all flags for compound words */
|
||||||
char_u *sl_syllable; /* SYLLABLE repeatable chars or NULL */
|
char_u *sl_syllable; /* SYLLABLE repeatable chars or NULL */
|
||||||
garray_T sl_syl_items; /* syllable items */
|
garray_T sl_syl_items; /* syllable items */
|
||||||
|
|
||||||
@@ -627,8 +628,8 @@ typedef struct trystate_S
|
|||||||
char_u ts_fidxtry; /* ts_fidx at which bytes may be changed */
|
char_u ts_fidxtry; /* ts_fidx at which bytes may be changed */
|
||||||
char_u ts_twordlen; /* valid length of tword[] */
|
char_u ts_twordlen; /* valid length of tword[] */
|
||||||
char_u ts_prefixdepth; /* stack depth for end of prefix or
|
char_u ts_prefixdepth; /* stack depth for end of prefix or
|
||||||
* PFD_PREFIXTREE or PFD_NOPREFIX or
|
* PFD_PREFIXTREE or PFD_NOPREFIX */
|
||||||
* PFD_COMPOUND */
|
char_u ts_flags; /* TSF_ flags */
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
char_u ts_tcharlen; /* number of bytes in tword character */
|
char_u ts_tcharlen; /* number of bytes in tword character */
|
||||||
char_u ts_tcharidx; /* current byte index in tword character */
|
char_u ts_tcharidx; /* current byte index in tword character */
|
||||||
@@ -638,6 +639,7 @@ typedef struct trystate_S
|
|||||||
char_u ts_prewordlen; /* length of word in "preword[]" */
|
char_u ts_prewordlen; /* length of word in "preword[]" */
|
||||||
char_u ts_splitoff; /* index in "tword" after last split */
|
char_u ts_splitoff; /* index in "tword" after last split */
|
||||||
char_u ts_complen; /* nr of compound words used */
|
char_u ts_complen; /* nr of compound words used */
|
||||||
|
char_u ts_compsplit; /* index for "compflags" where word was spit */
|
||||||
char_u ts_save_badflags; /* su_badflags saved here */
|
char_u ts_save_badflags; /* su_badflags saved here */
|
||||||
} trystate_T;
|
} trystate_T;
|
||||||
|
|
||||||
@@ -646,10 +648,14 @@ typedef struct trystate_S
|
|||||||
#define DIFF_YES 1 /* different byte found */
|
#define DIFF_YES 1 /* different byte found */
|
||||||
#define DIFF_INSERT 2 /* inserting character */
|
#define DIFF_INSERT 2 /* inserting character */
|
||||||
|
|
||||||
|
/* values for ts_flags */
|
||||||
|
#define TSF_PREFIXOK 1 /* already checked that prefix is OK */
|
||||||
|
#define TSF_DIDSPLIT 2 /* tried split at this point */
|
||||||
|
|
||||||
/* special values ts_prefixdepth */
|
/* special values ts_prefixdepth */
|
||||||
#define PFD_COMPOUND 0xfd /* prefixed is a compound word */
|
|
||||||
#define PFD_PREFIXTREE 0xfe /* walking through the prefix tree */
|
|
||||||
#define PFD_NOPREFIX 0xff /* not using prefixes */
|
#define PFD_NOPREFIX 0xff /* not using prefixes */
|
||||||
|
#define PFD_PREFIXTREE 0xfe /* walking through the prefix tree */
|
||||||
|
#define PFD_NOTSPECIAL 0xfd /* first value that's not special */
|
||||||
|
|
||||||
/* mode values for find_word */
|
/* mode values for find_word */
|
||||||
#define FIND_FOLDWORD 0 /* find word case-folded */
|
#define FIND_FOLDWORD 0 /* find word case-folded */
|
||||||
@@ -664,7 +670,7 @@ static void slang_clear __ARGS((slang_T *lp));
|
|||||||
static void find_word __ARGS((matchinf_T *mip, int mode));
|
static void find_word __ARGS((matchinf_T *mip, int mode));
|
||||||
static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags));
|
static int can_compound __ARGS((slang_T *slang, char_u *word, char_u *flags));
|
||||||
static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req));
|
static int valid_word_prefix __ARGS((int totprefcnt, int arridx, int flags, char_u *word, slang_T *slang, int cond_req));
|
||||||
static void find_prefix __ARGS((matchinf_T *mip));
|
static void find_prefix __ARGS((matchinf_T *mip, int mode));
|
||||||
static int fold_more __ARGS((matchinf_T *mip));
|
static int fold_more __ARGS((matchinf_T *mip));
|
||||||
static int spell_valid_case __ARGS((int wordflags, int treeflags));
|
static int spell_valid_case __ARGS((int wordflags, int treeflags));
|
||||||
static int no_spell_checking __ARGS((void));
|
static int no_spell_checking __ARGS((void));
|
||||||
@@ -897,7 +903,7 @@ spell_check(wp, ptr, attrp, capcol)
|
|||||||
find_word(&mi, FIND_KEEPWORD);
|
find_word(&mi, FIND_KEEPWORD);
|
||||||
|
|
||||||
/* Check for matching prefixes. */
|
/* Check for matching prefixes. */
|
||||||
find_prefix(&mi);
|
find_prefix(&mi, FIND_FOLDWORD);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mi.mi_result != SP_OK)
|
if (mi.mi_result != SP_OK)
|
||||||
@@ -988,6 +994,7 @@ find_word(mip, mode)
|
|||||||
char_u *byts;
|
char_u *byts;
|
||||||
idx_T *idxs;
|
idx_T *idxs;
|
||||||
int word_ends;
|
int word_ends;
|
||||||
|
int prefix_found;
|
||||||
|
|
||||||
if (mode == FIND_KEEPWORD || mode == FIND_KEEPCOMPOUND)
|
if (mode == FIND_KEEPWORD || mode == FIND_KEEPCOMPOUND)
|
||||||
{
|
{
|
||||||
@@ -1136,6 +1143,9 @@ find_word(mip, mode)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
word_ends = TRUE;
|
word_ends = TRUE;
|
||||||
|
/* The prefix flag is before compound flags. Once a valid prefix flag
|
||||||
|
* has been found we try compound flags. */
|
||||||
|
prefix_found = FALSE;
|
||||||
|
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
if (mode != FIND_KEEPWORD && has_mbyte)
|
if (mode != FIND_KEEPWORD && has_mbyte)
|
||||||
@@ -1185,7 +1195,7 @@ find_word(mip, mode)
|
|||||||
/* When mode is FIND_PREFIX the word must support the prefix:
|
/* When mode is FIND_PREFIX the word must support the prefix:
|
||||||
* check the prefix ID and the condition. Do that for the list at
|
* check the prefix ID and the condition. Do that for the list at
|
||||||
* mip->mi_prefarridx that find_prefix() filled. */
|
* mip->mi_prefarridx that find_prefix() filled. */
|
||||||
else if (mode == FIND_PREFIX)
|
else if (mode == FIND_PREFIX && !prefix_found)
|
||||||
{
|
{
|
||||||
c = valid_word_prefix(mip->mi_prefcnt, mip->mi_prefarridx,
|
c = valid_word_prefix(mip->mi_prefcnt, mip->mi_prefarridx,
|
||||||
flags,
|
flags,
|
||||||
@@ -1197,6 +1207,7 @@ find_word(mip, mode)
|
|||||||
/* Use the WF_RARE flag for a rare prefix. */
|
/* Use the WF_RARE flag for a rare prefix. */
|
||||||
if (c & WF_RAREPFX)
|
if (c & WF_RAREPFX)
|
||||||
flags |= WF_RARE;
|
flags |= WF_RARE;
|
||||||
|
prefix_found = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode == FIND_COMPOUND || mode == FIND_KEEPCOMPOUND
|
if (mode == FIND_COMPOUND || mode == FIND_KEEPCOMPOUND
|
||||||
@@ -1214,10 +1225,10 @@ find_word(mip, mode)
|
|||||||
if (!word_ends && mip->mi_complen + 2 > slang->sl_compmax)
|
if (!word_ends && mip->mi_complen + 2 > slang->sl_compmax)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* At start of word quickly check if compounding is possible
|
/* Quickly check if compounding is possible with this flag. */
|
||||||
* with this flag. */
|
if (vim_strchr(mip->mi_complen == 0
|
||||||
if (mip->mi_complen == 0
|
? slang->sl_compstartflags
|
||||||
&& vim_strchr(slang->sl_compstartflags,
|
: slang->sl_compallflags,
|
||||||
((unsigned)flags >> 24)) == NULL)
|
((unsigned)flags >> 24)) == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -1267,17 +1278,19 @@ find_word(mip, mode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
c = mip->mi_compoff;
|
||||||
++mip->mi_complen;
|
++mip->mi_complen;
|
||||||
find_word(mip, FIND_COMPOUND);
|
find_word(mip, FIND_COMPOUND);
|
||||||
--mip->mi_complen;
|
|
||||||
if (mip->mi_result == SP_OK)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Find following word in keep-case tree. */
|
/* Find following word in keep-case tree. */
|
||||||
mip->mi_compoff = wlen;
|
mip->mi_compoff = wlen;
|
||||||
++mip->mi_complen;
|
|
||||||
find_word(mip, FIND_KEEPCOMPOUND);
|
find_word(mip, FIND_KEEPCOMPOUND);
|
||||||
|
|
||||||
|
/* Check for following word with prefix. */
|
||||||
|
mip->mi_compoff = c;
|
||||||
|
find_prefix(mip, FIND_COMPOUND);
|
||||||
--mip->mi_complen;
|
--mip->mi_complen;
|
||||||
|
|
||||||
if (mip->mi_result == SP_OK)
|
if (mip->mi_result == SP_OK)
|
||||||
break;
|
break;
|
||||||
continue;
|
continue;
|
||||||
@@ -1399,11 +1412,15 @@ valid_word_prefix(totprefcnt, arridx, flags, word, slang, cond_req)
|
|||||||
* Check if the word at "mip->mi_word" has a matching prefix.
|
* Check if the word at "mip->mi_word" has a matching prefix.
|
||||||
* If it does, then check the following word.
|
* If it does, then check the following word.
|
||||||
*
|
*
|
||||||
|
* If "mode" is "FIND_COMPOUND" then do the same after another word, find a
|
||||||
|
* prefix in a compound word.
|
||||||
|
*
|
||||||
* For a match mip->mi_result is updated.
|
* For a match mip->mi_result is updated.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
find_prefix(mip)
|
find_prefix(mip, mode)
|
||||||
matchinf_T *mip;
|
matchinf_T *mip;
|
||||||
|
int mode;
|
||||||
{
|
{
|
||||||
idx_T arridx = 0;
|
idx_T arridx = 0;
|
||||||
int len;
|
int len;
|
||||||
@@ -1424,6 +1441,12 @@ find_prefix(mip)
|
|||||||
* case-folded. */
|
* case-folded. */
|
||||||
ptr = mip->mi_fword;
|
ptr = mip->mi_fword;
|
||||||
flen = mip->mi_fwordlen; /* available case-folded bytes */
|
flen = mip->mi_fwordlen; /* available case-folded bytes */
|
||||||
|
if (mode == FIND_COMPOUND)
|
||||||
|
{
|
||||||
|
/* Skip over the previously found word(s). */
|
||||||
|
ptr += mip->mi_compoff;
|
||||||
|
flen -= mip->mi_compoff;
|
||||||
|
}
|
||||||
idxs = slang->sl_pidxs;
|
idxs = slang->sl_pidxs;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1458,15 +1481,19 @@ find_prefix(mip)
|
|||||||
|
|
||||||
/* Find the word that comes after the prefix. */
|
/* Find the word that comes after the prefix. */
|
||||||
mip->mi_prefixlen = wlen;
|
mip->mi_prefixlen = wlen;
|
||||||
|
if (mode == FIND_COMPOUND)
|
||||||
|
/* Skip over the previously found word(s). */
|
||||||
|
mip->mi_prefixlen += mip->mi_compoff;
|
||||||
|
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
if (has_mbyte)
|
if (has_mbyte)
|
||||||
{
|
{
|
||||||
/* Case-folded length may differ from original length. */
|
/* Case-folded length may differ from original length. */
|
||||||
mip->mi_cprefixlen = nofold_len(mip->mi_fword, wlen,
|
mip->mi_cprefixlen = nofold_len(mip->mi_fword,
|
||||||
mip->mi_word);
|
mip->mi_prefixlen, mip->mi_word);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
mip->mi_cprefixlen = wlen;
|
mip->mi_cprefixlen = mip->mi_prefixlen;
|
||||||
#endif
|
#endif
|
||||||
find_word(mip, FIND_PREFIX);
|
find_word(mip, FIND_PREFIX);
|
||||||
|
|
||||||
@@ -1956,8 +1983,10 @@ slang_clear(lp)
|
|||||||
|
|
||||||
vim_free(lp->sl_compprog);
|
vim_free(lp->sl_compprog);
|
||||||
vim_free(lp->sl_compstartflags);
|
vim_free(lp->sl_compstartflags);
|
||||||
|
vim_free(lp->sl_compallflags);
|
||||||
lp->sl_compprog = NULL;
|
lp->sl_compprog = NULL;
|
||||||
lp->sl_compstartflags = NULL;
|
lp->sl_compstartflags = NULL;
|
||||||
|
lp->sl_compallflags = NULL;
|
||||||
|
|
||||||
vim_free(lp->sl_syllable);
|
vim_free(lp->sl_syllable);
|
||||||
lp->sl_syllable = NULL;
|
lp->sl_syllable = NULL;
|
||||||
@@ -2496,7 +2525,7 @@ read_sal_section(fd, slang)
|
|||||||
salitem_T *smp;
|
salitem_T *smp;
|
||||||
int ccnt;
|
int ccnt;
|
||||||
char_u *p;
|
char_u *p;
|
||||||
int c;
|
int c = NUL;
|
||||||
|
|
||||||
slang->sl_sofo = FALSE;
|
slang->sl_sofo = FALSE;
|
||||||
|
|
||||||
@@ -2667,6 +2696,7 @@ read_compound(fd, slang, len)
|
|||||||
char_u *pat;
|
char_u *pat;
|
||||||
char_u *pp;
|
char_u *pp;
|
||||||
char_u *cp;
|
char_u *cp;
|
||||||
|
char_u *ap;
|
||||||
|
|
||||||
if (todo < 2)
|
if (todo < 2)
|
||||||
return SP_FORMERROR; /* need at least two bytes */
|
return SP_FORMERROR; /* need at least two bytes */
|
||||||
@@ -2696,7 +2726,8 @@ read_compound(fd, slang, len)
|
|||||||
if (pat == NULL)
|
if (pat == NULL)
|
||||||
return SP_ERROR;
|
return SP_ERROR;
|
||||||
|
|
||||||
/* We also need a list of all flags that can appear at the start. */
|
/* We also need a list of all flags that can appear at the start and one
|
||||||
|
* for all flags. */
|
||||||
cp = alloc(todo + 1);
|
cp = alloc(todo + 1);
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
{
|
{
|
||||||
@@ -2706,6 +2737,15 @@ read_compound(fd, slang, len)
|
|||||||
slang->sl_compstartflags = cp;
|
slang->sl_compstartflags = cp;
|
||||||
*cp = NUL;
|
*cp = NUL;
|
||||||
|
|
||||||
|
ap = alloc(todo + 1);
|
||||||
|
if (ap == NULL)
|
||||||
|
{
|
||||||
|
vim_free(pat);
|
||||||
|
return SP_ERROR;
|
||||||
|
}
|
||||||
|
slang->sl_compallflags = ap;
|
||||||
|
*ap = NUL;
|
||||||
|
|
||||||
pp = pat;
|
pp = pat;
|
||||||
*pp++ = '^';
|
*pp++ = '^';
|
||||||
*pp++ = '\\';
|
*pp++ = '\\';
|
||||||
@@ -2715,6 +2755,15 @@ read_compound(fd, slang, len)
|
|||||||
while (todo-- > 0)
|
while (todo-- > 0)
|
||||||
{
|
{
|
||||||
c = getc(fd); /* <compflags> */
|
c = getc(fd); /* <compflags> */
|
||||||
|
|
||||||
|
/* Add all flags to "sl_compallflags". */
|
||||||
|
if (vim_strchr((char_u *)"+*[]/", c) == NULL
|
||||||
|
&& vim_strchr(slang->sl_compallflags, c) == NULL)
|
||||||
|
{
|
||||||
|
*ap++ = c;
|
||||||
|
*ap = NUL;
|
||||||
|
}
|
||||||
|
|
||||||
if (atstart != 0)
|
if (atstart != 0)
|
||||||
{
|
{
|
||||||
/* At start of item: copy flags to "sl_compstartflags". For a
|
/* At start of item: copy flags to "sl_compstartflags". For a
|
||||||
@@ -6178,7 +6227,7 @@ write_vim_spell(spin, fname)
|
|||||||
char_u folchars[128 * 8];
|
char_u folchars[128 * 8];
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
putc(SN_MIDWORD, fd); /* <sectionID> */
|
putc(SN_CHARFLAGS, fd); /* <sectionID> */
|
||||||
putc(SNF_REQUIRED, fd); /* <sectionflags> */
|
putc(SNF_REQUIRED, fd); /* <sectionflags> */
|
||||||
|
|
||||||
/* Form the <folchars> string first, we need to know its length. */
|
/* Form the <folchars> string first, we need to know its length. */
|
||||||
@@ -7545,9 +7594,11 @@ static char_u *repl_to = NULL;
|
|||||||
/*
|
/*
|
||||||
* "z?": Find badly spelled word under or after the cursor.
|
* "z?": Find badly spelled word under or after the cursor.
|
||||||
* Give suggestions for the properly spelled word.
|
* Give suggestions for the properly spelled word.
|
||||||
|
* When "count" is non-zero use that suggestion.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
spell_suggest()
|
spell_suggest(count)
|
||||||
|
int count;
|
||||||
{
|
{
|
||||||
char_u *line;
|
char_u *line;
|
||||||
pos_T prev_cursor = curwin->w_cursor;
|
pos_T prev_cursor = curwin->w_cursor;
|
||||||
@@ -7560,6 +7611,7 @@ spell_suggest()
|
|||||||
int mouse_used;
|
int mouse_used;
|
||||||
int need_cap;
|
int need_cap;
|
||||||
int limit;
|
int limit;
|
||||||
|
int selected = count;
|
||||||
|
|
||||||
/* Find the start of the badly spelled word. */
|
/* Find the start of the badly spelled word. */
|
||||||
if (spell_move_to(FORWARD, TRUE, TRUE) == FAIL
|
if (spell_move_to(FORWARD, TRUE, TRUE) == FAIL
|
||||||
@@ -7606,6 +7658,12 @@ spell_suggest()
|
|||||||
|
|
||||||
if (sug.su_ga.ga_len == 0)
|
if (sug.su_ga.ga_len == 0)
|
||||||
MSG(_("Sorry, no suggestions"));
|
MSG(_("Sorry, no suggestions"));
|
||||||
|
else if (count > 0)
|
||||||
|
{
|
||||||
|
if (count > sug.su_ga.ga_len)
|
||||||
|
smsg((char_u *)_("Sorry, only %ld suggestions"),
|
||||||
|
(long)sug.su_ga.ga_len);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vim_free(repl_from);
|
vim_free(repl_from);
|
||||||
@@ -7694,40 +7752,40 @@ spell_suggest()
|
|||||||
msg_col = 0;
|
msg_col = 0;
|
||||||
#endif
|
#endif
|
||||||
/* Ask for choice. */
|
/* Ask for choice. */
|
||||||
i = prompt_for_number(&mouse_used);
|
selected = prompt_for_number(&mouse_used);
|
||||||
if (mouse_used)
|
if (mouse_used)
|
||||||
i -= lines_left;
|
selected -= lines_left;
|
||||||
|
|
||||||
if (i > 0 && i <= sug.su_ga.ga_len && u_save_cursor() == OK)
|
|
||||||
{
|
|
||||||
/* Save the from and to text for :spellrepall. */
|
|
||||||
stp = &SUG(sug.su_ga, i - 1);
|
|
||||||
repl_from = vim_strnsave(sug.su_badptr, stp->st_orglen);
|
|
||||||
repl_to = vim_strsave(stp->st_word);
|
|
||||||
|
|
||||||
/* Replace the word. */
|
|
||||||
p = alloc(STRLEN(line) - stp->st_orglen + STRLEN(stp->st_word) + 1);
|
|
||||||
if (p != NULL)
|
|
||||||
{
|
|
||||||
c = sug.su_badptr - line;
|
|
||||||
mch_memmove(p, line, c);
|
|
||||||
STRCPY(p + c, stp->st_word);
|
|
||||||
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();
|
|
||||||
AppendToRedobuff((char_u *)"ciw");
|
|
||||||
AppendToRedobuff(stp->st_word);
|
|
||||||
AppendCharToRedobuff(ESC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
curwin->w_cursor = prev_cursor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (selected > 0 && selected <= sug.su_ga.ga_len && u_save_cursor() == OK)
|
||||||
|
{
|
||||||
|
/* Save the from and to text for :spellrepall. */
|
||||||
|
stp = &SUG(sug.su_ga, selected - 1);
|
||||||
|
repl_from = vim_strnsave(sug.su_badptr, stp->st_orglen);
|
||||||
|
repl_to = vim_strsave(stp->st_word);
|
||||||
|
|
||||||
|
/* Replace the word. */
|
||||||
|
p = alloc(STRLEN(line) - stp->st_orglen + STRLEN(stp->st_word) + 1);
|
||||||
|
if (p != NULL)
|
||||||
|
{
|
||||||
|
c = sug.su_badptr - line;
|
||||||
|
mch_memmove(p, line, c);
|
||||||
|
STRCPY(p + c, stp->st_word);
|
||||||
|
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();
|
||||||
|
AppendToRedobuff((char_u *)"ciw");
|
||||||
|
AppendToRedobuff(stp->st_word);
|
||||||
|
AppendCharToRedobuff(ESC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
curwin->w_cursor = prev_cursor;
|
||||||
|
|
||||||
spell_find_cleanup(&sug);
|
spell_find_cleanup(&sug);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8317,6 +8375,13 @@ suggest_try_special(su)
|
|||||||
* stack[] is used to store info. This allows combinations, thus insert one
|
* stack[] is used to store info. This allows combinations, thus insert one
|
||||||
* character, replace one and delete another. The number of changes is
|
* character, replace one and delete another. The number of changes is
|
||||||
* limited by su->su_maxscore, checked in try_deeper().
|
* limited by su->su_maxscore, checked in try_deeper().
|
||||||
|
*
|
||||||
|
* After implementing this I noticed an article by Kemal Oflazer that
|
||||||
|
* describes something similar: "Error-tolerant Finite State Recognition with
|
||||||
|
* Applications to Morphological Analysis and Spelling Correction" (1996).
|
||||||
|
* The implementation in the article is simplified and requires a stack of
|
||||||
|
* unknown depth. The implementation here only needs a stack depth of the
|
||||||
|
* length of the word.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
suggest_try_change(su)
|
suggest_try_change(su)
|
||||||
@@ -8372,7 +8437,6 @@ suggest_try_change(su)
|
|||||||
depth = 0;
|
depth = 0;
|
||||||
sp = &stack[0];
|
sp = &stack[0];
|
||||||
vim_memset(sp, 0, sizeof(trystate_T));
|
vim_memset(sp, 0, sizeof(trystate_T));
|
||||||
sp->ts_state = STATE_START;
|
|
||||||
sp->ts_curi = 1;
|
sp->ts_curi = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -8395,6 +8459,7 @@ suggest_try_change(su)
|
|||||||
byts = fbyts;
|
byts = fbyts;
|
||||||
idxs = fidxs;
|
idxs = fidxs;
|
||||||
sp->ts_prefixdepth = PFD_NOPREFIX;
|
sp->ts_prefixdepth = PFD_NOPREFIX;
|
||||||
|
sp->ts_state = STATE_START;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -8460,10 +8525,12 @@ suggest_try_change(su)
|
|||||||
|
|
||||||
/* Move the prefix to preword[] with the right case
|
/* Move the prefix to preword[] with the right case
|
||||||
* and make find_keepcap_word() works. */
|
* and make find_keepcap_word() works. */
|
||||||
sp->ts_splitoff = sp->ts_twordlen;
|
tword[sp->ts_twordlen] = NUL;
|
||||||
tword[sp->ts_splitoff] = NUL;
|
make_case_word(tword + sp->ts_splitoff,
|
||||||
make_case_word(tword, preword, flags);
|
preword + sp->ts_prewordlen,
|
||||||
|
flags);
|
||||||
sp->ts_prewordlen = STRLEN(preword);
|
sp->ts_prewordlen = STRLEN(preword);
|
||||||
|
sp->ts_splitoff = sp->ts_twordlen;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -8486,22 +8553,8 @@ suggest_try_change(su)
|
|||||||
|| !spell_iswordp(fword + sp->ts_fidx, curbuf));
|
|| !spell_iswordp(fword + sp->ts_fidx, curbuf));
|
||||||
tword[sp->ts_twordlen] = NUL;
|
tword[sp->ts_twordlen] = NUL;
|
||||||
|
|
||||||
if (sp->ts_prefixdepth == PFD_COMPOUND)
|
if (sp->ts_prefixdepth <= PFD_NOTSPECIAL
|
||||||
{
|
&& (sp->ts_flags & TSF_PREFIXOK) == 0)
|
||||||
/* There was a compound word before this word. If this
|
|
||||||
* word does not support compounding then give up
|
|
||||||
* (splitting is tried for the word without compound
|
|
||||||
* flag). */
|
|
||||||
if (((unsigned)flags >> 24) == 0
|
|
||||||
|| sp->ts_twordlen - sp->ts_splitoff
|
|
||||||
< slang->sl_compminlen)
|
|
||||||
break;
|
|
||||||
compflags[sp->ts_complen] = ((unsigned)flags >> 24);
|
|
||||||
compflags[sp->ts_complen + 1] = NUL;
|
|
||||||
if (fword_ends && !can_compound(slang, tword, compflags))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (sp->ts_prefixdepth < MAXWLEN)
|
|
||||||
{
|
{
|
||||||
/* There was a prefix before the word. Check that the
|
/* There was a prefix before the word. Check that the
|
||||||
* prefix can be used with this word. */
|
* prefix can be used with this word. */
|
||||||
@@ -8522,9 +8575,33 @@ suggest_try_change(su)
|
|||||||
/* Use the WF_RARE flag for a rare prefix. */
|
/* Use the WF_RARE flag for a rare prefix. */
|
||||||
if (c & WF_RAREPFX)
|
if (c & WF_RAREPFX)
|
||||||
flags |= WF_RARE;
|
flags |= WF_RARE;
|
||||||
|
|
||||||
|
/* Tricky: when checking for both prefix and
|
||||||
|
* compounding we run into the prefix flag first.
|
||||||
|
* Remember that it's OK, so that we accept the prefix
|
||||||
|
* when arriving at a compound flag. */
|
||||||
|
sp->ts_flags |= TSF_PREFIXOK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sp->ts_complen > sp->ts_compsplit)
|
||||||
|
{
|
||||||
|
/* There was a compound word before this word. If this
|
||||||
|
* word does not support compounding then give up
|
||||||
|
* (splitting is tried for the word without compound
|
||||||
|
* flag). */
|
||||||
|
if (((unsigned)flags >> 24) == 0
|
||||||
|
|| sp->ts_twordlen - sp->ts_splitoff
|
||||||
|
< slang->sl_compminlen)
|
||||||
|
break;
|
||||||
|
compflags[sp->ts_complen] = ((unsigned)flags >> 24);
|
||||||
|
compflags[sp->ts_complen + 1] = NUL;
|
||||||
|
if (fword_ends && !can_compound(slang,
|
||||||
|
tword + sp->ts_splitoff,
|
||||||
|
compflags + sp->ts_compsplit))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Form the word with proper case in preword.
|
* Form the word with proper case in preword.
|
||||||
* If there is a word from a previous split, append.
|
* If there is a word from a previous split, append.
|
||||||
@@ -8620,24 +8697,48 @@ suggest_try_change(su)
|
|||||||
* (e.g., a swap). No need to split, but do check that
|
* (e.g., a swap). No need to split, but do check that
|
||||||
* the following word is valid.
|
* the following word is valid.
|
||||||
*/
|
*/
|
||||||
|
try_compound = FALSE;
|
||||||
if (!fword_ends
|
if (!fword_ends
|
||||||
&& ((unsigned)flags >> 24) != 0
|
&& ((unsigned)flags >> 24) != 0
|
||||||
&& sp->ts_twordlen - sp->ts_splitoff
|
&& sp->ts_twordlen - sp->ts_splitoff
|
||||||
>= slang->sl_compminlen
|
>= slang->sl_compminlen
|
||||||
&& sp->ts_complen + 1 <= slang->sl_compmax
|
&& sp->ts_complen + 1 - sp->ts_compsplit
|
||||||
&& (sp->ts_complen > 0
|
< slang->sl_compmax
|
||||||
|| vim_strchr(slang->sl_compstartflags,
|
&& (vim_strchr(sp->ts_complen == sp->ts_compsplit
|
||||||
|
? slang->sl_compstartflags
|
||||||
|
: slang->sl_compallflags,
|
||||||
((unsigned)flags >> 24)) != NULL))
|
((unsigned)flags >> 24)) != NULL))
|
||||||
{
|
{
|
||||||
try_compound = TRUE;
|
try_compound = TRUE;
|
||||||
compflags[sp->ts_complen] = ((unsigned)flags >> 24);
|
compflags[sp->ts_complen] = ((unsigned)flags >> 24);
|
||||||
compflags[sp->ts_complen + 1] = NUL;
|
compflags[sp->ts_complen + 1] = NUL;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
/* If we could add a compound word, and it's also possible
|
||||||
|
* to split at this point, do the split first and set
|
||||||
|
* TSF_DIDSPLIT to avoid doing it again. */
|
||||||
|
if (!fword_ends
|
||||||
|
&& try_compound
|
||||||
|
&& (sp->ts_flags & TSF_DIDSPLIT) == 0)
|
||||||
{
|
{
|
||||||
try_compound = FALSE;
|
try_compound = FALSE;
|
||||||
if (!fword_ends)
|
sp->ts_flags |= TSF_DIDSPLIT;
|
||||||
newscore += SCORE_SPLIT;
|
--sp->ts_curi; /* do the same NUL again */
|
||||||
|
compflags[sp->ts_complen] = NUL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sp->ts_flags &= ~TSF_DIDSPLIT;
|
||||||
|
|
||||||
|
if (!try_compound && !fword_ends)
|
||||||
|
{
|
||||||
|
/* If we're going to split need to check that the
|
||||||
|
* words so far are valid for compounding. */
|
||||||
|
if (sp->ts_complen > sp->ts_compsplit
|
||||||
|
&& !can_compound(slang,
|
||||||
|
tword + sp->ts_splitoff,
|
||||||
|
compflags + sp->ts_compsplit))
|
||||||
|
break;
|
||||||
|
newscore += SCORE_SPLIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (try_deeper(su, stack, depth, newscore))
|
if (try_deeper(su, stack, depth, newscore))
|
||||||
@@ -8684,14 +8785,14 @@ suggest_try_change(su)
|
|||||||
sp->ts_fidx += l;
|
sp->ts_fidx += l;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set flag to check compound flag on following word */
|
/* When compounding include compound flag in
|
||||||
|
* compflags[] (already set above). When splitting we
|
||||||
|
* may start compounding over again. */
|
||||||
if (try_compound)
|
if (try_compound)
|
||||||
{
|
|
||||||
sp->ts_prefixdepth = PFD_COMPOUND;
|
|
||||||
++sp->ts_complen;
|
++sp->ts_complen;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
sp->ts_prefixdepth = PFD_NOPREFIX;
|
sp->ts_compsplit = sp->ts_complen;
|
||||||
|
sp->ts_prefixdepth = PFD_NOPREFIX;
|
||||||
|
|
||||||
/* set su->su_badflags to the caps type at this
|
/* set su->su_badflags to the caps type at this
|
||||||
* position */
|
* position */
|
||||||
@@ -8706,6 +8807,15 @@ suggest_try_change(su)
|
|||||||
|
|
||||||
/* Restart at top of the tree. */
|
/* Restart at top of the tree. */
|
||||||
sp->ts_arridx = 0;
|
sp->ts_arridx = 0;
|
||||||
|
|
||||||
|
/* If there are postponed prefixes, try these too. */
|
||||||
|
if (pbyts != NULL)
|
||||||
|
{
|
||||||
|
byts = pbyts;
|
||||||
|
idxs = pidxs;
|
||||||
|
sp->ts_prefixdepth = PFD_PREFIXTREE;
|
||||||
|
sp->ts_state = STATE_NOPREFIX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -8716,6 +8826,10 @@ suggest_try_change(su)
|
|||||||
|
|
||||||
/* Continue looking for NUL bytes. */
|
/* Continue looking for NUL bytes. */
|
||||||
sp->ts_state = STATE_START;
|
sp->ts_state = STATE_START;
|
||||||
|
|
||||||
|
/* In case we went into the prefix tree. */
|
||||||
|
byts = fbyts;
|
||||||
|
idxs = fidxs;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE_ENDNUL:
|
case STATE_ENDNUL:
|
||||||
@@ -9353,6 +9467,7 @@ try_deeper(su, stack, depth, score_add)
|
|||||||
stack[depth + 1].ts_state = STATE_START;
|
stack[depth + 1].ts_state = STATE_START;
|
||||||
stack[depth + 1].ts_score = newscore;
|
stack[depth + 1].ts_score = newscore;
|
||||||
stack[depth + 1].ts_curi = 1; /* start just after length byte */
|
stack[depth + 1].ts_curi = 1; /* start just after length byte */
|
||||||
|
stack[depth + 1].ts_flags = 0;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10322,6 +10437,15 @@ eval_soundfold(word)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Turn "inword" into its sound-a-like equivalent in "res[MAXWLEN]".
|
* Turn "inword" into its sound-a-like equivalent in "res[MAXWLEN]".
|
||||||
|
*
|
||||||
|
* There are many ways to turn a word into a sound-a-like representation. The
|
||||||
|
* oldest is Soundex (1918!). A nice overview can be found in "Approximate
|
||||||
|
* swedish name matching - survey and test of different algorithms" by Klas
|
||||||
|
* Erikson.
|
||||||
|
*
|
||||||
|
* We support two methods:
|
||||||
|
* 1. SOFOFROM/SOFOTO do a simple character mapping.
|
||||||
|
* 2. SAL items define a more advanced sound-folding (and much slower).
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
spell_soundfold(slang, inword, folded, res)
|
spell_soundfold(slang, inword, folded, res)
|
||||||
@@ -11243,9 +11367,10 @@ soundalike_score(goodstart, badstart)
|
|||||||
* Compute the "edit distance" to turn "badword" into "goodword". The less
|
* Compute the "edit distance" to turn "badword" into "goodword". The less
|
||||||
* deletes/inserts/substitutes/swaps are required the lower the score.
|
* deletes/inserts/substitutes/swaps are required the lower the score.
|
||||||
*
|
*
|
||||||
* The algorithm comes from Aspell editdist.cpp, edit_distance().
|
* The algorithm is described by Du and Chang, 1992.
|
||||||
* It has been converted from C++ to C and modified to support multi-byte
|
* The implementation of the algorithm comes from Aspell editdist.cpp,
|
||||||
* characters.
|
* edit_distance(). It has been converted from C++ to C and modified to
|
||||||
|
* support multi-byte characters.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
spell_edit_score(badword, goodword)
|
spell_edit_score(badword, goodword)
|
||||||
|
Reference in New Issue
Block a user