Patch 9.0.1243
Problem:    :setglobal cannot use script-local function for "expr" option.
Solution:   Use the pointer to the option value properly. (closes #11883)
Files:      src/optionstr.c, src/testdir/test_edit.vim,
            src/testdir/test_fold.vim, src/testdir/test_gf.vim,
            src/testdir/test_normal.vim


*** ../vim-9.0.1242/src/optionstr.c     2023-01-16 18:19:01.907301080 +0000
--- src/optionstr.c     2023-01-25 15:28:29.822772690 +0000
***************
*** 2311,2318 ****
            varp == &p_dex ||
  # endif
  # ifdef FEAT_FOLDING
!           varp == &curwin->w_p_fde ||
!           varp == &curwin->w_p_fdt ||
  # endif
            gvarp == &p_fex ||
  # ifdef FEAT_FIND_ID
--- 2311,2318 ----
            varp == &p_dex ||
  # endif
  # ifdef FEAT_FOLDING
!           gvarp == &curwin->w_allbuf_opt.wo_fde ||
!           gvarp == &curwin->w_allbuf_opt.wo_fdt ||
  # endif
            gvarp == &p_fex ||
  # ifdef FEAT_FIND_ID
***************
*** 2327,2378 ****
  # endif
            varp == &p_ccv)
      {
-       char_u  **p_opt = NULL;
-       char_u  *name;
- 
        // If the option value starts with <SID> or s:, then replace that with
        // the script identifier.
! # ifdef FEAT_BEVAL
!       if (varp == &p_bexpr)           // 'balloonexpr'
!           p_opt = (opt_flags & OPT_LOCAL) ? &curbuf->b_p_bexpr : &p_bexpr;
! # endif
! # ifdef FEAT_DIFF
!       if (varp == &p_dex)     // 'diffexpr'
!           p_opt = &p_dex;
! # endif
! # ifdef FEAT_FOLDING
!       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;
! # ifdef FEAT_FIND_ID
!       if (gvarp == &p_inex)   // 'includeexpr'
!           p_opt = &curbuf->b_p_inex;
! # endif
!       if (gvarp == &p_inde)   // 'indentexpr'
!           p_opt = &curbuf->b_p_inde;
! # ifdef FEAT_DIFF
!       if (varp == &p_pex)     // 'patchexpr'
!           p_opt = &p_pex;
! # endif
! # ifdef FEAT_POSTSCRIPT
!       if (varp == &p_pexpr)   // 'printexpr'
!           p_opt = &p_pexpr;
! # endif
!       if (varp == &p_ccv)     // 'charconvert'
!           p_opt = &p_ccv;
! 
!       if (p_opt != NULL)
        {
!           name = get_scriptlocal_funcname(*p_opt);
!           if (name != NULL)
!           {
!               free_string_option(*p_opt);
!               *p_opt = name;
!           }
        }
  
  # ifdef FEAT_FOLDING
--- 2327,2339 ----
  # endif
            varp == &p_ccv)
      {
        // If the option value starts with <SID> or s:, then replace that with
        // the script identifier.
!       char_u *name = get_scriptlocal_funcname(*varp);
!       if (name != NULL)
        {
!           free_string_option(*varp);
!           *varp = name;
        }
  
  # ifdef FEAT_FOLDING
*** ../vim-9.0.1242/src/testdir/test_edit.vim   2022-09-21 15:13:49.314998845 
+0100
--- src/testdir/test_edit.vim   2023-01-25 15:28:29.822772690 +0000
***************
*** 330,337 ****
--- 330,352 ----
    endfunc
    set indentexpr=s:NewIndentExpr()
    call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr)
+   call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &g:indentexpr)
    set indentexpr=<SID>NewIndentExpr()
    call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr)
+   call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &g:indentexpr)
+   setlocal indentexpr=
+   setglobal indentexpr=s:NewIndentExpr()
+   call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &g:indentexpr)
+   call assert_equal('', &indentexpr)
+   new
+   call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr)
+   bw!
+   setglobal indentexpr=<SID>NewIndentExpr()
+   call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &g:indentexpr)
+   call assert_equal('', &indentexpr)
+   new
+   call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr)
+   bw!
    set indentexpr&
  
    bw!
*** ../vim-9.0.1242/src/testdir/test_fold.vim   2023-01-17 19:48:02.759310921 
+0000
--- src/testdir/test_fold.vim   2023-01-25 15:28:29.822772690 +0000
***************
*** 1503,1508 ****
--- 1503,1509 ----
    set foldmethod=expr foldexpr=s:FoldFunc()
    redraw!
    call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr)
+   call assert_equal(expand('<SID>') .. 'FoldFunc()', &g:foldexpr)
    call assert_equal(1, g:FoldLnum)
    set foldmethod& foldexpr=
    bw!
***************
*** 1512,1519 ****
    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
--- 1513,1543 ----
    set foldmethod=expr foldexpr=<SID>FoldFunc()
    redraw!
    call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr)
+   call assert_equal(expand('<SID>') .. 'FoldFunc()', &g:foldexpr)
    call assert_equal(1, g:FoldLnum)
!   bw!
!   call setline(1, 'abc')
!   setlocal foldmethod& foldexpr&
!   setglobal foldmethod=expr foldexpr=s:FoldFunc()
!   call assert_equal(expand('<SID>') .. 'FoldFunc()', &g:foldexpr)
!   call assert_equal('0', &foldexpr)
!   enew!
!   call setline(1, 'abc')
!   redraw!
!   call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr)
!   call assert_equal(1, g:FoldLnum)
!   bw!
!   call setline(1, 'abc')
!   setlocal foldmethod& foldexpr&
!   setglobal foldmethod=expr foldexpr=<SID>FoldFunc()
!   call assert_equal(expand('<SID>') .. 'FoldFunc()', &g:foldexpr)
!   call assert_equal('0', &foldexpr)
!   enew!
!   call setline(1, 'abc')
!   redraw!
!   call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr)
!   call assert_equal(1, g:FoldLnum)
!   set foldmethod& foldexpr&
    delfunc s:FoldFunc
    bw!
  endfunc
***************
*** 1527,1551 ****
    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
  
--- 1551,1603 ----
    new | only
    call setline(1, range(50))
    let g:FoldTextArgs = []
    set foldtext=s:FoldText()
    norm! 4Gzf4j
    redraw!
    call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext)
+   call assert_equal(expand('<SID>') .. 'FoldText()', &g:foldtext)
    call assert_equal([4, 8], g:FoldTextArgs)
    set foldtext&
    bw!
    new | only
    call setline(1, range(50))
    let g:FoldTextArgs = []
    set foldtext=<SID>FoldText()
    norm! 8Gzf4j
    redraw!
    call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext)
+   call assert_equal(expand('<SID>') .. 'FoldText()', &g:foldtext)
    call assert_equal([8, 12], g:FoldTextArgs)
    set foldtext&
    bw!
+   call setline(1, range(50))
+   let g:FoldTextArgs = []
+   setlocal foldtext&
+   setglobal foldtext=s:FoldText()
+   call assert_equal(expand('<SID>') .. 'FoldText()', &g:foldtext)
+   call assert_equal('foldtext()', &foldtext)
+   enew!
+   call setline(1, range(50))
+   norm! 12Gzf4j
+   redraw!
+   call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext)
+   call assert_equal([12, 16], g:FoldTextArgs)
+   set foldtext&
+   bw!
+   call setline(1, range(50))
+   let g:FoldTextArgs = []
+   setlocal foldtext&
+   setglobal foldtext=<SID>FoldText()
+   call assert_equal(expand('<SID>') .. 'FoldText()', &g:foldtext)
+   call assert_equal('foldtext()', &foldtext)
+   enew!
+   call setline(1, range(50))
+   norm! 16Gzf4j
+   redraw!
+   call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext)
+   call assert_equal([16, 20], g:FoldTextArgs)
+   set foldtext&
+   bw!
    delfunc s:FoldText
  endfunc
  
*** ../vim-9.0.1242/src/testdir/test_gf.vim     2022-09-28 21:06:30.634345977 
+0100
--- src/testdir/test_gf.vim     2023-01-25 15:28:29.822772690 +0000
***************
*** 227,232 ****
--- 227,233 ----
    endfunc
    set includeexpr=s:IncludeFunc()
    call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr)
+   call assert_equal(expand('<SID>') .. 'IncludeFunc()', &g:includeexpr)
    new | only
    call setline(1, 'TestFile1')
    let g:IncludeFname = ''
***************
*** 235,245 ****
--- 236,270 ----
    bw!
    set includeexpr=<SID>IncludeFunc()
    call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr)
+   call assert_equal(expand('<SID>') .. 'IncludeFunc()', &g:includeexpr)
    new | only
    call setline(1, 'TestFile2')
    let g:IncludeFname = ''
    call assert_fails('normal! gf', 'E447:')
    call assert_equal('TestFile2', g:IncludeFname)
+   bw!
+   setlocal includeexpr=
+   setglobal includeexpr=s:IncludeFunc()
+   call assert_equal(expand('<SID>') .. 'IncludeFunc()', &g:includeexpr)
+   call assert_equal('', &includeexpr)
+   new
+   call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr)
+   call setline(1, 'TestFile3')
+   let g:IncludeFname = ''
+   call assert_fails('normal! gf', 'E447:')
+   call assert_equal('TestFile3', g:IncludeFname)
+   bw!
+   setlocal includeexpr=
+   setglobal includeexpr=<SID>IncludeFunc()
+   call assert_equal(expand('<SID>') .. 'IncludeFunc()', &g:includeexpr)
+   call assert_equal('', &includeexpr)
+   new
+   call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr)
+   call setline(1, 'TestFile4')
+   let g:IncludeFname = ''
+   call assert_fails('normal! gf', 'E447:')
+   call assert_equal('TestFile4', g:IncludeFname)
+   bw!
    set includeexpr&
    delfunc s:IncludeFunc
    bw!
*** ../vim-9.0.1242/src/testdir/test_normal.vim 2022-12-08 09:41:20.416361660 
+0000
--- src/testdir/test_normal.vim 2023-01-25 15:28:29.822772690 +0000
***************
*** 262,267 ****
--- 262,268 ----
    endfunc
    set formatexpr=s:Format()
    call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
+   call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr)
    new | only
    call setline(1, range(1, 40))
    let g:FormatArgs = []
***************
*** 270,275 ****
--- 271,277 ----
    bw!
    set formatexpr=<SID>Format()
    call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
+   call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr)
    new | only
    call setline(1, range(1, 40))
    let g:FormatArgs = []
***************
*** 277,282 ****
--- 279,285 ----
    call assert_equal([4, 2], g:FormatArgs)
    bw!
    let &formatexpr = 's:Format()'
+   call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr)
    new | only
    call setline(1, range(1, 40))
    let g:FormatArgs = []
***************
*** 284,295 ****
--- 287,341 ----
    call assert_equal([6, 2], g:FormatArgs)
    bw!
    let &formatexpr = '<SID>Format()'
+   call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr)
    new | only
    call setline(1, range(1, 40))
    let g:FormatArgs = []
    normal! 8GVjgq
    call assert_equal([8, 2], g:FormatArgs)
+   bw!
    setlocal formatexpr=
+   setglobal formatexpr=s:Format()
+   call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr)
+   call assert_equal('', &formatexpr)
+   new
+   call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
+   call setline(1, range(1, 40))
+   let g:FormatArgs = []
+   normal! 10GVjgq
+   call assert_equal([10, 2], g:FormatArgs)
+   bw!
+   setglobal formatexpr=<SID>Format()
+   call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr)
+   call assert_equal('', &formatexpr)
+   new
+   call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
+   call setline(1, range(1, 40))
+   let g:FormatArgs = []
+   normal! 12GVjgq
+   call assert_equal([12, 2], g:FormatArgs)
+   bw!
+   let &g:formatexpr = 's:Format()'
+   call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr)
+   call assert_equal('', &formatexpr)
+   new
+   call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
+   call setline(1, range(1, 40))
+   let g:FormatArgs = []
+   normal! 14GVjgq
+   call assert_equal([14, 2], g:FormatArgs)
+   bw!
+   let &g:formatexpr = '<SID>Format()'
+   call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr)
+   call assert_equal('', &formatexpr)
+   new
+   call assert_equal(expand('<SID>') .. 'Format()', &formatexpr)
+   call setline(1, range(1, 40))
+   let g:FormatArgs = []
+   normal! 16GVjgq
+   call assert_equal([16, 2], g:FormatArgs)
+   bw!
+   set formatexpr=
    delfunc s:Format
    bw!
  endfunc
*** ../vim-9.0.1242/src/version.c       2023-01-25 15:04:17.943549251 +0000
--- src/version.c       2023-01-25 15:31:04.306728988 +0000
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1243,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
43. You tell the kids they can't use the computer because "Daddy's got work to
    do" and you don't even have a job.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230125153158.B3A961C065A%40moolenaar.net.

Raspunde prin e-mail lui