mirror of
https://github.com/neovim/neovim.git
synced 2025-09-30 23:18:33 +00:00
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 vim/vim#6227)
152e79e94b
This commit is contained in:
@@ -8230,9 +8230,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.
|
|
||||||
|
|
||||||
*spellsuggest()*
|
*spellsuggest()*
|
||||||
spellsuggest({word} [, {max} [, {capital}]])
|
spellsuggest({word} [, {max} [, {capital}]])
|
||||||
@@ -8254,8 +8253,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.
|
|
||||||
|
|
||||||
|
|
||||||
split({expr} [, {pattern} [, {keepempty}]]) *split()*
|
split({expr} [, {pattern} [, {keepempty}]]) *split()*
|
||||||
|
@@ -9661,6 +9661,18 @@ static void f_spellbadword(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
const char *word = "";
|
const char *word = "";
|
||||||
hlf_T attr = HLF_COUNT;
|
hlf_T attr = HLF_COUNT;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
const 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;
|
||||||
|
}
|
||||||
|
|
||||||
if (argvars[0].v_type == VAR_UNKNOWN) {
|
if (argvars[0].v_type == VAR_UNKNOWN) {
|
||||||
// Find the start and length of the badly spelled word.
|
// Find the start and length of the badly spelled word.
|
||||||
@@ -9669,7 +9681,7 @@ static void f_spellbadword(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
word = (char *)get_cursor_pos_ptr();
|
word = (char *)get_cursor_pos_ptr();
|
||||||
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) {
|
||||||
const char *str = tv_get_string_chk(&argvars[0]);
|
const char *str = tv_get_string_chk(&argvars[0]);
|
||||||
int capcol = -1;
|
int capcol = -1;
|
||||||
|
|
||||||
@@ -9687,6 +9699,7 @@ static void f_spellbadword(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
curwin->w_p_spell = wo_spell_save;
|
||||||
|
|
||||||
assert(len <= INT_MAX);
|
assert(len <= INT_MAX);
|
||||||
tv_list_alloc_ret(rettv, 2);
|
tv_list_alloc_ret(rettv, 2);
|
||||||
@@ -9708,8 +9721,20 @@ static void f_spellsuggest(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
|||||||
int maxcount;
|
int maxcount;
|
||||||
garray_T ga = GA_EMPTY_INIT_VALUE;
|
garray_T ga = GA_EMPTY_INIT_VALUE;
|
||||||
bool need_capital = false;
|
bool need_capital = false;
|
||||||
|
const int wo_spell_save = curwin->w_p_spell;
|
||||||
|
|
||||||
if (curwin->w_p_spell && *curwin->w_s->b_p_spl != NUL) {
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*curwin->w_s->b_p_spl != NUL) {
|
||||||
const char *const str = tv_get_string(&argvars[0]);
|
const char *const str = tv_get_string(&argvars[0]);
|
||||||
if (argvars[1].v_type != VAR_UNKNOWN) {
|
if (argvars[1].v_type != VAR_UNKNOWN) {
|
||||||
maxcount = tv_get_number_chk(&argvars[1], &typeerr);
|
maxcount = tv_get_number_chk(&argvars[1], &typeerr);
|
||||||
@@ -9736,6 +9761,7 @@ f_spellsuggest_return:
|
|||||||
tv_list_append_allocated_string(rettv->vval.v_list, p);
|
tv_list_append_allocated_string(rettv->vval.v_list, p);
|
||||||
}
|
}
|
||||||
ga_clear(&ga);
|
ga_clear(&ga);
|
||||||
|
curwin->w_p_spell = wo_spell_save;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
static void f_split(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||||
|
@@ -878,6 +878,7 @@ EXTERN char_u e_invexpr2[] INIT(= N_("E15: Invalid expression: %s"));
|
|||||||
EXTERN char_u e_invrange[] INIT(= N_("E16: Invalid range"));
|
EXTERN char_u e_invrange[] INIT(= N_("E16: Invalid range"));
|
||||||
EXTERN char_u e_invcmd[] INIT(= N_("E476: Invalid command"));
|
EXTERN char_u e_invcmd[] INIT(= N_("E476: Invalid command"));
|
||||||
EXTERN char_u e_isadir2[] INIT(= N_("E17: \"%s\" is a directory"));
|
EXTERN char_u e_isadir2[] INIT(= N_("E17: \"%s\" is a directory"));
|
||||||
|
EXTERN char_u e_no_spell[] INIT(= N_("E756: Spell checking is not possible"));
|
||||||
EXTERN char_u e_invchan[] INIT(= N_("E900: Invalid channel id"));
|
EXTERN char_u e_invchan[] INIT(= N_("E900: Invalid channel id"));
|
||||||
EXTERN char_u e_invchanjob[] INIT(= N_("E900: Invalid channel id: not a job"));
|
EXTERN char_u e_invchanjob[] INIT(= N_("E900: Invalid channel id: not a job"));
|
||||||
EXTERN char_u e_jobtblfull[] INIT(= N_("E901: Job table is full"));
|
EXTERN char_u e_jobtblfull[] INIT(= N_("E901: Job table is full"));
|
||||||
|
@@ -1343,7 +1343,7 @@ static bool 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
|
||||||
|| GA_EMPTY(&wp->w_s->b_langp)) {
|
|| GA_EMPTY(&wp->w_s->b_langp)) {
|
||||||
EMSG(_("E756: Spell checking is not enabled"));
|
EMSG(_(e_no_spell));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -2771,9 +2771,17 @@ void 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;
|
||||||
|
const 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) {
|
||||||
// Use the Visually selected text as the bad word. But reject
|
// Use the Visually selected text as the bad word. But reject
|
||||||
@@ -2966,6 +2974,7 @@ void spell_suggest(int count)
|
|||||||
|
|
||||||
spell_find_cleanup(&sug);
|
spell_find_cleanup(&sug);
|
||||||
xfree(line);
|
xfree(line);
|
||||||
|
curwin->w_p_spell = wo_spell_save;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the word at line "lnum" column "col" is required to start with a
|
// Check if the word at line "lnum" column "col" is required to start with a
|
||||||
|
@@ -106,11 +106,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')
|
||||||
@@ -174,9 +177,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
|
||||||
|
|
||||||
@@ -204,6 +207,13 @@ func Test_spellsuggest()
|
|||||||
call assert_equal(['Third'], spellsuggest('THird', 1))
|
call assert_equal(['Third'], spellsuggest('THird', 1))
|
||||||
call assert_equal(['All'], spellsuggest('ALl', 1))
|
call assert_equal(['All'], spellsuggest('ALl', 1))
|
||||||
|
|
||||||
|
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&
|
set spell&
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -631,6 +641,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
|
||||||
|
Reference in New Issue
Block a user