From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Leo Newsgroups: gmane.emacs.devel Subject: Re: Any objection to adding completing-read-function? Date: Thu, 02 Jun 2011 03:03:18 +0800 Message-ID: References: <21E601B384E14788A5CDF8AD49535D75@us.oracle.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: dough.gmane.org 1306955043 32495 80.91.229.12 (1 Jun 2011 19:04:03 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Wed, 1 Jun 2011 19:04:03 +0000 (UTC) Cc: Drew Adams , emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Jun 01 21:03:57 2011 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([140.186.70.17]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1QRqhw-0005eS-Dr for ged-emacs-devel@m.gmane.org; Wed, 01 Jun 2011 21:03:56 +0200 Original-Received: from localhost ([::1]:51561 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QRqhv-0001X7-FI for ged-emacs-devel@m.gmane.org; Wed, 01 Jun 2011 15:03:55 -0400 Original-Received: from eggs.gnu.org ([140.186.70.92]:58667) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QRqhf-0001Wv-O6 for emacs-devel@gnu.org; Wed, 01 Jun 2011 15:03:42 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QRqhZ-0002Qx-1O for emacs-devel@gnu.org; Wed, 01 Jun 2011 15:03:39 -0400 Original-Received: from mail-pw0-f41.google.com ([209.85.160.41]:41125) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QRqhY-0002Qb-Nq for emacs-devel@gnu.org; Wed, 01 Jun 2011 15:03:32 -0400 Original-Received: by pwi12 with SMTP id 12so203365pwi.0 for ; Wed, 01 Jun 2011 12:03:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version:content-type; bh=pSpuoWC2kdq4WcwD9yQJ24RXjc/4JfoSjOibRO+m4Jo=; b=terF2KeRR3iPzkcVaBLYEu2cq46ckz0ElI1002J2MaPZDxNPTZjy6P+bkeEi9CiC1z r/P0w22vgtEVYyhi2nYIaM5s5IoUAk6GrkPEJNdB9PDwJuEUUu+ZAgY73xaQC5Q8+lzh y8DyrU7sU4+0sIKFLFjVlnuLM+czWYNmELkEs= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-type; b=Y0bIus4gL9NUHIXnnWx8ggT7KNbe8kq1VgYAJVvzKDj2sNqyz8qWKd6n0hLDqDcpei IvCDhoCEzamkf46dgcGeEQRDyx0CC0+Hct8Wktj8jHLJSvslEXNZhcsHGU/9x++kE833 sCFRscsQtzWsnTyZ9LdaO7yzOsTnVBnn26E5A= Original-Received: by 10.68.64.225 with SMTP id r1mr3415139pbs.250.1306955011416; Wed, 01 Jun 2011 12:03:31 -0700 (PDT) Original-Received: from localhost ([114.247.10.65]) by mx.google.com with ESMTPS id k9sm1306188pbc.70.2011.06.01.12.03.24 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 01 Jun 2011 12:03:28 -0700 (PDT) In-Reply-To: (Stefan Monnier's message of "Tue, 31 May 2011 12:51:36 -0300") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3.50 (Mac OS X 10.6.7) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.160.41 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:140030 Archived-At: --=-=-= Content-Type: text/plain On 2011-05-31 23:51 +0800, Stefan Monnier wrote: >> 2. I would also prefer it if the code for `completing-read-function' and its >> treatment were in Lisp, not C. > > Full agreement. I'd like to turn the `initial' arg into a callback > (which can do initialization in a similar way to > minibuffer-with-setup-hook, but more robust) but doing it in C is > more painful. Will look into this later on. >> No, I won't be submitting a patch. ;-) Dunno > > Damn! Preliminary patch attached that moves completing-read-function and completing-read-default to elisp. Comments welcome. Since completing-read-default in the patch calls read-from-minibuffer, what to do with this note: ,----[ read-from-minibuffer ] | *Note* that this behavior differs from the way such arguments are used | in `completing-read' and some related functions, which use | zero-indexing for POSITION. `---- --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=crf.diff Content-Description: crf.diff === modified file 'lisp/minibuffer.el' --- lisp/minibuffer.el 2011-06-01 15:34:41 +0000 +++ lisp/minibuffer.el 2011-06-01 18:48:10 +0000 @@ -2699,7 +2699,30 @@ (let ((newstr (completion-initials-expand string table pred))) (when newstr (completion-pcm-try-completion newstr table pred (length newstr))))) + +(defvar completing-read-function 'completing-read-default + "The function called by `completing-read' to do its work. +It should accept the same arguments as `completing-read'.") +(defun completing-read-default (prompt collection &optional predicate require-match + initial-input hist def inherit-input-method) + "Default method for reading from the minibuffer with completion. +See `completing-read' for the meaning of the arguments." + (let* ((minibuffer-completion-table collection) + (minibuffer-completion-predicate predicate) + (minibuffer-completion-confirm (not require-match)) + (keymap (if require-match + (if minibuffer-completing-file-name + minibuffer-local-filename-must-match-map + minibuffer-local-must-match-map) + (if minibuffer-completing-file-name + minibuffer-local-filename-completion-map + minibuffer-local-completion-map))) + (result (read-from-minibuffer prompt initial-input keymap + nil hist def inherit-input-method))) + (when (and (equal result "") def) + (setq result (if (consp def) (car def) def))) + result)) ;; Miscellaneous === modified file 'src/minibuf.c' --- src/minibuf.c 2011-06-01 15:34:41 +0000 +++ src/minibuf.c 2011-06-01 18:51:33 +0000 @@ -72,7 +72,6 @@ static Lisp_Object Qminibuffer_completion_table; static Lisp_Object Qminibuffer_completion_predicate; static Lisp_Object Qminibuffer_completion_confirm; -static Lisp_Object Qcompleting_read_default; static Lisp_Object Quser_variable_p; static Lisp_Object Qminibuffer_default; @@ -1686,7 +1685,7 @@ (Lisp_Object prompt, Lisp_Object collection, Lisp_Object predicate, Lisp_Object require_match, Lisp_Object initial_input, Lisp_Object hist, Lisp_Object def, Lisp_Object inherit_input_method) { Lisp_Object args[9]; - args[0] = Vcompleting_read_function; + args[0] = Fsymbol_value (intern ("completing-read-function")); args[1] = prompt; args[2] = collection; args[3] = predicate; @@ -1697,76 +1696,6 @@ args[8] = inherit_input_method; return Ffuncall (9, args); } - -DEFUN ("completing-read-default", Fcompleting_read_default, Scompleting_read_default, 2, 8, 0, - doc: /* Default method for reading from the minibuffer with completion. -See `completing-read' for the meaning of the arguments. */) - (Lisp_Object prompt, Lisp_Object collection, Lisp_Object predicate, Lisp_Object require_match, Lisp_Object initial_input, Lisp_Object hist, Lisp_Object def, Lisp_Object inherit_input_method) -{ - Lisp_Object val, histvar, histpos, position; - Lisp_Object init; - int pos = 0; - int count = SPECPDL_INDEX (); - struct gcpro gcpro1; - - init = initial_input; - GCPRO1 (def); - - specbind (Qminibuffer_completion_table, collection); - specbind (Qminibuffer_completion_predicate, predicate); - specbind (Qminibuffer_completion_confirm, - EQ (require_match, Qt) ? Qnil : require_match); - - position = Qnil; - if (!NILP (init)) - { - if (CONSP (init)) - { - position = Fcdr (init); - init = Fcar (init); - } - CHECK_STRING (init); - if (!NILP (position)) - { - CHECK_NUMBER (position); - /* Convert to distance from end of input. */ - pos = XINT (position) - SCHARS (init); - } - } - - if (SYMBOLP (hist)) - { - histvar = hist; - histpos = Qnil; - } - else - { - histvar = Fcar_safe (hist); - histpos = Fcdr_safe (hist); - } - if (NILP (histvar)) - histvar = Qminibuffer_history; - if (NILP (histpos)) - XSETFASTINT (histpos, 0); - - val = read_minibuf (NILP (require_match) - ? (NILP (Vminibuffer_completing_file_name) - || EQ (Vminibuffer_completing_file_name, Qlambda) - ? Vminibuffer_local_completion_map - : Vminibuffer_local_filename_completion_map) - : (NILP (Vminibuffer_completing_file_name) - || EQ (Vminibuffer_completing_file_name, Qlambda) - ? Vminibuffer_local_must_match_map - : Vminibuffer_local_filename_must_match_map), - init, prompt, make_number (pos), 0, - histvar, histpos, def, 0, - !NILP (inherit_input_method)); - - if (STRINGP (val) && SCHARS (val) == 0 && ! NILP (def)) - val = CONSP (def) ? XCAR (def) : def; - - RETURN_UNGCPRO (unbind_to (count, val)); -} Lisp_Object Fassoc_string (register Lisp_Object key, Lisp_Object list, Lisp_Object case_fold); @@ -2005,7 +1934,6 @@ minibuf_save_list = Qnil; staticpro (&minibuf_save_list); - DEFSYM (Qcompleting_read_default, "completing-read-default"); DEFSYM (Qcompletion_ignore_case, "completion-ignore-case"); DEFSYM (Qread_file_name_internal, "read-file-name-internal"); DEFSYM (Qminibuffer_default, "minibuffer-default"); @@ -2124,12 +2052,6 @@ doc: /* Non-nil means completing file names. */); Vminibuffer_completing_file_name = Qnil; - DEFVAR_LISP ("completing-read-function", - Vcompleting_read_function, - doc: /* The function called by `completing-read' to do the work. -It should accept the same arguments as `completing-read'. */); - Vcompleting_read_function = Qcompleting_read_default; - DEFVAR_LISP ("minibuffer-help-form", Vminibuffer_help_form, doc: /* Value that `help-form' takes on inside the minibuffer. */); Vminibuffer_help_form = Qnil; @@ -2205,5 +2127,4 @@ defsubr (&Stest_completion); defsubr (&Sassoc_string); defsubr (&Scompleting_read); - defsubr (&Scompleting_read_default); } --=-=-= Content-Type: text/plain Leo --=-=-=--