]> granicus.if.org Git - vim/commitdiff
patch 8.2.3908: cannot use a script-local function for 'foldtext' v8.2.3908
authorYegappan Lakshmanan <yegappan@yahoo.com>
Sun, 26 Dec 2021 21:54:43 +0000 (21:54 +0000)
committerBram Moolenaar <Bram@vim.org>
Sun, 26 Dec 2021 21:54:43 +0000 (21:54 +0000)
Problem:    Cannot use a script-local function for 'foldtext'.
Solution:   Expand "s:" and "<SID>". (Yegappan Lakshmanan, closes #9411)

runtime/doc/fold.txt
src/optionstr.c
src/strings.c
src/testdir/test_blob.vim
src/testdir/test_expr.vim
src/testdir/test_filter_map.vim
src/testdir/test_fold.vim
src/testdir/test_listdict.vim
src/version.c

index 56c3c75c35f88e02d033d9906bb56db5ced8718d..cac76bad98d5ff3e0630caa97b43b12c461f00ec 100644 (file)
@@ -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|
 
index c69354eced3bba25043e936931ebe1c30381cb3a..ae584d02b94d78f3d7f1ab64fbabc4973207d395 100644 (file)
@@ -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;
index 6a6b0f43c0800acaf01a1e5a216f3356cd79f7f6..3dd68569503c0a4d87c18b82c8ec57abffc029d2 100644 (file)
@@ -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);
index 3ce95756f18b6c5c133119ef5163611c5edee513..69c86963cd2d6deb55339b71e72a697193da9593 100644 (file)
@@ -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()
index ba2e2597a00bcbc923119baa0de3155ccdace85d..8a65a8990a8731610d8e4f32a3fde406479e8bda 100644 (file)
@@ -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)
 
index 1767a99669122e68d5cb688fb2a66c2be7e46197..6cde453500952856ed9f3012d9e5569f5b1b1560 100644 (file)
@@ -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)
 
index d35b7c807be6b0085ae1231df05b48755568bdfc..e3b6b6e58bc250cbc4bd74fbdbcba55b19f22b39 100644 (file)
@@ -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
index e7b6588786fd514934ed66694cd0d2986a7fc41f..fbb917b9b2a26e5cbab9fc8ab966f40f51aee218 100644 (file)
@@ -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:')
index 7b8b0a68389e6bd7ef1bfcc2ba32cc82e862c09a..64086c3de5adfee6316b416016566dd49e90d620 100644 (file)
@@ -749,6 +749,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3908,
 /**/
     3907,
 /**/