Mercurial > vim
changeset 27441:674240fcf6de v8.2.4249
patch 8.2.4249: the timeout limit for spell suggestions is always 5000
Commit: https://github.com/vim/vim/commit/585ee07cfef307b2fc828537e0d31fdc22d7e79f
Author: Bram Moolenaar <Bram@vim.org>
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'.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 29 Jan 2022 12:30:02 +0100 |
parents | 1118a65c9bc7 |
children | b967aa552f64 |
files | runtime/doc/options.txt src/spellsuggest.c src/testdir/test_spell.vim src/version.c |
diffstat | 4 files changed, 34 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- 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.
--- 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 }
--- 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')