bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#9160: 24.0.50; Emacs freezes in *shell* buffer.


From: Stefan Monnier
Subject: bug#9160: 24.0.50; Emacs freezes in *shell* buffer.
Date: Mon, 19 Sep 2011 21:10:58 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux)

> I confirmed that that above test case is fixed now.  But, I
> found several other bugs related completions.  All the
> following testcases are with the latest trunk Emacs with -Q
> argument, and they don't happen with Emacs 23.3.

> (1) SPC not escaped in *Completions* buffer
> % mkdir tmp
> % cd tmp
> % touch '0 a' '0-a'
> % rm 0<tab>

> Now the the *Completions* buffer is:
> <...>
> Possible completions are:
> 0 a
> 0-a

> Note that SPC is not escapsed in '0 a'.  So, when I click

Yes, that by design.

> it, *shell* buffer becomes this:
> % rm 0 a

That's a known (to me) bug.
Making escaping (aka quoting) interact correctly with completion styles
like partial-completion and substring is actually a nasty problem.
The old code used to escape the strings returned by all-completions (so
the *Completions* buffer would show the escaped names), which solves
some of the problematic cases, but has the following downsides:
- it's aesthetically unpleasant (the *Completions* buffer does not need
  that kind of escaping).
- it's inefficient (requires escaping all elements of all-completions).
- more problematic: it doesn't actually solve the problem in all cases,
  because the user may have typed "a\bc" but the escaping code cannot
  know that the user decided to (unnecessarily) escape "b" so it won't
  escape "b" and we're back at the problem that the completion will fail
  because the output from all-completions doesn't actually match the
  user's input, even tho it should.
We have related problems with $ escaping in find-file (they manifest in
different ways because we half-solved the issues differently).

I'm still not quite sure yet how to best solve those problems, but it
seems that a real solution will have to handle a more general problem,
e.g. cases such as "/u-$b-c" in find-file, where "$b" is an env var that
expands to (say) "c/d".

> (2) The second arg to rm command is not completed.
> % mkdir tmp
> % cd tmp
> % touch abc def
> % rm a<tab>
> % rm abc d<tab>
> Now just "No match" is shown instead of "d" completed to
> "def".  This DOES NOT happen with 'ls' command.

I think I just fixed it with the patch below.

> (3) Error in post-command-hook for *.tar.gz file.
> % mkdir tmp
> % cd tmp
> % echo abc > abc
> % echo def > def
> % tar cfz temp.tar.gz abc def
> % tar tfz temp<tab>
> Now the command line is correctly completed to:
> % tar tfz temp.tar.gz 
> But, this error is signaled:
> Error in post-command-hook (completion-in-region--postch):
> (wrong-type-argument listp [tar-header #<marker at 513 in  *tar-data
> temp.tar.gz*> abc 436 8308 8308 4 (20069 47563) 4380 nil  ustar  handa handa
> 0 0 nil])

I cannot reproduce this error.  Has it been fixed in the mean time?


        Stefan


--- lisp/minibuffer.el  2011-09-02 00:36:58 +0000
+++ lisp/minibuffer.el  2011-09-20 01:00:12 +0000
@@ -322,14 +322,15 @@
     (test-completion string table pred2))
    (t
     (or (complete-with-action action table string
-                              (if (null pred2) pred1
+                              (if (not (and pred1 pred2))
+                                  (or pred1 pred2)
                                 (lambda (x)
                                   ;; Call `pred1' first, so that `pred2'
                                   ;; really can't tell that `x' is in table.
-                                  (if (funcall pred1 x) (funcall pred2 x)))))
+                                  (and (funcall pred1 x) (funcall pred2 x)))))
         ;; If completion failed and we're not applying pred1 strictly, try
         ;; again without pred1.
-        (and (not strict)
+        (and (not strict) pred1 pred2
              (complete-with-action action table string pred2))))))
 
 (defun completion-table-in-turn (&rest tables)
@@ -1774,7 +1775,7 @@
 
 (defun completion-file-name-table (string pred action)
   "Completion table for file names."
-  (ignore-errors
+  (with-demoted-errors
     (cond
      ((eq action 'metadata) '(metadata (category . file)))
      ((eq (car-safe action) 'boundaries)






reply via email to

[Prev in Thread] Current Thread [Next in Thread]