(follow-mode): Don't run hooks twice. Use `when'.
[bpt/emacs.git] / lisp / ls-lisp.el
index 20da227..a016b83 100644 (file)
@@ -12,7 +12,7 @@
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
@@ -113,7 +113,7 @@ option will have no effect until you restart Emacs."
        (t '(links uid gid)))           ; GNU ls
   "*A list of optional file attributes that ls-lisp should display.
 It should contain none or more of the symbols: links, uid, gid.
-nil (or an empty list) means display none of them.
+A value of nil (or an empty list) means display none of them.
 
 Concepts come from UNIX: `links' means count of names associated with
 the file\; `uid' means user (owner) identifier\; `gid' means group
@@ -216,6 +216,7 @@ that work are: A a c i r S s t u U X g G B C R and F partly."
     ;; We need the directory in order to find the right handler.
     (let ((handler (find-file-name-handler (expand-file-name file)
                                           'insert-directory))
+         (orig-file file)
          wildcard-regexp)
       (if handler
          (funcall handler 'insert-directory file switches
@@ -229,7 +230,10 @@ that work are: A a c i r S s t u U X g G B C R and F partly."
        ;; `ls' don't mind, we certainly do, because it makes us think
        ;; there is no wildcard, only a directory name.
        (if (and ls-lisp-support-shell-wildcards
-                (string-match "[[?*]" file))
+                (string-match "[[?*]" file)
+                ;; Prefer an existing file to wildcards, like
+                ;; dired-noselect does.
+                (not (file-exists-p file)))
            (progn
              (or (not (eq (aref file (1- (length file))) ?/))
                  (setq file (substring file 0 (1- (length file)))))
@@ -241,9 +245,21 @@ that work are: A a c i r S s t u U X g G B C R and F partly."
                    (file-name-nondirectory file))
                  file (file-name-directory file))
          (if (memq ?B switches) (setq wildcard-regexp "[^~]\\'")))
-       (ls-lisp-insert-directory
-        file switches (ls-lisp-time-index switches)
-        wildcard-regexp full-directory-p)
+       (condition-case err
+           (ls-lisp-insert-directory
+            file switches (ls-lisp-time-index switches)
+            wildcard-regexp full-directory-p)
+         (invalid-regexp
+          ;; Maybe they wanted a literal file that just happens to
+          ;; use characters special to shell wildcards.
+          (if (equal (cadr err) "Unmatched [ or [^")
+              (progn
+                (setq wildcard-regexp (if (memq ?B switches) "[^~]\\'")
+                      file (file-relative-name orig-file))
+                (ls-lisp-insert-directory
+                 file switches (ls-lisp-time-index switches)
+                 nil full-directory-p))
+            (signal (car err) (cdr err)))))
        ;; Try to insert the amount of free space.
        (save-excursion
          (goto-char (point-min))