diff options
-rw-r--r-- | runtime/doc/eval.txt | 8 | ||||
-rw-r--r-- | src/evalfunc.c | 46 | ||||
-rw-r--r-- | src/globals.h | 3 | ||||
-rw-r--r-- | src/spell.c | 2 | ||||
-rw-r--r-- | src/spellsuggest.c | 13 | ||||
-rw-r--r-- | src/testdir/test_spell.vim | 45 | ||||
-rw-r--r-- | src/version.c | 2 |
7 files changed, 105 insertions, 14 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index f3e240aa0..78588bfd3 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -9537,9 +9537,8 @@ spellbadword([{sentence}]) echo spellbadword("the quik brown fox") < ['quik', 'bad'] ~ - The spelling information for the current window is used. The - 'spell' option must be set and the value of 'spelllang' is - used. + The spelling information for the current window and the value + of 'spelllang' are used. Can also be used as a |method|: > GetText()->spellbadword() @@ -9564,8 +9563,7 @@ spellsuggest({word} [, {max} [, {capital}]]) although it may appear capitalized. The spelling information for the current window is used. The - 'spell' option must be set and the values of 'spelllang' and - 'spellsuggest' are used. + values of 'spelllang' and 'spellsuggest' are used. Can also be used as a |method|: > GetWord()->spellsuggest() diff --git a/src/evalfunc.c b/src/evalfunc.c index e67aa5848..1f5309510 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -7596,9 +7596,30 @@ f_spellbadword(typval_T *argvars UNUSED, typval_T *rettv) char_u *word = (char_u *)""; hlf_T attr = HLF_COUNT; int len = 0; +#ifdef FEAT_SPELL + int wo_spell_save = curwin->w_p_spell; + + if (!curwin->w_p_spell) + { + did_set_spelllang(curwin); + curwin->w_p_spell = TRUE; + } + + if (*curwin->w_s->b_p_spl == NUL) + { + emsg(_(e_no_spell)); + curwin->w_p_spell = wo_spell_save; + return; + } +#endif if (rettv_list_alloc(rettv) == FAIL) + { +#ifdef FEAT_SPELL + curwin->w_p_spell = wo_spell_save; +#endif return; + } #ifdef FEAT_SPELL if (argvars[0].v_type == VAR_UNKNOWN) @@ -7611,7 +7632,7 @@ f_spellbadword(typval_T *argvars UNUSED, typval_T *rettv) curwin->w_set_curswant = TRUE; } } - else if (curwin->w_p_spell && *curbuf->b_s.b_p_spl != NUL) + else if (*curbuf->b_s.b_p_spl != NUL) { char_u *str = tv_get_string_chk(&argvars[0]); int capcol = -1; @@ -7633,6 +7654,7 @@ f_spellbadword(typval_T *argvars UNUSED, typval_T *rettv) } } } + curwin->w_p_spell = wo_spell_save; #endif list_append_string(rettv->vval.v_list, word, len); @@ -7658,13 +7680,32 @@ f_spellsuggest(typval_T *argvars UNUSED, typval_T *rettv) int i; listitem_T *li; int need_capital = FALSE; + int wo_spell_save = curwin->w_p_spell; + + if (!curwin->w_p_spell) + { + did_set_spelllang(curwin); + curwin->w_p_spell = TRUE; + } + + if (*curwin->w_s->b_p_spl == NUL) + { + emsg(_(e_no_spell)); + curwin->w_p_spell = wo_spell_save; + return; + } #endif if (rettv_list_alloc(rettv) == FAIL) + { +#ifdef FEAT_SPELL + curwin->w_p_spell = wo_spell_save; +#endif return; + } #ifdef FEAT_SPELL - if (curwin->w_p_spell && *curwin->w_s->b_p_spl != NUL) + if (*curwin->w_s->b_p_spl != NUL) { str = tv_get_string(&argvars[0]); if (argvars[1].v_type != VAR_UNKNOWN) @@ -7701,6 +7742,7 @@ f_spellsuggest(typval_T *argvars UNUSED, typval_T *rettv) } ga_clear(&ga); } + curwin->w_p_spell = wo_spell_save; #endif } diff --git a/src/globals.h b/src/globals.h index 66b204b41..27a8d6814 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1581,6 +1581,9 @@ EXTERN char e_invcmd[] INIT(= N_("E476: Invalid command")); #if defined(UNIX) || defined(FEAT_SYN_HL) || defined(FEAT_SPELL) EXTERN char e_isadir2[] INIT(= N_("E17: \"%s\" is a directory")); #endif +#ifdef FEAT_SPELL +EXTERN char e_no_spell[] INIT(= N_("E756: Spell checking is not possible")); +#endif #ifdef FEAT_LIBCALL EXTERN char e_libcall[] INIT(= N_("E364: Library call failed for \"%s()\"")); #endif diff --git a/src/spell.c b/src/spell.c index cdb8e2ff0..102355f7c 100644 --- a/src/spell.c +++ b/src/spell.c @@ -1225,7 +1225,7 @@ no_spell_checking(win_T *wp) if (!wp->w_p_spell || *wp->w_s->b_p_spl == NUL || wp->w_s->b_langp.ga_len == 0) { - emsg(_("E756: Spell checking is not enabled")); + emsg(_(e_no_spell)); return TRUE; } return FALSE; diff --git a/src/spellsuggest.c b/src/spellsuggest.c index c1ead7cce..c03233f52 100644 --- a/src/spellsuggest.c +++ b/src/spellsuggest.c @@ -471,9 +471,19 @@ spell_suggest(int count) int selected = count; int badlen = 0; int msg_scroll_save = msg_scroll; + int wo_spell_save = curwin->w_p_spell; - if (no_spell_checking(curwin)) + if (!curwin->w_p_spell) + { + did_set_spelllang(curwin); + curwin->w_p_spell = TRUE; + } + + if (*curwin->w_s->b_p_spl == NUL) + { + emsg(_(e_no_spell)); return; + } if (VIsual_active) { @@ -686,6 +696,7 @@ spell_suggest(int count) spell_find_cleanup(&sug); skip: vim_free(line); + curwin->w_p_spell = wo_spell_save; } /* diff --git a/src/testdir/test_spell.vim b/src/testdir/test_spell.vim index 4e376b810..7cc209bc8 100644 --- a/src/testdir/test_spell.vim +++ b/src/testdir/test_spell.vim @@ -99,11 +99,14 @@ foobar/? set spelllang=Xwords.spl call assert_equal(['foobar', 'rare'], spellbadword('foo foobar')) - " Typo should not be detected without the 'spell' option. + " Typo should be detected even without the 'spell' option. set spelllang=en_gb nospell call assert_equal(['', ''], spellbadword('centre')) - call assert_equal(['', ''], spellbadword('My bycycle.')) - call assert_equal(['', ''], spellbadword('A sentence. another sentence')) + call assert_equal(['bycycle', 'bad'], spellbadword('My bycycle.')) + call assert_equal(['another', 'caps'], spellbadword('A sentence. another sentence')) + + set spelllang= + call assert_fails("call spellbadword('maxch')", 'E756:') call delete('Xwords.spl') call delete('Xwords') @@ -130,9 +133,9 @@ endfunc " Test spellsuggest({word} [, {max} [, {capital}]]) func Test_spellsuggest() - " No suggestions when spell checking is not enabled. + " Verify suggestions are given even when spell checking is not enabled. set nospell - call assert_equal([], spellsuggest('marrch')) + call assert_equal(['march', 'March'], spellsuggest('marrch', 2)) set spell @@ -163,6 +166,10 @@ func Test_spellsuggest() call assert_fails("call spellsuggest('maxch', [])", 'E745:') call assert_fails("call spellsuggest('maxch', 2, [])", 'E745:') + set spelllang= + call assert_fails("call spellsuggest('maxch')", 'E756:') + set spelllang& + set spell& endfunc @@ -617,6 +624,34 @@ func Test_zeq_crash() bwipe! endfunc +" Check that z= works even when 'nospell' is set. This test uses one of the +" tests in Test_spellsuggest_option_number() just to verify that z= basically +" works and that "E756: Spell checking is not enabled" is not generated. +func Test_zeq_nospell() + new + set nospell spellsuggest=1,best + call setline(1, 'A baord') + try + norm $1z= + call assert_equal('A board', getline(1)) + catch + call assert_report("Caught exception: " . v:exception) + endtry + set spell& spellsuggest& + bwipe! +endfunc + +" Check that "E756: Spell checking is not possible" is reported when z= is +" executed and 'spelllang' is empty. +func Test_zeq_no_spelllang() + new + set spelllang= spellsuggest=1,best + call setline(1, 'A baord') + call assert_fails('normal $1z=', 'E756:') + set spelllang& spellsuggest& + bwipe! +endfunc + " Check handling a word longer than MAXWLEN. func Test_spell_long_word() set enc=utf-8 diff --git a/src/version.c b/src/version.c index e0848174f..30106ff00 100644 --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 945, +/**/ 944, /**/ 943, |