1
0
forked from aniani/vim

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
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, but in a special way. It uses
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, but in a special way. It uses
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
<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*

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 "")
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|.
for thesaurus completion commands |i_CTRL-X_CTRL-T|. See
|compl-thesaurus|.
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.
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.

View File

@@ -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, typval_T *rettv)
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

View File

@@ -5131,6 +5131,11 @@ unset_global_local_option(char_u *name, void *from)
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 opt_flags)
#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);

View File

@@ -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

View File

@@ -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,

View File

@@ -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'

View File

@@ -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\<c-x>\<c-t>\<c-n>\<cr>\<esc>", 'tnix')
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
call assert_fails("normal $a\<C-X>\<C-T>", 'E117:')
set thesaurusfunc&
%bw!
set thesaurusfunc=
set thesaurus=
endfunc
func Test_edit_CTRL_U()

View File

@@ -757,6 +757,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3528,
/**/
3527,
/**/