Mirror of the Vim source from https://github.com/vim/vim
Revision | 5614e76f3dee23b6f20a44bb99dc0481b90244a5 (tree) |
---|---|
Time | 2023-01-26 00:45:03 |
Author | Bram Moolenaar <Bram@vim....> |
Commiter | Bram Moolenaar |
patch 9.0.1243: :setglobal cannot use script-local function for "expr" option
Commit: https://github.com/vim/vim/commit/01d4efe2e87632aa085897d3d64e27585908f977
Author: zeertzjq <zeertzjq@outlook.com>
Date: Wed Jan 25 15:31:28 2023 +0000
@@ -2311,8 +2311,8 @@ | ||
2311 | 2311 | varp == &p_dex || |
2312 | 2312 | # endif |
2313 | 2313 | # ifdef FEAT_FOLDING |
2314 | - varp == &curwin->w_p_fde || | |
2315 | - varp == &curwin->w_p_fdt || | |
2314 | + gvarp == &curwin->w_allbuf_opt.wo_fde || | |
2315 | + gvarp == &curwin->w_allbuf_opt.wo_fdt || | |
2316 | 2316 | # endif |
2317 | 2317 | gvarp == &p_fex || |
2318 | 2318 | # ifdef FEAT_FIND_ID |
@@ -2327,52 +2327,13 @@ | ||
2327 | 2327 | # endif |
2328 | 2328 | varp == &p_ccv) |
2329 | 2329 | { |
2330 | - char_u **p_opt = NULL; | |
2331 | - char_u *name; | |
2332 | - | |
2333 | 2330 | // If the option value starts with <SID> or s:, then replace that with |
2334 | 2331 | // the script identifier. |
2335 | -# ifdef FEAT_BEVAL | |
2336 | - if (varp == &p_bexpr) // 'balloonexpr' | |
2337 | - p_opt = (opt_flags & OPT_LOCAL) ? &curbuf->b_p_bexpr : &p_bexpr; | |
2338 | -# endif | |
2339 | -# ifdef FEAT_DIFF | |
2340 | - if (varp == &p_dex) // 'diffexpr' | |
2341 | - p_opt = &p_dex; | |
2342 | -# endif | |
2343 | -# ifdef FEAT_FOLDING | |
2344 | - if (varp == &curwin->w_p_fde) // 'foldexpr' | |
2345 | - p_opt = &curwin->w_p_fde; | |
2346 | - if (varp == &curwin->w_p_fdt) // 'foldtext' | |
2347 | - p_opt = &curwin->w_p_fdt; | |
2348 | -# endif | |
2349 | - if (gvarp == &p_fex) // 'formatexpr' | |
2350 | - p_opt = &curbuf->b_p_fex; | |
2351 | -# ifdef FEAT_FIND_ID | |
2352 | - if (gvarp == &p_inex) // 'includeexpr' | |
2353 | - p_opt = &curbuf->b_p_inex; | |
2354 | -# endif | |
2355 | - if (gvarp == &p_inde) // 'indentexpr' | |
2356 | - p_opt = &curbuf->b_p_inde; | |
2357 | -# ifdef FEAT_DIFF | |
2358 | - if (varp == &p_pex) // 'patchexpr' | |
2359 | - p_opt = &p_pex; | |
2360 | -# endif | |
2361 | -# ifdef FEAT_POSTSCRIPT | |
2362 | - if (varp == &p_pexpr) // 'printexpr' | |
2363 | - p_opt = &p_pexpr; | |
2364 | -# endif | |
2365 | - if (varp == &p_ccv) // 'charconvert' | |
2366 | - p_opt = &p_ccv; | |
2367 | - | |
2368 | - if (p_opt != NULL) | |
2332 | + char_u *name = get_scriptlocal_funcname(*varp); | |
2333 | + if (name != NULL) | |
2369 | 2334 | { |
2370 | - name = get_scriptlocal_funcname(*p_opt); | |
2371 | - if (name != NULL) | |
2372 | - { | |
2373 | - free_string_option(*p_opt); | |
2374 | - *p_opt = name; | |
2375 | - } | |
2335 | + free_string_option(*varp); | |
2336 | + *varp = name; | |
2376 | 2337 | } |
2377 | 2338 | |
2378 | 2339 | # ifdef FEAT_FOLDING |
@@ -330,8 +330,23 @@ | ||
330 | 330 | endfunc |
331 | 331 | set indentexpr=s:NewIndentExpr() |
332 | 332 | call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr) |
333 | + call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &g:indentexpr) | |
333 | 334 | set indentexpr=<SID>NewIndentExpr() |
334 | 335 | call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr) |
336 | + call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &g:indentexpr) | |
337 | + setlocal indentexpr= | |
338 | + setglobal indentexpr=s:NewIndentExpr() | |
339 | + call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &g:indentexpr) | |
340 | + call assert_equal('', &indentexpr) | |
341 | + new | |
342 | + call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr) | |
343 | + bw! | |
344 | + setglobal indentexpr=<SID>NewIndentExpr() | |
345 | + call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &g:indentexpr) | |
346 | + call assert_equal('', &indentexpr) | |
347 | + new | |
348 | + call assert_equal(expand('<SID>') .. 'NewIndentExpr()', &indentexpr) | |
349 | + bw! | |
335 | 350 | set indentexpr& |
336 | 351 | |
337 | 352 | bw! |
@@ -1503,6 +1503,7 @@ | ||
1503 | 1503 | set foldmethod=expr foldexpr=s:FoldFunc() |
1504 | 1504 | redraw! |
1505 | 1505 | call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr) |
1506 | + call assert_equal(expand('<SID>') .. 'FoldFunc()', &g:foldexpr) | |
1506 | 1507 | call assert_equal(1, g:FoldLnum) |
1507 | 1508 | set foldmethod& foldexpr= |
1508 | 1509 | bw! |
@@ -1512,8 +1513,31 @@ | ||
1512 | 1513 | set foldmethod=expr foldexpr=<SID>FoldFunc() |
1513 | 1514 | redraw! |
1514 | 1515 | call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr) |
1516 | + call assert_equal(expand('<SID>') .. 'FoldFunc()', &g:foldexpr) | |
1515 | 1517 | call assert_equal(1, g:FoldLnum) |
1516 | - set foldmethod& foldexpr= | |
1518 | + bw! | |
1519 | + call setline(1, 'abc') | |
1520 | + setlocal foldmethod& foldexpr& | |
1521 | + setglobal foldmethod=expr foldexpr=s:FoldFunc() | |
1522 | + call assert_equal(expand('<SID>') .. 'FoldFunc()', &g:foldexpr) | |
1523 | + call assert_equal('0', &foldexpr) | |
1524 | + enew! | |
1525 | + call setline(1, 'abc') | |
1526 | + redraw! | |
1527 | + call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr) | |
1528 | + call assert_equal(1, g:FoldLnum) | |
1529 | + bw! | |
1530 | + call setline(1, 'abc') | |
1531 | + setlocal foldmethod& foldexpr& | |
1532 | + setglobal foldmethod=expr foldexpr=<SID>FoldFunc() | |
1533 | + call assert_equal(expand('<SID>') .. 'FoldFunc()', &g:foldexpr) | |
1534 | + call assert_equal('0', &foldexpr) | |
1535 | + enew! | |
1536 | + call setline(1, 'abc') | |
1537 | + redraw! | |
1538 | + call assert_equal(expand('<SID>') .. 'FoldFunc()', &foldexpr) | |
1539 | + call assert_equal(1, g:FoldLnum) | |
1540 | + set foldmethod& foldexpr& | |
1517 | 1541 | delfunc s:FoldFunc |
1518 | 1542 | bw! |
1519 | 1543 | endfunc |
@@ -1527,25 +1551,53 @@ | ||
1527 | 1551 | new | only |
1528 | 1552 | call setline(1, range(50)) |
1529 | 1553 | let g:FoldTextArgs = [] |
1530 | - set foldmethod=manual | |
1531 | 1554 | set foldtext=s:FoldText() |
1532 | 1555 | norm! 4Gzf4j |
1533 | 1556 | redraw! |
1534 | 1557 | call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext) |
1558 | + call assert_equal(expand('<SID>') .. 'FoldText()', &g:foldtext) | |
1535 | 1559 | call assert_equal([4, 8], g:FoldTextArgs) |
1536 | 1560 | set foldtext& |
1537 | 1561 | bw! |
1538 | 1562 | new | only |
1539 | 1563 | call setline(1, range(50)) |
1540 | 1564 | let g:FoldTextArgs = [] |
1541 | - set foldmethod=manual | |
1542 | 1565 | set foldtext=<SID>FoldText() |
1543 | 1566 | norm! 8Gzf4j |
1544 | 1567 | redraw! |
1545 | 1568 | call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext) |
1569 | + call assert_equal(expand('<SID>') .. 'FoldText()', &g:foldtext) | |
1546 | 1570 | call assert_equal([8, 12], g:FoldTextArgs) |
1547 | 1571 | set foldtext& |
1548 | 1572 | bw! |
1573 | + call setline(1, range(50)) | |
1574 | + let g:FoldTextArgs = [] | |
1575 | + setlocal foldtext& | |
1576 | + setglobal foldtext=s:FoldText() | |
1577 | + call assert_equal(expand('<SID>') .. 'FoldText()', &g:foldtext) | |
1578 | + call assert_equal('foldtext()', &foldtext) | |
1579 | + enew! | |
1580 | + call setline(1, range(50)) | |
1581 | + norm! 12Gzf4j | |
1582 | + redraw! | |
1583 | + call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext) | |
1584 | + call assert_equal([12, 16], g:FoldTextArgs) | |
1585 | + set foldtext& | |
1586 | + bw! | |
1587 | + call setline(1, range(50)) | |
1588 | + let g:FoldTextArgs = [] | |
1589 | + setlocal foldtext& | |
1590 | + setglobal foldtext=<SID>FoldText() | |
1591 | + call assert_equal(expand('<SID>') .. 'FoldText()', &g:foldtext) | |
1592 | + call assert_equal('foldtext()', &foldtext) | |
1593 | + enew! | |
1594 | + call setline(1, range(50)) | |
1595 | + norm! 16Gzf4j | |
1596 | + redraw! | |
1597 | + call assert_equal(expand('<SID>') .. 'FoldText()', &foldtext) | |
1598 | + call assert_equal([16, 20], g:FoldTextArgs) | |
1599 | + set foldtext& | |
1600 | + bw! | |
1549 | 1601 | delfunc s:FoldText |
1550 | 1602 | endfunc |
1551 | 1603 |
@@ -227,6 +227,7 @@ | ||
227 | 227 | endfunc |
228 | 228 | set includeexpr=s:IncludeFunc() |
229 | 229 | call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr) |
230 | + call assert_equal(expand('<SID>') .. 'IncludeFunc()', &g:includeexpr) | |
230 | 231 | new | only |
231 | 232 | call setline(1, 'TestFile1') |
232 | 233 | let g:IncludeFname = '' |
@@ -235,11 +236,35 @@ | ||
235 | 236 | bw! |
236 | 237 | set includeexpr=<SID>IncludeFunc() |
237 | 238 | call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr) |
239 | + call assert_equal(expand('<SID>') .. 'IncludeFunc()', &g:includeexpr) | |
238 | 240 | new | only |
239 | 241 | call setline(1, 'TestFile2') |
240 | 242 | let g:IncludeFname = '' |
241 | 243 | call assert_fails('normal! gf', 'E447:') |
242 | 244 | call assert_equal('TestFile2', g:IncludeFname) |
245 | + bw! | |
246 | + setlocal includeexpr= | |
247 | + setglobal includeexpr=s:IncludeFunc() | |
248 | + call assert_equal(expand('<SID>') .. 'IncludeFunc()', &g:includeexpr) | |
249 | + call assert_equal('', &includeexpr) | |
250 | + new | |
251 | + call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr) | |
252 | + call setline(1, 'TestFile3') | |
253 | + let g:IncludeFname = '' | |
254 | + call assert_fails('normal! gf', 'E447:') | |
255 | + call assert_equal('TestFile3', g:IncludeFname) | |
256 | + bw! | |
257 | + setlocal includeexpr= | |
258 | + setglobal includeexpr=<SID>IncludeFunc() | |
259 | + call assert_equal(expand('<SID>') .. 'IncludeFunc()', &g:includeexpr) | |
260 | + call assert_equal('', &includeexpr) | |
261 | + new | |
262 | + call assert_equal(expand('<SID>') .. 'IncludeFunc()', &includeexpr) | |
263 | + call setline(1, 'TestFile4') | |
264 | + let g:IncludeFname = '' | |
265 | + call assert_fails('normal! gf', 'E447:') | |
266 | + call assert_equal('TestFile4', g:IncludeFname) | |
267 | + bw! | |
243 | 268 | set includeexpr& |
244 | 269 | delfunc s:IncludeFunc |
245 | 270 | bw! |
@@ -262,6 +262,7 @@ | ||
262 | 262 | endfunc |
263 | 263 | set formatexpr=s:Format() |
264 | 264 | call assert_equal(expand('<SID>') .. 'Format()', &formatexpr) |
265 | + call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr) | |
265 | 266 | new | only |
266 | 267 | call setline(1, range(1, 40)) |
267 | 268 | let g:FormatArgs = [] |
@@ -270,6 +271,7 @@ | ||
270 | 271 | bw! |
271 | 272 | set formatexpr=<SID>Format() |
272 | 273 | call assert_equal(expand('<SID>') .. 'Format()', &formatexpr) |
274 | + call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr) | |
273 | 275 | new | only |
274 | 276 | call setline(1, range(1, 40)) |
275 | 277 | let g:FormatArgs = [] |
@@ -277,6 +279,7 @@ | ||
277 | 279 | call assert_equal([4, 2], g:FormatArgs) |
278 | 280 | bw! |
279 | 281 | let &formatexpr = 's:Format()' |
282 | + call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr) | |
280 | 283 | new | only |
281 | 284 | call setline(1, range(1, 40)) |
282 | 285 | let g:FormatArgs = [] |
@@ -284,12 +287,55 @@ | ||
284 | 287 | call assert_equal([6, 2], g:FormatArgs) |
285 | 288 | bw! |
286 | 289 | let &formatexpr = '<SID>Format()' |
290 | + call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr) | |
287 | 291 | new | only |
288 | 292 | call setline(1, range(1, 40)) |
289 | 293 | let g:FormatArgs = [] |
290 | 294 | normal! 8GVjgq |
291 | 295 | call assert_equal([8, 2], g:FormatArgs) |
296 | + bw! | |
292 | 297 | setlocal formatexpr= |
298 | + setglobal formatexpr=s:Format() | |
299 | + call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr) | |
300 | + call assert_equal('', &formatexpr) | |
301 | + new | |
302 | + call assert_equal(expand('<SID>') .. 'Format()', &formatexpr) | |
303 | + call setline(1, range(1, 40)) | |
304 | + let g:FormatArgs = [] | |
305 | + normal! 10GVjgq | |
306 | + call assert_equal([10, 2], g:FormatArgs) | |
307 | + bw! | |
308 | + setglobal formatexpr=<SID>Format() | |
309 | + call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr) | |
310 | + call assert_equal('', &formatexpr) | |
311 | + new | |
312 | + call assert_equal(expand('<SID>') .. 'Format()', &formatexpr) | |
313 | + call setline(1, range(1, 40)) | |
314 | + let g:FormatArgs = [] | |
315 | + normal! 12GVjgq | |
316 | + call assert_equal([12, 2], g:FormatArgs) | |
317 | + bw! | |
318 | + let &g:formatexpr = 's:Format()' | |
319 | + call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr) | |
320 | + call assert_equal('', &formatexpr) | |
321 | + new | |
322 | + call assert_equal(expand('<SID>') .. 'Format()', &formatexpr) | |
323 | + call setline(1, range(1, 40)) | |
324 | + let g:FormatArgs = [] | |
325 | + normal! 14GVjgq | |
326 | + call assert_equal([14, 2], g:FormatArgs) | |
327 | + bw! | |
328 | + let &g:formatexpr = '<SID>Format()' | |
329 | + call assert_equal(expand('<SID>') .. 'Format()', &g:formatexpr) | |
330 | + call assert_equal('', &formatexpr) | |
331 | + new | |
332 | + call assert_equal(expand('<SID>') .. 'Format()', &formatexpr) | |
333 | + call setline(1, range(1, 40)) | |
334 | + let g:FormatArgs = [] | |
335 | + normal! 16GVjgq | |
336 | + call assert_equal([16, 2], g:FormatArgs) | |
337 | + bw! | |
338 | + set formatexpr= | |
293 | 339 | delfunc s:Format |
294 | 340 | bw! |
295 | 341 | endfunc |
@@ -696,6 +696,8 @@ | ||
696 | 696 | static int included_patches[] = |
697 | 697 | { /* Add new patch number below this line */ |
698 | 698 | /**/ |
699 | + 1243, | |
700 | +/**/ | |
699 | 701 | 1242, |
700 | 702 | /**/ |
701 | 703 | 1241, |