0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

patch 8.2.3528: 'thesaurus' and 'thesaurusfunc' do not have the same scope

Problem:    'thesaurus' and 'thesaurusfunc' do not have the same scope.
Solution:   Make 'thesaurusfunc' global-local.
This commit is contained in:
Bram Moolenaar
2021-10-17 14:13:09 +01:00
parent 9d4b8caf9e
commit f4d8b76d30
9 changed files with 109 additions and 51 deletions

View File

@@ -824,6 +824,9 @@ CTRL-X CTRL-K Search the files given with the 'dictionary' option
CTRL-P Search backwards for next matching keyword. This CTRL-P Search backwards for next matching keyword. This
keyword replaces the previous matching keyword. keyword replaces the previous matching keyword.
Completing words in 'thesaurus' *compl-thesaurus*
*i_CTRL-X_CTRL-T* *i_CTRL-X_CTRL-T*
CTRL-X CTRL-T Works as CTRL-X CTRL-K, but in a special way. It uses CTRL-X CTRL-T Works as CTRL-X CTRL-K, but in a special way. It uses
the 'thesaurus' option instead of 'dictionary'. If a the 'thesaurus' option instead of 'dictionary'. If a
@@ -832,22 +835,6 @@ CTRL-X CTRL-T Works as CTRL-X CTRL-K, but in a special way. It uses
matches, even though they don't complete the word. matches, even though they don't complete the word.
Thus a word can be completely replaced. Thus a word can be completely replaced.
For an example, imagine the 'thesaurus' file has a
line like this: >
angry furious mad enraged
< Placing the cursor after the letters "ang" and typing
CTRL-X CTRL-T would complete the word "angry";
subsequent presses would change the word to "furious",
"mad" etc.
Other uses include translation between two languages,
or grouping API functions by keyword.
If the 'thesaurusfunc' option is set, then the user
specified function is invoked to get the list of
completion matches and the 'thesaurus' option is not
used. See |complete-functions| for an explanation of
how the function is invoked and what it should return.
CTRL-T or CTRL-T or
CTRL-N Search forward for next matching keyword. This CTRL-N Search forward for next matching keyword. This
keyword replaces the previous matching keyword. keyword replaces the previous matching keyword.
@@ -855,6 +842,61 @@ CTRL-X CTRL-T Works as CTRL-X CTRL-K, but in a special way. It uses
CTRL-P Search backwards for next matching keyword. This CTRL-P Search backwards for next matching keyword. This
keyword replaces the previous matching keyword. keyword replaces the previous matching keyword.
In the file used by the 'thesaurus' option each line in the file should
contain words with similar meaning, separated by non-keyword characters (white
space is preferred). Maximum line length is 510 bytes.
For an example, imagine the 'thesaurus' file has a line like this: >
angry furious mad enraged
<Placing the cursor after the letters "ang" and typing CTRL-X CTRL-T would
complete the word "angry"; subsequent presses would change the word to
"furious", "mad" etc.
Other uses include translation between two languages, or grouping API
functions by keyword.
An English word list was added to this github issue:
https://github.com/vim/vim/issues/629#issuecomment-443293282
Unpack thesaurus_pkg.zip, put the thesaurus.txt file somewhere, e.g.
~/.vim/thesaurus/english.txt, and the 'thesaurus' option to this file name.
Completing keywords with 'thesaurusfunc' *compl-thesaurusfunc*
If the 'thesaurusfunc' option is set, then the user specified function is
invoked to get the list of completion matches and the 'thesaurus' option is
not used. See |complete-functions| for an explanation of how the function is
invoked and what it should return.
Here is an example that uses the "aiksaurus" command (provided by Magnus
Groß): >
func Thesaur(findstart, base)
if a:findstart
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~ '\a'
let start -= 1
endwhile
return start
else
let res = []
let h = ''
for l in split(system('aiksaurus '.shellescape(a:base)), '\n')
if l[:3] == '=== '
let h = substitute(l[4:], ' =*$', '', '')
elseif l[0] =~ '\a'
call extend(res, map(split(l, ', '), {_, val -> {'word': val, 'menu': '('.h.')'}}))
endif
endfor
return res
endif
endfunc
if has('patch-8.2.3520')
set thesaurusfunc=Thesaur
endif
Completing keywords in the current and included files *compl-keyword* Completing keywords in the current and included files *compl-keyword*

View File

@@ -8027,35 +8027,28 @@ A jump table for the options with a short description can be found at |Q_op|.
'thesaurus' 'tsr' string (default "") 'thesaurus' 'tsr' string (default "")
global or local to buffer |global-local| global or local to buffer |global-local|
List of file names, separated by commas, that are used to lookup words List of file names, separated by commas, that are used to lookup words
for thesaurus completion commands |i_CTRL-X_CTRL-T|. for thesaurus completion commands |i_CTRL-X_CTRL-T|. See
|compl-thesaurus|.
Each line in the file should contain words with similar meaning, This option is not used if 'thesaurusfunc' is set, either for the
separated by non-keyword characters (white space is preferred). buffer or globally.
Maximum line length is 510 bytes.
An English word list was added to this github issue:
https://github.com/vim/vim/issues/629#issuecomment-443293282
Unpack thesaurus_pkg.zip, put the thesaurus.txt file somewhere, e.g.
~/.vim/thesaurus/english.txt, and the 'thesaurus' option to this file
name.
To include a comma in a file name precede it with a backslash. Spaces To include a comma in a file name precede it with a backslash. Spaces
after a comma are ignored, otherwise spaces are included in the file after a comma are ignored, otherwise spaces are included in the file
name. See |option-backslash| about using backslashes. name. See |option-backslash| about using backslashes. The use of
The use of |:set+=| and |:set-=| is preferred when adding or removing |:set+=| and |:set-=| is preferred when adding or removing directories
directories from the list. This avoids problems when a future version from the list. This avoids problems when a future version uses
uses another default. another default. Backticks cannot be used in this option for security
Backticks cannot be used in this option for security reasons. reasons.
*'thesaurusfunc'* *tsrfu'* *'thesaurusfunc'* *tsrfu'*
'thesaurusfunc' 'tsrfu' string (default: empty) 'thesaurusfunc' 'tsrfu' string (default: empty)
local to buffer global or local to buffer |global-local|
{not available when compiled without the |+eval| {not available when compiled without the |+eval|
feature} feature}
This option specifies a function to be used for thesaurus completion This option specifies a function to be used for thesaurus completion
with CTRL-X CTRL-T. |i_CTRL-X_CTRL-T| with CTRL-X CTRL-T. |i_CTRL-X_CTRL-T| See |compl-thesaurusfunc|.
See |complete-functions| for an explanation of how the function is
invoked and what it should return.
This option cannot be set from a |modeline| or in the |sandbox|, for This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons. security reasons.

View File

@@ -301,7 +301,7 @@ has_compl_option(int dict_opt)
) )
: (*curbuf->b_p_tsr == NUL && *p_tsr == NUL : (*curbuf->b_p_tsr == NUL && *p_tsr == NUL
#ifdef FEAT_COMPL_FUNC #ifdef FEAT_COMPL_FUNC
&& *curbuf->b_p_tsrfu == NUL && *curbuf->b_p_tsrfu == NUL && *p_tsrfu == NUL
#endif #endif
)) ))
{ {
@@ -2246,7 +2246,7 @@ get_complete_funcname(int type)
case CTRL_X_OMNI: case CTRL_X_OMNI:
return curbuf->b_p_ofu; return curbuf->b_p_ofu;
case CTRL_X_THESAURUS: case CTRL_X_THESAURUS:
return curbuf->b_p_tsrfu; return *curbuf->b_p_tsrfu == NUL ? p_tsrfu : curbuf->b_p_tsrfu;
default: default:
return (char_u *)""; return (char_u *)"";
} }
@@ -2750,9 +2750,8 @@ f_complete_info(typval_T *argvars, typval_T *rettv)
thesaurus_func_complete(int type UNUSED) thesaurus_func_complete(int type UNUSED)
{ {
#ifdef FEAT_COMPL_FUNC #ifdef FEAT_COMPL_FUNC
return (type == CTRL_X_THESAURUS return type == CTRL_X_THESAURUS
&& curbuf->b_p_tsrfu != NULL && (*curbuf->b_p_tsrfu != NUL || *p_tsrfu != NUL);
&& *curbuf->b_p_tsrfu != NUL);
#else #else
return FALSE; return FALSE;
#endif #endif

View File

@@ -5131,6 +5131,11 @@ unset_global_local_option(char_u *name, void *from)
case PV_TSR: case PV_TSR:
clear_string_option(&buf->b_p_tsr); clear_string_option(&buf->b_p_tsr);
break; break;
#ifdef FEAT_COMPL_FUNC
case PV_TSRFU:
clear_string_option(&buf->b_p_tsrfu);
break;
#endif
case PV_FP: case PV_FP:
clear_string_option(&buf->b_p_fp); clear_string_option(&buf->b_p_fp);
break; break;
@@ -5225,6 +5230,9 @@ get_varp_scope(struct vimoption *p, int opt_flags)
#endif #endif
case PV_DICT: return (char_u *)&(curbuf->b_p_dict); case PV_DICT: return (char_u *)&(curbuf->b_p_dict);
case PV_TSR: return (char_u *)&(curbuf->b_p_tsr); case PV_TSR: return (char_u *)&(curbuf->b_p_tsr);
#ifdef FEAT_COMPL_FUNC
case PV_TSRFU: return (char_u *)&(curbuf->b_p_tsrfu);
#endif
#if defined(FEAT_BEVAL) && defined(FEAT_EVAL) #if defined(FEAT_BEVAL) && defined(FEAT_EVAL)
case PV_BEXPR: return (char_u *)&(curbuf->b_p_bexpr); case PV_BEXPR: return (char_u *)&(curbuf->b_p_bexpr);
#endif #endif
@@ -5305,6 +5313,10 @@ get_varp(struct vimoption *p)
? (char_u *)&(curbuf->b_p_dict) : p->var; ? (char_u *)&(curbuf->b_p_dict) : p->var;
case PV_TSR: return *curbuf->b_p_tsr != NUL case PV_TSR: return *curbuf->b_p_tsr != NUL
? (char_u *)&(curbuf->b_p_tsr) : p->var; ? (char_u *)&(curbuf->b_p_tsr) : p->var;
#ifdef FEAT_COMPL_FUNC
case PV_TSRFU: return *curbuf->b_p_tsrfu != NUL
? (char_u *)&(curbuf->b_p_tsrfu) : p->var;
#endif
case PV_FP: return *curbuf->b_p_fp != NUL case PV_FP: return *curbuf->b_p_fp != NUL
? (char_u *)&(curbuf->b_p_fp) : p->var; ? (char_u *)&(curbuf->b_p_fp) : p->var;
#ifdef FEAT_QUICKFIX #ifdef FEAT_QUICKFIX
@@ -5433,7 +5445,6 @@ get_varp(struct vimoption *p)
#ifdef FEAT_COMPL_FUNC #ifdef FEAT_COMPL_FUNC
case PV_CFU: return (char_u *)&(curbuf->b_p_cfu); case PV_CFU: return (char_u *)&(curbuf->b_p_cfu);
case PV_OFU: return (char_u *)&(curbuf->b_p_ofu); case PV_OFU: return (char_u *)&(curbuf->b_p_ofu);
case PV_THSFU: return (char_u *)&(curbuf->b_p_tsrfu);
#endif #endif
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
case PV_TFU: return (char_u *)&(curbuf->b_p_tfu); case PV_TFU: return (char_u *)&(curbuf->b_p_tfu);
@@ -5936,8 +5947,6 @@ buf_copy_options(buf_T *buf, int flags)
COPY_OPT_SCTX(buf, BV_CFU); COPY_OPT_SCTX(buf, BV_CFU);
buf->b_p_ofu = vim_strsave(p_ofu); buf->b_p_ofu = vim_strsave(p_ofu);
COPY_OPT_SCTX(buf, BV_OFU); COPY_OPT_SCTX(buf, BV_OFU);
buf->b_p_tsrfu = vim_strsave(p_thsfu);
COPY_OPT_SCTX(buf, BV_THSFU);
#endif #endif
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
buf->b_p_tfu = vim_strsave(p_tfu); buf->b_p_tfu = vim_strsave(p_tfu);
@@ -6080,6 +6089,9 @@ buf_copy_options(buf_T *buf, int flags)
#endif #endif
buf->b_p_dict = empty_option; buf->b_p_dict = empty_option;
buf->b_p_tsr = empty_option; buf->b_p_tsr = empty_option;
#ifdef FEAT_COMPL_FUNC
buf->b_p_tsrfu = empty_option;
#endif
#ifdef FEAT_TEXTOBJ #ifdef FEAT_TEXTOBJ
buf->b_p_qe = vim_strsave(p_qe); buf->b_p_qe = vim_strsave(p_qe);
COPY_OPT_SCTX(buf, BV_QE); COPY_OPT_SCTX(buf, BV_QE);

View File

@@ -404,7 +404,7 @@ EXTERN char_u *p_cinw; // 'cinwords'
#ifdef FEAT_COMPL_FUNC #ifdef FEAT_COMPL_FUNC
EXTERN char_u *p_cfu; // 'completefunc' EXTERN char_u *p_cfu; // 'completefunc'
EXTERN char_u *p_ofu; // 'omnifunc' EXTERN char_u *p_ofu; // 'omnifunc'
EXTERN char_u *p_thsfu; // 'thesaurusfunc' EXTERN char_u *p_tsrfu; // 'thesaurusfunc'
#endif #endif
EXTERN int p_ci; // 'copyindent' EXTERN int p_ci; // 'copyindent'
#if defined(FEAT_GUI) && defined(MACOS_X) #if defined(FEAT_GUI) && defined(MACOS_X)
@@ -1222,7 +1222,7 @@ enum
, BV_TAGS , BV_TAGS
, BV_TC , BV_TC
#ifdef FEAT_COMPL_FUNC #ifdef FEAT_COMPL_FUNC
, BV_THSFU , BV_TSRFU
#endif #endif
, BV_TS , BV_TS
, BV_TW , BV_TW

View File

@@ -141,7 +141,7 @@
# define PV_TFU OPT_BUF(BV_TFU) # define PV_TFU OPT_BUF(BV_TFU)
#endif #endif
#ifdef FEAT_COMPL_FUNC #ifdef FEAT_COMPL_FUNC
# define PV_THSFU OPT_BUF(BV_THSFU) # define PV_TSRFU OPT_BOTH(OPT_BUF(BV_TSRFU))
#endif #endif
#define PV_TAGS OPT_BOTH(OPT_BUF(BV_TAGS)) #define PV_TAGS OPT_BOTH(OPT_BUF(BV_TAGS))
#define PV_TC OPT_BOTH(OPT_BUF(BV_TC)) #define PV_TC OPT_BOTH(OPT_BUF(BV_TC))
@@ -2634,7 +2634,7 @@ static struct vimoption options[] =
{(char_u *)"", (char_u *)0L} SCTX_INIT}, {(char_u *)"", (char_u *)0L} SCTX_INIT},
{"thesaurusfunc", "tsrfu", P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE, {"thesaurusfunc", "tsrfu", P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE,
#ifdef FEAT_COMPL_FUNC #ifdef FEAT_COMPL_FUNC
(char_u *)&p_thsfu, PV_THSFU, (char_u *)&p_tsrfu, PV_TSRFU,
{(char_u *)"", (char_u *)0L} {(char_u *)"", (char_u *)0L}
#else #else
(char_u *)NULL, PV_NONE, (char_u *)NULL, PV_NONE,

View File

@@ -2864,7 +2864,6 @@ struct file_buffer
#ifdef FEAT_COMPL_FUNC #ifdef FEAT_COMPL_FUNC
char_u *b_p_cfu; // 'completefunc' char_u *b_p_cfu; // 'completefunc'
char_u *b_p_ofu; // 'omnifunc' char_u *b_p_ofu; // 'omnifunc'
char_u *b_p_tsrfu; // 'thesaurusfunc'
#endif #endif
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
char_u *b_p_tfu; // 'tagfunc' char_u *b_p_tfu; // 'tagfunc'
@@ -2967,6 +2966,9 @@ struct file_buffer
unsigned b_tc_flags; // flags for 'tagcase' unsigned b_tc_flags; // flags for 'tagcase'
char_u *b_p_dict; // 'dictionary' local value char_u *b_p_dict; // 'dictionary' local value
char_u *b_p_tsr; // 'thesaurus' local value char_u *b_p_tsr; // 'thesaurus' local value
#ifdef FEAT_COMPL_FUNC
char_u *b_p_tsrfu; // 'thesaurusfunc' local value
#endif
long b_p_ul; // 'undolevels' local value long b_p_ul; // 'undolevels' local value
#ifdef FEAT_PERSISTENT_UNDO #ifdef FEAT_PERSISTENT_UNDO
int b_p_udf; // 'undofile' int b_p_udf; // 'undofile'

View File

@@ -920,16 +920,24 @@ endfunc
func Test_thesaurus_func() func Test_thesaurus_func()
new new
set thesaurus= set thesaurus=notused
set thesaurusfunc=MyThesaurus set thesaurusfunc=NotUsed
setlocal thesaurusfunc=MyThesaurus
call setline(1, "an ki") call setline(1, "an ki")
call cursor(1, 1) call cursor(1, 1)
call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix') call feedkeys("A\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
call assert_equal(['an amiable', ''], getline(1, '$')) call assert_equal(['an amiable', ''], getline(1, '$'))
setlocal thesaurusfunc=NonExistingFunc
call assert_fails("normal $a\<C-X>\<C-T>", 'E117:')
setlocal thesaurusfunc=
set thesaurusfunc=NonExistingFunc set thesaurusfunc=NonExistingFunc
call assert_fails("normal $a\<C-X>\<C-T>", 'E117:') call assert_fails("normal $a\<C-X>\<C-T>", 'E117:')
set thesaurusfunc&
%bw! %bw!
set thesaurusfunc=
set thesaurus=
endfunc endfunc
func Test_edit_CTRL_U() func Test_edit_CTRL_U()

View File

@@ -757,6 +757,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 */
/**/
3528,
/**/ /**/
3527, 3527,
/**/ /**/