From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: charles@aurox.ch (Charles A. Roelli) Newsgroups: gmane.emacs.bugs Subject: bug#30697: make eval-expression only take `read'-able Lisp Date: Sun, 04 Mar 2018 17:46:18 +0100 Message-ID: NNTP-Posting-Host: blaine.gmane.org X-Trace: blaine.gmane.org 1520181254 25381 195.159.176.226 (4 Mar 2018 16:34:14 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 4 Mar 2018 16:34:14 +0000 (UTC) To: 30697@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Mar 04 17:34:10 2018 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1esWaO-0005gM-UZ for geb-bug-gnu-emacs@m.gmane.org; Sun, 04 Mar 2018 17:34:09 +0100 Original-Received: from localhost ([::1]:45371 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esWcP-0003y6-KN for geb-bug-gnu-emacs@m.gmane.org; Sun, 04 Mar 2018 11:36:13 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:47977) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esWcI-0003xj-Jj for bug-gnu-emacs@gnu.org; Sun, 04 Mar 2018 11:36:07 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1esWcE-0004J2-Jy for bug-gnu-emacs@gnu.org; Sun, 04 Mar 2018 11:36:06 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:36689) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1esWcE-0004Iw-F5 for bug-gnu-emacs@gnu.org; Sun, 04 Mar 2018 11:36:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1esWcE-00058s-2M for bug-gnu-emacs@gnu.org; Sun, 04 Mar 2018 11:36:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: charles@aurox.ch (Charles A. Roelli) Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 04 Mar 2018 16:36:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 30697 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.152018132919719 (code B ref -1); Sun, 04 Mar 2018 16:36:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 4 Mar 2018 16:35:29 +0000 Original-Received: from localhost ([127.0.0.1]:44586 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1esWbh-00057y-GK for submit@debbugs.gnu.org; Sun, 04 Mar 2018 11:35:29 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:56853) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1esWbg-00057m-PC for submit@debbugs.gnu.org; Sun, 04 Mar 2018 11:35:28 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1esWba-0003pk-Gg for submit@debbugs.gnu.org; Sun, 04 Mar 2018 11:35:23 -0500 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:51264) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1esWba-0003pW-Di for submit@debbugs.gnu.org; Sun, 04 Mar 2018 11:35:22 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:47769) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1esWbZ-0003qq-3S for bug-gnu-emacs@gnu.org; Sun, 04 Mar 2018 11:35:22 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1esWbV-0003ma-00 for bug-gnu-emacs@gnu.org; Sun, 04 Mar 2018 11:35:21 -0500 Original-Received: from sinyavsky.aurox.ch ([37.35.109.145]:59062) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1esWbU-0003ko-KU for bug-gnu-emacs@gnu.org; Sun, 04 Mar 2018 11:35:16 -0500 Original-Received: from sinyavsky.aurox.ch (sinyavsky.aurox.ch [127.0.0.1]) by sinyavsky.aurox.ch (Postfix) with ESMTP id 5162E226AF for ; Sun, 4 Mar 2018 16:35:48 +0000 (UTC) Authentication-Results: sinyavsky.aurox.ch (amavisd-new); dkim=pass (1024-bit key) reason="pass (just generated, assumed good)" header.d=aurox.ch DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=aurox.ch; h= subject:subject:to:from:from:message-id:date:date; s=dkim; t= 1520181347; x=1521045348; bh=gYE1Ph6AP2QUay3tFteUNiMX3G8a5T2Zxbr VEzpY9c0=; b=sgsfjZ6cp0vr5NqogyMp587GoYa6tN9z7azsRGduxwK//GVZ8I9 rKfsZ7Yt7Q9SvOl2skJAd+2pwTL26DTBRtDd1ZMFbEAkGt8MsS6X8NSqkO7n4bFL IZ8GR8cSy3eMYbJX4A/mIaD5eT091TwbF35Fxbxz8iSWiE287JQ0Uu98= X-Virus-Scanned: Debian amavisd-new at test.virtualizor.com Original-Received: from sinyavsky.aurox.ch ([127.0.0.1]) by sinyavsky.aurox.ch (sinyavsky.aurox.ch [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id KBKT54m_9gTU for ; Sun, 4 Mar 2018 16:35:47 +0000 (UTC) Original-Received: from gray (125.85.192.178.dynamic.wline.res.cust.swisscom.ch [178.192.85.125]) by sinyavsky.aurox.ch (Postfix) with ESMTPSA id 92B4622688 for ; Sun, 4 Mar 2018 16:35:47 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:143894 Archived-At: Here is a change to make eval-expression issue a warning in the minibuffer when the user enters an unreadable expression. Currently, we just error out, so the user has to restart the command and go back in the history to get back what he typed. With the change applied, if you type M-: ( RET from emacs -q, you'll see, Eval: ( [End of file during parsing] which gives you a chance to fix the error right away. As another example, if you type an extra paren, as in M-: ( ) ) RET you'll see, Eval: ()) [Trailing garbage following expression] and point is left at the extra paren. I've also added documentation for read--expression. The change follows: diff --git a/lisp/simple.el b/lisp/simple.el index 60a0028..7387554 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -1517,6 +1517,10 @@ eval-expression-minibuffer-setup-hook "Hook run by `eval-expression' when entering the minibuffer.") (defun read--expression (prompt &optional initial-contents) + "Read an Emacs Lisp expression from the minibuffer. + +PROMPT and optional argument INITIAL-CONTENTS do the same as in +function `read-from-minibuffer'." (let ((minibuffer-completing-symbol t)) (minibuffer-with-setup-hook (lambda () @@ -1526,11 +1530,52 @@ read--expression (eldoc-mode 1) (add-hook 'completion-at-point-functions #'elisp-completion-at-point nil t) + (local-set-key "\r" 'read--expression-try-read) + (local-set-key "\n" 'read--expression-try-read) (run-hooks 'eval-expression-minibuffer-setup-hook)) (read-from-minibuffer prompt initial-contents read-expression-map t 'read-expression-history)))) +(defun read--expression-try-read () + "Try to read an Emacs Lisp expression in the minibuffer. + +Exit the minibuffer if successful, else report the error to the +user and move point to the location of the error. If point is +not already at the location of the error, push a mark before +moving point." + (interactive) + (unless (> (minibuffer-depth) 0) + (error "Minibuffer must be active")) + (if (let* ((contents (minibuffer-contents)) + (error-point nil)) + (with-temp-buffer + (condition-case err + (progn + (insert contents) + (goto-char (point-min)) + ;; `read' will signal errors like "End of file during + ;; parsing" and "Invalid read syntax". + (read (current-buffer)) + ;; Since `read' does not signal the "Trailing garbage + ;; following expression" error, we check for trailing + ;; garbage ourselves. + (or (progn + ;; This check is similar to what `string_to_object' + ;; does in minibuf.c. + (skip-chars-forward " \t\n") + (= (point) (point-max))) + (error "Trailing garbage following expression"))) + (error + (setq error-point (+ (length (minibuffer-prompt)) (point))) + (with-current-buffer (window-buffer (minibuffer-window)) + (unless (= (point) error-point) + (push-mark)) + (goto-char error-point) + (minibuffer-message (error-message-string err))) + nil)))) + (exit-minibuffer))) + (defun eval-expression-get-print-arguments (prefix-argument) "Get arguments for commands that print an expression result. Returns a list (INSERT-VALUE NO-TRUNCATE CHAR-PRINT-LIMIT)