changeset 27309:391011658d95 v8.2.4183

patch 8.2.4183: cannot use an import in 'formatexpr' Commit: https://github.com/vim/vim/commit/3ba685eeefcfbbf895d70664357ef05f252d7b21 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 22 19:17:31 2022 +0000 patch 8.2.4183: cannot use an import in 'formatexpr' Problem: Cannot use an import in 'formatexpr'. Solution: Set the script context when evaluating 'formatexpr'.
author Bram Moolenaar <Bram@vim.org>
date Sat, 22 Jan 2022 20:30:03 +0100
parents 2df6f738a531
children 1644ebf86471
files src/testdir/test_vim9_import.vim src/textformat.c src/version.c
diffstat 3 files changed, 33 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_import.vim
+++ b/src/testdir/test_vim9_import.vim
@@ -759,6 +759,34 @@ def Run_Test_import_in_diffexpr()
   bwipe!
 enddef
 
+def Test_import_in_formatexpr()
+  var lines =<< trim END
+      vim9script
+      export def MyFormatExpr(): number
+        g:did_format = 'yes'
+        return 0
+      enddef
+  END
+  writefile(lines, 'Xformatter')
+
+  lines =<< trim END
+      vim9script
+      import './Xformatter' as format
+      set formatexpr=format.MyFormatExpr()
+  END
+  CheckScriptSuccess(lines)
+
+  new
+  setline(1, ['a', 'b', 'c'])
+  normal gqG
+  assert_equal('yes', g:did_format)
+
+  bwipe!
+  delete('Xformatter')
+  unlet g:did_format
+  set formatexpr=
+enddef
+
 def Test_export_fails()
   CheckScriptFailure(['export var some = 123'], 'E1042:')
   CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
--- a/src/textformat.c
+++ b/src/textformat.c
@@ -903,6 +903,7 @@ fex_format(
 								   OPT_LOCAL);
     int		r;
     char_u	*fex;
+    sctx_T	save_sctx = current_sctx;
 
     // Set v:lnum to the first line number and v:count to the number of lines.
     // Set v:char to the character to be inserted (can be NUL).
@@ -914,6 +915,7 @@ fex_format(
     fex = vim_strsave(curbuf->b_p_fex);
     if (fex == NULL)
 	return 0;
+    current_sctx = curbuf->b_p_script_ctx[BV_FEX];
 
     // Evaluate the function.
     if (use_sandbox)
@@ -924,6 +926,7 @@ fex_format(
 
     set_vim_var_string(VV_CHAR, NULL, -1);
     vim_free(fex);
+    current_sctx = save_sctx;
 
     return r;
 }
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4183,
+/**/
     4182,
 /**/
     4181,