diff options
| -rw-r--r-- | lisp/ls-lisp.el | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el index 4aa431501a8..1f0b24b6b1b 100644 --- a/lisp/ls-lisp.el +++ b/lisp/ls-lisp.el | |||
| @@ -50,27 +50,47 @@ | |||
| 50 | 50 | ||
| 51 | ;;; Code: | 51 | ;;; Code: |
| 52 | 52 | ||
| 53 | (defvar ls-lisp-support-shell-wildcards t | ||
| 54 | "*Non-nil means file patterns are treated as shell wildcards. | ||
| 55 | nil means they are treated as Emacs regexps (for backward compatibility). | ||
| 56 | This variable is checked by \\[insert-directory] only when `ls-lisp.el' | ||
| 57 | package is used.") | ||
| 58 | |||
| 53 | (defun insert-directory (file &optional switches wildcard full-directory-p) | 59 | (defun insert-directory (file &optional switches wildcard full-directory-p) |
| 54 | "Insert directory listing for of FILE, formatted according to SWITCHES. | 60 | "Insert directory listing for FILE, formatted according to SWITCHES. |
| 55 | Leaves point after the inserted text. | 61 | Leaves point after the inserted text. |
| 56 | Optional third arg WILDCARD means treat FILE as shell wildcard. | 62 | Optional third arg WILDCARD means treat FILE as shell wildcard. |
| 57 | Optional fourth arg FULL-DIRECTORY-P means file is a directory and | 63 | Optional fourth arg FULL-DIRECTORY-P means file is a directory and |
| 58 | switches do not contain `d', so that a full listing is expected. | 64 | switches do not contain `d', so that a full listing is expected. |
| 59 | 65 | ||
| 60 | This version of the function comes from `ls-lisp.el'. | 66 | This version of the function comes from `ls-lisp.el'. It doesn not |
| 61 | It does not support ordinary shell wildcards; instead, it allows | 67 | run any external programs or shells. It supports ordinary shell |
| 62 | regular expressions to match file names. | 68 | wildcards if `ls-lisp-support-shell-wildcards' variable is non-nil; |
| 69 | otherwise, it interprets wildcards as regular expressions to match | ||
| 70 | file names. | ||
| 63 | 71 | ||
| 64 | The switches that work are: A a c i r S s t u" | 72 | Not all `ls' switches are supported. The switches that work |
| 73 | are: A a c i r S s t u" | ||
| 65 | (let ((handler (find-file-name-handler file 'insert-directory))) | 74 | (let ((handler (find-file-name-handler file 'insert-directory))) |
| 66 | (if handler | 75 | (if handler |
| 67 | (funcall handler 'insert-directory file switches | 76 | (funcall handler 'insert-directory file switches |
| 68 | wildcard full-directory-p) | 77 | wildcard full-directory-p) |
| 78 | ;; Sometimes we get ".../foo*/" as FILE. While the shell and | ||
| 79 | ;; `ls' don't mind, we certainly do, because it makes us think | ||
| 80 | ;; there is no wildcard, only a directory name. | ||
| 81 | (if (and ls-lisp-support-shell-wildcards | ||
| 82 | (string-match "[[?*]" file)) | ||
| 83 | (progn | ||
| 84 | (or (not (eq (aref file (1- (length file))) ?/)) | ||
| 85 | (setq file (substring file 0 (1- (length file))))) | ||
| 86 | (setq wildcard t))) | ||
| 69 | ;; Convert SWITCHES to a list of characters. | 87 | ;; Convert SWITCHES to a list of characters. |
| 70 | (setq switches (append switches nil)) | 88 | (setq switches (append switches nil)) |
| 71 | (if wildcard | 89 | (if wildcard |
| 72 | (setq wildcard (file-name-nondirectory file) ; actually emacs regexp | 90 | (setq wildcard |
| 73 | ;; perhaps convert it from shell to emacs syntax? | 91 | (if ls-lisp-support-shell-wildcards |
| 92 | (wildcard-to-regexp (file-name-nondirectory file)) | ||
| 93 | (file-name-nondirectory file)) | ||
| 74 | file (file-name-directory file))) | 94 | file (file-name-directory file))) |
| 75 | (if (or wildcard | 95 | (if (or wildcard |
| 76 | full-directory-p) | 96 | full-directory-p) |
| @@ -100,7 +120,12 @@ The switches that work are: A a c i r S s t u" | |||
| 100 | ;; seems to stimulate an Emacs bug | 120 | ;; seems to stimulate an Emacs bug |
| 101 | ;; ILLEGAL DATATYPE (#o37777777727) or #o67 | 121 | ;; ILLEGAL DATATYPE (#o37777777727) or #o67 |
| 102 | file-list)) | 122 | file-list)) |
| 103 | (insert "total \007\n") ; filled in afterwards | 123 | ;; ``Total'' line (filled in afterwards). |
| 124 | (insert (if (car-safe file-alist) | ||
| 125 | "total \007\n" | ||
| 126 | ;; Shell says ``No match'' if no files match | ||
| 127 | ;; the wildcard; let's say something similar. | ||
| 128 | "(No match)\ntotal \007\n")) | ||
| 104 | (setq file-alist | 129 | (setq file-alist |
| 105 | (ls-lisp-handle-switches file-alist switches)) | 130 | (ls-lisp-handle-switches file-alist switches)) |
| 106 | (while file-alist | 131 | (while file-alist |
| @@ -116,7 +141,7 @@ The switches that work are: A a c i r S s t u" | |||
| 116 | (search-backward "total \007") | 141 | (search-backward "total \007") |
| 117 | (goto-char (match-end 0)) | 142 | (goto-char (match-end 0)) |
| 118 | (delete-char -1) | 143 | (delete-char -1) |
| 119 | (insert (format "%d" (1+ (/ sum 1024)))))) | 144 | (insert (format "%d" (if (zerop sum) 0 (1+ (/ sum 1024))))))) |
| 120 | ;; if not full-directory-p, FILE *must not* end in /, as | 145 | ;; if not full-directory-p, FILE *must not* end in /, as |
| 121 | ;; file-attributes will not recognize a symlink to a directory | 146 | ;; file-attributes will not recognize a symlink to a directory |
| 122 | ;; must make it a relative filename as ls does: | 147 | ;; must make it a relative filename as ls does: |
| @@ -185,7 +210,7 @@ The switches that work are: A a c i r S s t u" | |||
| 185 | ;; Emacs should be able to make strings of them. | 210 | ;; Emacs should be able to make strings of them. |
| 186 | ;; user-login-name and user-full-name could take an | 211 | ;; user-login-name and user-full-name could take an |
| 187 | ;; optional arg. | 212 | ;; optional arg. |
| 188 | (format " %3d %8s %8s %8d " | 213 | (format " %3d %-8s %-8s %8d " |
| 189 | (nth 1 file-attr) ; no. of links | 214 | (nth 1 file-attr) ; no. of links |
| 190 | (if (= (user-uid) (nth 2 file-attr)) | 215 | (if (= (user-uid) (nth 2 file-attr)) |
| 191 | (user-login-name) | 216 | (user-login-name) |