To: vim_dev@googlegroups.com Subject: Patch 8.2.4249 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4249 Problem: The timeout limit for spell suggestions is always 5000 milli seconds. Solution: Add the "timeout" entry to 'spellsuggest'. Files: runtime/doc/options.txt, src/spellsuggest.c, src/testdir/test_spell.vim *** ../vim-8.2.4248/runtime/doc/options.txt 2022-01-15 10:00:59.576603900 +0000 --- runtime/doc/options.txt 2022-01-29 11:15:32.006269608 +0000 *************** *** 7348,7353 **** --- 7372,7383 ---- 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. *** ../vim-8.2.4248/src/spellsuggest.c 2022-01-29 10:51:54.945759266 +0000 --- src/spellsuggest.c 2022-01-29 11:20:21.501470791 +0000 *************** *** 197,202 **** --- 197,204 ---- #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,435 **** else if (STRCMP(buf, "double") == 0) f = SPS_DOUBLE; else if (STRNCMP(buf, "expr:", 5) != 0 ! && STRNCMP(buf, "file:", 5) != 0) f = -1; if (f == -1 || (sps_flags != 0 && f != 0)) --- 431,440 ---- else if (STRCMP(buf, "double") == 0) f = SPS_DOUBLE; else if (STRNCMP(buf, "expr:", 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,847 **** --- 847,853 ---- 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,869 **** --- 870,878 ---- 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,1333 **** } } #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); #endif // Loop to find all suggestions. At each round we either: --- 1334,1343 ---- } } #ifdef FEAT_RELTIME ! // 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,2665 **** ui_breakcheck(); breakcheckcount = 1000; #ifdef FEAT_RELTIME ! if (profile_passed_limit(&time_limit)) got_int = TRUE; #endif } --- 2669,2676 ---- ui_breakcheck(); breakcheckcount = 1000; #ifdef FEAT_RELTIME ! if (spell_suggest_timeout > 0 ! && profile_passed_limit(&time_limit)) got_int = TRUE; #endif } *** ../vim-8.2.4248/src/testdir/test_spell.vim 2022-01-29 10:51:54.949759202 +0000 --- src/testdir/test_spell.vim 2022-01-29 11:20:58.868851404 +0000 *************** *** 446,451 **** --- 446,461 ---- 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') *** ../vim-8.2.4248/src/version.c 2022-01-29 10:59:48.505909435 +0000 --- src/version.c 2022-01-29 11:21:26.788388588 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4249, /**/ -- Kiss me twice. I'm schizophrenic. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///