From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Jambunathan K Newsgroups: gmane.emacs.bugs Subject: bug#12638: 24.2.50; FR: Some suggestions for icomplete-mode Date: Thu, 13 Dec 2012 19:21:06 +0530 Message-ID: <87bodykqlx.fsf@gmail.com> References: <87391ieck9.fsf@gmail.com> <87624nsjes.fsf@gmail.com> <87d2yq9dvi.fsf@gmail.com> <87boe995nq.fsf@gmail.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1355410278 6421 80.91.229.3 (13 Dec 2012 14:51:18 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 13 Dec 2012 14:51:18 +0000 (UTC) Cc: 12638@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Dec 13 15:51:32 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1TjA8J-0006Nh-Jr for geb-bug-gnu-emacs@m.gmane.org; Thu, 13 Dec 2012 15:51:31 +0100 Original-Received: from localhost ([::1]:36465 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TjA86-0000gs-QP for geb-bug-gnu-emacs@m.gmane.org; Thu, 13 Dec 2012 09:51:18 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:60206) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TjA82-0000YN-Ep for bug-gnu-emacs@gnu.org; Thu, 13 Dec 2012 09:51:16 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Tj99y-0001Vw-Bi for bug-gnu-emacs@gnu.org; Thu, 13 Dec 2012 08:49:15 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:58345) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tj99y-0001Vh-71 for bug-gnu-emacs@gnu.org; Thu, 13 Dec 2012 08:49:10 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1Tj9An-0007nh-IX for bug-gnu-emacs@gnu.org; Thu, 13 Dec 2012 08:50:01 -0500 X-Loop: help-debbugs@gnu.org In-Reply-To: <87391ieck9.fsf@gmail.com> Resent-From: Jambunathan K Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 13 Dec 2012 13:50:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 12638 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 12638-submit@debbugs.gnu.org id=B12638.135540654729888 (code B ref 12638); Thu, 13 Dec 2012 13:50:01 +0000 Original-Received: (at 12638) by debbugs.gnu.org; 13 Dec 2012 13:49:07 +0000 Original-Received: from localhost ([127.0.0.1]:40363 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Tj99u-0007ly-Ti for submit@debbugs.gnu.org; Thu, 13 Dec 2012 08:49:07 -0500 Original-Received: from mail-da0-f44.google.com ([209.85.210.44]:40099) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1Tj99p-0007lS-Dq for 12638@debbugs.gnu.org; Thu, 13 Dec 2012 08:49:04 -0500 Original-Received: by mail-da0-f44.google.com with SMTP id z20so821432dae.3 for <12638@debbugs.gnu.org>; Thu, 13 Dec 2012 05:48:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:references:date:message-id:user-agent :mime-version:content-type; bh=QX7gWX7vKTb9w58e7IW/XdYemdoQe57H+6lnYPtsKH8=; b=F3OXJru2KCC60oA4dObXnVlvEhr+BCIEnwyhRxhoaoAzSBUg/LPfm8rP9ftt0uY8qk oZ4n3L+ohSz6UOYDpFRPm8JkBMs34GH27QdhvH3NM5JGOq8keHY3L8LtrcgnFTt0YSc6 F7TPqQE8BEu6+AYyftyS7owGQ6rrmomZvSF9S51mkaSYbi7nNgepmEwdA+FIsEapdwSz jxJdL3pizhOG3RU9taFtJCEiwyzysoFufuj/j7nhDyM8+172dghOSaAzOUgL3XYmJz8B +8iXSX4/Wio65qCwxEzsDKP7l/OjEHCWyxlzt3QOW9TipiFZ2sAAFZXSEveI6Aw/ajqe Ql5A== Original-Received: by 10.68.212.68 with SMTP id ni4mr5567299pbc.107.1355406487839; Thu, 13 Dec 2012 05:48:07 -0800 (PST) Original-Received: from debian-6.05 ([115.184.39.134]) by mx.google.com with ESMTPS id oi2sm1055062pbb.62.2012.12.13.05.48.02 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 13 Dec 2012 05:48:06 -0800 (PST) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 140.186.70.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-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:68454 Archived-At: --=-=-= Content-Type: text/plain Jambunathan K writes: > Stefan Monnier writes: > >>> 2. M-x debbugs-gnu >>> There is no way I can C-s C-j to the second or third candidates. >>> I normally use debbbugs-gnu-search which is the second candidate. >> >> Better ask this elsewhere, I'm not up to speed on debbugs-gnu. > > I am attaching screenshot of minibuffer. > > 1. M-x debbugs-gnu > 2. Immediately cycle with C-s > > Cycling may happen internally but the UI presents the "most-is-exact" > always at the head. This is a definite bug. The case to be handled is "Complete, but not unique". The attached patch fixes the issue by sneaking a Ctrl-M in to the try try completion field. Attachments: M-x debbugs-gnu RET with icomplete-mode on. icomplete-1.png: Note the ^M and the empty first entry icomplete-2.png: After a C-s. Note the ^M indicator and empty entry pushed to the last. icomplete-3.png: This is the second invocation of M-x debbugs-gnu RET. Note that the entry from the recent history is at the head. Also note ^M and the empty entries. --=-=-= Content-Type: text/x-diff; charset=utf-8 Content-Disposition: inline; filename=icomplete-bug12638.diff Content-Transfer-Encoding: quoted-printable =3D=3D=3D modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2012-12-13 05:29:15 +0000 +++ lisp/ChangeLog 2012-12-13 13:32:58 +0000 @@ -1,3 +1,10 @@ +2012-12-13 Jambunathan K + + * icomplete.el (icomplete-hide-common-prefix): New user variable. + (icomplete-first-match): New user face. + (icomplete-completions): Honor above settings. Correctly handle + the case when NAME is complete but not unique (Bug#12638). + 2012-12-13 Alan Mackenzie =20 Make CC Mode not hang when _some_ lines end in CRLF. Bug #11841. =3D=3D=3D modified file 'lisp/icomplete.el' --- lisp/icomplete.el 2012-11-30 17:09:55 +0000 +++ lisp/icomplete.el 2012-12-13 13:16:31 +0000 @@ -76,6 +76,18 @@ :type 'string :version "24.4") =20 +(defcustom icomplete-hide-common-prefix t + "When non-nil, hide common prefix from completion candidates. +When nil, show candidates in full." + :type 'boolean + :version "24.4" + :group 'icomplete) + +(defface icomplete-first-match '((t :weight bold)) + "Face used by icomplete for highlighting first match." + :version "24.4" + :group 'icomplete) + ;;;_* User Customization variables (defcustom icomplete-prospects-height ;; 20 is an estimated common size for the prompt + minibuffer content, to @@ -332,14 +344,12 @@ are exhibited within the square braces.) (determ (unless (or (eq t compare) (eq t most-try) (=3D (setq compare (1- (abs compare))) (length most))) - (concat open-bracket (cond ((=3D compare (length name)) ;; Typical case: name is a prefix. (substring most compare)) ((< compare 5) most) - (t (concat "..." (substring most compare)))) - close-bracket))) + (t (concat "..." (substring most compare)))))) ;;"-prospects" - more than one candidate (prospects-len (+ (length determ) 6 ;; take {,...} into account (string-width (buffer-string)))) @@ -350,6 +360,8 @@ are exhibited within the square braces.) ;; one line, increase the allowable space accordingly. (/ prospects-len (window-width))) (window-width))) + (prefix (when icomplete-hide-common-prefix + (try-completion "" comps))) (prefix-len ;; Find the common prefix among `comps'. ;; We can't use the optimization below because its assumptions @@ -359,37 +371,58 @@ are exhibited within the square braces.) ;; ;; Common case. ;; (length most) ;; Else, use try-completion. - (let ((comps-prefix (try-completion "" comps))) - (and (stringp comps-prefix) - (length comps-prefix)))) ;;) - + (and (stringp prefix) (length prefix))) ;;) prospects most-is-exact comp limit) (if (eq most-try t) ;; (or (null (cdr comps)) (setq prospects nil) + (when (and (cdr comps) (member name comps)) + ;; NAME is complete but not unique. This scenario, poses + ;; following UI issues: + ;; + ;; - When common prefix is hidden, NAME is stripped empty. + ;; This would make the entry inconspicuous. + ;; - Due to sorting of completions, NAME may not be the + ;; first of the prospects and could be hidden deep in the + ;; displayed string. + ;; - Because of truncation, NAME may not even be displayed + ;; to the user. + ;; + ;; To circumvent all the above problems, provide a visual + ;; cue to the user via try completion field. + (setq determ "=0D")) (while (and comps (not limit)) (setq comp (if prefix-len (substring (car comps) prefix-len) (car comps)) comps (cdr comps)) - (cond ((string-equal comp "") (setq most-is-exact t)) - ((member comp prospects)) - (t (setq prospects-len + (setq prospects-len (+ (string-width comp) 1 prospects-len)) (if (< prospects-len prospects-max) (push comp prospects) - (setq limit t)))))) + (setq limit t)))) + (setq prospects (nreverse prospects)) + ;; Decorate the first of prospects. + (when prospects + (let ((first (copy-sequence (pop prospects)))) + (put-text-property 0 (length first) + 'face 'icomplete-first-match first) + (push first prospects))) ;; Restore the base-size info, since completion-all-sorted-complet= ions ;; is cached. (if last (setcdr last base-size)) + (when determ + (setq determ (concat open-bracket determ close-bracket))) (if prospects (concat determ + (if (not (cdr prospects)) + ;; NAME is not complete but will complete to + ;; an EXACT match on next try. + "" + (concat "{" - (and most-is-exact - (substring icomplete-separator - (string-match "[^ ]" icomplete-separat= or))) - (mapconcat 'identity (nreverse prospects) - icomplete-separator) + (mapconcat 'identity prospects icomplete-separator) (and limit (concat icomplete-separator "=E2=80=A6")) - "}") + "}" + ))) (concat determ " [Matched]")))))) =20 ;;_* Local emacs vars. --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=icomplete-3.png Content-Transfer-Encoding: base64 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 --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=icomplete-2.png Content-Transfer-Encoding: base64 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 g8zS/A9RxSLFZDh1wgAAAABJRU5ErkJggg== --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=icomplete-1.png Content-Transfer-Encoding: base64 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 axsAAACgAf8D4T4dRx4LdOAAAAAASUVORK5CYII= --=-=-=--