1
0
forked from aniani/vim

patch 8.2.0945: cannot use "z=" when 'spell' is off

Problem:    Cannot use "z=" when 'spell' is off.
Solution:   Make "z=" work even when 'spell' is off. (Christian Brabandt,
            Gary Johnson, closes #6227)
This commit is contained in:
Bram Moolenaar
2020-06-10 15:32:08 +02:00
parent 253ea9fa42
commit 152e79e94b
7 changed files with 105 additions and 14 deletions

View File

@@ -9537,9 +9537,8 @@ spellbadword([{sentence}])
echo spellbadword("the quik brown fox") echo spellbadword("the quik brown fox")
< ['quik', 'bad'] ~ < ['quik', 'bad'] ~
The spelling information for the current window is used. The The spelling information for the current window and the value
'spell' option must be set and the value of 'spelllang' is of 'spelllang' are used.
used.
Can also be used as a |method|: > Can also be used as a |method|: >
GetText()->spellbadword() GetText()->spellbadword()
@@ -9564,8 +9563,7 @@ spellsuggest({word} [, {max} [, {capital}]])
although it may appear capitalized. although it may appear capitalized.
The spelling information for the current window is used. The The spelling information for the current window is used. The
'spell' option must be set and the values of 'spelllang' and values of 'spelllang' and 'spellsuggest' are used.
'spellsuggest' are used.
Can also be used as a |method|: > Can also be used as a |method|: >
GetWord()->spellsuggest() GetWord()->spellsuggest()

View File

@@ -7596,9 +7596,30 @@ f_spellbadword(typval_T *argvars UNUSED, typval_T *rettv)
char_u *word = (char_u *)""; char_u *word = (char_u *)"";
hlf_T attr = HLF_COUNT; hlf_T attr = HLF_COUNT;
int len = 0; 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) if (rettv_list_alloc(rettv) == FAIL)
{
#ifdef FEAT_SPELL
curwin->w_p_spell = wo_spell_save;
#endif
return; return;
}
#ifdef FEAT_SPELL #ifdef FEAT_SPELL
if (argvars[0].v_type == VAR_UNKNOWN) 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; 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]); char_u *str = tv_get_string_chk(&argvars[0]);
int capcol = -1; int capcol = -1;
@@ -7633,6 +7654,7 @@ f_spellbadword(typval_T *argvars UNUSED, typval_T *rettv)
} }
} }
} }
curwin->w_p_spell = wo_spell_save;
#endif #endif
list_append_string(rettv->vval.v_list, word, len); list_append_string(rettv->vval.v_list, word, len);
@@ -7658,13 +7680,32 @@ f_spellsuggest(typval_T *argvars UNUSED, typval_T *rettv)
int i; int i;
listitem_T *li; listitem_T *li;
int need_capital = FALSE; 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 #endif
if (rettv_list_alloc(rettv) == FAIL) if (rettv_list_alloc(rettv) == FAIL)
{
#ifdef FEAT_SPELL
curwin->w_p_spell = wo_spell_save;
#endif
return; return;
}
#ifdef FEAT_SPELL #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]); str = tv_get_string(&argvars[0]);
if (argvars[1].v_type != VAR_UNKNOWN) if (argvars[1].v_type != VAR_UNKNOWN)
@@ -7701,6 +7742,7 @@ f_spellsuggest(typval_T *argvars UNUSED, typval_T *rettv)
} }
ga_clear(&ga); ga_clear(&ga);
} }
curwin->w_p_spell = wo_spell_save;
#endif #endif
} }

View File

@@ -1581,6 +1581,9 @@ EXTERN char e_invcmd[] INIT(= N_("E476: Invalid command"));
#if defined(UNIX) || defined(FEAT_SYN_HL) || defined(FEAT_SPELL) #if defined(UNIX) || defined(FEAT_SYN_HL) || defined(FEAT_SPELL)
EXTERN char e_isadir2[] INIT(= N_("E17: \"%s\" is a directory")); EXTERN char e_isadir2[] INIT(= N_("E17: \"%s\" is a directory"));
#endif #endif
#ifdef FEAT_SPELL
EXTERN char e_no_spell[] INIT(= N_("E756: Spell checking is not possible"));
#endif
#ifdef FEAT_LIBCALL #ifdef FEAT_LIBCALL
EXTERN char e_libcall[] INIT(= N_("E364: Library call failed for \"%s()\"")); EXTERN char e_libcall[] INIT(= N_("E364: Library call failed for \"%s()\""));
#endif #endif

View File

@@ -1225,7 +1225,7 @@ no_spell_checking(win_T *wp)
if (!wp->w_p_spell || *wp->w_s->b_p_spl == NUL if (!wp->w_p_spell || *wp->w_s->b_p_spl == NUL
|| wp->w_s->b_langp.ga_len == 0) || wp->w_s->b_langp.ga_len == 0)
{ {
emsg(_("E756: Spell checking is not enabled")); emsg(_(e_no_spell));
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View File

@@ -471,9 +471,19 @@ spell_suggest(int count)
int selected = count; int selected = count;
int badlen = 0; int badlen = 0;
int msg_scroll_save = msg_scroll; 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; return;
}
if (VIsual_active) if (VIsual_active)
{ {
@@ -686,6 +696,7 @@ spell_suggest(int count)
spell_find_cleanup(&sug); spell_find_cleanup(&sug);
skip: skip:
vim_free(line); vim_free(line);
curwin->w_p_spell = wo_spell_save;
} }
/* /*

View File

@@ -99,11 +99,14 @@ foobar/?
set spelllang=Xwords.spl set spelllang=Xwords.spl
call assert_equal(['foobar', 'rare'], spellbadword('foo foobar')) 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 set spelllang=en_gb nospell
call assert_equal(['', ''], spellbadword('centre')) call assert_equal(['', ''], spellbadword('centre'))
call assert_equal(['', ''], spellbadword('My bycycle.')) call assert_equal(['bycycle', 'bad'], spellbadword('My bycycle.'))
call assert_equal(['', ''], spellbadword('A sentence. another sentence')) 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.spl')
call delete('Xwords') call delete('Xwords')
@@ -130,9 +133,9 @@ endfunc
" Test spellsuggest({word} [, {max} [, {capital}]]) " Test spellsuggest({word} [, {max} [, {capital}]])
func Test_spellsuggest() func Test_spellsuggest()
" No suggestions when spell checking is not enabled. " Verify suggestions are given even when spell checking is not enabled.
set nospell set nospell
call assert_equal([], spellsuggest('marrch')) call assert_equal(['march', 'March'], spellsuggest('marrch', 2))
set spell set spell
@@ -163,6 +166,10 @@ func Test_spellsuggest()
call assert_fails("call spellsuggest('maxch', [])", 'E745:') call assert_fails("call spellsuggest('maxch', [])", 'E745:')
call assert_fails("call spellsuggest('maxch', 2, [])", 'E745:') call assert_fails("call spellsuggest('maxch', 2, [])", 'E745:')
set spelllang=
call assert_fails("call spellsuggest('maxch')", 'E756:')
set spelllang&
set spell& set spell&
endfunc endfunc
@@ -617,6 +624,34 @@ func Test_zeq_crash()
bwipe! bwipe!
endfunc 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. " Check handling a word longer than MAXWLEN.
func Test_spell_long_word() func Test_spell_long_word()
set enc=utf-8 set enc=utf-8

View File

@@ -754,6 +754,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 */
/**/
945,
/**/ /**/
944, 944,
/**/ /**/