0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 7.4.1064

Problem:    When a spell file has single letter compounding creating
            suggestions takes an awful long time.
Solution:   Add th eNOCOMPOUNDSUGS flag.
This commit is contained in:
Bram Moolenaar
2016-01-09 13:51:34 +01:00
parent 4d1c0a4441
commit 7b877b3605
3 changed files with 50 additions and 10 deletions

View File

@@ -1386,6 +1386,14 @@ the item name. Case is always ignored.
The Hunspell feature to use three arguments and flags is not supported. The Hunspell feature to use three arguments and flags is not supported.
*spell-NOCOMPOUNDSUGS*
This item indicates that using compounding to make suggestions is not a good
idea. Use this when compounding is used with very short or one-character
words. E.g. to make numbers out of digits. Without this flag creating
suggestions would spend most time trying all kind of weird compound words.
NOCOMPOUNDSUGS ~
*spell-SYLLABLE* *spell-SYLLABLE*
The SYLLABLE item defines characters or character sequences that are used to The SYLLABLE item defines characters or character sequences that are used to
count the number of syllables in a word. Example: count the number of syllables in a word. Example:

View File

@@ -59,6 +59,12 @@
# define SPELL_PRINTTREE # define SPELL_PRINTTREE
#endif #endif
/* Use SPELL_COMPRESS_ALLWAYS for debugging: compress the word tree after
* adding a word. Only use it for small word lists! */
#if 0
# define SPELL_COMPRESS_ALLWAYS
#endif
/* Use DEBUG_TRIEWALK to print the changes made in suggest_trie_walk() for a /* Use DEBUG_TRIEWALK to print the changes made in suggest_trie_walk() for a
* specific word. */ * specific word. */
#if 0 #if 0
@@ -177,6 +183,8 @@
* <timestamp> 8 bytes time in seconds that must match with .sug file * <timestamp> 8 bytes time in seconds that must match with .sug file
* *
* sectionID == SN_NOSPLITSUGS: nothing * sectionID == SN_NOSPLITSUGS: nothing
*
* sectionID == SN_NOCOMPOUNDSUGS: nothing
* *
* sectionID == SN_WORDS: <word> ... * sectionID == SN_WORDS: <word> ...
* <word> N bytes NUL terminated common word * <word> N bytes NUL terminated common word
@@ -501,6 +509,7 @@ struct slang_S
garray_T sl_repsal; /* list of fromto_T entries from REPSAL lines */ garray_T sl_repsal; /* list of fromto_T entries from REPSAL lines */
short sl_repsal_first[256]; /* sl_rep_first for REPSAL lines */ short sl_repsal_first[256]; /* sl_rep_first for REPSAL lines */
int sl_nosplitsugs; /* don't suggest splitting a word */ int sl_nosplitsugs; /* don't suggest splitting a word */
int sl_nocompoundsugs; /* don't suggest compounding */
/* Info from the .sug file. Loaded on demand. */ /* Info from the .sug file. Loaded on demand. */
time_t sl_sugtime; /* timestamp for .sug file */ time_t sl_sugtime; /* timestamp for .sug file */
@@ -570,6 +579,7 @@ typedef struct langp_S
#define SN_WORDS 13 /* common words */ #define SN_WORDS 13 /* common words */
#define SN_NOSPLITSUGS 14 /* don't split word for suggestions */ #define SN_NOSPLITSUGS 14 /* don't split word for suggestions */
#define SN_INFO 15 /* info section */ #define SN_INFO 15 /* info section */
#define SN_NOCOMPOUNDSUGS 16 /* don't compound for suggestions */
#define SN_END 255 /* end of sections */ #define SN_END 255 /* end of sections */
#define SNF_REQUIRED 1 /* <sectionflags>: required section */ #define SNF_REQUIRED 1 /* <sectionflags>: required section */
@@ -2913,7 +2923,11 @@ spell_load_file(fname, lang, old_lp, silent)
break; break;
case SN_NOSPLITSUGS: case SN_NOSPLITSUGS:
lp->sl_nosplitsugs = TRUE; /* <timestamp> */ lp->sl_nosplitsugs = TRUE;
break;
case SN_NOCOMPOUNDSUGS:
lp->sl_nocompoundsugs = TRUE;
break; break;
case SN_COMPOUND: case SN_COMPOUND:
@@ -5005,6 +5019,7 @@ typedef struct spellinfo_S
char_u *si_sofoto; /* SOFOTO text */ char_u *si_sofoto; /* SOFOTO text */
int si_nosugfile; /* NOSUGFILE item found */ int si_nosugfile; /* NOSUGFILE item found */
int si_nosplitsugs; /* NOSPLITSUGS item found */ int si_nosplitsugs; /* NOSPLITSUGS item found */
int si_nocompoundsugs; /* NOCOMPOUNDSUGS item found */
int si_followup; /* soundsalike: ? */ int si_followup; /* soundsalike: ? */
int si_collapse; /* soundsalike: ? */ int si_collapse; /* soundsalike: ? */
hashtab_T si_commonwords; /* hashtable for common words */ hashtab_T si_commonwords; /* hashtable for common words */
@@ -5130,9 +5145,9 @@ spell_print_node(wordnode_T *node, int depth)
PRINTSOME(line1, depth, "(%d)", node->wn_nr, 0); PRINTSOME(line1, depth, "(%d)", node->wn_nr, 0);
PRINTSOME(line2, depth, " ", 0, 0); PRINTSOME(line2, depth, " ", 0, 0);
PRINTSOME(line3, depth, " ", 0, 0); PRINTSOME(line3, depth, " ", 0, 0);
msg(line1); msg((char_u *)line1);
msg(line2); msg((char_u *)line2);
msg(line3); msg((char_u *)line3);
} }
else else
{ {
@@ -5158,9 +5173,9 @@ spell_print_node(wordnode_T *node, int depth)
if (node->wn_byte == NUL) if (node->wn_byte == NUL)
{ {
msg(line1); msg((char_u *)line1);
msg(line2); msg((char_u *)line2);
msg(line3); msg((char_u *)line3);
} }
/* do the children */ /* do the children */
@@ -5598,6 +5613,10 @@ spell_read_aff(spin, fname)
{ {
spin->si_nosplitsugs = TRUE; spin->si_nosplitsugs = TRUE;
} }
else if (is_aff_rule(items, itemcnt, "NOCOMPOUNDSUGS", 1))
{
spin->si_nocompoundsugs = TRUE;
}
else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1)) else if (is_aff_rule(items, itemcnt, "NOSUGFILE", 1))
{ {
spin->si_nosugfile = TRUE; spin->si_nosugfile = TRUE;
@@ -7621,7 +7640,7 @@ tree_add_word(spin, word, root, flags, region, affixID)
node = *prev; node = *prev;
} }
#ifdef SPELL_PRINTTREE #ifdef SPELL_PRINTTREE
smsg("Added \"%s\"", word); smsg((char_u *)"Added \"%s\"", word);
spell_print_tree(root->wn_sibling); spell_print_tree(root->wn_sibling);
#endif #endif
@@ -7647,7 +7666,7 @@ tree_add_word(spin, word, root, flags, region, affixID)
* (si_compress_cnt == 1) and the number of free nodes drops below the * (si_compress_cnt == 1) and the number of free nodes drops below the
* maximum word length. * maximum word length.
*/ */
#ifndef SPELL_PRINTTREE #ifndef SPELL_COMPRESS_ALLWAYS
if (spin->si_compress_cnt == 1 if (spin->si_compress_cnt == 1
? spin->si_free_count < MAXWLEN ? spin->si_free_count < MAXWLEN
: spin->si_blocks_cnt >= compress_start) : spin->si_blocks_cnt >= compress_start)
@@ -8295,6 +8314,16 @@ write_vim_spell(spin, fname)
put_bytes(fd, (long_u)0, 4); /* <sectionlen> */ put_bytes(fd, (long_u)0, 4); /* <sectionlen> */
} }
/* SN_NOCOMPUNDSUGS: nothing
* This is used to notify that no suggestions with compounds are to be
* made. */
if (spin->si_nocompoundsugs)
{
putc(SN_NOCOMPOUNDSUGS, fd); /* <sectionID> */
putc(0, fd); /* <sectionflags> */
put_bytes(fd, (long_u)0, 4); /* <sectionlen> */
}
/* SN_COMPOUND: compound info. /* SN_COMPOUND: compound info.
* We don't mark it required, when not supported all compound words will * We don't mark it required, when not supported all compound words will
* be bad words. */ * be bad words. */
@@ -11883,6 +11912,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
*/ */
try_compound = FALSE; try_compound = FALSE;
if (!soundfold if (!soundfold
&& !slang->sl_nocompoundsugs
&& slang->sl_compprog != NULL && slang->sl_compprog != NULL
&& ((unsigned)flags >> 24) != 0 && ((unsigned)flags >> 24) != 0
&& sp->ts_twordlen - sp->ts_splitoff && sp->ts_twordlen - sp->ts_splitoff
@@ -11907,7 +11937,7 @@ suggest_trie_walk(su, lp, fword, soundfold)
/* For NOBREAK we never try splitting, it won't make any word /* For NOBREAK we never try splitting, it won't make any word
* valid. */ * valid. */
if (slang->sl_nobreak) if (slang->sl_nobreak && !slang->sl_nocompoundsugs)
try_compound = TRUE; try_compound = TRUE;
/* If we could add a compound word, and it's also possible to /* If we could add a compound word, and it's also possible to

View File

@@ -741,6 +741,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1064,
/**/ /**/
1063, 1063,
/**/ /**/