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:
@@ -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:
|
||||||
|
50
src/spell.c
50
src/spell.c
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user