summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Corallo <akrl@sdf.org>2020-05-08 10:24:02 +0100
committerAndrea Corallo <akrl@sdf.org>2020-05-08 14:30:13 +0100
commitb46c5046e71bdd6207e421bceade2fead6c6dd1c (patch)
tree7e279bdc6c4fa51dd77d6097b9eefcf63a8bee3f
parentc578c72aae601462a5ece8cc15aa6d13bc80e196 (diff)
downloademacs-b46c5046e71bdd6207e421bceade2fead6c6dd1c.tar.gz
Add lexspace-import-symbol
-rw-r--r--src/lexspaces.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/lexspaces.c b/src/lexspaces.c
index 5de227bb1a9..6faf80505e4 100644
--- a/src/lexspaces.c
+++ b/src/lexspaces.c
@@ -77,8 +77,35 @@ DEFUN ("lexspace-make-from", Flexspace_make_from, Slexspace_make_from, 2, 2, 0,
return name;
}
+DEFUN ("lexspace-import-symbol", Flexspace_import_symbol,
+ Slexspace_import_symbol, 2, 2, 0,
+ doc: /* Import SYMBOL binding from lexspace SRC. */)
+ (Lisp_Object symbol, Lisp_Object src)
+{
+ CHECK_SYMBOL (symbol);
+ CHECK_SYMBOL (src);
+ Lisp_Object src_idx = Fgethash (src, Vlexspaces, Qnil);
+ if (NILP (src_idx))
+ error ("lexspace %s does not exists", SSDATA (SYMBOL_NAME (src)));
+
+ struct Lisp_Symbol *sym = XSYMBOL (symbol);
+ if (!EQ (sym->u.s.val.value, Qunbound))
+ {
+ struct Lisp_Binding *binding = XBINDING (sym->u.s.val.value);
+ binding->r[CURRENT_LEXSPACE] = true;
+ binding->b[CURRENT_LEXSPACE] = src_idx;
+ }
+ if (!NILP (sym->u.s._function))
+ {
+ struct Lisp_Binding *binding = XBINDING (sym->u.s._function);
+ binding->r[CURRENT_LEXSPACE] = true;
+ binding->b[CURRENT_LEXSPACE] = src_idx;
+ }
+ return symbol;
+}
+
DEFUN ("in-lexspace", Fin_lexspace, Sin_lexspace, 1, 1, 0,
- doc: /* Set NAME as current lexspace. Create it in case. */)
+ doc: /* Set NAME as current lexspace. */)
(Lisp_Object name)
{
CHECK_SYMBOL (name);
@@ -106,5 +133,6 @@ syms_of_lexspaces (void)
DEFVAR_LISP ("current-lexspace-idx", Vcurrent_lexspace_idx,
doc: /* Internal use. */);
defsubr (&Sin_lexspace);
+ defsubr (&Slexspace_import_symbol);
defsubr (&Slexspace_make_from);
}