@@ -713,7 +713,7 @@ def select_item(code: str, idx: int, _f: Optional[FrameType] = None) -> Any:
713713 locals_1 = locals ()
714714 locals_2 = locals_1 .copy ()
715715 # pylint: disable=exec-used
716- exec (f"{ l } = list({ r } )[{ idx } ]" , _f .f_globals , locals_2 )
716+ exec (f"{ l } = list({ r } )[{ idx } ]" , _f .f_locals | _f . f_globals , locals_2 )
717717 for bind in [k for k in locals_2 .keys () if k not in locals_1 .keys ()]:
718718 _f .f_globals [bind ] = locals_2 [bind ]
719719 # pylint: disable=eval-used
@@ -753,7 +753,7 @@ def to_elisp(code: str, _f: Optional[FrameType] = None) -> str:
753753 _f = _f or top_level ()
754754 with io .StringIO () as buf , redirect_stdout (buf ):
755755 # pylint: disable=eval-used
756- print_elisp (eval (code , _f .f_globals ))
756+ print_elisp (eval (code , _f .f_locals | _f . f_globals ))
757757 return buf .getvalue ().strip ()
758758
759759def translate (code : str , _f : Optional [FrameType ] = None , use_in_expr : bool = False ) -> Any :
@@ -793,19 +793,22 @@ def eval_code(_code: str, _env: Dict[str, Any] = {}) -> EvalResult:
793793 _locals = {}
794794 locals_1 = _locals
795795 locals_2 = locals_1 .copy ()
796+ locals_globals = _f .f_locals | _f .f_globals
797+ if "debug" in _env :
798+ print (f"{ ast .unparse (last )= } " )
796799 with io .StringIO () as buf , redirect_stdout (buf ):
797800 if butlast :
798801 # pylint: disable=exec-used
799- exec (ast .unparse (butlast ), _f . f_globals , locals_2 )
802+ exec (ast .unparse (butlast ), locals_globals , locals_2 )
800803 for bind in [k for k in locals_2 .keys () if k not in locals_1 .keys ()]:
801804 _f .f_globals [bind ] = locals_2 [bind ]
802805 try :
803806 # pylint: disable=eval-used
804- _res = eval (ast .unparse (last ), _f . f_globals , locals_2 )
807+ _res = eval (ast .unparse (last ), locals_globals , locals_2 )
805808 except SyntaxError :
806809 locals_1 = _locals
807810 locals_2 = locals_1 .copy ()
808- exec (ast .unparse (last ), _f . f_globals , locals_2 )
811+ exec (ast .unparse (last ), locals_globals , locals_2 )
809812 out = buf .getvalue ().strip ()
810813 binds1 = [k for k in locals_2 .keys () if k not in locals_1 .keys ()]
811814 for bind in binds1 :
@@ -820,6 +823,9 @@ def eval_code(_code: str, _env: Dict[str, Any] = {}) -> EvalResult:
820823 except Exception as e :
821824 err = f"{ e .__class__ .__name__ } : { e } \n { e .__dict__ } "
822825 _f .f_globals ["e" ] = e
826+ locs = e .__traceback__ .tb_frame .f_locals .get ("locals_2" , {})
827+ for bind in locs :
828+ _f .f_globals [bind ] = locs [bind ]
823829 return {
824830 "res" : to_str (_res ) if _env .get ("echo" ) else repr (_res ),
825831 "binds" : binds ,
0 commit comments