Package: emacs;
Reported by: Stefan Monnier <monnier <at> IRO.UMontreal.CA>
Date: Thu, 11 Jan 2018 16:38:01 UTC
Severity: wishlist
Found in version 27.0.50
Fixed in version 27.1
Done: Glenn Morris <rgm <at> gnu.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Stefan Monnier <monnier <at> IRO.UMontreal.CA> To: Michael Heerdegen <michael_heerdegen <at> web.de> Cc: 30078 <at> debbugs.gnu.org Subject: bug#30078: 27.0.50; Use lexical-binding for M-: Date: Mon, 19 Mar 2018 15:34:55 -0400
> New patch below. Of course, I got side-tracked and forgot to include the patch. Here it is, Stefan diff --git a/etc/NEWS b/etc/NEWS index 99f3f27486..2d985aab9e 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -71,6 +71,10 @@ moved to the early init file (see above). * Changes in Emacs 27.1 +** Lexical binding is now used when evaluating interactive Elisp forms +More specifically, lexical-binding is now used for M-:, --eval, as well +as in the *scratch* and *ielm* buffers. + --- ** The new option 'tooltip-resize-echo-area' avoids truncating tooltip text on GUI frames when tooltips are displayed in the echo area. Instead, diff --git a/lisp/ielm.el b/lisp/ielm.el index 59e333f19c..73cf37efbc 100644 --- a/lisp/ielm.el +++ b/lisp/ielm.el @@ -559,10 +559,11 @@ inferior-emacs-lisp-mode ;; Useful for `hs-minor-mode'. (setq-local comment-start ";") (setq-local comment-use-syntax t) + (setq-local lexical-binding t) - (set (make-local-variable 'indent-line-function) 'ielm-indent-line) + (set (make-local-variable 'indent-line-function) #'ielm-indent-line) (set (make-local-variable 'ielm-working-buffer) (current-buffer)) - (set (make-local-variable 'fill-paragraph-function) 'lisp-fill-paragraph) + (set (make-local-variable 'fill-paragraph-function) #'lisp-fill-paragraph) ;; Value holders (set (make-local-variable '*) nil) diff --git a/lisp/server.el b/lisp/server.el index ff03cbe622..a8a82922f5 100644 --- a/lisp/server.el +++ b/lisp/server.el @@ -793,7 +793,7 @@ server-eval-and-print ;; intended it to interrupt us rather than interrupt whatever Emacs ;; was doing before it started handling the process filter. ;; Hence `with-local-quit' (bug#6585). - (let ((v (with-local-quit (eval (car (read-from-string expr)))))) + (let ((v (with-local-quit (eval (car (read-from-string expr)) t)))) (when proc (with-temp-buffer (let ((standard-output (current-buffer))) @@ -1315,7 +1315,7 @@ server-execute (find-file-noselect initial-buffer-choice)) ((functionp initial-buffer-choice) (funcall initial-buffer-choice))))) - (if (buffer-live-p buf) buf (get-buffer-create "*scratch*"))))) + (if (buffer-live-p buf) buf (startup--get-buffer-create-scratch))))) ;; Set current buffer so that newly created tty frames ;; show the correct buffer initially. (frame (with-current-buffer (or (car buffers) diff --git a/lisp/simple.el b/lisp/simple.el index fa93cf87c7..f578efb7cb 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -1579,12 +1579,12 @@ eval-expression (eval-expression-get-print-arguments current-prefix-arg))) (if (null eval-expression-debug-on-error) - (push (eval exp lexical-binding) values) + (push (eval exp t) values) (let ((old-value (make-symbol "t")) new-value) ;; Bind debug-on-error to something unique so that we can ;; detect when evalled code changes it. (let ((debug-on-error old-value)) - (push (eval (macroexpand-all exp) lexical-binding) values) + (push (eval (macroexpand-all exp) t) values) (setq new-value debug-on-error)) ;; If evalled code has changed the value of debug-on-error, ;; propagate that change to the global binding. diff --git a/lisp/startup.el b/lisp/startup.el index 2669342eda..77d6232924 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -1357,7 +1357,8 @@ command-line (if (get-buffer "*scratch*") (with-current-buffer "*scratch*" (if (eq major-mode 'fundamental-mode) - (funcall initial-major-mode)))) + (funcall initial-major-mode)) + (setq-local lexical-binding t))) ;; Load library for our terminal type. ;; User init file can set term-file-prefix to nil to prevent this. @@ -2103,7 +2104,7 @@ normal-no-mouse-startup-screen (insert "\t\t") (insert-button "Open *scratch* buffer" 'action (lambda (_button) (switch-to-buffer - (get-buffer-create "*scratch*"))) + (startup--get-buffer-create-scratch))) 'follow-link t) (insert "\n") (insert "\n" (emacs-version) "\n" emacs-copyright "\n") @@ -2229,6 +2230,13 @@ display-about-screen (defalias 'about-emacs 'display-about-screen) (defalias 'display-splash-screen 'display-startup-screen) +(defun startup--get-buffer-create-scratch () + (or (get-buffer "*scratch*") + (with-current-buffer (get-buffer-create "*scratch*") + (set-buffer-major-mode (current-buffer)) + (setq-local lexical-binding t) + (current-buffer)))) + (defun command-line-1 (args-left) "A subroutine of `command-line'." (display-startup-echo-area-message) @@ -2378,7 +2386,7 @@ command-line-1 (unless (= end (length str-expr)) (error "Trailing garbage following expression: %s" (substring str-expr end))) - (eval expr))) + (eval expr t))) ((member argi '("-L" "-directory")) ;; -L :/foo adds /foo to the _end_ of load-path. @@ -2493,7 +2501,7 @@ command-line-1 (when (eq initial-buffer-choice t) ;; When `initial-buffer-choice' equals t make sure that *scratch* ;; exists. - (get-buffer-create "*scratch*")) + (startup--get-buffer-create-scratch)) ;; If *scratch* exists and is empty, insert initial-scratch-message. ;; Do this before switching to *scratch* below to handle bug#9605. @@ -2512,7 +2520,7 @@ command-line-1 ((functionp initial-buffer-choice) (funcall initial-buffer-choice)) ((eq initial-buffer-choice t) - (get-buffer-create "*scratch*")) + (startup--get-buffer-create-scratch)) (t (error "initial-buffer-choice must be a string, a function, or t."))))) (unless (buffer-live-p buf) diff --git a/lisp/window.el b/lisp/window.el index 8c5e441e4b..3f475ce8ae 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -4578,7 +4578,7 @@ last-buffer (or (get-next-valid-buffer (nreverse (buffer-list frame)) buffer visible-ok frame) (get-buffer "*scratch*") - (let ((scratch (get-buffer-create "*scratch*"))) + (let ((scratch (startup--get-buffer-create-scratch))) (set-buffer-major-mode scratch) scratch)))
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.