annotate lisp/find-lisp.el @ 110410:f2e111723c3a

Merge changes made in Gnus trunk. Reimplement nnimap, and do tweaks to the rest of the code to support that. * gnus-int.el (gnus-finish-retrieve-group-infos) (gnus-retrieve-group-data-early): New functions. * gnus-range.el (gnus-range-nconcat): New function. * gnus-start.el (gnus-get-unread-articles): Support early retrieval of data. (gnus-read-active-for-groups): Support finishing the early retrieval of data. * gnus-sum.el (gnus-summary-move-article): Pass the move-to group name if the move is internal, so that nnimap can do fast internal moves. * gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for nnimap usage. * nnimap.el: Rewritten. * nnmail.el (nnmail-inhibit-default-split-group): New internal variable to allow the mail splitting to not return a default group. This is useful for nnimap, which will leave unmatched mail in the inbox. * utf7.el (utf7-encode): Autoload. Implement shell connection. * nnimap.el (nnimap-open-shell-stream): New function. (nnimap-open-connection): Use it. Get the number of lines by using BODYSTRUCTURE. (nnimap-transform-headers): Get the number of lines in each message. (nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the number of lines. Not all servers return UIDNEXT. Work past this problem. Remove junk from end of file. Fix typo in "bogus" section. Make capabilties be case-insensitive. Require cl when compiling. Don't bug out if the LIST command doesn't have any parameters. 2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change) * nnimap.el (nnimap-get-groups): Don't bug out if the LIST command doesn't have any parameters. (mm-text-html-renderer): Document gnus-article-html. 2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix) * mm-decode.el (mm-text-html-renderer): Document gnus-article-html. * dgnushack.el: Define netrc-credentials. If the user doesn't have a /etc/services, supply some sensible port defaults. Have `unseen-or-unread' select an unread unseen article first. (nntp-open-server): Return whether the open was successful or not. Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ). Save result so that it doesn't say "failed" all the time. Add ~/.authinfo to the default, since that's probably most useful for users. Don't use the "finish" method when we're reading from the agent. Add some more nnimap-relevant agent stuff to nnagent.el. * nnimap.el (nnimap-with-process-buffer): Removed. Revert one line that was changed by mistake in the last checkin. (nnimap-open-connection): Don't error out when we can't make a connection nnimap-related changes to avoid bugging out if we can't contact a server. * gnus-start.el (gnus-get-unread-articles): Don't try to scan groups from methods that are denied. * nnimap.el (nnimap-possibly-change-group): Return nil if we can't log in. (nnimap-finish-retrieve-group-infos): Make sure we're not waiting for nothing. * gnus-sum.el (gnus-select-newsgroup): Indent.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 18 Sep 2010 10:02:19 +0000
parents 1d1d5d9bd884
children 376148b31b5e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38431
853c3674f20a Fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37471
diff changeset
1 ;;; find-lisp.el --- emulation of find in Emacs Lisp
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2
38431
853c3674f20a Fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37471
diff changeset
3 ;; Author: Peter Breton
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
4 ;; Created: Fri Mar 26 1999
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5 ;; Keywords: unix
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
6
74437
94b7821984ff Update copyright years.
Glenn Morris <rgm@gnu.org>
parents: 68866
diff changeset
7 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
8 ;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
15 ;; (at your option) any later version.
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
21
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 93975
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25 ;;; Commentary:
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26 ;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27 ;; This is a very generalized form of find; it basically implements a
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28 ;; recursive directory descent. The conditions which bound the search
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29 ;; are expressed as predicates, and I have not addressed the question
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30 ;; of how to wrap up the common chores that find does in a simpler
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 ;; format than writing code for all the various predicates.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32 ;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
33 ;; Some random thoughts are to express simple queries directly with
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 ;; user-level functions, and perhaps use some kind of forms interface
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
35 ;; for medium-level queries. Really complicated queries can be
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
36 ;; expressed in Lisp.
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
37 ;;
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39 ;;; Todo
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40 ;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
41 ;; It would be nice if we could sort the results without running the find
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
42 ;; again. Maybe that could work by storing the original file attributes?
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
43
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
44 ;;; Code:
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
45
66775
91dca36c0245 Require dired.
Luc Teirlinck <teirllm@auburn.edu>
parents: 65291
diff changeset
46 (require 'dired)
91dca36c0245 Require dired.
Luc Teirlinck <teirllm@auburn.edu>
parents: 65291
diff changeset
47
65291
8dbff69aa3ac (dired-buffers, dired-subdir-alist): Add defvars.
Juanma Barranquero <lekktu@gmail.com>
parents: 64762
diff changeset
48 (defvar dired-buffers)
8dbff69aa3ac (dired-buffers, dired-subdir-alist): Add defvars.
Juanma Barranquero <lekktu@gmail.com>
parents: 64762
diff changeset
49 (defvar dired-subdir-alist)
8dbff69aa3ac (dired-buffers, dired-subdir-alist): Add defvars.
Juanma Barranquero <lekktu@gmail.com>
parents: 64762
diff changeset
50
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51 ;; Internal variables
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53 (defvar find-lisp-regexp nil
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 "Internal variable.")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56 (defconst find-lisp-line-indent " "
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57 "Indentation for dired file lines.")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59 (defvar find-lisp-file-predicate nil
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
60 "Predicate for choosing to include files.")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 (defvar find-lisp-directory-predicate nil
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 "Predicate for choosing to descend into directories.")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
66 ;; Debugging Code
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
68
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
69 (defvar find-lisp-debug-buffer "*Find Lisp Debug*"
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
70 "Buffer for debugging information.")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
71
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72 (defvar find-lisp-debug nil
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73 "Whether debugging is enabled.")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75 (defun find-lisp-debug-message (message)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 "Print a debug message MESSAGE in `find-lisp-debug-buffer'."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 (set-buffer (get-buffer-create find-lisp-debug-buffer))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78 (goto-char (point-max))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 (insert message "\n"))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 ;; Directory and File predicates
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 (defun find-lisp-default-directory-predicate (dir parent)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 "True if DIR is not a dot file, and not a symlink.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 PARENT is the parent directory of DIR."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 (and find-lisp-debug
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
89 (find-lisp-debug-message
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 (format "Processing directory %s in %s" dir parent)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 ;; Skip current and parent directories
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 (not (or (string= dir ".")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 (string= dir "..")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 ;; Skip directories which are symlinks
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 ;; Easy way to circumvent recursive loops
76230
3e1deb9ccdf5 (find-lisp-default-directory-predicate):
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 75347
diff changeset
96 (file-symlink-p (expand-file-name dir parent)))))
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 (defun find-lisp-default-file-predicate (file dir)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 "True if FILE matches `find-lisp-regexp'.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100 DIR is the directory containing FILE."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 (and find-lisp-debug
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
102 (find-lisp-debug-message
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 (format "Processing file %s in %s" file dir)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 (and (not (file-directory-p (expand-file-name file dir)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 (string-match find-lisp-regexp file)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 (defun find-lisp-file-predicate-is-directory (file dir)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 "True if FILE is a directory.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 Argument DIR is the directory containing FILE."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110 (and find-lisp-debug
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
111 (find-lisp-debug-message
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 (format "Processing file %s in %s" file dir)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 (and (file-directory-p (expand-file-name file dir))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 (not (or (string= file ".")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 (string= file "..")))))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 ;; Find functions
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121 (defun find-lisp-find-files (directory regexp)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122 "Find files in DIRECTORY which match REGEXP."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123 (let ((file-predicate 'find-lisp-default-file-predicate)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 (directory-predicate 'find-lisp-default-directory-predicate)
33710
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
125 (find-lisp-regexp regexp))
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
126 (find-lisp-find-files-internal
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
127 directory
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128 file-predicate
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 directory-predicate)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 ;; Workhorse function
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
132 (defun find-lisp-find-files-internal (directory file-predicate
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
133 directory-predicate)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 "Find files under DIRECTORY which satisfy FILE-PREDICATE.
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
135 FILE-PREDICATE is a function which takes two arguments: the file and its
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136 directory.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138 DIRECTORY-PREDICATE is used to decide whether to descend into directories.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 It is a function which takes two arguments, the directory and its parent."
33710
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
140 (setq directory (file-name-as-directory directory))
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 (let (results sub-results)
33710
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
142 (dolist (file (directory-files directory nil nil t))
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
143 (let ((fullname (expand-file-name file directory)))
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
144 (when (file-readable-p (expand-file-name file directory))
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
145 ;; If a directory, check it we should descend into it
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
146 (and (file-directory-p fullname)
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
147 (funcall directory-predicate file directory)
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148 (progn
33710
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
149 (setq sub-results
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
150 (find-lisp-find-files-internal
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
151 fullname
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
152 file-predicate
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
153 directory-predicate))
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
154 (if results
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
155 (nconc results sub-results)
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
156 (setq results sub-results))))
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
157 ;; For all files and directories, call the file predicate
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
158 (and (funcall file-predicate file directory)
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
159 (if results
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
160 (nconc results (list fullname))
bec245584796 (find-lisp-find-files-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32116
diff changeset
161 (setq results (list fullname)))))))
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162 results))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
164 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
165 ;; Find-dired all in Lisp
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
166 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167
37471
f335708a19f2 (find-lisp-find-dired-filter)
Eli Zaretskii <eliz@gnu.org>
parents: 33710
diff changeset
168 ;;;###autoload
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169 (defun find-lisp-find-dired (dir regexp)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170 "Find files in DIR, matching REGEXP."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
171 (interactive "DFind files in directory: \nsMatching regexp: ")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
172 (let ((find-lisp-regexp regexp))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
173 (find-lisp-find-dired-internal
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
174 dir
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
175 'find-lisp-default-file-predicate
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
176 'find-lisp-default-directory-predicate
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177 "*Find Lisp Dired*")))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
179 ;; Just the subdirectories
37471
f335708a19f2 (find-lisp-find-dired-filter)
Eli Zaretskii <eliz@gnu.org>
parents: 33710
diff changeset
180 ;;;###autoload
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
181 (defun find-lisp-find-dired-subdirectories (dir)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
182 "Find all subdirectories of DIR."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
183 (interactive "DFind subdirectories of directory: ")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
184 (find-lisp-find-dired-internal
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
185 dir
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
186 'find-lisp-file-predicate-is-directory
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
187 'find-lisp-default-directory-predicate
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
188 "*Find Lisp Dired Subdirectories*"))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
189
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190 ;; Most of this is lifted from find-dired.el
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
191 ;;
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
192 (defun find-lisp-find-dired-internal (dir file-predicate
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 directory-predicate buffer-name)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 "Run find (Lisp version) and go into Dired mode on a buffer of the output."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195 (let ((dired-buffers dired-buffers)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196 buf
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197 (regexp find-lisp-regexp))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198 ;; Expand DIR ("" means default-directory), and make sure it has a
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
199 ;; trailing slash.
66775
91dca36c0245 Require dired.
Luc Teirlinck <teirllm@auburn.edu>
parents: 65291
diff changeset
200 (setq dir (file-name-as-directory (expand-file-name dir)))
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201 ;; Check that it's really a directory.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202 (or (file-directory-p dir)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 (error "find-dired needs a directory: %s" dir))
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
204 (or
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 (and (buffer-name)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
206 (string= buffer-name (buffer-name)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207 (switch-to-buffer (setq buf (get-buffer-create buffer-name))))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
208 (widen)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
209 (kill-all-local-variables)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
210 (setq buffer-read-only nil)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211 (erase-buffer)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
212 (setq default-directory dir)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 (dired-mode dir)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
214
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
215 (use-local-map (append (make-sparse-keymap) (current-local-map)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
216
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
217 (make-local-variable 'find-lisp-file-predicate)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
218 (setq find-lisp-file-predicate file-predicate)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
219 (make-local-variable 'find-lisp-directory-predicate)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
220 (setq find-lisp-directory-predicate directory-predicate)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
221 (make-local-variable 'find-lisp-regexp)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
222 (setq find-lisp-regexp regexp)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
223
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224 (make-local-variable 'revert-buffer-function)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225 (setq revert-buffer-function
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
226 (function
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
227 (lambda(ignore1 ignore2)
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
228 (find-lisp-insert-directory
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
229 default-directory
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
230 find-lisp-file-predicate
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
231 find-lisp-directory-predicate
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
232 'ignore)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
233 )
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
234 ))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
235
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
236 ;; Set subdir-alist so that Tree Dired will work:
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
237 (if (fboundp 'dired-simple-subdir-alist)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
238 ;; will work even with nested dired format (dired-nstd.el,v 1.15
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
239 ;; and later)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
240 (dired-simple-subdir-alist)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
241 ;; else we have an ancient tree dired (or classic dired, where
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
242 ;; this does no harm)
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
243 (set (make-local-variable 'dired-subdir-alist)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
244 (list (cons default-directory (point-min-marker)))))
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
245 (find-lisp-insert-directory
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
246 dir file-predicate directory-predicate 'ignore)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
247 (goto-char (point-min))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
248 (dired-goto-next-file)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
249
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
250 (defun find-lisp-insert-directory (dir
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
251 file-predicate
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
252 directory-predicate
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
253 sort-function)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
254 "Insert the results of `find-lisp-find-files' in the current buffer."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
255 (let ((buffer-read-only nil)
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
256 (files (find-lisp-find-files-internal
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
257 dir
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
258 file-predicate
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
259 directory-predicate))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260 (len (length dir)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
261 (erase-buffer)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
262 ;; Subdir headlerline must come first because the first marker in
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
263 ;; subdir-alist points there.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
264 (insert find-lisp-line-indent dir ":\n")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
265 ;; Make second line a ``find'' line in analogy to the ``total'' or
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
266 ;; ``wildcard'' line.
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
267 ;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
268 ;; No analog for find-lisp?
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
269 (insert find-lisp-line-indent "\n")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
270 ;; Run the find function
84869
9ee30350a5a4 (find-lisp-insert-directory): Use `mapc' rather than `mapcar'.
Juanma Barranquero <lekktu@gmail.com>
parents: 78236
diff changeset
271 (mapc
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272 (function
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273 (lambda(file)
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
274 (find-lisp-find-dired-insert-file
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
275 (substring file len)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
276 (current-buffer))))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
277 (sort files 'string-lessp))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
278 ;; FIXME: Sort function is ignored for now
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
279 ;; (funcall sort-function files))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
280 (goto-char (point-min))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
281 (dired-goto-next-file)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
282
37471
f335708a19f2 (find-lisp-find-dired-filter)
Eli Zaretskii <eliz@gnu.org>
parents: 33710
diff changeset
283 ;;;###autoload
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
284 (defun find-lisp-find-dired-filter (regexp)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
285 "Change the filter on a find-lisp-find-dired buffer to REGEXP."
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
286 (interactive "sSet filter to regexp: ")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
287 (setq find-lisp-regexp regexp)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
288 (revert-buffer))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
289
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
290 (defun find-lisp-find-dired-insert-file (file buffer)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
291 (set-buffer buffer)
32116
3f09592bbc80 * find-lisp.el (find-lisp-find-files-internal):
Peter Breton <pbreton@attbi.com>
parents: 29696
diff changeset
292 (insert find-lisp-line-indent
66829
dce32a0d407f (find-lisp-find-dired-insert-file): Pass 'string arg to `file-attributes'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 66775
diff changeset
293 (find-lisp-format file (file-attributes file 'string) (list "")
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294 (current-time))))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297 ;; Lifted from ls-lisp. We don't want to require it, because that
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
298 ;; would alter the insert-directory function.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 (defun find-lisp-format (file-name file-attr switches now)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 (let ((file-type (nth 0 file-attr)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303 (concat (if (memq ?i switches) ; inode number
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 (format "%6d " (nth 10 file-attr)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 ;; nil is treated like "" in concat
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306 (if (memq ?s switches) ; size in K
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 (format "%4d " (1+ (/ (nth 7 file-attr) 1024))))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308 (nth 8 file-attr) ; permission bits
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
309 (format " %3d %-8s %-8s %8d "
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
310 (nth 1 file-attr) ; no. of links
66829
dce32a0d407f (find-lisp-find-dired-insert-file): Pass 'string arg to `file-attributes'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 66775
diff changeset
311 (if (numberp (nth 2 file-attr))
dce32a0d407f (find-lisp-find-dired-insert-file): Pass 'string arg to `file-attributes'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 66775
diff changeset
312 (int-to-string (nth 2 file-attr))
dce32a0d407f (find-lisp-find-dired-insert-file): Pass 'string arg to `file-attributes'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 66775
diff changeset
313 (nth 2 file-attr)) ; uid
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
314 (if (eq system-type 'ms-dos)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315 "root" ; everything is root on MSDOS.
66829
dce32a0d407f (find-lisp-find-dired-insert-file): Pass 'string arg to `file-attributes'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 66775
diff changeset
316 (if (numberp (nth 3 file-attr))
dce32a0d407f (find-lisp-find-dired-insert-file): Pass 'string arg to `file-attributes'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 66775
diff changeset
317 (int-to-string (nth 3 file-attr))
dce32a0d407f (find-lisp-find-dired-insert-file): Pass 'string arg to `file-attributes'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 66775
diff changeset
318 (nth 3 file-attr))) ; gid
29696
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
319 (nth 7 file-attr) ; size in bytes
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
320 )
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
321 (find-lisp-format-time file-attr switches now)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
322 " "
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
323 file-name
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
324 (if (stringp file-type) ; is a symbolic link
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
325 (concat " -> " file-type)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
326 "")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
327 "\n")))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
328
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
329 (defun find-lisp-time-index (switches)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
330 ;; Return index into file-attributes according to ls SWITCHES.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
331 (cond
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
332 ((memq ?c switches) 6) ; last mode change
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
333 ((memq ?u switches) 4) ; last access
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 ;; default is last modtime
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
335 (t 5)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
336
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337 (defun find-lisp-format-time (file-attr switches now)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338 ;; Format time string for file with attributes FILE-ATTR according
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339 ;; to SWITCHES (a list of ls option letters of which c and u are recognized).
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340 ;; Use the same method as `ls' to decide whether to show time-of-day or year,
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341 ;; depending on distance between file date and NOW.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342 (let* ((time (nth (find-lisp-time-index switches) file-attr))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343 (diff16 (- (car time) (car now)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
344 (diff (+ (ash diff16 16) (- (car (cdr time)) (car (cdr now)))))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
345 (past-cutoff (- (* 6 30 24 60 60))) ; 6 30-day months
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
346 (future-cutoff (* 60 60))) ; 1 hour
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
347 (format-time-string
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
348 (if (and
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349 (<= past-cutoff diff) (<= diff future-cutoff)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
350 ;; Sanity check in case `diff' computation overflowed.
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
351 (<= (1- (ash past-cutoff -16)) diff16)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
352 (<= diff16 (1+ (ash future-cutoff -16))))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
353 "%b %e %H:%M"
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
354 "%b %e %Y")
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
355 time)))
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
356
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
357 (provide 'find-lisp)
a5051216d618 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
358
93975
1e3a407766b9 Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 87649
diff changeset
359 ;; arch-tag: a711374c-f12a-46f6-aa18-ba7d77b9602a
38431
853c3674f20a Fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37471
diff changeset
360 ;;; find-lisp.el ends here