summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2021-12-26 21:54:43 +0000
committerBram Moolenaar <Bram@vim.org>2021-12-26 21:54:43 +0000
commit27708e6c7b6f444fd599f3dc5015336b002b874d (patch)
treeca58fb2aa05c18a8149600a23c08603a19e02caa
parentc553a21e189aa440515a19c5b25f8b6b50c5d53d (diff)
patch 8.2.3908: cannot use a script-local function for 'foldtext'v8.2.3908
Problem: Cannot use a script-local function for 'foldtext'. Solution: Expand "s:" and "<SID>". (Yegappan Lakshmanan, closes #9411)
-rw-r--r--runtime/doc/fold.txt7
-rw-r--r--src/optionstr.c5
-rw-r--r--src/strings.c2
-rw-r--r--src/testdir/test_blob.vim14
-rw-r--r--src/testdir/test_expr.vim1
-rw-r--r--src/testdir/test_filter_map.vim1
-rw-r--r--src/testdir/test_fold.vim31
-rw-r--r--src/testdir/test_listdict.vim1
-rw-r--r--src/version.c2
9 files changed, 60 insertions, 4 deletions
diff --git a/runtime/doc/fold.txt b/runtime/doc/fold.txt
index 56c3c75c35..cac76bad98 100644
--- a/runtime/doc/fold.txt
+++ b/runtime/doc/fold.txt
@@ -122,7 +122,7 @@ Try to avoid the "=", "a" and "s" return values, since Vim often has to search
backwards for a line for which the fold level is defined. This can be slow.
If the 'foldexpr' expression starts with s: or |<SID>|, then it is replaced
-with the script ID (|local-function|). Example: >
+with the script ID (|local-function|). Examples: >
set foldexpr=s:MyFoldExpr()
set foldexpr=<SID>SomeFoldExpr()
<
@@ -529,6 +529,11 @@ The resulting line is truncated to fit in the window, it never wraps.
When there is room after the text, it is filled with the character specified
by 'fillchars'.
+If the 'foldtext' expression starts with s: or |<SID>|, then it is replaced
+with the script ID (|local-function|). Examples: >
+ set foldtext=s:MyFoldText()
+ set foldtext=<SID>SomeFoldText()
+<
Note that backslashes need to be used for characters that the ":set" command
handles differently: Space, backslash and double-quote. |option-backslash|
diff --git a/src/optionstr.c b/src/optionstr.c
index c69354eced..ae584d02b9 100644
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -2310,6 +2310,7 @@ ambw_end:
# endif
# ifdef FEAT_FOLDING
varp == &curwin->w_p_fde ||
+ varp == &curwin->w_p_fdt ||
# endif
gvarp == &p_fex ||
# ifdef FEAT_FIND_ID
@@ -2341,8 +2342,10 @@ ambw_end:
p_opt = &p_dex;
# endif
# ifdef FEAT_FOLDING
- if(varp == &curwin->w_p_fde) // 'foldexpr'
+ if (varp == &curwin->w_p_fde) // 'foldexpr'
p_opt = &curwin->w_p_fde;
+ if (varp == &curwin->w_p_fdt) // 'foldtext'
+ p_opt = &curwin->w_p_fdt;
# endif
if (gvarp == &p_fex) // 'formatexpr'
p_opt = &curbuf->b_p_fex;
diff --git a/src/strings.c b/src/strings.c
index 6a6b0f43c0..3dd6856950 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -905,8 +905,6 @@ string_filter_map(
set_vim_var_nr(VV_KEY, idx);
if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL
|| did_emsg)
- break;
- if (did_emsg)
{
clear_tv(&newtv);
clear_tv(&tv);
diff --git a/src/testdir/test_blob.vim b/src/testdir/test_blob.vim
index 3ce95756f1..69c86963cd 100644
--- a/src/testdir/test_blob.vim
+++ b/src/testdir/test_blob.vim
@@ -37,6 +37,7 @@ func Test_blob_create()
call assert_fails('VAR b = 0z001122.')
call assert_fails('call get("", 1)', 'E896:')
call assert_equal(0, len(test_null_blob()))
+ call assert_equal(0z, copy(test_null_blob()))
END
call CheckLegacyAndVim9Success(lines)
endfunc
@@ -369,6 +370,14 @@ func Test_blob_add()
add(test_null_blob(), 0x22)
END
call CheckDefExecAndScriptFailure(lines, 'E1131:')
+
+ let lines =<< trim END
+ let b = 0zDEADBEEF
+ lockvar b
+ call add(b, 0)
+ unlockvar b
+ END
+ call CheckScriptFailure(lines, 'E741:')
endfunc
func Test_blob_empty()
@@ -445,6 +454,9 @@ func Test_blob_func_remove()
remove(b, 0)
END
call CheckScriptFailure(lines, 'E741:')
+
+ call assert_fails('echo remove(0z1020, [])', 'E745:')
+ call assert_fails('echo remove(0z1020, 0, [])', 'E745:')
endfunc
func Test_blob_read_write()
@@ -474,6 +486,7 @@ func Test_blob_filter()
call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
END
call CheckLegacyAndVim9Success(lines)
+ call assert_fails('echo filter(0z10, "a10")', 'E121:')
endfunc
" map() item in blob
@@ -489,6 +502,7 @@ func Test_blob_map()
call map(0z00, '[9]')
END
call CheckLegacyAndVim9Failure(lines, 'E978:')
+ call assert_fails('echo map(0z10, "a10")', 'E121:')
endfunc
func Test_blob_index()
diff --git a/src/testdir/test_expr.vim b/src/testdir/test_expr.vim
index ba2e2597a0..8a65a8990a 100644
--- a/src/testdir/test_expr.vim
+++ b/src/testdir/test_expr.vim
@@ -405,6 +405,7 @@ func Test_printf_misc()
call assert_equal('[00000あiう]', printf('[%010.7S]', 'あiう'))
call assert_equal('1%', printf('%d%%', 1))
+ call assert_notequal('', printf('%p', "abc"))
END
call CheckLegacyAndVim9Success(lines)
diff --git a/src/testdir/test_filter_map.vim b/src/testdir/test_filter_map.vim
index 1767a99669..6cde453500 100644
--- a/src/testdir/test_filter_map.vim
+++ b/src/testdir/test_filter_map.vim
@@ -183,6 +183,7 @@ func Test_filter_map_string()
call assert_equal('', map('', "v:val == 'a'"))
call assert_equal('', map(test_null_string(), "v:val == 'a'"))
call assert_fails('echo map("abc", "10")', 'E928:')
+ call assert_fails('echo map("abc", "a10")', 'E121:')
END
call CheckLegacyAndVim9Success(lines)
diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim
index d35b7c807b..e3b6b6e58b 100644
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
@@ -1408,4 +1408,35 @@ func Test_foldexpr_scriptlocal_func()
bw!
endfunc
+" Test for using a script-local function for 'foldtext'
+func Test_foldtext_scriptlocal_func()
+ func! s:FoldText()
+ let g:FoldTextArgs = [v:foldstart, v:foldend]
+ return foldtext()
+ endfunc
+ new | only
+ call setline(1, range(50))
+ let g:FoldTextArgs = []
+ set foldmethod=manual
+ set foldtext=s:FoldText()
+ norm! 4Gzf4j
+ redraw!
+ call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext)
+ call assert_equal([4, 8], g:FoldTextArgs)
+ set foldtext&
+ bw!
+ new | only
+ call setline(1, range(50))
+ let g:FoldTextArgs = []
+ set foldmethod=manual
+ set foldtext=<SID>FoldText()
+ norm! 8Gzf4j
+ redraw!
+ call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext)
+ call assert_equal([8, 12], g:FoldTextArgs)
+ set foldtext&
+ bw!
+ delfunc s:FoldText
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/test_listdict.vim b/src/testdir/test_listdict.vim
index e7b6588786..fbb917b9b2 100644
--- a/src/testdir/test_listdict.vim
+++ b/src/testdir/test_listdict.vim
@@ -1163,6 +1163,7 @@ func Test_listdict_extend()
let d = {'a': 'A', 'b': 'B'}
call assert_fails("call extend(d, {'b': 0, 'c':'C'}, 'error')", 'E737:')
+ call assert_fails("call extend(d, {'b': 0}, [])", 'E730:')
call assert_fails("call extend(d, {'b': 0, 'c':'C'}, 'xxx')", 'E475:')
if has('float')
call assert_fails("call extend(d, {'b': 0, 'c':'C'}, 1.2)", 'E475:')
diff --git a/src/version.c b/src/version.c
index 7b8b0a6838..64086c3de5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3908,
+/**/
3907,
/**/
3906,