aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Ingebrigtsen2021-07-22 00:21:34 +0200
committerLars Ingebrigtsen2021-07-22 00:21:34 +0200
commita82855732019622ebe1cfac9055d84366f3608f2 (patch)
treea9b361d10d57fbb4874b69851aa348b1918f5671
parent38a62efc15ddd849219ef1bdc98da933b5b1c33c (diff)
downloademacs-a82855732019622ebe1cfac9055d84366f3608f2.tar.gz
emacs-a82855732019622ebe1cfac9055d84366f3608f2.zip
Move generalized variable specs from cl-lib.el to gv.el
* lisp/emacs-lisp/cl-lib.el: Move all the generalized variable specifications from cl-lib.el... * lisp/emacs-lisp/gv.el: ... to gv.el. This will make things like `(setf (getenv "FOO") "BAR")' work without requiring anything, since `setf' lives in gv.el (bug#49651).
-rw-r--r--lisp/emacs-lisp/cl-lib.el105
-rw-r--r--lisp/emacs-lisp/gv.el100
2 files changed, 100 insertions, 105 deletions
diff --git a/lisp/emacs-lisp/cl-lib.el b/lisp/emacs-lisp/cl-lib.el
index 7f7eb963423..317a4c62309 100644
--- a/lisp/emacs-lisp/cl-lib.el
+++ b/lisp/emacs-lisp/cl-lib.el
@@ -515,111 +515,6 @@ the process stops as soon as KEYS or VALUES run out.
515If ALIST is non-nil, the new pairs are prepended to it." 515If ALIST is non-nil, the new pairs are prepended to it."
516 (nconc (cl-mapcar 'cons keys values) alist)) 516 (nconc (cl-mapcar 'cons keys values) alist))
517 517
518;;; Generalized variables.
519
520;; These used to be in cl-macs.el since all macros that use them (like setf)
521;; were autoloaded from cl-macs.el. But now that setf, push, and pop are in
522;; core Elisp, they need to either be right here or be autoloaded via
523;; cl-loaddefs.el, which is more trouble than it is worth.
524
525;; Some more Emacs-related place types.
526(gv-define-simple-setter buffer-file-name set-visited-file-name t)
527(gv-define-setter buffer-modified-p (flag &optional buf)
528 (macroexp-let2 nil buffer `(or ,buf (current-buffer))
529 `(with-current-buffer ,buffer
530 (set-buffer-modified-p ,flag))))
531(gv-define-simple-setter buffer-name rename-buffer t)
532(gv-define-setter buffer-string (store)
533 `(insert (prog1 ,store (erase-buffer))))
534(gv-define-simple-setter buffer-substring cl--set-buffer-substring)
535(gv-define-simple-setter current-buffer set-buffer)
536(gv-define-simple-setter current-column move-to-column t)
537(gv-define-simple-setter current-global-map use-global-map t)
538(gv-define-setter current-input-mode (store)
539 `(progn (apply #'set-input-mode ,store) ,store))
540(gv-define-simple-setter current-local-map use-local-map t)
541(gv-define-simple-setter current-window-configuration
542 set-window-configuration t)
543(gv-define-simple-setter default-file-modes set-default-file-modes t)
544(gv-define-simple-setter documentation-property put)
545(gv-define-setter face-background (x f &optional s)
546 `(set-face-background ,f ,x ,s))
547(gv-define-setter face-background-pixmap (x f &optional s)
548 `(set-face-background-pixmap ,f ,x ,s))
549(gv-define-setter face-font (x f &optional s) `(set-face-font ,f ,x ,s))
550(gv-define-setter face-foreground (x f &optional s)
551 `(set-face-foreground ,f ,x ,s))
552(gv-define-setter face-underline-p (x f &optional s)
553 `(set-face-underline ,f ,x ,s))
554(gv-define-simple-setter file-modes set-file-modes t)
555(gv-define-setter frame-height (x &optional frame)
556 `(set-frame-height (or ,frame (selected-frame)) ,x))
557(gv-define-simple-setter frame-parameters modify-frame-parameters t)
558(gv-define-simple-setter frame-visible-p cl--set-frame-visible-p)
559(gv-define-setter frame-width (x &optional frame)
560 `(set-frame-width (or ,frame (selected-frame)) ,x))
561(gv-define-simple-setter getenv setenv t)
562(gv-define-simple-setter get-register set-register)
563(gv-define-simple-setter global-key-binding global-set-key)
564(gv-define-simple-setter local-key-binding local-set-key)
565(gv-define-simple-setter mark set-mark t)
566(gv-define-simple-setter mark-marker set-mark t)
567(gv-define-simple-setter marker-position set-marker t)
568(gv-define-setter mouse-position (store scr)
569 `(set-mouse-position ,scr (car ,store) (cadr ,store)
570 (cddr ,store)))
571(gv-define-simple-setter point goto-char)
572(gv-define-simple-setter point-marker goto-char t)
573(gv-define-setter point-max (store)
574 `(progn (narrow-to-region (point-min) ,store) ,store))
575(gv-define-setter point-min (store)
576 `(progn (narrow-to-region ,store (point-max)) ,store))
577(gv-define-setter read-mouse-position (store scr)
578 `(set-mouse-position ,scr (car ,store) (cdr ,store)))
579(gv-define-simple-setter screen-height set-screen-height t)
580(gv-define-simple-setter screen-width set-screen-width t)
581(gv-define-simple-setter selected-window select-window)
582(gv-define-simple-setter selected-screen select-screen)
583(gv-define-simple-setter selected-frame select-frame)
584(gv-define-simple-setter standard-case-table set-standard-case-table)
585(gv-define-simple-setter syntax-table set-syntax-table)
586(gv-define-simple-setter visited-file-modtime set-visited-file-modtime t)
587(gv-define-setter window-height (store)
588 `(progn (enlarge-window (- ,store (window-height))) ,store))
589(gv-define-setter window-width (store)
590 `(progn (enlarge-window (- ,store (window-width)) t) ,store))
591(gv-define-simple-setter x-get-secondary-selection x-own-secondary-selection t)
592
593;; More complex setf-methods.
594
595;; This is a hack that allows (setf (eq a 7) B) to mean either
596;; (setq a 7) or (setq a nil) depending on whether B is nil or not.
597;; This is useful when you have control over the PLACE but not over
598;; the VALUE, as is the case in define-minor-mode's :variable.
599;; It turned out that :variable needed more flexibility anyway, so
600;; this doesn't seem too useful now.
601(gv-define-expander eq
602 (lambda (do place val)
603 (gv-letplace (getter setter) place
604 (macroexp-let2 nil val val
605 (funcall do `(eq ,getter ,val)
606 (lambda (v)
607 `(cond
608 (,v ,(funcall setter val))
609 ((eq ,getter ,val) ,(funcall setter `(not ,val))))))))))
610
611(gv-define-expander substring
612 (lambda (do place from &optional to)
613 (gv-letplace (getter setter) place
614 (macroexp-let2* nil ((start from) (end to))
615 (funcall do `(substring ,getter ,start ,end)
616 (lambda (v)
617 (macroexp-let2 nil v v
618 `(progn
619 ,(funcall setter `(cl--set-substring
620 ,getter ,start ,end ,v))
621 ,v))))))))
622
623;;; Miscellaneous. 518;;; Miscellaneous.
624 519
625(provide 'cl-lib) 520(provide 'cl-lib)
diff --git a/lisp/emacs-lisp/gv.el b/lisp/emacs-lisp/gv.el
index f08f7ac1153..d6272a52469 100644
--- a/lisp/emacs-lisp/gv.el
+++ b/lisp/emacs-lisp/gv.el
@@ -614,5 +614,105 @@ REF must have been previously obtained with `gv-ref'."
614;; (,(nth 1 vars) (v) (funcall ',setter v))) 614;; (,(nth 1 vars) (v) (funcall ',setter v)))
615;; ,@body))) 615;; ,@body)))
616 616
617;;; Generalized variables.
618
619;; Some Emacs-related place types.
620(gv-define-simple-setter buffer-file-name set-visited-file-name t)
621(gv-define-setter buffer-modified-p (flag &optional buf)
622 (macroexp-let2 nil buffer `(or ,buf (current-buffer))
623 `(with-current-buffer ,buffer
624 (set-buffer-modified-p ,flag))))
625(gv-define-simple-setter buffer-name rename-buffer t)
626(gv-define-setter buffer-string (store)
627 `(insert (prog1 ,store (erase-buffer))))
628(gv-define-simple-setter buffer-substring cl--set-buffer-substring)
629(gv-define-simple-setter current-buffer set-buffer)
630(gv-define-simple-setter current-column move-to-column t)
631(gv-define-simple-setter current-global-map use-global-map t)
632(gv-define-setter current-input-mode (store)
633 `(progn (apply #'set-input-mode ,store) ,store))
634(gv-define-simple-setter current-local-map use-local-map t)
635(gv-define-simple-setter current-window-configuration
636 set-window-configuration t)
637(gv-define-simple-setter default-file-modes set-default-file-modes t)
638(gv-define-simple-setter documentation-property put)
639(gv-define-setter face-background (x f &optional s)
640 `(set-face-background ,f ,x ,s))
641(gv-define-setter face-background-pixmap (x f &optional s)
642 `(set-face-background-pixmap ,f ,x ,s))
643(gv-define-setter face-font (x f &optional s) `(set-face-font ,f ,x ,s))
644(gv-define-setter face-foreground (x f &optional s)
645 `(set-face-foreground ,f ,x ,s))
646(gv-define-setter face-underline-p (x f &optional s)
647 `(set-face-underline ,f ,x ,s))
648(gv-define-simple-setter file-modes set-file-modes t)
649(gv-define-setter frame-height (x &optional frame)
650 `(set-frame-height (or ,frame (selected-frame)) ,x))
651(gv-define-simple-setter frame-parameters modify-frame-parameters t)
652(gv-define-simple-setter frame-visible-p cl--set-frame-visible-p)
653(gv-define-setter frame-width (x &optional frame)
654 `(set-frame-width (or ,frame (selected-frame)) ,x))
655(gv-define-simple-setter getenv setenv t)
656(gv-define-simple-setter get-register set-register)
657(gv-define-simple-setter global-key-binding global-set-key)
658(gv-define-simple-setter local-key-binding local-set-key)
659(gv-define-simple-setter mark set-mark t)
660(gv-define-simple-setter mark-marker set-mark t)
661(gv-define-simple-setter marker-position set-marker t)
662(gv-define-setter mouse-position (store scr)
663 `(set-mouse-position ,scr (car ,store) (cadr ,store)
664 (cddr ,store)))
665(gv-define-simple-setter point goto-char)
666(gv-define-simple-setter point-marker goto-char t)
667(gv-define-setter point-max (store)
668 `(progn (narrow-to-region (point-min) ,store) ,store))
669(gv-define-setter point-min (store)
670 `(progn (narrow-to-region ,store (point-max)) ,store))
671(gv-define-setter read-mouse-position (store scr)
672 `(set-mouse-position ,scr (car ,store) (cdr ,store)))
673(gv-define-simple-setter screen-height set-screen-height t)
674(gv-define-simple-setter screen-width set-screen-width t)
675(gv-define-simple-setter selected-window select-window)
676(gv-define-simple-setter selected-screen select-screen)
677(gv-define-simple-setter selected-frame select-frame)
678(gv-define-simple-setter standard-case-table set-standard-case-table)
679(gv-define-simple-setter syntax-table set-syntax-table)
680(gv-define-simple-setter visited-file-modtime set-visited-file-modtime t)
681(gv-define-setter window-height (store)
682 `(progn (enlarge-window (- ,store (window-height))) ,store))
683(gv-define-setter window-width (store)
684 `(progn (enlarge-window (- ,store (window-width)) t) ,store))
685(gv-define-simple-setter x-get-secondary-selection x-own-secondary-selection t)
686
687;; More complex setf-methods.
688
689;; This is a hack that allows (setf (eq a 7) B) to mean either
690;; (setq a 7) or (setq a nil) depending on whether B is nil or not.
691;; This is useful when you have control over the PLACE but not over
692;; the VALUE, as is the case in define-minor-mode's :variable.
693;; It turned out that :variable needed more flexibility anyway, so
694;; this doesn't seem too useful now.
695(gv-define-expander eq
696 (lambda (do place val)
697 (gv-letplace (getter setter) place
698 (macroexp-let2 nil val val
699 (funcall do `(eq ,getter ,val)
700 (lambda (v)
701 `(cond
702 (,v ,(funcall setter val))
703 ((eq ,getter ,val) ,(funcall setter `(not ,val))))))))))
704
705(gv-define-expander substring
706 (lambda (do place from &optional to)
707 (gv-letplace (getter setter) place
708 (macroexp-let2* nil ((start from) (end to))
709 (funcall do `(substring ,getter ,start ,end)
710 (lambda (v)
711 (macroexp-let2 nil v v
712 `(progn
713 ,(funcall setter `(cl--set-substring
714 ,getter ,start ,end ,v))
715 ,v))))))))
716
617(provide 'gv) 717(provide 'gv)
618;;; gv.el ends here 718;;; gv.el ends here