* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) @ 2010-05-29 1:35 Lennart Borgman 2010-05-29 16:12 ` Eli Zaretskii 2010-05-29 21:18 ` Stefan Monnier 0 siblings, 2 replies; 16+ messages in thread From: Lennart Borgman @ 2010-05-29 1:35 UTC (permalink / raw) To: 6299 I get this backtrace below in certain cases when doing C-x C-f and entering c:/ema TAB in the minibuffer. I have no good idea of how to debug it. It happens only after I have loaded a multi major mode file. However it happens not after just loading mumamo.el. If I enter c:/emacs/something TAB it does not happen either, i.e. it happens only before the second "/". Tramp is loaded after the first TAB above but that is loaded in both the cases where I get an error and those where I do not get it. (I have no idea why tramp is loaded though.) I do not know if I can track this down to something more simple so I ask for suggestions and qualified guesses instead. Anyone has some? This is with a checkout from 2010-05-22, my patched version. Debugger entered--Lisp error: (args-out-of-range "c:" 0 3) signal(args-out-of-range ("c:" 0 3)) completion--some(#[(style) " \236A@\n \f $\207" [style completion-styles-alist string table pred point] 5] (basic partial-completion emacs22)) completion-try-completion("c:/ema" read-file-name-internal file-exists-p 6) completion--do-completion() minibuffer-complete() call-interactively(minibuffer-complete nil nil) completing-read("Find file: " read-file-name-internal file-exists-p nil "c:/emacs/p/100522/EmacsW32/nxhtml/util/" file-name-history "c:/emacs/p/100522/EmacsW32/nxhtml/util/") ad-Orig-read-file-name("Find file: " nil "c:/emacs/p/100522/EmacsW32/nxhtml/util/" nil nil nil) (setq ad-return-value (ad-Orig-read-file-name prompt dir default-filename mustmatch initial predicate)) (let ((viper-minibuffer-exit-hook ...)) (setq ad-return-value (ad-Orig-read-file-name prompt dir default-filename mustmatch initial predicate))) (let (ad-return-value) (let (...) (setq ad-return-value ...)) ad-return-value) read-file-name("Find file: " nil "c:/emacs/p/100522/EmacsW32/nxhtml/util/") (cons (read-file-name "Find file: " nil default-directory) (cond (... ...) (... ...))) call-interactively(find-file nil nil) ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-29 1:35 bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) Lennart Borgman @ 2010-05-29 16:12 ` Eli Zaretskii 2010-05-29 21:18 ` Stefan Monnier 1 sibling, 0 replies; 16+ messages in thread From: Eli Zaretskii @ 2010-05-29 16:12 UTC (permalink / raw) To: Lennart Borgman; +Cc: 6299 > From: Lennart Borgman <lennart.borgman@gmail.com> > Date: Sat, 29 May 2010 03:35:00 +0200 > Cc: > > I get this backtrace below in certain cases when doing C-x C-f and entering > > c:/ema TAB > > in the minibuffer. I have no good idea of how to debug it. > > It happens only after I have loaded a multi major mode file. However > it happens not after just loading mumamo.el. > > If I enter > > c:/emacs/something TAB > > it does not happen either, i.e. it happens only before the second "/". > > Tramp is loaded after the first TAB above but that is loaded in both > the cases where I get an error and those where I do not get it. (I > have no idea why tramp is loaded though.) > > I do not know if I can track this down to something more simple so I > ask for suggestions and qualified guesses instead. Anyone has some? > > This is with a checkout from 2010-05-22, my patched version. > > > Debugger entered--Lisp error: (args-out-of-range "c:" 0 3) > signal(args-out-of-range ("c:" 0 3)) > completion--some(#[(style) " \236A@\n \f I would suggest to step through completion-emacs22-try-completion in Edebug. ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-29 1:35 bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) Lennart Borgman 2010-05-29 16:12 ` Eli Zaretskii @ 2010-05-29 21:18 ` Stefan Monnier 2010-05-29 21:24 ` Lennart Borgman 1 sibling, 1 reply; 16+ messages in thread From: Stefan Monnier @ 2010-05-29 21:18 UTC (permalink / raw) To: Lennart Borgman; +Cc: 6299 > Debugger entered--Lisp error: (args-out-of-range "c:" 0 3) > signal(args-out-of-range ("c:" 0 3)) > completion--some(#[(style) " \236A@\n \f > $\207" [style completion-styles-alist string table pred point] 5] > (basic partial-completion emacs22)) First thing: edit completion--some o as to replace condition-case with condition-case-no-debug. This way the error won't be delayed and you'll get a more precise backtrace. Stefan ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-29 21:18 ` Stefan Monnier @ 2010-05-29 21:24 ` Lennart Borgman 2010-05-29 22:07 ` Lennart Borgman 0 siblings, 1 reply; 16+ messages in thread From: Lennart Borgman @ 2010-05-29 21:24 UTC (permalink / raw) To: Stefan Monnier; +Cc: 6299 On Sat, May 29, 2010 at 11:18 PM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: >> Debugger entered--Lisp error: (args-out-of-range "c:" 0 3) >> signal(args-out-of-range ("c:" 0 3)) >> completion--some(#[(style) " \236A@\n \f >> $\207" [style completion-styles-alist string table pred point] 5] >> (basic partial-completion emacs22)) > > First thing: edit completion--some o as to replace condition-case with > condition-case-no-debug. This way the error won't be delayed and you'll > get a more precise backtrace. OK: Debugger entered--Lisp error: (args-out-of-range "c:" 0 3) completion-pcm--find-all-completions("c:" read-file-name-internal file-exists-p 2 completion-pcm--filename-try-filter) completion-pcm--find-all-completions("c:/em" read-file-name-internal file-exists-p 5 completion-pcm--filename-try-filter) completion-pcm-try-completion("c:/em" read-file-name-internal file-exists-p 5) #[(style) " \236A@\n \f $\207" [style completion-styles-alist string table pred point] 5](partial-completion) funcall(#[(style) " \236A@\n \f $\207" [style completion-styles-alist string table pred point] 5] partial-completion) (setq res (funcall fun arg)) (progn (setq arg (pop xs)) (setq res (funcall fun arg))) (lambda nil (progn (setq arg ...) (setq res ...)))() funcall((lambda nil (progn (setq arg ...) (setq res ...)))) (if debug-on-error (funcall body) (condition-case err (funcall body) (error ... nil))) (let ((body ...)) (if debug-on-error (funcall body) (condition-case err ... ...))) (condition-case-no-debug err (progn (setq arg ...) (setq res ...)) (error (unless firsterror ... ...) nil)) (while (and (not res) xs) (condition-case-no-debug err (progn ... ...) (error ... nil))) (let ((firsterror nil) arg res) (while (and ... xs) (condition-case-no-debug err ... ...)) (or res (if firsterror ...))) completion--some(#[(style) " \236A@\n \f $\207" [style completion-styles-alist string table pred point] 5] (basic partial-completion emacs22)) completion-try-completion("c:/em" read-file-name-internal file-exists-p 5) completion--do-completion() minibuffer-complete() call-interactively(minibuffer-complete nil nil) completing-read("Find file: " read-file-name-internal file-exists-p nil "c:/emacs/p/100522/emacs/lisp/" file-name-history "c:/emacs/p/100522/emacs/lisp/") ad-Orig-read-file-name("Find file: " nil "c:/emacs/p/100522/emacs/lisp/" nil nil nil) (setq ad-return-value (ad-Orig-read-file-name prompt dir default-filename mustmatch initial predicate)) (let ((viper-minibuffer-exit-hook ...)) (setq ad-return-value (ad-Orig-read-file-name prompt dir default-filename mustmatch initial predicate))) (let (ad-return-value) (let (...) (setq ad-return-value ...)) ad-return-value) read-file-name("Find file: " nil "c:/emacs/p/100522/emacs/lisp/") (cons (read-file-name "Find file: " nil default-directory) (cond (... ...) (... ...))) call-interactively(find-file nil nil) ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-29 21:24 ` Lennart Borgman @ 2010-05-29 22:07 ` Lennart Borgman 2010-05-29 23:29 ` Stefan Monnier 0 siblings, 1 reply; 16+ messages in thread From: Lennart Borgman @ 2010-05-29 22:07 UTC (permalink / raw) To: Stefan Monnier; +Cc: 6299 On Sat, May 29, 2010 at 11:24 PM, Lennart Borgman <lennart.borgman@gmail.com> wrote: > On Sat, May 29, 2010 at 11:18 PM, Stefan Monnier > <monnier@iro.umontreal.ca> wrote: >>> Debugger entered--Lisp error: (args-out-of-range "c:" 0 3) >>> signal(args-out-of-range ("c:" 0 3)) >>> completion--some(#[(style) " \236A@\n \f >>> $\207" [style completion-styles-alist string table pred point] 5] >>> (basic partial-completion emacs22)) >> >> First thing: edit completion--some o as to replace condition-case with >> condition-case-no-debug. This way the error won't be delayed and you'll >> get a more precise backtrace. eval-buffer in minibuffer.el made it more understandable. Here it is (but I do not know the cause of it): * I added a little trace here (defun completion-pcm--find-all-completions (string table pred point &optional filter) "Find all completions for STRING at POINT in TABLE, satisfying PRED. POINT is a position inside STRING. FILTER is a function applied to the return value, that can be used, e.g. to filter out additional entries (because TABLE migth not obey PRED)." (unless filter (setq filter 'identity)) (message "FIND: filter=%S" filter) (let* ((beforepoint (substring string 0 point)) (afterpoint (substring string point)) (bounds (completion-boundaries beforepoint table pred afterpoint)) (dummy (message "FIND: string=%S bounds=%S, beforepoint=%S afterpoint=%S" string bounds beforepoint afterpoint)) (prefix (substring beforepoint 0 (car bounds))) (suffix (substring afterpoint (cdr bounds))) firsterror) and in (defun completion-boundaries (string table pred suffix) "Return the boundaries of the completions returned by TABLE for STRING. STRING is the string on which completion will be performed. SUFFIX is the string after point. The result is of the form (START . END) where START is the position in STRING of the beginning of the completion field and END is the position in SUFFIX of the end of the completion field. E.g. for simple completion tables, the result is always (0 . (length SUFFIX)) and for file names the result is the positions delimited by the closest directory separators." (message "BOUNDARIES string=%S table=%s pred=%s suffix=%S" string table pred suffix) (let ((boundaries (if (functionp table) (funcall table string pred (cons 'boundaries suffix))))) (message "BOUNDARIES boundaries=%S" boundaries) (if (not (eq (car-safe boundaries) 'boundaries)) (setq boundaries nil)) (cons (or (cadr boundaries) 0) (or (cddr boundaries) (length suffix))))) and got BOUNDARIES string="c:/ema" table=read-file-name-internal pred=file-exists-p suffix="" BOUNDARIES boundaries=(boundaries 3) FIND: filter=completion-pcm--filename-try-filter BOUNDARIES string="c:/ema" table=read-file-name-internal pred=file-exists-p suffix="" BOUNDARIES boundaries=(boundaries 3) FIND: string="c:/ema" bounds=(3 . 0), beforepoint="c:/ema" afterpoint="" FIND: prefix="c:/" FIND: substring="c:" FIND: filter=completion-pcm--filename-try-filter BOUNDARIES string="c:" table=read-file-name-internal pred=file-exists-p suffix="" BOUNDARIES boundaries=(boundaries 3) FIND: string="c:" bounds=(3 . 0), beforepoint="c:" afterpoint="" Entering debugger... It looks like perhaps read-file-name-internal gives the wrong information. PS: There is an advice on read-file-name is Around-advice `viper-suffix-advice': Tell `exit-minibuffer' to run `viper-file-add-suffix' as a hook. which does not seem to be involved (I unadvised read-file-name). ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-29 22:07 ` Lennart Borgman @ 2010-05-29 23:29 ` Stefan Monnier 2010-05-30 0:10 ` Lennart Borgman 0 siblings, 1 reply; 16+ messages in thread From: Stefan Monnier @ 2010-05-29 23:29 UTC (permalink / raw) To: Lennart Borgman; +Cc: 6299 > BOUNDARIES string="c:" table=read-file-name-internal pred=file-exists-p suffix="" > BOUNDARIES boundaries=(boundaries 3) This appears to be the problem. (read-file-name-internal "c:" nil '(boundaries . "")) seems to return (boundaries 3 . 0). Since the code that does that is most likely the one in completion--file-name-table which does: (let ((start (length (file-name-directory string))) (end (string-match-p "/" (cdr action)))) (list* 'boundaries start end))) my guess is that (file-name-directory "c:") return "c:/". I guess we should just use (or (string-match "[^/]*\\'" string) 0) instead of (length (file-name-directory string)) but it has N^2 complexity :-( Stefan ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-29 23:29 ` Stefan Monnier @ 2010-05-30 0:10 ` Lennart Borgman 2010-05-30 3:34 ` Stefan Monnier 2010-05-30 13:39 ` Lennart Borgman 0 siblings, 2 replies; 16+ messages in thread From: Lennart Borgman @ 2010-05-30 0:10 UTC (permalink / raw) To: Stefan Monnier; +Cc: 6299 On Sun, May 30, 2010 at 1:29 AM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: >> BOUNDARIES string="c:" table=read-file-name-internal pred=file-exists-p suffix="" >> BOUNDARIES boundaries=(boundaries 3) > > This appears to be the problem. > > (read-file-name-internal "c:" nil '(boundaries . "")) > > seems to return (boundaries 3 . 0). > Since the code that does that is most likely the one in > completion--file-name-table which does: > > (let ((start (length (file-name-directory string))) > (end (string-match-p "/" (cdr action)))) > (list* 'boundaries start end))) > > my guess is that (file-name-directory "c:") return "c:/". Yes, that is the case, it returns "c:/". But I think that is can't return something. However in my opinion it should return an error because "c:" is not a file path. It is just a device. It it signaled an error code that tries something like this would be more easily found and cured. So I think the problem is that (file-name-directory "c:") is called. There must be some bad assumption somewhere in the code behind that. Another suggestion that might help cleaning the code logic in different places: Add a function directory-root-p w32: (directory-root-p "c:/") => t *nix: (directory-root-p "/") => t w32: (directory-root-p "/") => nil (or signal error, but that would fit badly with file-directory-p) *nix: (directory-root-p "c;/") => nil -"- > I guess we should just use (or (string-match "[^/]*\\'" string) 0) > instead of (length (file-name-directory string)) but it has N^2 > complexity :-( > > > Stefan > ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 0:10 ` Lennart Borgman @ 2010-05-30 3:34 ` Stefan Monnier 2010-05-30 4:27 ` Juanma Barranquero 2010-05-30 13:39 ` Lennart Borgman 1 sibling, 1 reply; 16+ messages in thread From: Stefan Monnier @ 2010-05-30 3:34 UTC (permalink / raw) To: Lennart Borgman; +Cc: 6299 >> my guess is that (file-name-directory "c:") return "c:/". > Yes, that is the case, it returns "c:/". What about (file-name-nondirectory "c:")? And what about (file-name-all-completions (file-name-nondirectory "c:") (file-name-directory "c:")) ? -- Stefan ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 3:34 ` Stefan Monnier @ 2010-05-30 4:27 ` Juanma Barranquero 2010-05-30 10:11 ` Lennart Borgman 0 siblings, 1 reply; 16+ messages in thread From: Juanma Barranquero @ 2010-05-30 4:27 UTC (permalink / raw) To: Stefan Monnier; +Cc: 6299 On Sun, May 30, 2010 at 05:34, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > What about (file-name-nondirectory "c:")? ELISP> (file-name-nondirectory "c:") "" > And what about (file-name-all-completions > (file-name-nondirectory "c:") > (file-name-directory "c:")) ? Returns all files and dirs in C:/ Juanma ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 4:27 ` Juanma Barranquero @ 2010-05-30 10:11 ` Lennart Borgman 2010-05-30 14:18 ` Stefan Monnier 0 siblings, 1 reply; 16+ messages in thread From: Lennart Borgman @ 2010-05-30 10:11 UTC (permalink / raw) To: Juanma Barranquero; +Cc: 6299 On Sun, May 30, 2010 at 6:27 AM, Juanma Barranquero <lekktu@gmail.com> wrote: > On Sun, May 30, 2010 at 05:34, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > >> What about (file-name-nondirectory "c:")? > > ELISP> (file-name-nondirectory "c:") > "" Same here. >> And what about (file-name-all-completions >> (file-name-nondirectory "c:") >> (file-name-directory "c:")) ? > > Returns all files and dirs in C:/ The same + tramp's symbols (fcp:, psftp:, plinkx: etc) and tramp's usernames ("some.one@" etc). ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 10:11 ` Lennart Borgman @ 2010-05-30 14:18 ` Stefan Monnier 2010-05-30 17:40 ` Lennart Borgman 0 siblings, 1 reply; 16+ messages in thread From: Stefan Monnier @ 2010-05-30 14:18 UTC (permalink / raw) To: Lennart Borgman; +Cc: Juanma Barranquero, 6299 >>> What about (file-name-nondirectory "c:")? ELISP> (file-name-nondirectory "c:") >> "" Good thanks. >>> And what about (file-name-all-completions >>> (file-name-nondirectory "c:") >>> (file-name-directory "c:")) ? >> Returns all files and dirs in C:/ Again, thank you. > The same + tramp's symbols (fcp:, psftp:, plinkx: etc) and tramp's > usernames ("some.one@" etc). Not sure if that's correct, but it's a separate problem. I've installed the patch below which should hopefully fix the original problem. Please confirm. Stefan === modified file 'lisp/minibuffer.el' --- lisp/minibuffer.el 2010-05-12 00:39:46 +0000 +++ lisp/minibuffer.el 2010-05-30 14:13:36 +0000 @@ -1342,7 +1342,14 @@ ((eq (car-safe action) 'boundaries) (let ((start (length (file-name-directory string))) (end (string-match-p "/" (cdr action)))) - (list* 'boundaries start end))) + (list* 'boundaries + ;; if `string' is "C:" in w32, (file-name-directory string) + ;; returns "C:/", so `start' is 3 rather than 2. + ;; Not quite sure what is The Right Fix, but clipping it + ;; back to 2 will work for this particular case. We'll + ;; see if we can come up with a better fix when we bump + ;; into more such problematic cases. + (min start (length string)) end))) ((eq action 'lambda) (if (zerop (length string)) @@ -1395,17 +1402,18 @@ (cond ((eq (car-safe action) 'boundaries) ;; For the boundaries, we can't really delegate to - ;; completion-file-name-table and then fix them up, because it - ;; would require us to track the relationship between `str' and + ;; substitute-in-file-name+completion-file-name-table and then fix + ;; them up (as we do for the other actions), because it would + ;; require us to track the relationship between `str' and ;; `string', which is difficult. And in any case, if - ;; substitute-in-file-name turns "fo-$TO-ba" into "fo-o/b-ba", there's - ;; no way for us to return proper boundaries info, because the - ;; boundary is not (yet) in `string'. - ;; FIXME: Actually there is a way to return correct boundaries info, - ;; at the condition of modifying the all-completions return accordingly. - (let ((start (length (file-name-directory string))) - (end (string-match-p "/" (cdr action)))) - (list* 'boundaries start end))) + ;; substitute-in-file-name turns "fo-$TO-ba" into "fo-o/b-ba", + ;; there's no way for us to return proper boundaries info, because + ;; the boundary is not (yet) in `string'. + ;; + ;; FIXME: Actually there is a way to return correct boundaries + ;; info, at the condition of modifying the all-completions + ;; return accordingly. But for now, let's not bother. + (completion-file-name-table string pred action)) (t (let* ((default-directory ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 14:18 ` Stefan Monnier @ 2010-05-30 17:40 ` Lennart Borgman 2010-05-30 21:18 ` Stefan Monnier 0 siblings, 1 reply; 16+ messages in thread From: Lennart Borgman @ 2010-05-30 17:40 UTC (permalink / raw) To: Stefan Monnier; +Cc: Juanma Barranquero, 6299 On Sun, May 30, 2010 at 4:18 PM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > >> The same + tramp's symbols (fcp:, psftp:, plinkx: etc) and tramp's >> usernames ("some.one@" etc). > > Not sure if that's correct, but it's a separate problem. Yes, it seems to be separate. > I've installed the patch below which should hopefully fix the original problem. > Please confirm. Thanks, it works. ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 17:40 ` Lennart Borgman @ 2010-05-30 21:18 ` Stefan Monnier 0 siblings, 0 replies; 16+ messages in thread From: Stefan Monnier @ 2010-05-30 21:18 UTC (permalink / raw) To: Lennart Borgman; +Cc: Juanma Barranquero >> I've installed the patch below which should hopefully fix the >> original problem. Please confirm. > Thanks, it works. Good thing done, > I meant the argument ACTION to some function, but what exactly was > I reading?? [...] > There is no ACTION arg to try-completion etc. The ACTION is not passed to try-completion but from try-completion to the completion table (when it's a function). I've just installed the patch below to try and improve the documentation of those issues. Stefan === modified file 'doc/lispref/minibuf.texi' --- doc/lispref/minibuf.texi 2010-05-03 22:01:23 +0000 +++ doc/lispref/minibuf.texi 2010-05-30 21:10:01 +0000 @@ -812,6 +812,24 @@ If @var{collection} is a function, it is called with three arguments, the values @var{string}, @var{predicate} and @code{lambda}; whatever it returns, @code{test-completion} returns in turn. + +@defun completion-boundaries string collection predicate suffix +This function returns the boundaries of the field on which @var{collection} +will operate, assuming that @var{string} holds the text before point +and @var{suffix} holds the text after point. + +Normally completion operates on the whole string, so for all normal +collections, this will always return @code{(0 . (length +@var{suffix}))}. But more complex completion such as completion on +files is done one field at a time. For example, completion of +@code{"/usr/sh"} will include @code{"/usr/share/"} but not +@code{"/usr/share/doc"} even if @code{"/usr/share/doc"} exists. +Also @code{all-completions} on @code{"/usr/sh"} will not include +@code{"/usr/share/"} but only @code{"share/"}. So if @var{string} is +@code{"/usr/sh"} and @var{suffix} is @code{"e/doc"}, +@code{completion-boundaries} will return @code{(5 . 1)} which tells us +that the @var{collection} will only return completion information that +pertains to the area after @code{"/usr/"} and before @code{"/doc"}. @end defun If you store a completion alist in a variable, you should mark the @@ -1618,13 +1636,14 @@ can supply your own function to compute the completion of a given string. This is called @dfn{programmed completion}. Emacs uses programmed completion when completing file names (@pxref{File Name -Completion}). +Completion}), among many other cases. - To use this feature, pass a symbol with a function definition as the -@var{collection} argument to @code{completing-read}. The function + To use this feature, pass a function as the @var{collection} +argument to @code{completing-read}. The function @code{completing-read} arranges to pass your completion function along -to @code{try-completion} and @code{all-completions}, which will then let -your function do all the work. +to @code{try-completion}, @code{all-completions}, and other basic +completion functions, which will then let your function do all +the work. The completion function should accept three arguments: @@ -1638,10 +1657,14 @@ and ignore the possible match if the predicate returns @code{nil}. @item -A flag specifying the type of operation. +A flag specifying the type of operation. The best way to think about +it is that the function stands for an object (in the +``object-oriented'' sense of the word), and this third argument +specifies which method to run. @end itemize - There are three flag values for three operations: + There are currently four methods, i.e. four flag values, one for + each of the four different basic operations: @itemize @bullet @item @@ -1663,6 +1686,13 @@ @code{lambda} specifies @code{test-completion}. The completion function should return @code{t} if the specified string is an exact match for some possibility; @code{nil} otherwise. + +@item +@code{(boundaries . SUFFIX)} specifies @code{completion-boundaries}. +The function should return a value of the form @code{(boundaries +START . END)} where START is the position of the beginning boundary in +in the string to complete, and END is the position of the end boundary +in SUFFIX. @end itemize It would be consistent and clean for completion functions to allow ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 0:10 ` Lennart Borgman 2010-05-30 3:34 ` Stefan Monnier @ 2010-05-30 13:39 ` Lennart Borgman 2010-05-30 14:05 ` Stefan Monnier 1 sibling, 1 reply; 16+ messages in thread From: Lennart Borgman @ 2010-05-30 13:39 UTC (permalink / raw) To: Stefan Monnier; +Cc: 6299 On Sun, May 30, 2010 at 2:10 AM, Lennart Borgman <lennart.borgman@gmail.com> wrote: > On Sun, May 30, 2010 at 1:29 AM, Stefan Monnier > <monnier@iro.umontreal.ca> wrote: >>> BOUNDARIES string="c:" table=read-file-name-internal pred=file-exists-p suffix="" >>> BOUNDARIES boundaries=(boundaries 3) >> >> This appears to be the problem. >> >> (read-file-name-internal "c:" nil '(boundaries . "")) >> >> seems to return (boundaries 3 . 0). >> Since the code that does that is most likely the one in >> completion--file-name-table which does: >> >> (let ((start (length (file-name-directory string))) >> (end (string-match-p "/" (cdr action)))) >> (list* 'boundaries start end))) >> >> my guess is that (file-name-directory "c:") return "c:/". > > Yes, that is the case, it returns "c:/". > > But I think that is can't return something. However in my opinion it > should return an error because "c:" is not a file path. It is just a > device. It it signaled an error code that tries something like this > would be more easily found and cured. > > So I think the problem is that (file-name-directory "c:") is called. > There must be some bad assumption somewhere in the code behind that. > > > Another suggestion that might help cleaning the code logic in > different places: Add a function directory-root-p > > w32: (directory-root-p "c:/") => t > *nix: (directory-root-p "/") => t > > w32: (directory-root-p "/") => nil (or signal error, but that would > fit badly with file-directory-p) > *nix: (directory-root-p "c;/") => nil -"- I am looking around at the code a bit. I do not understand the comment in completion--file-name-table: (cond ((eq (car-safe action) 'boundaries) ;; For the boundaries, we can't really delegate to ;; completion-file-name-table and then fix them up, because it ;; would require us to track the relationship between `str' and ;; `string', which is difficult. And in any case, if ;; substitute-in-file-name turns "fo-$TO-ba" into "fo-o/b-ba", there's ;; no way for us to return proper boundaries info, because the ;; boundary is not (yet) in `string'. AFAICS it is doing exactly the same as completion-file-name-table here. What am I missing? BTW the doc string for action in completing read etc should be fixed. >> I guess we should just use (or (string-match "[^/]*\\'" string) 0) >> instead of (length (file-name-directory string)) but it has N^2 >> complexity :-( >> >> >> Stefan >> > ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 13:39 ` Lennart Borgman @ 2010-05-30 14:05 ` Stefan Monnier 2010-05-30 17:39 ` Lennart Borgman 0 siblings, 1 reply; 16+ messages in thread From: Stefan Monnier @ 2010-05-30 14:05 UTC (permalink / raw) To: Lennart Borgman; +Cc: 6299 > I am looking around at the code a bit. I do not understand the comment > in completion--file-name-table: > (cond > ((eq (car-safe action) 'boundaries) > ;; For the boundaries, we can't really delegate to > ;; completion-file-name-table and then fix them up, because it > ;; would require us to track the relationship between `str' and > ;; `string', which is difficult. And in any case, if > ;; substitute-in-file-name turns "fo-$TO-ba" into "fo-o/b-ba", there's > ;; no way for us to return proper boundaries info, because the > ;; boundary is not (yet) in `string'. > AFAICS it is doing exactly the same as completion-file-name-table > here. What am I missing? You're missing that "delegate to completion-file-name-table" means calling substitute-in-file-name first and then completion-file-name-table, so it wouldn't do the same. But yes, we could call completion-file-name-table directly without going through substitute-in-file-name. The reason why I don't do that is mostly historical (I first started to do something more clever which didn't work). > BTW the doc string for action in completing read etc should be fixed. I don't know what you mean here. Stefan ^ permalink raw reply [flat|nested] 16+ messages in thread
* bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) 2010-05-30 14:05 ` Stefan Monnier @ 2010-05-30 17:39 ` Lennart Borgman 0 siblings, 0 replies; 16+ messages in thread From: Lennart Borgman @ 2010-05-30 17:39 UTC (permalink / raw) To: Stefan Monnier; +Cc: 6299 On Sun, May 30, 2010 at 4:05 PM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: > > You're missing that "delegate to completion-file-name-table" means No, but I saw in the patch that you understood what I mean. Excuse my bad explanation, I was just convinced that you should see it. >> BTW the doc string for action in completing read etc should be fixed. > > I don't know what you mean here. I meant the argument ACTION to some function, but what exactly was I reading?? Note that my current checkout is from 2010-05-22. Here are some doc strings which makes me confused: (defun completion-table-with-predicate (table pred1 strict string pred2 action) "Make a completion table equivalent to TABLE but filtered through PRED1. PRED1 is a function of one argument which returns non-nil if and only if the argument is an element of TABLE which should be considered for completion. STRING, PRED2, and ACTION are the usual arguments to completion tables, as described in `try-completion', `all-completions', and `test-completion'. If STRICT is t, the predicate always applies; if nil it only applies if it does not reduce the set of possible completions to nothing. Note: TABLE needs to be a proper completion table which obeys predicates." There is no ACTION arg to try-completion etc. (defun complete-with-action (action table string pred) "Perform completion ACTION. STRING is the string to complete. TABLE is the completion table, which should not be a function. PRED is a completion predicate. ACTION can be one of nil, t or `lambda'." It looks like ACTION is tested against n and t but not against lambda. And I think it can have other values, since the code seems to expect something like '(boundaries ...) ... ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2010-05-30 21:18 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-05-29 1:35 bug#6299: In read-file-name: (args-out-of-range "c:" 0 3) Lennart Borgman 2010-05-29 16:12 ` Eli Zaretskii 2010-05-29 21:18 ` Stefan Monnier 2010-05-29 21:24 ` Lennart Borgman 2010-05-29 22:07 ` Lennart Borgman 2010-05-29 23:29 ` Stefan Monnier 2010-05-30 0:10 ` Lennart Borgman 2010-05-30 3:34 ` Stefan Monnier 2010-05-30 4:27 ` Juanma Barranquero 2010-05-30 10:11 ` Lennart Borgman 2010-05-30 14:18 ` Stefan Monnier 2010-05-30 17:40 ` Lennart Borgman 2010-05-30 21:18 ` Stefan Monnier 2010-05-30 13:39 ` Lennart Borgman 2010-05-30 14:05 ` Stefan Monnier 2010-05-30 17:39 ` Lennart Borgman
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).