# HG changeset patch # User Bram Moolenaar # Date 1643455802 -3600 # Node ID 674240fcf6decde5ad5423e1f9905f838162a4b7 # Parent 1118a65c9bc76129570af23e343f875c9ce77037 patch 8.2.4249: the timeout limit for spell suggestions is always 5000 Commit: https://github.com/vim/vim/commit/585ee07cfef307b2fc828537e0d31fdc22d7e79f Author: Bram Moolenaar Date: Sat Jan 29 11:22:17 2022 +0000 patch 8.2.4249: the timeout limit for spell suggestions is always 5000 Problem: The timeout limit for spell suggestions is always 5000 milli seconds. Solution: Add the "timeout" entry to 'spellsuggest'. diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -7363,6 +7363,12 @@ A jump table for the options with a shor suggestions is never more than the value of 'lines' minus two. + timeout:{millisec} Limit the time searching for suggestions to + {millisec} milli seconds. Applies to the following + methods. When omitted the limit is 5000. When + negative there is no limit. {only works when built + with the +reltime feature} + file:{filename} Read file {filename}, which must have two columns, separated by a slash. The first column contains the bad word, the second column the suggested good word. diff --git a/src/spellsuggest.c b/src/spellsuggest.c --- a/src/spellsuggest.c +++ b/src/spellsuggest.c @@ -197,6 +197,8 @@ typedef struct trystate_S #define PFD_PREFIXTREE 0xfe // walking through the prefix tree #define PFD_NOTSPECIAL 0xfd // highest value that's not special +static long spell_suggest_timeout = 5000; + static void spell_find_suggest(char_u *badptr, int badlen, suginfo_T *su, int maxcount, int banbadword, int need_cap, int interactive); #ifdef FEAT_EVAL static void spell_suggest_expr(suginfo_T *su, char_u *expr); @@ -429,7 +431,10 @@ spell_check_sps(void) else if (STRCMP(buf, "double") == 0) f = SPS_DOUBLE; else if (STRNCMP(buf, "expr:", 5) != 0 - && STRNCMP(buf, "file:", 5) != 0) + && STRNCMP(buf, "file:", 5) != 0 + && (STRNCMP(buf, "timeout:", 8) != 0 + || (!VIM_ISDIGIT(buf[8]) + && !(buf[8] == '-' && VIM_ISDIGIT(buf[9]))))) f = -1; if (f == -1 || (sps_flags != 0 && f != 0)) @@ -842,6 +847,7 @@ spell_find_suggest( sps_copy = vim_strsave(p_sps); if (sps_copy == NULL) return; + spell_suggest_timeout = 5000; // Loop over the items in 'spellsuggest'. for (p = sps_copy; *p != NUL; ) @@ -864,6 +870,9 @@ spell_find_suggest( else if (STRNCMP(buf, "file:", 5) == 0) // Use list of suggestions in a file. spell_suggest_file(su, buf + 5); + else if (STRNCMP(buf, "timeout:", 8) == 0) + // Limit the time searching for suggestions. + spell_suggest_timeout = atol((char *)buf + 8); else if (!did_intern) { // Use internal method once. @@ -1325,9 +1334,10 @@ suggest_trie_walk( } } #ifdef FEAT_RELTIME - // The loop may take an indefinite amount of time. Break out after five - // sectonds. TODO: add an option for the time limit. - profile_setlimit(5000, &time_limit); + // The loop may take an indefinite amount of time. Break out after some + // time. + if (spell_suggest_timeout > 0) + profile_setlimit(spell_suggest_timeout, &time_limit); #endif // Loop to find all suggestions. At each round we either: @@ -2659,7 +2669,8 @@ suggest_trie_walk( ui_breakcheck(); breakcheckcount = 1000; #ifdef FEAT_RELTIME - if (profile_passed_limit(&time_limit)) + if (spell_suggest_timeout > 0 + && profile_passed_limit(&time_limit)) got_int = TRUE; #endif } diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim --- a/src/testdir/test_spell.vim +++ b/src/testdir/test_spell.vim @@ -446,6 +446,16 @@ func Test_spellsuggest_expr_errors() delfunc MySuggest3 endfunc +func Test_spellsuggest_timeout() + set spellsuggest=timeout:30 + set spellsuggest=timeout:-123 + set spellsuggest=timeout:999999 + call assert_fails('set spellsuggest=timeout', 'E474:') + call assert_fails('set spellsuggest=timeout:x', 'E474:') + call assert_fails('set spellsuggest=timeout:-x', 'E474:') + call assert_fails('set spellsuggest=timeout:--9', 'E474:') +endfunc + func Test_spellinfo() new let runtime = substitute($VIMRUNTIME, '\\', '/', 'g') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4249, +/**/ 4248, /**/ 4247,