Initial Commit
[packages] / xemacs-packages / dired / dired-vir.el
1 ;;  -*-Emacs-Lisp-*-
2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;;
4 ;; File:          dired-vir.el
5 ;; Dired Version: 7.17
6 ;; RCS:
7 ;; Description:   Virtual dired mode for browsing ls -lR listings.
8 ;; Author:        Sebastian Kremer <sk@thp.uni-koeln.de>
9 ;; Created:       7-Mar-1991 16:00
10 ;;
11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
13 ;;; Requirements and provisions
14 (provide 'dired-vir)
15 (require 'dired)
16
17 ;;;###autoload
18 (defun dired-virtual (dirname &optional switches)
19   "Put this buffer into Virtual Dired mode.
20
21 In Virtual Dired mode, all commands that do not actually consult the
22 filesystem will work.
23
24 This is useful if you want to peruse and move around in an ls -lR
25 output file, for example one you got from an ftp server.  With
26 efs, you can even dired a directory containing an ls-lR file,
27 visit that file and turn on virtual dired mode.  But don't try to save
28 this file, as dired-virtual indents the listing and thus changes the
29 buffer.
30
31 If you have save a Dired buffer in a file you can use \\[dired-virtual] to
32 resume it in a later session.
33
34 Type \\<dired-mode-map>\\[revert-buffer] in the
35 Virtual Dired buffer and answer `y' to convert the virtual to a real
36 dired buffer again.  You don't have to do this, though: you can relist
37 single subdirs using \\[dired-do-redisplay].
38 "
39
40   ;; DIRNAME is the top level directory of the buffer.  It will become
41   ;; its `default-directory'.  If nil, the old value of
42   ;; default-directory is used.
43
44   ;; Optional SWITCHES are the ls switches to use.
45
46   ;; Shell wildcards will be used if there already is a `wildcard'
47   ;; line in the buffer (thus it is a saved Dired buffer), but there
48   ;; is no other way to get wildcards.  Insert a `wildcard' line by
49   ;; hand if you want them.
50
51   (interactive
52    (list (read-string "Virtual Dired directory: " (dired-virtual-guess-dir))))
53   (goto-char (point-min))
54   (or (looking-at "  ")
55       ;; if not already indented, do it now:
56       (indent-region (point-min) (point-max) 2))
57   (or dirname (setq dirname default-directory))
58   (setq dirname (expand-file-name (file-name-as-directory dirname)))
59   (setq default-directory dirname)      ; contains no wildcards
60   (let ((wildcard (save-excursion
61                     (goto-char (point-min))
62                     (forward-line 1)
63                     (and (looking-at "^  wildcard ")
64                          (buffer-substring (match-end 0)
65                                            (progn (end-of-line) (point)))))))
66   (if wildcard
67         (setq dirname (expand-file-name wildcard default-directory))))
68   ;; If raw ls listing (not a saved old dired buffer), give it a
69   ;; decent subdir headerline:
70   (goto-char (point-min))
71   (or (looking-at dired-subdir-regexp)
72       (dired-insert-headerline default-directory))
73   (dired-mode dirname (or switches dired-listing-switches))
74   (setq mode-name "Virtual Dired"
75         revert-buffer-function 'dired-virtual-revert)
76   (set (make-local-variable 'dired-subdir-alist) nil)
77   (dired-build-subdir-alist)
78   (goto-char (point-min))
79   (dired-insert-set-properties (point-min) (point-max))
80   (dired-initial-position dirname))
81
82 (defun dired-virtual-guess-dir ()
83
84   ;; Guess and return appropriate working directory of this buffer,
85   ;; assumed to be in Dired or ls -lR format.
86   ;; The guess is based upon buffer contents.
87   ;; If nothing could be guessed, returns nil.
88
89   (let ((regexp "^\\(  \\)?\\([^ \n\r]*\\)\\(:\\)[\n\r]")
90         (subexpr 2))
91     (goto-char (point-min))
92     (cond ((looking-at regexp)
93            ;; If a saved dired buffer, look to which dir and
94            ;; perhaps wildcard it belongs:
95            (let ((dir (buffer-substring (match-beginning subexpr)
96                                         (match-end subexpr))))
97              (file-name-as-directory dir)))
98           ;; Else no match for headerline found.  It's a raw ls listing.
99           ;; In raw ls listings the directory does not have a headerline
100           ;; try parent of first subdir, if any
101           ((re-search-forward regexp nil t)
102            (file-name-directory
103             (directory-file-name
104              (file-name-as-directory
105               (buffer-substring (match-beginning subexpr)
106                                 (match-end subexpr))))))
107           (t                            ; if all else fails
108            nil))))
109
110
111 (defun dired-virtual-revert (&optional arg noconfirm)
112   (if (not
113        (y-or-n-p "Cannot revert a Virtual Dired buffer - switch to Real Dired mode? "))
114       (error "Cannot revert a Virtual Dired buffer.")
115     (setq mode-name "Dired"
116           revert-buffer-function 'dired-revert)
117     (revert-buffer)))
118
119 ;; A zero-arg version of dired-virtual.
120 ;; You need my modified version of set-auto-mode for the
121 ;; `buffer-contents-mode-alist'.
122 ;; Or you use infer-mode.el and infer-mode-alist, same syntax.
123 (defun dired-virtual-mode ()
124   "Put current buffer into virtual dired mode (see `dired-virtual').
125 Useful on `buffer-contents-mode-alist' (which see) with the regexp
126
127     \"^  \\(/[^ /]+\\)/?+:$\"
128
129 to put saved dired buffers automatically into virtual dired mode.
130
131 Also useful for `auto-mode-alist' (which see) like this:
132
133   \(setq auto-mode-alist (cons '(\"[^/]\\.dired$\" . dired-virtual-mode)
134                               auto-mode-alist)\)
135 "
136   (interactive)
137   (dired-virtual (dired-virtual-guess-dir)))
138
139 ;;; end of dired-vir.el