mirror of
https://github.com/neovim/neovim.git
synced 2026-08-29 10:31:48 +00:00
vim-patch:8.2.3900: it is not easy to use a script-local function for an option
Problem: It is not easy to use a script-local function for an option.
Solution: recognize s: and <SID> at the start of the expression. (Yegappan
Lakshmanan, closes vim/vim#9401)
8bb65f230d
Omit duplicate docs in fold.txt: removed in a later runtime update.
Cherry-pick test_diffmode.vim changes from patch 8.2.1432.
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
This commit is contained in:
@@ -711,7 +711,7 @@ void eval_patch(const char *const origfile, const char *const difffile, const ch
|
||||
set_vim_var_string(VV_FNAME_IN, origfile, -1);
|
||||
set_vim_var_string(VV_FNAME_DIFF, difffile, -1);
|
||||
set_vim_var_string(VV_FNAME_OUT, outfile, -1);
|
||||
(void)eval_to_bool((char *)p_pex, &err, NULL, false);
|
||||
(void)eval_to_bool(p_pex, &err, NULL, false);
|
||||
set_vim_var_string(VV_FNAME_IN, NULL, -1);
|
||||
set_vim_var_string(VV_FNAME_DIFF, NULL, -1);
|
||||
set_vim_var_string(VV_FNAME_OUT, NULL, -1);
|
||||
|
||||
@@ -622,7 +622,7 @@ EXTERN char *p_opfunc; // 'operatorfunc'
|
||||
EXTERN char_u *p_para; // 'paragraphs'
|
||||
EXTERN int p_paste; // 'paste'
|
||||
EXTERN char *p_pt; // 'pastetoggle'
|
||||
EXTERN char_u *p_pex; // 'patchexpr'
|
||||
EXTERN char *p_pex; // 'patchexpr'
|
||||
EXTERN char *p_pm; // 'patchmode'
|
||||
EXTERN char_u *p_path; // 'path'
|
||||
EXTERN char_u *p_cdpath; // 'cdpath'
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "nvim/drawscreen.h"
|
||||
#include "nvim/eval.h"
|
||||
#include "nvim/eval/typval_defs.h"
|
||||
#include "nvim/eval/userfunc.h"
|
||||
#include "nvim/eval/vars.h"
|
||||
#include "nvim/ex_getln.h"
|
||||
#include "nvim/fold.h"
|
||||
@@ -1341,10 +1342,6 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf
|
||||
newFoldLevel();
|
||||
}
|
||||
}
|
||||
} else if (varp == &curwin->w_p_fde) { // 'foldexpr'
|
||||
if (foldmethodIsExpr(curwin)) {
|
||||
foldUpdateAll(curwin);
|
||||
}
|
||||
} else if (gvarp == &curwin->w_allbuf_opt.wo_fmr) { // 'foldmarker'
|
||||
p = vim_strchr(*varp, ',');
|
||||
if (p == NULL) {
|
||||
@@ -1484,6 +1481,51 @@ char *did_set_string_option(int opt_idx, char **varp, char *oldval, char *errbuf
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (varp == &p_dex
|
||||
|| varp == &curwin->w_p_fde
|
||||
|| gvarp == &p_fex
|
||||
|| gvarp == &p_inex
|
||||
|| gvarp == &p_inde
|
||||
|| varp == &p_pex
|
||||
|| varp == &p_pexpr) { // '*expr' options
|
||||
char **p_opt = NULL;
|
||||
|
||||
// If the option value starts with <SID> or s:, then replace that with
|
||||
// the script identifier.
|
||||
|
||||
if (varp == &p_dex) { // 'diffexpr'
|
||||
p_opt = &p_dex;
|
||||
}
|
||||
if (varp == &curwin->w_p_fde) { // 'foldexpr'
|
||||
p_opt = &curwin->w_p_fde;
|
||||
}
|
||||
if (gvarp == &p_fex) { // 'formatexpr'
|
||||
p_opt = &curbuf->b_p_fex;
|
||||
}
|
||||
if (gvarp == &p_inex) { // 'includeexpr'
|
||||
p_opt = &curbuf->b_p_inex;
|
||||
}
|
||||
if (gvarp == &p_inde) { // 'indentexpr'
|
||||
p_opt = &curbuf->b_p_inde;
|
||||
}
|
||||
if (varp == &p_pex) { // 'patchexpr'
|
||||
p_opt = &p_pex;
|
||||
}
|
||||
if (varp == &p_pexpr) { // 'printexpr'
|
||||
p_opt = &p_pexpr;
|
||||
}
|
||||
|
||||
if (p_opt != NULL) {
|
||||
char *name = get_scriptlocal_funcname(*p_opt);
|
||||
if (name != NULL) {
|
||||
free_string_option(*p_opt);
|
||||
*p_opt = name;
|
||||
}
|
||||
}
|
||||
|
||||
if (varp == &curwin->w_p_fde && foldmethodIsExpr(curwin)) {
|
||||
foldUpdateAll(curwin);
|
||||
}
|
||||
} else if (gvarp == &p_cfu) { // 'completefunc'
|
||||
if (set_completefunc_option() == FAIL) {
|
||||
errmsg = e_invarg;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
" Tests for diff mode
|
||||
|
||||
source shared.vim
|
||||
source screendump.vim
|
||||
source check.vim
|
||||
@@ -681,15 +682,25 @@ func Test_diffexpr()
|
||||
set diffexpr=NewDiffFunc()
|
||||
call assert_fails('windo diffthis', ['E117:', 'E97:'])
|
||||
diffoff!
|
||||
|
||||
" Using a script-local function
|
||||
func s:NewDiffExpr()
|
||||
endfunc
|
||||
set diffexpr=s:NewDiffExpr()
|
||||
call assert_equal(expand('<SID>') .. 'NewDiffExpr()', &diffexpr)
|
||||
set diffexpr=<SID>NewDiffExpr()
|
||||
call assert_equal(expand('<SID>') .. 'NewDiffExpr()', &diffexpr)
|
||||
|
||||
%bwipe!
|
||||
set diffexpr& diffopt&
|
||||
delfunc DiffExpr
|
||||
delfunc s:NewDiffExpr
|
||||
endfunc
|
||||
|
||||
func Test_diffpatch()
|
||||
" The patch program on MS-Windows may fail or hang.
|
||||
if !executable('patch') || !has('unix')
|
||||
return
|
||||
endif
|
||||
CheckExecutable patch
|
||||
CheckUnix
|
||||
new
|
||||
insert
|
||||
***************
|
||||
@@ -1250,10 +1261,19 @@ func Test_patchexpr()
|
||||
call assert_equal(2, winnr('$'))
|
||||
call assert_true(&diff)
|
||||
|
||||
" Using a script-local function
|
||||
func s:NewPatchExpr()
|
||||
endfunc
|
||||
set patchexpr=s:NewPatchExpr()
|
||||
call assert_equal(expand('<SID>') .. 'NewPatchExpr()', &patchexpr)
|
||||
set patchexpr=<SID>NewPatchExpr()
|
||||
call assert_equal(expand('<SID>') .. 'NewPatchExpr()', &patchexpr)
|
||||
|
||||
call delete('Xinput')
|
||||
call delete('Xdiff')
|
||||
set patchexpr&
|
||||
delfunc TPatch
|
||||
delfunc s:NewPatchExpr
|
||||
%bwipe!
|
||||
endfunc
|
||||
|
||||
|
||||
@@ -330,6 +330,16 @@ func Test_edit_11_indentexpr()
|
||||
set cinkeys&vim indentkeys&vim
|
||||
set nocindent indentexpr=
|
||||
delfu Do_Indent
|
||||
|
||||
" Using a script-local function
|
||||
func s:NewIndentExpr()
|
||||
endfunc
|
||||
set indentexpr=s:NewIndentExpr()
|
||||
call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr)
|
||||
set indentexpr=<SID>NewIndentExpr()
|
||||
call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr)
|
||||
set indentexpr&
|
||||
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
|
||||
@@ -1273,6 +1273,32 @@ func Test_fold_jump()
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
" Test for using a script-local function for 'foldexpr'
|
||||
func Test_foldexpr_scriptlocal_func()
|
||||
func! s:FoldFunc()
|
||||
let g:FoldLnum = v:lnum
|
||||
endfunc
|
||||
new | only
|
||||
call setline(1, 'abc')
|
||||
let g:FoldLnum = 0
|
||||
set foldmethod=expr foldexpr=s:FoldFunc()
|
||||
redraw!
|
||||
call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr)
|
||||
call assert_equal(1, g:FoldLnum)
|
||||
set foldmethod& foldexpr=
|
||||
bw!
|
||||
new | only
|
||||
call setline(1, 'abc')
|
||||
let g:FoldLnum = 0
|
||||
set foldmethod=expr foldexpr=<SID>FoldFunc()
|
||||
redraw!
|
||||
call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr)
|
||||
call assert_equal(1, g:FoldLnum)
|
||||
set foldmethod& foldexpr=
|
||||
delfunc s:FoldFunc
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
" Make sure a fold containing a nested fold is split correctly when using
|
||||
" foldmethod=indent
|
||||
func Test_fold_split()
|
||||
|
||||
@@ -226,6 +226,32 @@ func Test_gf_includeexpr()
|
||||
delfunc IncFunc
|
||||
endfunc
|
||||
|
||||
" Test for using a script-local function for 'includeexpr'
|
||||
func Test_includeexpr_scriptlocal_func()
|
||||
func! s:IncludeFunc()
|
||||
let g:IncludeFname = v:fname
|
||||
return ''
|
||||
endfunc
|
||||
set includeexpr=s:IncludeFunc()
|
||||
call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr)
|
||||
new | only
|
||||
call setline(1, 'TestFile1')
|
||||
let g:IncludeFname = ''
|
||||
call assert_fails('normal! gf', 'E447:')
|
||||
call assert_equal('TestFile1', g:IncludeFname)
|
||||
bw!
|
||||
set includeexpr=<SID>IncludeFunc()
|
||||
call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr)
|
||||
new | only
|
||||
call setline(1, 'TestFile2')
|
||||
let g:IncludeFname = ''
|
||||
call assert_fails('normal! gf', 'E447:')
|
||||
call assert_equal('TestFile2', g:IncludeFname)
|
||||
set includeexpr&
|
||||
delfunc s:IncludeFunc
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
" Check that expanding directories can handle more than 255 entries.
|
||||
func Test_gf_subdirs_wildcard()
|
||||
let cwd = getcwd()
|
||||
|
||||
@@ -125,6 +125,14 @@ func Test_printexpr()
|
||||
set printexpr=PrintFails(v:fname_in)
|
||||
call assert_fails('hardcopy', 'E365:')
|
||||
|
||||
" Using a script-local function
|
||||
func s:NewPrintExpr()
|
||||
endfunc
|
||||
set printexpr=s:NewPrintExpr()
|
||||
call assert_equal(expand('<SID>') .. 'NewPrintExpr()', &printexpr)
|
||||
set printexpr=<SID>NewPrintExpr()
|
||||
call assert_equal(expand('<SID>') .. 'NewPrintExpr()', &printexpr)
|
||||
|
||||
set printexpr&
|
||||
bwipe
|
||||
endfunc
|
||||
|
||||
@@ -255,6 +255,45 @@ func Test_normal_formatexpr_returns_nonzero()
|
||||
close!
|
||||
endfunc
|
||||
|
||||
" Test for using a script-local function for 'formatexpr'
|
||||
func Test_formatexpr_scriptlocal_func()
|
||||
func! s:Format()
|
||||
let g:FormatArgs = [v:lnum, v:count]
|
||||
endfunc
|
||||
set formatexpr=s:Format()
|
||||
call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
|
||||
new | only
|
||||
call setline(1, range(1, 40))
|
||||
let g:FormatArgs = []
|
||||
normal! 2GVjgq
|
||||
call assert_equal([2, 2], g:FormatArgs)
|
||||
bw!
|
||||
set formatexpr=<SID>Format()
|
||||
call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
|
||||
new | only
|
||||
call setline(1, range(1, 40))
|
||||
let g:FormatArgs = []
|
||||
normal! 4GVjgq
|
||||
call assert_equal([4, 2], g:FormatArgs)
|
||||
bw!
|
||||
let &formatexpr = 's:Format()'
|
||||
new | only
|
||||
call setline(1, range(1, 40))
|
||||
let g:FormatArgs = []
|
||||
normal! 6GVjgq
|
||||
call assert_equal([6, 2], g:FormatArgs)
|
||||
bw!
|
||||
let &formatexpr = '<SID>Format()'
|
||||
new | only
|
||||
call setline(1, range(1, 40))
|
||||
let g:FormatArgs = []
|
||||
normal! 8GVjgq
|
||||
call assert_equal([8, 2], g:FormatArgs)
|
||||
setlocal formatexpr=
|
||||
delfunc s:Format
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
" basic test for formatprg
|
||||
func Test_normal06_formatprg()
|
||||
" only test on non windows platform
|
||||
|
||||
Reference in New Issue
Block a user