all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Juri Linkov <juri@jurta.org>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: 5364@debbugs.gnu.org, jidanni@jidanni.org
Subject: bug#5364: 23.1.91; execute-extended-command should do like FFAP
Date: Fri, 15 Jan 2010 11:19:38 +0200	[thread overview]
Message-ID: <87zl4fhgid.fsf@mail.jurta.org> (raw)
In-Reply-To: <jwvpr5cunc4.fsf-monnier+emacs@gnu.org> (Stefan Monnier's message of "Thu, 14 Jan 2010 21:20:27 -0500")

> The Elisp code looks OK, except it should be in the C file.  Please move
> it to simple.el where we can edit it with edebug, font-lock, eldoc, ...

A patch for post-23.2:

=== modified file 'lisp/simple.el'
--- lisp/simple.el	2010-01-13 08:35:10 +0000
+++ lisp/simple.el	2010-01-15 09:14:30 +0000
@@ -1210,6 +1210,29 @@ (defun repeat-complex-command (arg)
       (if command-history
 	  (error "Argument %d is beyond length of command history" arg)
 	(error "There are no previous complex commands to repeat")))))
+
+(defun read-extended-command ()
+  "Read command name to invoke in `execute-extended-command'."
+  (minibuffer-with-setup-hook
+      (lambda ()
+	(set (make-local-variable 'minibuffer-default-add-function)
+	     (lambda ()
+	       (with-current-buffer (window-buffer (minibuffer-selected-window))
+		 (and (commandp (function-called-at-point))
+		      (format "%S" (function-called-at-point)))))))
+    (completing-read
+     (concat (cond
+	      ((eq current-prefix-arg '-) "- ")
+	      ((and (consp current-prefix-arg)
+		    (eq (car current-prefix-arg) 4)) "C-u ")
+	      ((and (consp current-prefix-arg)
+		    (integerp (car current-prefix-arg)))
+	       (format "%d " (car current-prefix-arg)))
+	      ((integerp current-prefix-arg)
+	       (format "%d " current-prefix-arg)))
+	     (key-description (this-single-command-keys))
+	     " ")
+     obarray 'commandp t nil 'extended-command-history)))
 \f
 (defvar minibuffer-history nil
   "Default minibuffer history list.

=== modified file 'src/keyboard.c'
--- src/keyboard.c	2010-01-13 08:35:10 +0000
+++ src/keyboard.c	2010-01-15 09:17:15 +0000
@@ -10512,19 +10512,17 @@ (at your option) any later version.
 
 \f
 DEFUN ("execute-extended-command", Fexecute_extended_command, Sexecute_extended_command,
-       1, 1, "P",
-       doc: /* Read function name, then read its arguments and call it.
+       2, 2, "(list current-prefix-arg (read-extended-command))",
+       doc: /* Read arguments, then read FUNCTION name and call it.
 
 To pass a numeric argument to the command you are invoking with, specify
 the numeric argument to this command.
 
 Noninteractively, the argument PREFIXARG is the prefix argument to
 give to the command you invoke, if it asks for an argument.  */)
-     (prefixarg)
-     Lisp_Object prefixarg;
+     (prefixarg, function)
+     Lisp_Object prefixarg, function;
 {
-  Lisp_Object function;
-  char buf[40];
   int saved_last_point_position;
   Lisp_Object saved_keys, saved_last_point_position_buffer;
   Lisp_Object bindings, value;
@@ -10543,32 +10541,8 @@ (at your option) any later version.
 			XVECTOR (this_command_keys)->contents);
   saved_last_point_position_buffer = last_point_position_buffer;
   saved_last_point_position = last_point_position;
-  buf[0] = 0;
   GCPRO3 (saved_keys, prefixarg, saved_last_point_position_buffer);
 
-  if (EQ (prefixarg, Qminus))
-    strcpy (buf, "- ");
-  else if (CONSP (prefixarg) && XINT (XCAR (prefixarg)) == 4)
-    strcpy (buf, "C-u ");
-  else if (CONSP (prefixarg) && INTEGERP (XCAR (prefixarg)))
-    sprintf (buf, "%ld ", (long) XINT (XCAR (prefixarg)));
-  else if (INTEGERP (prefixarg))
-    sprintf (buf, "%ld ", (long) XINT (prefixarg));
-
-  /* This isn't strictly correct if execute-extended-command
-     is bound to anything else.  Perhaps it should use
-     this_command_keys?  */
-  strcat (buf, "M-x ");
-
-  /* Prompt with buf, and then read a string, completing from and
-     restricting to the set of all defined commands.  Don't provide
-     any initial input.  Save the command read on the extended-command
-     history list. */
-  function = Fcompleting_read (build_string (buf),
-			       Vobarray, Qcommandp,
-			       Qt, Qnil, Qextended_command_history, Qnil,
-			       Qnil);
-
 #ifdef HAVE_WINDOW_SYSTEM
   if (hstarted) start_hourglass ();
 #endif

-- 
Juri Linkov
http://www.jurta.org/emacs/






  parent reply	other threads:[~2010-01-15  9:19 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-12 12:52 bug#5364: 23.1.91; execute-extended-command should do like FFAP jidanni
2010-01-12 20:54 ` Juri Linkov
2010-01-12 22:46   ` jidanni
2010-01-13  0:32     ` Juri Linkov
2010-01-13  1:17       ` jidanni
2010-01-13  1:21     ` Stefan Monnier
2010-01-13  2:00       ` jidanni
2010-01-13  4:12         ` Stefan Monnier
2010-01-14  3:33           ` jidanni
2010-01-14 15:12             ` Stefan Monnier
2010-01-14 21:07               ` Juri Linkov
2010-01-14 22:40                 ` Stefan Monnier
2010-01-15  1:12                   ` Juri Linkov
2010-01-15  2:20                     ` Stefan Monnier
2010-01-15  3:06                       ` Chong Yidong
2010-01-15  7:49                         ` Stefan Monnier
2010-01-15  9:19                       ` Juri Linkov [this message]
2010-08-22 23:32                     ` Juri Linkov
2010-01-13  7:26   ` Jan D.
2010-01-14  5:29     ` jidanni
2010-01-14 21:01       ` Juri Linkov
2010-01-15  3:04 ` jidanni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87zl4fhgid.fsf@mail.jurta.org \
    --to=juri@jurta.org \
    --cc=5364@debbugs.gnu.org \
    --cc=jidanni@jidanni.org \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.