From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Michael Heerdegen Newsgroups: gmane.emacs.bugs Subject: bug#14175: 24.3.50; Bad completion behavior with read-file-name-completion-ignore-case t Date: Fri, 12 Apr 2013 16:53:47 +0200 Message-ID: <87k3o7kdfo.fsf@web.de> References: <877gkab09w.fsf@web.de> <87zjx69e76.fsf@web.de> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable X-Trace: ger.gmane.org 1365778457 26407 80.91.229.3 (12 Apr 2013 14:54:17 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Fri, 12 Apr 2013 14:54:17 +0000 (UTC) To: 14175@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Apr 12 16:54:21 2013 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 1UQfMo-00043g-84 for geb-bug-gnu-emacs@m.gmane.org; Fri, 12 Apr 2013 16:54:18 +0200 Original-Received: from localhost ([::1]:44478 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQfMn-0002iO-Ph for geb-bug-gnu-emacs@m.gmane.org; Fri, 12 Apr 2013 10:54:17 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:41611) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQfMh-0002i9-G8 for bug-gnu-emacs@gnu.org; Fri, 12 Apr 2013 10:54:15 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UQfMe-0001LM-HF for bug-gnu-emacs@gnu.org; Fri, 12 Apr 2013 10:54:11 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:43381) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UQfMe-0001LC-DG for bug-gnu-emacs@gnu.org; Fri, 12 Apr 2013 10:54:08 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1UQfQQ-0001qQ-Ig for bug-gnu-emacs@gnu.org; Fri, 12 Apr 2013 10:58:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Michael Heerdegen Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 12 Apr 2013 14:58:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 14175 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 14175-submit@debbugs.gnu.org id=B14175.13657786757027 (code B ref 14175); Fri, 12 Apr 2013 14:58:02 +0000 Original-Received: (at 14175) by debbugs.gnu.org; 12 Apr 2013 14:57:55 +0000 Original-Received: from localhost ([127.0.0.1]:47489 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1UQfQH-0001p8-09 for submit@debbugs.gnu.org; Fri, 12 Apr 2013 10:57:54 -0400 Original-Received: from mout.web.de ([212.227.15.3]:56910) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1UQfQB-0001oQ-2Q for 14175@debbugs.gnu.org; Fri, 12 Apr 2013 10:57:51 -0400 Original-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 In-Reply-To: <87zjx69e76.fsf@web.de> (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) X-Provags-ID: V02:K0:teE9cVKf47xvSyUkklPJNiqUhyrVDOxxaKZsm83Kh+u pXEeWR2MTrSPMhbu7TzRSpn0gSzESeFaegkEYSaAoIDjnTrHEb y0DbBWKsFhSBOHNJBOU57A5XNoJeA+wCGL8Grx7j5DSdBvQiby gB7xwcyCKqovdzDsLkL/9rt8rQvCMgnhh0hirYQxhU6G+PDv4s QT+Bzzs0dBAphtTOEIxS8K1IviE2VDwmwlr54nfHJk= 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:73360 Archived-At: Michael Heerdegen 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