# HG changeset patch # User Bram Moolenaar # Date 1634476504 -7200 # Node ID ac330e2fecc401c49991d348e118d1057ea10973 # Parent b2a27d7a9427389dc81ecf02d589096778932b0f patch 8.2.3528: 'thesaurus' and 'thesaurusfunc' do not have the same scope Commit: https://github.com/vim/vim/commit/f4d8b76d304dabc39c06d2344cd4c7b28484811b Author: Bram Moolenaar Date: Sun Oct 17 14:13:09 2021 +0100 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. diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt --- a/runtime/doc/insert.txt +++ b/runtime/doc/insert.txt @@ -824,6 +824,9 @@ CTRL-X CTRL-K Search the files given wi CTRL-P Search backwards for next matching keyword. This keyword replaces the previous matching keyword. + +Completing words in 'thesaurus' *compl-thesaurus* + *i_CTRL-X_CTRL-T* 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 @@ -832,22 +835,6 @@ CTRL-X CTRL-T Works as CTRL-X CTRL-K, b matches, even though they don't complete the word. 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-N Search forward for next matching keyword. This keyword replaces the previous matching keyword. @@ -855,6 +842,61 @@ CTRL-X CTRL-T Works as CTRL-X CTRL-K, b CTRL-P Search backwards for next matching keyword. This 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 + + + 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* diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -8027,35 +8027,28 @@ A jump table for the options with a shor 'thesaurus' 'tsr' string (default "") global or local to buffer |global-local| List of file names, separated by commas, that are used to lookup words - for thesaurus completion commands |i_CTRL-X_CTRL-T|. - - 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. - - 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. + for thesaurus completion commands |i_CTRL-X_CTRL-T|. See + |compl-thesaurus|. + + This option is not used if 'thesaurusfunc' is set, either for the + buffer or globally. 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 - name. See |option-backslash| about using backslashes. - The use of |:set+=| and |:set-=| is preferred when adding or removing - directories from the list. This avoids problems when a future version - uses another default. - Backticks cannot be used in this option for security reasons. + name. See |option-backslash| about using backslashes. The use of + |:set+=| and |:set-=| is preferred when adding or removing directories + from the list. This avoids problems when a future version uses + another default. Backticks cannot be used in this option for security + reasons. *'thesaurusfunc'* *tsrfu'* 'thesaurusfunc' 'tsrfu' string (default: empty) - local to buffer + global or local to buffer |global-local| {not available when compiled without the |+eval| feature} This option specifies a function to be used for thesaurus completion - with CTRL-X CTRL-T. |i_CTRL-X_CTRL-T| - See |complete-functions| for an explanation of how the function is - invoked and what it should return. + with CTRL-X CTRL-T. |i_CTRL-X_CTRL-T| See |compl-thesaurusfunc|. + This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. diff --git a/src/insexpand.c b/src/insexpand.c --- a/src/insexpand.c +++ b/src/insexpand.c @@ -301,7 +301,7 @@ has_compl_option(int dict_opt) ) : (*curbuf->b_p_tsr == NUL && *p_tsr == NUL #ifdef FEAT_COMPL_FUNC - && *curbuf->b_p_tsrfu == NUL + && *curbuf->b_p_tsrfu == NUL && *p_tsrfu == NUL #endif )) { @@ -2246,7 +2246,7 @@ get_complete_funcname(int type) case CTRL_X_OMNI: return curbuf->b_p_ofu; case CTRL_X_THESAURUS: - return curbuf->b_p_tsrfu; + return *curbuf->b_p_tsrfu == NUL ? p_tsrfu : curbuf->b_p_tsrfu; default: return (char_u *)""; } @@ -2750,9 +2750,8 @@ f_complete_info(typval_T *argvars, typva thesaurus_func_complete(int type UNUSED) { #ifdef FEAT_COMPL_FUNC - return (type == CTRL_X_THESAURUS - && curbuf->b_p_tsrfu != NULL - && *curbuf->b_p_tsrfu != NUL); + return type == CTRL_X_THESAURUS + && (*curbuf->b_p_tsrfu != NUL || *p_tsrfu != NUL); #else return FALSE; #endif diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -5131,6 +5131,11 @@ unset_global_local_option(char_u *name, case PV_TSR: clear_string_option(&buf->b_p_tsr); break; +#ifdef FEAT_COMPL_FUNC + case PV_TSRFU: + clear_string_option(&buf->b_p_tsrfu); + break; +#endif case PV_FP: clear_string_option(&buf->b_p_fp); break; @@ -5225,6 +5230,9 @@ get_varp_scope(struct vimoption *p, int #endif case PV_DICT: return (char_u *)&(curbuf->b_p_dict); 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) case PV_BEXPR: return (char_u *)&(curbuf->b_p_bexpr); #endif @@ -5305,6 +5313,10 @@ get_varp(struct vimoption *p) ? (char_u *)&(curbuf->b_p_dict) : p->var; case PV_TSR: return *curbuf->b_p_tsr != NUL ? (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 ? (char_u *)&(curbuf->b_p_fp) : p->var; #ifdef FEAT_QUICKFIX @@ -5433,7 +5445,6 @@ get_varp(struct vimoption *p) #ifdef FEAT_COMPL_FUNC case PV_CFU: return (char_u *)&(curbuf->b_p_cfu); case PV_OFU: return (char_u *)&(curbuf->b_p_ofu); - case PV_THSFU: return (char_u *)&(curbuf->b_p_tsrfu); #endif #ifdef FEAT_EVAL 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); buf->b_p_ofu = vim_strsave(p_ofu); COPY_OPT_SCTX(buf, BV_OFU); - buf->b_p_tsrfu = vim_strsave(p_thsfu); - COPY_OPT_SCTX(buf, BV_THSFU); #endif #ifdef FEAT_EVAL buf->b_p_tfu = vim_strsave(p_tfu); @@ -6080,6 +6089,9 @@ buf_copy_options(buf_T *buf, int flags) #endif buf->b_p_dict = empty_option; buf->b_p_tsr = empty_option; +#ifdef FEAT_COMPL_FUNC + buf->b_p_tsrfu = empty_option; +#endif #ifdef FEAT_TEXTOBJ buf->b_p_qe = vim_strsave(p_qe); COPY_OPT_SCTX(buf, BV_QE); diff --git a/src/option.h b/src/option.h --- a/src/option.h +++ b/src/option.h @@ -404,7 +404,7 @@ EXTERN char_u *p_cinw; // 'cinwords' #ifdef FEAT_COMPL_FUNC EXTERN char_u *p_cfu; // 'completefunc' EXTERN char_u *p_ofu; // 'omnifunc' -EXTERN char_u *p_thsfu; // 'thesaurusfunc' +EXTERN char_u *p_tsrfu; // 'thesaurusfunc' #endif EXTERN int p_ci; // 'copyindent' #if defined(FEAT_GUI) && defined(MACOS_X) @@ -1222,7 +1222,7 @@ enum , BV_TAGS , BV_TC #ifdef FEAT_COMPL_FUNC - , BV_THSFU + , BV_TSRFU #endif , BV_TS , BV_TW diff --git a/src/optiondefs.h b/src/optiondefs.h --- a/src/optiondefs.h +++ b/src/optiondefs.h @@ -141,7 +141,7 @@ # define PV_TFU OPT_BUF(BV_TFU) #endif #ifdef FEAT_COMPL_FUNC -# define PV_THSFU OPT_BUF(BV_THSFU) +# define PV_TSRFU OPT_BOTH(OPT_BUF(BV_TSRFU)) #endif #define PV_TAGS OPT_BOTH(OPT_BUF(BV_TAGS)) #define PV_TC OPT_BOTH(OPT_BUF(BV_TC)) @@ -2634,7 +2634,7 @@ static struct vimoption options[] = {(char_u *)"", (char_u *)0L} SCTX_INIT}, {"thesaurusfunc", "tsrfu", P_STRING|P_ALLOCED|P_VI_DEF|P_SECURE, #ifdef FEAT_COMPL_FUNC - (char_u *)&p_thsfu, PV_THSFU, + (char_u *)&p_tsrfu, PV_TSRFU, {(char_u *)"", (char_u *)0L} #else (char_u *)NULL, PV_NONE, diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -2864,7 +2864,6 @@ struct file_buffer #ifdef FEAT_COMPL_FUNC char_u *b_p_cfu; // 'completefunc' char_u *b_p_ofu; // 'omnifunc' - char_u *b_p_tsrfu; // 'thesaurusfunc' #endif #ifdef FEAT_EVAL char_u *b_p_tfu; // 'tagfunc' @@ -2967,6 +2966,9 @@ struct file_buffer unsigned b_tc_flags; // flags for 'tagcase' char_u *b_p_dict; // 'dictionary' 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 #ifdef FEAT_PERSISTENT_UNDO int b_p_udf; // 'undofile' diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim --- a/src/testdir/test_edit.vim +++ b/src/testdir/test_edit.vim @@ -920,16 +920,24 @@ endfunc func Test_thesaurus_func() new - set thesaurus= - set thesaurusfunc=MyThesaurus + set thesaurus=notused + set thesaurusfunc=NotUsed + setlocal thesaurusfunc=MyThesaurus call setline(1, "an ki") call cursor(1, 1) call feedkeys("A\\\\\", 'tnix') call assert_equal(['an amiable', ''], getline(1, '$')) + + setlocal thesaurusfunc=NonExistingFunc + call assert_fails("normal $a\\", 'E117:') + + setlocal thesaurusfunc= set thesaurusfunc=NonExistingFunc call assert_fails("normal $a\\", 'E117:') - set thesaurusfunc& %bw! + + set thesaurusfunc= + set thesaurus= endfunc func Test_edit_CTRL_U() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -758,6 +758,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3528, +/**/ 3527, /**/ 3526,