GNU bug report logs - #14175
24.3.50; Bad completion behavior with read-file-name-completion-ignore-case t

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: michael_heerdegen@HIDDEN; dated Wed, 10 Apr 2013 20:32:01 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 14175 <at> debbugs.gnu.org:


Received: (at 14175) by debbugs.gnu.org; 12 Apr 2013 17:44:13 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Apr 12 13:44:13 2013
Received: from localhost ([127.0.0.1]:47663 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.72)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1UQi1E-0008SV-9k
	for submit <at> debbugs.gnu.org; Fri, 12 Apr 2013 13:44:12 -0400
Received: from ironport2-out.teksavvy.com ([206.248.154.182]:58441)
	by debbugs.gnu.org with esmtp (Exim 4.72)
	(envelope-from <monnier@HIDDEN>) id 1UQi1C-0008S7-FJ
	for 14175 <at> debbugs.gnu.org; Fri, 12 Apr 2013 13:44:10 -0400
X-IronPort-Anti-Spam-Filtered: true
X-IronPort-Anti-Spam-Result: Av8EABK/CFFFxIEd/2dsb2JhbABEuzWDWRdzgh4BAQQBViMFCws0EhQYDSSIHgbBLZEKA6R6gV6DEw
X-IPAS-Result: Av8EABK/CFFFxIEd/2dsb2JhbABEuzWDWRdzgh4BAQQBViMFCws0EhQYDSSIHgbBLZEKA6R6gV6DEw
X-IronPort-AV: E=Sophos;i="4.84,565,1355115600"; 
   d="scan'208";a="7278990"
Received: from 69-196-129-29.dsl.teksavvy.com (HELO pastel.home)
	([69.196.129.29])
	by ironport2-out.teksavvy.com with ESMTP/TLS/ADH-AES256-SHA;
	12 Apr 2013 13:40:11 -0400
Received: by pastel.home (Postfix, from userid 20848)
	id EE2B367B10; Fri, 12 Apr 2013 13:40:13 -0400 (EDT)
From: Stefan Monnier <monnier@HIDDEN>
To: Michael Heerdegen <michael_heerdegen@HIDDEN>
Subject: Re: bug#14175: 24.3.50;
	Bad completion behavior with read-file-name-completion-ignore-case t
Message-ID: <jwvhajbirh8.fsf-monnier+emacs@HIDDEN>
References: <877gkab09w.fsf@HIDDEN> <87zjx69e76.fsf@HIDDEN>
Date: Fri, 12 Apr 2013 13:40:13 -0400
In-Reply-To: <87zjx69e76.fsf@HIDDEN> (Michael Heerdegen's message of "Thu, 11
	Apr 2013 01:08:13 +0200")
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -1.9 (-)
X-Debbugs-Envelope-To: 14175
Cc: 14175 <at> debbugs.gnu.org
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <http://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
	<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <http://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <http://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
	<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Sender: debbugs-submit-bounces <at> debbugs.gnu.org
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
X-Spam-Score: -1.9 (-)

> When you hit TAB the second time, this call in
> `completion--nth-completion' changes the result from ("download/"
> "Downloads/") to ("Download/" "Downloads/"):

>    (if requote
>         (funcall requote result n)
>       result)

Hmmm........

Indeed we have a problem.  Usually "completion-ignore-case" as you
expect means "feel free to change my input's case to match the
completions".  But the "quote/requote" thingy generally tries to
preserve the user's input (e.g. so as to keep $HOME rather than replace
it with /home/monnier), which is why here it also preserves the
user's case.

Not sure yet how best to fix this bug.


        Stefan




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#14175; Package emacs. Full text available.

Message received at 14175 <at> debbugs.gnu.org:


Received: (at 14175) by debbugs.gnu.org; 12 Apr 2013 14:57:55 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Apr 12 10:57:55 2013
Received: from localhost ([127.0.0.1]:47489 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.72)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1UQfQH-0001p8-09
	for submit <at> debbugs.gnu.org; Fri, 12 Apr 2013 10:57:54 -0400
Received: from mout.web.de ([212.227.15.3]:56910)
	by debbugs.gnu.org with esmtp (Exim 4.72)
	(envelope-from <michael_heerdegen@HIDDEN>) id 1UQfQB-0001oQ-2Q
	for 14175 <at> debbugs.gnu.org; Fri, 12 Apr 2013 10:57:51 -0400
Received: from drachen.dragon ([92.74.136.91]) by smtp.web.de (mrweb101) with
	ESMTPSA (Nemesis) id 0LzsKN-1UeuRb0MAl-014S0l;
	Fri, 12 Apr 2013 16:53:50 +0200
From: Michael Heerdegen <michael_heerdegen@HIDDEN>
To: 14175 <at> debbugs.gnu.org
Subject: Re: bug#14175: 24.3.50;
	Bad completion behavior with read-file-name-completion-ignore-case t
References: <877gkab09w.fsf@HIDDEN> <87zjx69e76.fsf@HIDDEN>
Date: Fri, 12 Apr 2013 16:53:47 +0200
In-Reply-To: <87zjx69e76.fsf@HIDDEN> (Michael Heerdegen's message of "Thu, 11
	Apr 2013 01:08:13 +0200")
Message-ID: <87k3o7kdfo.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable
X-Provags-ID: V02:K0:teE9cVKf47xvSyUkklPJNiqUhyrVDOxxaKZsm83Kh+u
	pXEeWR2MTrSPMhbu7TzRSpn0gSzESeFaegkEYSaAoIDjnTrHEb
	y0DbBWKsFhSBOHNJBOU57A5XNoJeA+wCGL8Grx7j5DSdBvQiby
	gB7xwcyCKqovdzDsLkL/9rt8rQvCMgnhh0hirYQxhU6G+PDv4s
	QT+Bzzs0dBAphtTOEIxS8K1IviE2VDwmwlr54nfHJk=
X-Spam-Score: -4.3 (----)
X-Debbugs-Envelope-To: 14175
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <http://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
	<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <http://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <http://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
	<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Sender: debbugs-submit-bounces <at> debbugs.gnu.org
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
X-Spam-Score: -4.3 (----)

Michael Heerdegen <michael_heerdegen@HIDDEN> writes:

> Hello,
>
> 1.  I tried to debug a bit.
>
> When you hit TAB the second time, this call in
> `completion--nth-completion' changes the result from ("download/"
> "Downloads/") to ("Download/" "Downloads/"):
>
>    (if requote
>         (funcall requote result n)
>       result)

Some more information: this call at the very last lines of
`completion-table-with-quoting':

(when last
 (setcdr last nil)
 (completion--twq-all string ustring
                      unquoted-result base
                      unquote requote))

returns the changed case of the first candidate (from "~/download" to
"~/Download"), i.e., introduces the error.

Here is a backtrace of that point of time:

,----------------------------------------------------------------------
|   completion--twq-all("~/Download" "~/Download" (#("download/" 0 8 (face =
(completions-common-part)) 8 9 (face (completions-first-difference))) #("Do=
wnloads/" 0 8 (face (completions-common-part)) 8 9 (face (completions-first=
-difference)))) 2 substitute-in-file-name completion--sifn-requote)
|   (progn (setcdr last nil) (completion--twq-all string ustring unquoted-r=
esult base unquote requote))
|   (if last (progn (setcdr last nil) (completion--twq-all string ustring u=
nquoted-result base unquote requote)))
|   (let* ((last (last unquoted-result)) (base (or (cdr last) 0))) (if last=
 (progn (setcdr last nil) (completion--twq-all string ustring unquoted-resu=
lt base unquote requote))))
|   (let nil (debug) (let* ((last (last unquoted-result)) (base (or (cdr la=
st) 0))) (if last (progn (setcdr last nil) (completion--twq-all string ustr=
ing unquoted-result base unquote requote)))))
|   (cond ((eq op (quote 1)) (let nil (if (not (stringp (car-safe unquoted-=
result))) unquoted-result (completion--twq-try string ustring (car unquoted=
-result) (cdr unquoted-result) unquote requote)))) ((eq op (quote 2)) (let =
nil (debug) (let* ((last (last unquoted-result)) (base (or (cdr last) 0))) =
(if last (progn (setcdr last nil) (completion--twq-all string ustring unquo=
ted-result base unquote requote)))))) (t nil))
|   (closure ((uprefix . "~/Download") (ustring . #1=3D"~/Download") (actio=
n . completion--unquote) (pred . 10) (string . #1#) (requote . completion--=
sifn-requote) (unquote . substitute-in-file-name) (table . completion-file-=
name-table) t) (unquoted-result op) (cond ((eq op (quote 1)) (let nil (if (=
not (stringp (car-safe unquoted-result))) unquoted-result (completion--twq-=
try string ustring (car unquoted-result) (cdr unquoted-result) unquote requ=
ote)))) ((eq op (quote 2)) (let nil (debug) (let* ((last (last unquoted-res=
ult)) (base (or ... 0))) (if last (progn (setcdr last nil) (completion--twq=
-all string ustring unquoted-result base unquote requote)))))) (t nil)))((#=
("download/" 0 8 (face (completions-common-part)) 8 9 (face (completions-fi=
rst-difference))) #("Downloads/" 0 8 (face (completions-common-part)) 8 9 (=
face (completions-first-difference)))) 2)
|   funcall((closure ((uprefix . "~/Download") (ustring . #1=3D"~/Download"=
) (action . completion--unquote) (pred . 10) (string . #1#) (requote . comp=
letion--sifn-requote) (unquote . substitute-in-file-name) (table . completi=
on-file-name-table) t) (unquoted-result op) (cond ((eq op (quote 1)) (let n=
il (if (not (stringp (car-safe unquoted-result))) unquoted-result (completi=
on--twq-try string ustring (car unquoted-result) (cdr unquoted-result) unqu=
ote requote)))) ((eq op (quote 2)) (let nil (debug) (let* ((last (last unqu=
oted-result)) (base (or ... 0))) (if last (progn (setcdr last nil) (complet=
ion--twq-all string ustring unquoted-result base unquote requote)))))) (t n=
il))) (#("download/" 0 8 (face (completions-common-part)) 8 9 (face (comple=
tions-first-difference))) #("Downloads/" 0 8 (face (completions-common-part=
)) 8 9 (face (completions-first-difference)))) 2)
|   (if requote (funcall requote result n) result)
|   (let ((requote (if (completion-metadata-get metadata (quote completion-=
-unquote-requote)) (progn (let ((new ...)) (setq string (car ...)) (setq ta=
ble (car ...)) (setq point (car ...)) (car (prog1 new ...)))))) (result (pr=
ogn (completion--some (function (lambda (style) (funcall ... string table p=
red point))) (completion--styles metadata))))) (if requote (funcall requote=
 result n) result))
|   completion--nth-completion(2 "~/Download" read-file-name-internal file-=
exists-p 10 (metadata (category . file) (completion--unquote-requote . t)))
|   completion-all-completions("~/Download" read-file-name-internal file-ex=
ists-p 10 (metadata (category . file) (completion--unquote-requote . t)))
|   (let* ((start (field-beginning)) (end (field-end)) (string (field-strin=
g)) (md (completion--field-metadata start)) (completions (completion-all-co=
mpletions string minibuffer-completion-table minibuffer-completion-predicat=
e (- (point) (field-beginning)) md))) (message nil) (if (or (null completio=
ns) (and (not (consp (cdr completions))) (equal (car completions) string)))=
 (progn (minibuffer-hide-completions) (ding) (minibuffer-message (if comple=
tions "Sole completion" "No completions"))) (let* ((last (last completions)=
) (base-size (cdr last)) (prefix (if (zerop base-size) nil (substring strin=
g 0 base-size))) (all-md (completion--metadata (buffer-substring-no-propert=
ies start (point)) base-size md minibuffer-completion-table minibuffer-comp=
letion-predicate)) (afun (or (completion-metadata-get all-md (quote annotat=
ion-function)) (plist-get completion-extra-properties :annotation-function)=
 completion-annotate-function)) (display-buffer-mark-dedicated (quote soft)=
)) (let* ((#1=3D#:old-dir default-directory) (#4=3D#:buf (save-current-buff=
er (set-buffer ...) (prog1 ... ... ... ... ... ... ...))) (standard-output =
#4#)) (prog1 (progn (if last (progn ...)) (setq completions (let ... ...)) =
(if afun (progn ...)) (save-current-buffer (set-buffer standard-output) (se=
t ... ...) (set ... ...)) (display-completion-list completions)) (internal-=
temp-output-buffer-show #4#))))) nil)
|   minibuffer-completion-help()
|   (if (if (eq completion-auto-help (quote lazy)) (let nil (eq this-comman=
d last-command)) (let nil completion-auto-help)) (minibuffer-completion-hel=
p) (completion--message "Next char not unique"))
|   (cond ((and (consp (cdr comps)) (not (condition-case nil (progn (consp =
(nthcdr threshold comps))) (error nil)))) (setq completed t exact t) (compl=
etion--cache-all-sorted-completions comps) (minibuffer-force-complete)) (co=
mpleted (minibuffer-hide-completions) (if exact (completion--done completio=
n (if (< comp-pos (length completion)) (quote exact) (quote unknown))))) ((=
not exact) (if (if (eq completion-auto-help (quote lazy)) (let nil (eq this=
-command last-command)) (let nil completion-auto-help)) (minibuffer-complet=
ion-help) (completion--message "Next char not unique"))) (t (if (and (eq th=
is-command last-command) completion-auto-help) (minibuffer-completion-help)=
) (completion--done completion (quote exact) (if expect-exact nil "Complete=
, but not unique"))))
|   (let* ((exact (test-completion completion minibuffer-completion-table m=
inibuffer-completion-predicate)) (threshold (completion--cycle-threshold md=
)) (comps (if (and threshold (or (not completed) (< (car ...) comp-pos))) (=
progn (completion-all-sorted-completions))))) (completion--flush-all-sorted=
-completions) (cond ((and (consp (cdr comps)) (not (condition-case nil (pro=
gn (consp ...)) (error nil)))) (setq completed t exact t) (completion--cach=
e-all-sorted-completions comps) (minibuffer-force-complete)) (completed (mi=
nibuffer-hide-completions) (if exact (completion--done completion (if (< co=
mp-pos (length completion)) (quote exact) (quote unknown))))) ((not exact) =
(if (if (eq completion-auto-help (quote lazy)) (let nil (eq this-command la=
st-command)) (let nil completion-auto-help)) (minibuffer-completion-help) (=
completion--message "Next char not unique"))) (t (if (and (eq this-command =
last-command) completion-auto-help) (minibuffer-completion-help)) (completi=
on--done completion (quote exact) (if expect-exact nil "Complete, but not u=
nique")))) (minibuffer--bitset completed t exact))
|   (if (not (or unchanged completed)) (completion--do-completion try-compl=
etion-function expect-exact) (let* ((exact (test-completion completion mini=
buffer-completion-table minibuffer-completion-predicate)) (threshold (compl=
etion--cycle-threshold md)) (comps (if (and threshold (or (not completed) (=
< ... comp-pos))) (progn (completion-all-sorted-completions))))) (completio=
n--flush-all-sorted-completions) (cond ((and (consp (cdr comps)) (not (cond=
ition-case nil (progn ...) (error nil)))) (setq completed t exact t) (compl=
etion--cache-all-sorted-completions comps) (minibuffer-force-complete)) (co=
mpleted (minibuffer-hide-completions) (if exact (completion--done completio=
n (if (< comp-pos ...) (quote exact) (quote unknown))))) ((not exact) (if (=
if (eq completion-auto-help (quote lazy)) (let nil (eq this-command last-co=
mmand)) (let nil completion-auto-help)) (minibuffer-completion-help) (compl=
etion--message "Next char not unique"))) (t (if (and (eq this-command last-=
command) completion-auto-help) (minibuffer-completion-help)) (completion--d=
one completion (quote exact) (if expect-exact nil "Complete, but not unique=
")))) (minibuffer--bitset completed t exact)))
|   (let* ((comp-pos (cdr comp)) (completion (car comp)) (completed (not (e=
q t (compare-strings completion nil nil string nil nil t)))) (unchanged (eq=
 t (compare-strings completion nil nil string nil nil nil)))) (if unchanged=
 (goto-char end) (completion--replace beg end completion)) (forward-char (-=
 comp-pos (length completion))) (if (not (or unchanged completed)) (complet=
ion--do-completion try-completion-function expect-exact) (let* ((exact (tes=
t-completion completion minibuffer-completion-table minibuffer-completion-p=
redicate)) (threshold (completion--cycle-threshold md)) (comps (if (and thr=
eshold (or ... ...)) (progn (completion-all-sorted-completions))))) (comple=
tion--flush-all-sorted-completions) (cond ((and (consp (cdr comps)) (not (c=
ondition-case nil ... ...))) (setq completed t exact t) (completion--cache-=
all-sorted-completions comps) (minibuffer-force-complete)) (completed (mini=
buffer-hide-completions) (if exact (completion--done completion (if ... ...=
 ...)))) ((not exact) (if (if (eq completion-auto-help ...) (let nil ...) (=
let nil completion-auto-help)) (minibuffer-completion-help) (completion--me=
ssage "Next char not unique"))) (t (if (and (eq this-command last-command) =
completion-auto-help) (minibuffer-completion-help)) (completion--done compl=
etion (quote exact) (if expect-exact nil "Complete, but not unique")))) (mi=
nibuffer--bitset completed t exact))))
|   (cond ((null comp) (minibuffer-hide-completions) (if completion-fail-di=
screetly nil (ding) (completion--message "No match")) (minibuffer--bitset n=
il nil nil)) ((eq t comp) (minibuffer-hide-completions) (goto-char end) (co=
mpletion--done string (quote finished) (if expect-exact nil "Sole completio=
n")) (minibuffer--bitset nil nil t)) (t (let* ((comp-pos (cdr comp)) (compl=
etion (car comp)) (completed (not (eq t (compare-strings completion nil nil=
 string nil nil t)))) (unchanged (eq t (compare-strings completion nil nil =
string nil nil nil)))) (if unchanged (goto-char end) (completion--replace b=
eg end completion)) (forward-char (- comp-pos (length completion))) (if (no=
t (or unchanged completed)) (completion--do-completion try-completion-funct=
ion expect-exact) (let* ((exact (test-completion completion minibuffer-comp=
letion-table minibuffer-completion-predicate)) (threshold (completion--cycl=
e-threshold md)) (comps (if ... ...))) (completion--flush-all-sorted-comple=
tions) (cond ((and ... ...) (setq completed t exact t) (completion--cache-a=
ll-sorted-completions comps) (minibuffer-force-complete)) (completed (minib=
uffer-hide-completions) (if exact ...)) ((not exact) (if ... ... ...)) (t (=
if ... ...) (completion--done completion ... ...))) (minibuffer--bitset com=
pleted t exact))))))
|   (let* ((beg (field-beginning)) (end (field-end)) (string (buffer-substr=
ing beg end)) (md (completion--field-metadata beg)) (comp (funcall (or try-=
completion-function (quote completion-try-completion)) string minibuffer-co=
mpletion-table minibuffer-completion-predicate (- (point) beg) md))) (cond =
((null comp) (minibuffer-hide-completions) (if completion-fail-discreetly n=
il (ding) (completion--message "No match")) (minibuffer--bitset nil nil nil=
)) ((eq t comp) (minibuffer-hide-completions) (goto-char end) (completion--=
done string (quote finished) (if expect-exact nil "Sole completion")) (mini=
buffer--bitset nil nil t)) (t (let* ((comp-pos (cdr comp)) (completion (car=
 comp)) (completed (not (eq t ...))) (unchanged (eq t (compare-strings comp=
letion nil nil string nil nil nil)))) (if unchanged (goto-char end) (comple=
tion--replace beg end completion)) (forward-char (- comp-pos (length comple=
tion))) (if (not (or unchanged completed)) (completion--do-completion try-c=
ompletion-function expect-exact) (let* ((exact ...) (threshold ...) (comps =
...)) (completion--flush-all-sorted-completions) (cond (... ... ... ...) (c=
ompleted ... ...) (... ...) (t ... ...)) (minibuffer--bitset completed t ex=
act)))))))
|   completion--do-completion()
|   (let* ((#1=3D#:val (completion--do-completion))) (if (eq #1# (quote 0))=
 (let nil nil) (let nil t)))
|   (cond ((window-live-p minibuffer-scroll-window) (let ((window minibuffe=
r-scroll-window)) (save-current-buffer (set-buffer (window-buffer window)) =
(if (pos-visible-in-window-p (point-max) window) (set-window-start window (=
point-min) nil) (scroll-other-window)) nil))) ((and completion-cycling comp=
letion-all-sorted-completions) (minibuffer-force-complete) t) (t (let* ((#1=
=3D#:val (completion--do-completion))) (if (eq #1# (quote 0)) (let nil nil)=
 (let nil t)))))
|   minibuffer-complete()
|   call-interactively(minibuffer-complete nil nil)
|   command-execute(minibuffer-complete)
|   read-from-minibuffer("Dired (directory): " "~/today/" (keymap (keymap (=
32)) keymap (7 . minibuffer-keyboard-quit) (menu-bar keymap (minibuf #1=3D"=
Minibuf" keymap (tab menu-item "Complete" minibuffer-complete :help "Comple=
te as far as possible") (space menu-item "Complete Word" minibuffer-complet=
e-word :help "Complete at most one word") (63 menu-item "List Completions" =
minibuffer-completion-help :help "Display all possible completions") #1#)) =
(27 keymap (21) (23) (118 . switch-to-completions)) (prior . switch-to-comp=
letions) (63 . minibuffer-completion-help) (32 . minibuffer-complete-word) =
(9 . minibuffer-complete) keymap (f9 . my-enlarge-mb) (menu-bar keymap (min=
ibuf #1# keymap (previous menu-item "Previous History Item" previous-histor=
y-element :help "Put previous minibuffer history element in the minibuffer"=
) (next menu-item "Next History Item" next-history-element :help "Put next =
minibuffer history element in the minibuffer") (isearch-backward menu-item =
"Isearch History Backward" isearch-backward :help "Incrementally search min=
ibuffer history backward") (isearch-forward menu-item "Isearch History Forw=
ard" isearch-forward :help "Incrementally search minibuffer history forward=
") (return menu-item "Enter" exit-minibuffer :key-sequence "" :help "Termin=
ate input and exit minibuffer") (quit menu-item "Quit" abort-recursive-edit=
 :help "Abort input and exit minibuffer") #1#)) (10 . exit-minibuffer) (13 =
. exit-minibuffer) (7 . abort-recursive-edit) (C-tab . file-cache-minibuffe=
r-complete) (9 . self-insert-command) (XF86Back . previous-history-element)=
 (up . previous-history-element) (prior . previous-history-element) (XF86Fo=
rward . next-history-element) (down . next-history-element) (next . next-hi=
story-element) (27 keymap (114 . previous-matching-history-element) (115 . =
next-matching-history-element) (112 . previous-history-element) (110 . next=
-history-element))) nil file-name-history "~/today/" nil)
|   (let* ((minibuffer-completion-table collection) (minibuffer-completion-=
predicate predicate) (minibuffer-completion-confirm (if (eq require-match t=
) nil require-match)) (base-keymap (if require-match minibuffer-local-must-=
match-map minibuffer-local-completion-map)) (keymap (if (memq minibuffer-co=
mpleting-file-name (quote (nil lambda))) base-keymap (make-composed-keymap =
minibuffer-local-filename-completion-map base-keymap))) (result (read-from-=
minibuffer prompt initial-input keymap nil hist def inherit-input-method)))=
 (if (and (equal result "") def) (progn (setq result (if (consp def) (car d=
ef) def)))) result)
|   completing-read-default("Dired (directory): " read-file-name-internal f=
ile-exists-p nil "~/today/" file-name-history "~/today/" nil)
|   completing-read("Dired (directory): " read-file-name-internal file-exis=
ts-p nil "~/today/" file-name-history "~/today/")
|   (progn (add-hook (quote minibuffer-setup-hook) #:setup-hook) (completin=
g-read prompt (quote read-file-name-internal) pred mustmatch insdef (quote =
file-name-history) default-filename))
|   (unwind-protect (progn (add-hook #1=3D(quote minibuffer-setup-hook) #2=
=3D#:setup-hook) (completing-read prompt (quote read-file-name-internal) pr=
ed mustmatch insdef (quote file-name-history) default-filename)) (remove-ho=
ok #1# #2#))
|   (let (#1=3D#:setup-hook) (setq #1# (function (lambda nil (remove-hook #=
2=3D(quote minibuffer-setup-hook) #1#) (funcall (function (lambda nil (setq=
 default-directory dir) (if ... ...) (set ... ...) (set-syntax-table minibu=
ffer-local-filename-syntax))))))) (unwind-protect (progn (add-hook #2# #1#)=
 (completing-read prompt (quote read-file-name-internal) pred mustmatch ins=
def (quote file-name-history) default-filename)) (remove-hook #2# #1#)))
|   (let ((dir (file-name-as-directory (expand-file-name dir)))) (let (#1=
=3D#:setup-hook) (setq #1# (function (lambda nil (remove-hook #2=3D(quote m=
inibuffer-setup-hook) #1#) (funcall (function (lambda nil ... ... ... ...))=
)))) (unwind-protect (progn (add-hook #2# #1#) (completing-read prompt (quo=
te read-file-name-internal) pred mustmatch insdef (quote file-name-history)=
 default-filename)) (remove-hook #2# #1#))))
|   (if (or (not (next-read-file-uses-dialog-p)) (file-remote-p dir)) (let =
((dir (file-name-as-directory (expand-file-name dir)))) (let (#1=3D#:setup-=
hook) (setq #1# (function (lambda nil (remove-hook #2=3D(quote minibuffer-s=
etup-hook) #1#) (funcall (function ...))))) (unwind-protect (progn (add-hoo=
k #2# #1#) (completing-read prompt (quote read-file-name-internal) pred mus=
tmatch insdef (quote file-name-history) default-filename)) (remove-hook #2#=
 #1#)))) (let ((file (file-name-nondirectory dir)) (dialog-mustmatch (not (=
memq mustmatch (quote (nil confirm confirm-after-completion)))))) (if (and =
(not default-filename) (not (zerop (length file)))) (progn (setq default-fi=
lename file) (setq dir (file-name-directory dir)))) (if default-filename (p=
rogn (setq default-filename (expand-file-name (if (consp default-filename) =
(car default-filename) default-filename) dir)))) (setq add-to-history t) (x=
-file-dialog prompt dir default-filename dialog-mustmatch (eq predicate (qu=
ote file-directory-p)))))
|   (let* ((val (if (or (not (next-read-file-uses-dialog-p)) (file-remote-p=
 dir)) (let ((dir (file-name-as-directory ...))) (let (#1=3D#:setup-hook) (=
setq #1# (function ...)) (unwind-protect (progn ... ...) (remove-hook #2=3D=
... #1#)))) (let ((file (file-name-nondirectory dir)) (dialog-mustmatch (no=
t ...))) (if (and (not default-filename) (not ...)) (progn (setq default-fi=
lename file) (setq dir ...))) (if default-filename (progn (setq default-fil=
ename ...))) (setq add-to-history t) (x-file-dialog prompt dir default-file=
name dialog-mustmatch (eq predicate (quote file-directory-p)))))) (replace-=
in-history (eq (car-safe file-name-history) val))) (if (consp default-filen=
ame) (progn (setq default-filename (car default-filename)))) (if (eq val de=
fault-filename) (progn (if (not replace-in-history) (setq add-to-history t)=
) (setq val ""))) (if val nil (error "No file name specified")) (if (and de=
fault-filename (string-equal val (if (consp insdef) (car insdef) insdef))) =
(setq val default-filename)) (setq val (substitute-in-file-name val)) (if r=
eplace-in-history (let ((val1 (minibuffer--double-dollars val))) (if histor=
y-delete-duplicates (setcdr file-name-history (delete val1 (cdr file-name-h=
istory)))) (if (string=3D val1 (cadr file-name-history)) (car (prog1 file-n=
ame-history (setq file-name-history (cdr file-name-history)))) (setcar file=
-name-history val1))) (if add-to-history (let ((val1 (minibuffer--double-do=
llars val))) (if (and (consp file-name-history) (equal (car file-name-histo=
ry) val1)) nil (setq file-name-history (cons val1 (if history-delete-duplic=
ates ... file-name-history))))))) val)
|   (let ((completion-ignore-case read-file-name-completion-ignore-case) (m=
inibuffer-completing-file-name t) (pred (or predicate (quote file-exists-p)=
)) (add-to-history nil)) (let* ((val (if (or (not (next-read-file-uses-dial=
og-p)) (file-remote-p dir)) (let ((dir ...)) (let (#1=3D#:setup-hook) (setq=
 #1# ...) (unwind-protect ... ...))) (let ((file ...) (dialog-mustmatch ...=
)) (if (and ... ...) (progn ... ...)) (if default-filename (progn ...)) (se=
tq add-to-history t) (x-file-dialog prompt dir default-filename dialog-must=
match (eq predicate ...))))) (replace-in-history (eq (car-safe file-name-hi=
story) val))) (if (consp default-filename) (progn (setq default-filename (c=
ar default-filename)))) (if (eq val default-filename) (progn (if (not repla=
ce-in-history) (setq add-to-history t)) (setq val ""))) (if val nil (error =
"No file name specified")) (if (and default-filename (string-equal val (if =
(consp insdef) (car insdef) insdef))) (setq val default-filename)) (setq va=
l (substitute-in-file-name val)) (if replace-in-history (let ((val1 (minibu=
ffer--double-dollars val))) (if history-delete-duplicates (setcdr file-name=
-history (delete val1 (cdr file-name-history)))) (if (string=3D val1 (cadr =
file-name-history)) (car (prog1 file-name-history (setq file-name-history .=
..))) (setcar file-name-history val1))) (if add-to-history (let ((val1 (min=
ibuffer--double-dollars val))) (if (and (consp file-name-history) (equal ..=
. val1)) nil (setq file-name-history (cons val1 ...)))))) val))
|   (let ((insdef (cond ((and insert-default-directory (stringp dir)) (if i=
nitial (cons (minibuffer--double-dollars ...) (length ...)) (minibuffer--do=
uble-dollars dir))) (initial (cons (minibuffer--double-dollars initial) 0))=
))) (let ((completion-ignore-case read-file-name-completion-ignore-case) (m=
inibuffer-completing-file-name t) (pred (or predicate (quote file-exists-p)=
)) (add-to-history nil)) (let* ((val (if (or (not ...) (file-remote-p dir))=
 (let (...) (let ... ... ...)) (let (... ...) (if ... ...) (if default-file=
name ...) (setq add-to-history t) (x-file-dialog prompt dir default-filenam=
e dialog-mustmatch ...)))) (replace-in-history (eq (car-safe file-name-hist=
ory) val))) (if (consp default-filename) (progn (setq default-filename (car=
 default-filename)))) (if (eq val default-filename) (progn (if (not replace=
-in-history) (setq add-to-history t)) (setq val ""))) (if val nil (error "N=
o file name specified")) (if (and default-filename (string-equal val (if (c=
onsp insdef) (car insdef) insdef))) (setq val default-filename)) (setq val =
(substitute-in-file-name val)) (if replace-in-history (let ((val1 (minibuff=
er--double-dollars val))) (if history-delete-duplicates (setcdr file-name-h=
istory (delete val1 ...))) (if (string=3D val1 (cadr file-name-history)) (c=
ar (prog1 file-name-history ...)) (setcar file-name-history val1))) (if add=
-to-history (let ((val1 ...)) (if (and ... ...) nil (setq file-name-history=
 ...))))) val)))
|   read-file-name-default("Dired (directory): " nil "/home/micha/today/" n=
il nil nil)
|   funcall(read-file-name-default "Dired (directory): " nil "/home/micha/t=
oday/" nil nil nil)
|   read-file-name("Dired (directory): " nil "/home/micha/today/" nil)
|   dired-read-dir-and-switches("")
|   call-interactively(dired nil nil)
|   command-execute(dired)
`----------------------------------------------------------------------

I can reproduce this behavior manually:

(completion--twq-all
 #1=3D"~/Download"
 #1# '(#("download/" 0 8 (face (completions-common-part)) 8 9 (face (comple=
tions-first-difference)))
       #("Downloads/" 0 8 (face (completions-common-part)) 8 9 (face (compl=
etions-first-difference))))
 2 'substitute-in-file-name 'completion--sifn-requote)

=3D=3D>

(#("Download/" 0 8
   (face completions-common-part)
   8 9
   (face
    (completions-first-difference)))
 #("Downloads/" 0 8
   (face completions-common-part)
   8 9
   (face
    (completions-first-difference)))
 . 2)

I can't dig further 'cause I don't know what `completion--twq-all' is or
should do.


HTH,

Michael.

=20




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#14175; Package emacs. Full text available.

Message received at 14175 <at> debbugs.gnu.org:


Received: (at 14175) by debbugs.gnu.org; 10 Apr 2013 23:12:04 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 10 19:12:04 2013
Received: from localhost ([127.0.0.1]:44273 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.72)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1UQ4BQ-000870-9p
	for submit <at> debbugs.gnu.org; Wed, 10 Apr 2013 19:12:04 -0400
Received: from mout.web.de ([212.227.17.11]:50687)
	by debbugs.gnu.org with esmtp (Exim 4.72)
	(envelope-from <michael_heerdegen@HIDDEN>) id 1UQ4BO-00086Z-BA
	for 14175 <at> debbugs.gnu.org; Wed, 10 Apr 2013 19:12:03 -0400
Received: from drachen.dragon ([92.74.136.91]) by smtp.web.de (mrweb103) with
	ESMTPSA (Nemesis) id 0LyDlZ-1UbdWt0cp3-015FPf;
	Thu, 11 Apr 2013 01:08:14 +0200
From: Michael Heerdegen <michael_heerdegen@HIDDEN>
To: 14175 <at> debbugs.gnu.org
Subject: Re: bug#14175: 24.3.50;
	Bad completion behavior with read-file-name-completion-ignore-case t
References: <877gkab09w.fsf@HIDDEN>
Date: Thu, 11 Apr 2013 01:08:13 +0200
In-Reply-To: <877gkab09w.fsf@HIDDEN> (Michael Heerdegen's message of "Wed, 10
	Apr 2013 22:26:03 +0200")
Message-ID: <87zjx69e76.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
X-Provags-ID: V02:K0:GlsatU1HroflUKx9TXCeTFMwVp6PyLn+wmH7FFkQKlR
	v10EnDL3w2T58LrGOmMwcgVDJaifL6T/jEJNoojdtIgNssEyz1
	sWEDhvLaFTmaOSCHGh7RoFLrO8Gbuo/l0SvG6N+cL593wNJ4ES
	ttfYfjFJ/Q3Hr6BW2amo8sT14sqjQ/qUL4OzZ+rUnRjMzh/yK2
	cTWOAEVmb8q7MBNe6bcQpBLiIGyADD63nOZZza79BE=
X-Spam-Score: -2.4 (--)
X-Debbugs-Envelope-To: 14175
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <http://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
	<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <http://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <http://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
	<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Sender: debbugs-submit-bounces <at> debbugs.gnu.org
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
X-Spam-Score: -4.3 (----)

Hello,

1.  I tried to debug a bit.

When you hit TAB the second time, this call in
`completion--nth-completion' changes the result from ("download/"
"Downloads/") to ("Download/" "Downloads/"):

   (if requote
        (funcall requote result n)
      result)

2.  I still think that the first TAB already should bring up *Completions* -
although this also doesn't happen when I start with "~/down", so this is
probably a separate issue (and maybe arguable).


Regards,

Michael.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#14175; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 10 Apr 2013 20:31:07 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 10 16:31:07 2013
Received: from localhost ([127.0.0.1]:44118 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.72)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1UQ1fe-0007t0-Ms
	for submit <at> debbugs.gnu.org; Wed, 10 Apr 2013 16:31:07 -0400
Received: from eggs.gnu.org ([208.118.235.92]:48415)
	by debbugs.gnu.org with esmtp (Exim 4.72)
	(envelope-from <michael_heerdegen@HIDDEN>) id 1UQ1fZ-0007sc-Tf
	for submit <at> debbugs.gnu.org; Wed, 10 Apr 2013 16:31:05 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
	(envelope-from <michael_heerdegen@HIDDEN>) id 1UQ1bv-0008Bn-Po
	for submit <at> debbugs.gnu.org; Wed, 10 Apr 2013 16:27:16 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-102.4 required=5.0 tests=BAYES_20,FREEMAIL_FROM,
	RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD,
	USER_IN_WHITELIST autolearn=disabled version=3.3.2
Received: from lists.gnu.org ([208.118.235.17]:53114)
	by eggs.gnu.org with esmtp (Exim 4.71)
	(envelope-from <michael_heerdegen@HIDDEN>) id 1UQ1bv-0008BW-N7
	for submit <at> debbugs.gnu.org; Wed, 10 Apr 2013 16:27:15 -0400
Received: from eggs.gnu.org ([208.118.235.92]:59773)
	by lists.gnu.org with esmtp (Exim 4.71)
	(envelope-from <michael_heerdegen@HIDDEN>) id 1UQ1bu-0004N8-On
	for bug-gnu-emacs@HIDDEN; Wed, 10 Apr 2013 16:27:15 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
	(envelope-from <michael_heerdegen@HIDDEN>) id 1UQ1bt-0008B3-TV
	for bug-gnu-emacs@HIDDEN; Wed, 10 Apr 2013 16:27:14 -0400
Received: from mout.web.de ([212.227.17.11]:55657)
	by eggs.gnu.org with esmtp (Exim 4.71)
	(envelope-from <michael_heerdegen@HIDDEN>) id 1UQ1ao-0007sb-5O
	for bug-gnu-emacs@HIDDEN; Wed, 10 Apr 2013 16:26:06 -0400
Received: from drachen.dragon ([92.74.136.91]) by smtp.web.de (mrweb001) with
	ESMTPSA (Nemesis) id 0MYvmV-1U4HaJ21Qp-00Vfyj for
	<bug-gnu-emacs@HIDDEN>; Wed, 10 Apr 2013 22:26:04 +0200
From: Michael Heerdegen <michael_heerdegen@HIDDEN>
To: bug-gnu-emacs@HIDDEN
Subject: 24.3.50;
	Bad completion behavior with read-file-name-completion-ignore-case t
Date: Wed, 10 Apr 2013 22:26:03 +0200
Message-ID: <877gkab09w.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Provags-ID: V02:K0:i5sylSEl6lzOdiWB9eiEgm/iOEkIIMctAE8Ph/qrJwf
	EqiPzsB9Ts0ptExfcyaw7mXquWQ1feXQt7tnj62KLWT9QW6kjr
	7Fjnl+wygX1Hffyi/m2GjyCtUqBL60e9mtMADatX0zSyGxq5TN
	OFZWeL6jZrC5xC0mf45Y+JCa0V+kfiCesbUPVAGpmTaGvUraDE
	NLtF63NiDhNZA94Luj7tUm6VZKnuBgkGTmk8DcAOc4=
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic]
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x
X-Received-From: 208.118.235.17
X-Spam-Score: -4.2 (----)
X-Debbugs-Envelope-To: submit
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: michael_heerdegen@HIDDEN
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <http://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>,
	<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <http://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <http://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>,
	<mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Sender: debbugs-submit-bounces <at> debbugs.gnu.org
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
X-Spam-Score: -6.9 (------)


Hi,

you can reproduce this with emacs -Q.

I use this setting:

(setq read-file-name-completion-ignore-case t
      completion-auto-help t)

In my "~/", I have, among other files,

  lrwxrwxrwx   1 micha micha    9 Feb  3 20:00 download -> Downloads
  drwxr-xr-x  11 micha micha 4,0K Apr  9 15:40 Downloads

I hit C-x d ~/Down TAB

Emacs completes the minibuffer to

  ~/Download

Since this is no valid completion, it should pop up *Completions*, but
it doesn't (first issue).  I hit TAB a second time.  I get this in *Completions*:

  Click <mouse-2> on a completion to select it.
  In this buffer, type RET to select the completion near point.
  
  Possible completions are:
  Download/
  Downloads/

It doesn't offer "download".  If I click on "Download/", I get the
message

  `mouse-choose-completion' is an obsolete command (as of 23.2); use
  `choose-completion' instead.

(second issue)

Then it completes the minibuffer content to "~/Download/".  But this
doesn't exist (third and major issue).  I get an error when hitting RET
(of course).


Thanks,

Michael.








Acknowledgement sent to michael_heerdegen@HIDDEN:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#14175; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Fri, 31 Oct 2014 17:00:04 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.