diff options
author | Andrea Corallo <akrl@sdf.org> | 2020-05-08 10:24:02 +0100 |
---|---|---|
committer | Andrea Corallo <akrl@sdf.org> | 2020-05-08 14:30:13 +0100 |
commit | b46c5046e71bdd6207e421bceade2fead6c6dd1c (patch) | |
tree | 7e279bdc6c4fa51dd77d6097b9eefcf63a8bee3f | |
parent | c578c72aae601462a5ece8cc15aa6d13bc80e196 (diff) | |
download | emacs-b46c5046e71bdd6207e421bceade2fead6c6dd1c.tar.gz |
Add lexspace-import-symbol
-rw-r--r-- | src/lexspaces.c | 30 |
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); } |