Mercurial > emacs
comparison lisp/locate.el @ 26043:255f19f33b82
(locate-in-alternate-database): Added this function
(locate): Added locate-post-command-hook.
(locate-prompt-for-command): Added this variable.
(locate): If locate-prompt-for-command is set, prompt for a command
to run to populate the locate buffer as the default behavior.
(locate-update): Add prefix arg to locate call.
(locate-with-filter): Add prefix arg to locate call.
(locate): Add prefix arg. If set, the function prompts the user
(locate-mouse-face): No longer needed.
(locate-mode): Setup `dired-subdir-alist' cleanly using `dired-alist-add-1'.
(locate-set-properties): Set properties cleanly using
`dired-insert-set-properties', giving dired like output.
for a command to run instead of the default one.
(locate-grep-history-list): Added this variable.
(locate-with-filter): Use locate-grep-history-list instead of grep-history.
(locate-filter-output): filter is not regexp-quoted.
(locate-mode-map): Added keybinding for locate-find-directory.
Changed keybinding for "U" from dired-unmark-all-files-no-query
to dired-unmark-all-files.
(locate-find-directory): Added this function.
(locate-find-directory-other-window): Added this function.
(locate-get-dirname): Added this function.
(locate-mouse-view-file): Renamed mouse-locate-view-file to this name.
author | Peter Breton <pbreton@attbi.com> |
---|---|
date | Sat, 16 Oct 1999 03:47:06 +0000 |
parents | f53740d7d40d |
children | 8ea5bfbb88f8 |
comparison
equal
deleted
inserted
replaced
26042:1eb2f529058f | 26043:255f19f33b82 |
---|---|
22 ;; Boston, MA 02111-1307, USA. | 22 ;; Boston, MA 02111-1307, USA. |
23 | 23 |
24 ;;; Commentary: | 24 ;;; Commentary: |
25 | 25 |
26 ;; Search a database of files and use dired commands on | 26 ;; Search a database of files and use dired commands on |
27 ;; the result. | 27 ;; the result. |
28 ;; | 28 ;; |
29 | 29 |
30 ;;;;; Building a database of files ;;;;;;;;; | 30 ;;;;; Building a database of files ;;;;;;;;; |
31 ;; | 31 ;; |
32 ;; You can create a simple files database with a port of the Unix find command | 32 ;; You can create a simple files database with a port of the Unix find command |
33 ;; and one of the various Windows NT various scheduling utilities, | 33 ;; and one of the various Windows NT various scheduling utilities, |
34 ;; for example the AT command from the NT Resource Kit, WinCron which is | 34 ;; for example the AT command from the NT Resource Kit, WinCron which is |
35 ;; included with Microsoft FrontPage, or the shareware NTCron program. | 35 ;; included with Microsoft FrontPage, or the shareware NTCron program. |
36 ;; | 36 ;; |
37 ;; To set up a function which searches the files database, do something | 37 ;; To set up a function which searches the files database, do something |
38 ;; like this: | 38 ;; like this: |
39 ;; | 39 ;; |
40 ;; (defvar locate-fcodes-file "c:/users/peter/fcodes") | 40 ;; (defvar locate-fcodes-file "c:/users/peter/fcodes") |
41 ;; (defvar locate-make-command-line 'nt-locate-make-command-line) | 41 ;; (defvar locate-make-command-line 'nt-locate-make-command-line) |
42 ;; | 42 ;; |
43 ;; (defun nt-locate-make-command-line (arg) | 43 ;; (defun nt-locate-make-command-line (arg) |
44 ;; (list "grep" "-i" arg locate-fcodes-file)) | 44 ;; (list "grep" "-i" arg locate-fcodes-file)) |
45 ;; | 45 ;; |
46 ;;;;;;;; ADVICE For dired-make-relative: ;;;;;;;;; | 46 ;;;;;;;; ADVICE For dired-make-relative: ;;;;;;;;; |
47 ;; | 47 ;; |
48 ;; For certain dired commands to work right, you should also include the | 48 ;; For certain dired commands to work right, you should also include the |
49 ;; following in your _emacs/.emacs: | 49 ;; following in your _emacs/.emacs: |
50 ;; | 50 ;; |
51 ;; (defadvice dired-make-relative (before set-no-error activate) | 51 ;; (defadvice dired-make-relative (before set-no-error activate) |
52 ;; "For locate mode and Windows, don't return errors" | 52 ;; "For locate mode and Windows, don't return errors" |
53 ;; (if (and (eq major-mode 'locate-mode) | 53 ;; (if (and (eq major-mode 'locate-mode) |
54 ;; (memq system-type (list 'windows-nt 'ms-dos))) | 54 ;; (memq system-type (list 'windows-nt 'ms-dos))) |
55 ;; (ad-set-arg 2 t) | 55 ;; (ad-set-arg 2 t) |
64 ;; database of file names. By default, this program is the GNU locate | 64 ;; database of file names. By default, this program is the GNU locate |
65 ;; command, but it could also be the BSD-style find command, or even a | 65 ;; command, but it could also be the BSD-style find command, or even a |
66 ;; user specified command. | 66 ;; user specified command. |
67 ;; | 67 ;; |
68 ;; To use the BSD-style "fast find", or any other shell command of the | 68 ;; To use the BSD-style "fast find", or any other shell command of the |
69 ;; form | 69 ;; form |
70 ;; | 70 ;; |
71 ;; SHELLPROGRAM Name-to-find | 71 ;; SHELLPROGRAM Name-to-find |
72 ;; | 72 ;; |
73 ;; set the variable `locate-command' in your .emacs file. | 73 ;; set the variable `locate-command' in your .emacs file. |
74 ;; | 74 ;; |
75 ;; To use a more complicated expression, create a function which | 75 ;; To use a more complicated expression, create a function which |
76 ;; takes a string (the name to find) as input and returns a list. | 76 ;; takes a string (the name to find) as input and returns a list. |
77 ;; The first element should be the command to be executed, the remaining | 77 ;; The first element should be the command to be executed, the remaining |
78 ;; elements should be the arguments (including the name to find). Then put | 78 ;; elements should be the arguments (including the name to find). Then put |
79 ;; | 79 ;; |
80 ;; (setq locate-make-command-line 'my-locate-command-line) | 80 ;; (setq locate-make-command-line 'my-locate-command-line) |
81 ;; | 81 ;; |
82 ;; in your .emacs, using the name of your function in place of | 82 ;; in your .emacs, using the name of your function in place of |
83 ;; my-locate-command-line. | 83 ;; my-locate-command-line. |
84 ;; | 84 ;; |
85 ;; You should make sure that whichever command you use works correctly | 85 ;; You should make sure that whichever command you use works correctly |
89 ;; your emacs process. | 89 ;; your emacs process. |
90 ;; | 90 ;; |
91 ;; Locate-mode assumes that each line output from the locate-command | 91 ;; Locate-mode assumes that each line output from the locate-command |
92 ;; consists exactly of a file name, possibly preceded or trailed by | 92 ;; consists exactly of a file name, possibly preceded or trailed by |
93 ;; whitespace. If your file database has other information on the line (for | 93 ;; whitespace. If your file database has other information on the line (for |
94 ;; example, the file size), you will need to redefine the function | 94 ;; example, the file size), you will need to redefine the function |
95 ;; `locate-get-file-positions' to return a list consisting of the first | 95 ;; `locate-get-file-positions' to return a list consisting of the first |
96 ;; character in the file name and the last character in the file name. | 96 ;; character in the file name and the last character in the file name. |
97 ;; | 97 ;; |
98 ;; To use locate-mode, simply type M-x locate and then the string | 98 ;; To use locate-mode, simply type M-x locate and then the string |
99 ;; you wish to find. You can use almost all of the dired commands in | 99 ;; you wish to find. You can use almost all of the dired commands in |
128 :group 'locate) | 128 :group 'locate) |
129 | 129 |
130 (defvar locate-history-list nil | 130 (defvar locate-history-list nil |
131 "The history list used by the \\[locate] command.") | 131 "The history list used by the \\[locate] command.") |
132 | 132 |
133 (defvar locate-grep-history-list nil | |
134 "The history list used by the \\[locate-with-filter] command.") | |
135 | |
133 (defcustom locate-make-command-line 'locate-default-make-command-line | 136 (defcustom locate-make-command-line 'locate-default-make-command-line |
134 "*Function used to create the locate command line." | 137 "*Function used to create the locate command line." |
135 :type 'function | 138 :type 'function |
136 :group 'locate) | 139 :group 'locate) |
137 | 140 |
143 (defcustom locate-fcodes-file nil | 146 (defcustom locate-fcodes-file nil |
144 "*File name for the database of file names." | 147 "*File name for the database of file names." |
145 :type '(choice file (const nil)) | 148 :type '(choice file (const nil)) |
146 :group 'locate) | 149 :group 'locate) |
147 | 150 |
148 (defcustom locate-mouse-face 'highlight | 151 (defcustom locate-header-face nil |
149 "*Face used to highlight locate entries." | |
150 :type 'face | |
151 :group 'locate) | |
152 | |
153 (defcustom locate-header-face 'underline | |
154 "*Face used to highlight the locate header." | 152 "*Face used to highlight the locate header." |
155 :type 'face | 153 :type 'face |
156 :group 'locate) | 154 :group 'locate) |
157 | 155 |
158 (defcustom locate-update-command "updatedb" | 156 (defcustom locate-update-command "updatedb" |
159 "The command used to update the locate database." | 157 "The command used to update the locate database." |
160 :type 'string | 158 :type 'string |
161 :group 'locate) | 159 :group 'locate) |
162 | 160 |
161 (defcustom locate-prompt-for-command nil | |
162 "If non-nil, the default behavior of the locate command is to prompt for a command to run. | |
163 Otherwise, that behavior is invoked via a prefix argument." | |
164 :group 'locate | |
165 :type 'boolean | |
166 ) | |
167 | |
163 ;; Functions | 168 ;; Functions |
164 | 169 |
165 (defun locate-default-make-command-line (search-string) | 170 (defun locate-default-make-command-line (search-string) |
166 (list locate-command search-string)) | 171 (list locate-command search-string)) |
167 | 172 |
168 ;;;###autoload | 173 ;;;###autoload |
169 (defun locate (search-string &optional filter) | 174 (defun locate (arg search-string &optional filter) |
170 "Run the program `locate', putting results in `*Locate*' buffer." | 175 "Run the program `locate', putting results in `*Locate*' buffer. |
176 With prefix arg, prompt for the locate command to run." | |
171 (interactive | 177 (interactive |
172 (list (read-from-minibuffer "Locate: " nil nil | 178 (list |
173 nil 'locate-history-list))) | 179 current-prefix-arg |
180 (if (or (and current-prefix-arg (not locate-prompt-for-command)) | |
181 (and (not current-prefix-arg) locate-prompt-for-command)) | |
182 (read-from-minibuffer "Run locate command: " | |
183 nil nil nil 'locate-history-list) | |
184 (read-from-minibuffer "Locate: " nil nil | |
185 nil 'locate-history-list) | |
186 ))) | |
174 (let* ((locate-cmd-list (funcall locate-make-command-line search-string)) | 187 (let* ((locate-cmd-list (funcall locate-make-command-line search-string)) |
175 (locate-cmd (car locate-cmd-list)) | 188 (locate-cmd (car locate-cmd-list)) |
176 (locate-cmd-args (cdr locate-cmd-list)) | 189 (locate-cmd-args (cdr locate-cmd-list)) |
190 (run-locate-command | |
191 (or (and arg (not locate-prompt-for-command)) | |
192 (and (not arg) locate-prompt-for-command))) | |
177 ) | 193 ) |
178 | 194 |
179 ;; Find the Locate buffer | 195 ;; Find the Locate buffer |
180 (save-window-excursion | 196 (save-window-excursion |
181 (set-buffer (get-buffer-create locate-buffer-name)) | 197 (set-buffer (get-buffer-create locate-buffer-name)) |
182 (locate-mode) | 198 (locate-mode) |
183 (erase-buffer) | 199 (erase-buffer) |
184 | 200 |
185 (setq locate-current-filter filter) | 201 (setq locate-current-filter filter) |
186 | 202 |
187 (apply 'call-process locate-cmd nil t nil locate-cmd-args) | 203 (if run-locate-command |
204 (shell-command search-string locate-buffer-name) | |
205 (apply 'call-process locate-cmd nil t nil locate-cmd-args)) | |
206 | |
188 (and filter | 207 (and filter |
189 (locate-filter-output filter)) | 208 (locate-filter-output filter)) |
190 | 209 |
191 (locate-do-setup) | 210 (locate-do-setup) |
192 ) | 211 ) |
193 (and (not (string-equal (buffer-name) locate-buffer-name)) | 212 (and (not (string-equal (buffer-name) locate-buffer-name)) |
194 (switch-to-buffer-other-window locate-buffer-name)) | 213 (switch-to-buffer-other-window locate-buffer-name)) |
214 | |
215 (run-hooks 'locate-post-command-hook) | |
195 ) | 216 ) |
196 ) | 217 ) |
197 | 218 |
198 ;;;###autoload | 219 ;;;###autoload |
199 (defun locate-with-filter (search-string filter) | 220 (defun locate-with-filter (search-string filter) |
200 "Run the locate command with a filter." | 221 "Run the locate command with a filter." |
201 (interactive | 222 (interactive |
202 (list (read-from-minibuffer "Locate: " nil nil | 223 (list (read-from-minibuffer "Locate: " nil nil |
203 nil 'locate-history-list) | 224 nil 'locate-history-list) |
204 (read-from-minibuffer "Filter: " nil nil | 225 (read-from-minibuffer "Filter: " nil nil |
205 nil 'grep-history))) | 226 nil 'locate-grep-history-list))) |
206 (locate search-string filter)) | 227 (locate nil search-string filter)) |
207 | 228 |
208 (defun locate-filter-output (filter) | 229 (defun locate-filter-output (filter) |
209 "Filter output from the locate command." | 230 "Filter output from the locate command." |
210 (goto-char (point-min)) | 231 (goto-char (point-min)) |
211 (delete-non-matching-lines (regexp-quote filter))) | 232 (delete-non-matching-lines filter)) |
212 | 233 |
213 (defvar locate-mode-map nil | 234 (defvar locate-mode-map nil |
214 "Local keymap for Locate mode buffers.") | 235 "Local keymap for Locate mode buffers.") |
215 (if locate-mode-map | 236 (if locate-mode-map |
216 nil | 237 nil |
226 (define-key locate-mode-map [menu-bar mark executables] 'undefined) | 247 (define-key locate-mode-map [menu-bar mark executables] 'undefined) |
227 (define-key locate-mode-map [menu-bar mark directory] 'undefined) | 248 (define-key locate-mode-map [menu-bar mark directory] 'undefined) |
228 (define-key locate-mode-map [menu-bar mark directories] 'undefined) | 249 (define-key locate-mode-map [menu-bar mark directories] 'undefined) |
229 (define-key locate-mode-map [menu-bar mark symlinks] 'undefined) | 250 (define-key locate-mode-map [menu-bar mark symlinks] 'undefined) |
230 | 251 |
231 (define-key locate-mode-map [mouse-2] 'mouse-locate-view-file) | 252 (define-key locate-mode-map [mouse-2] 'locate-mouse-view-file) |
232 (define-key locate-mode-map "\C-ct" 'locate-tags) | 253 (define-key locate-mode-map "\C-c\C-t" 'locate-tags) |
233 | 254 |
234 (define-key locate-mode-map "U" 'dired-unmark-all-files-no-query) | 255 (define-key locate-mode-map "U" 'dired-unmark-all-files) |
256 (define-key locate-mode-map "V" 'locate-find-directory) | |
235 ) | 257 ) |
236 | 258 |
237 ;; This variable is used to indent the lines and then to search for | 259 ;; This variable is used to indent the lines and then to search for |
238 ;; the file name | 260 ;; the file name |
239 (defconst locate-filename-indentation 4 | 261 (defconst locate-filename-indentation 4 |
242 (defun locate-get-file-positions () | 264 (defun locate-get-file-positions () |
243 (save-excursion | 265 (save-excursion |
244 (end-of-line) | 266 (end-of-line) |
245 (let ((eol (point))) | 267 (let ((eol (point))) |
246 (beginning-of-line) | 268 (beginning-of-line) |
247 | 269 |
248 ;; Assumes names end at the end of the line | 270 ;; Assumes names end at the end of the line |
249 (forward-char locate-filename-indentation) | 271 (forward-char locate-filename-indentation) |
250 (list (point) eol)))) | 272 (list (point) eol)))) |
251 | 273 |
252 ;; From SQL-mode | 274 ;; From SQL-mode |
258 0))) | 280 0))) |
259 | 281 |
260 (defun locate-get-filename () | 282 (defun locate-get-filename () |
261 (let ((pos (locate-get-file-positions)) | 283 (let ((pos (locate-get-file-positions)) |
262 (lineno (locate-current-line-number))) | 284 (lineno (locate-current-line-number))) |
263 (and (not (eq lineno 1)) | 285 (and (not (eq lineno 1)) |
264 (not (eq lineno 2)) | 286 (not (eq lineno 2)) |
265 (buffer-substring (elt pos 0) (elt pos 1))))) | 287 (buffer-substring (elt pos 0) (elt pos 1))))) |
266 | 288 |
267 (defun mouse-locate-view-file (event) | 289 (defun locate-mouse-view-file (event) |
268 "In Locate mode, view a file, using the mouse." | 290 "In Locate mode, view a file, using the mouse." |
269 (interactive "@e") | 291 (interactive "@e") |
270 (save-excursion | 292 (save-excursion |
271 (goto-char (posn-point (event-start event))) | 293 (goto-char (posn-point (event-start event))) |
272 (view-file (locate-get-filename)))) | 294 (view-file (locate-get-filename)))) |
273 | 295 |
274 ;; Define a mode for locate | 296 ;; Define a mode for locate |
275 ;; Default directory is set to "/" so that dired commands, which | 297 ;; Default directory is set to "/" so that dired commands, which |
276 ;; expect to be in a tree, will work properly | 298 ;; expect to be in a tree, will work properly |
277 (defun locate-mode () | 299 (defun locate-mode () |
278 "Major mode for the `*Locate*' buffer made by \\[locate]." | 300 "Major mode for the `*Locate*' buffer made by \\[locate]." |
279 (kill-all-local-variables) | 301 (kill-all-local-variables) |
302 ;; Avoid clobbering this variables | |
303 (make-local-variable 'dired-subdir-alist) | |
280 (use-local-map locate-mode-map) | 304 (use-local-map locate-mode-map) |
281 (setq major-mode 'locate-mode | 305 (setq major-mode 'locate-mode |
282 mode-name "Locate" | 306 mode-name "Locate" |
283 default-directory "/" | 307 default-directory "/") |
284 dired-subdir-alist (list (cons "/" (point-min-marker)))) | 308 (dired-alist-add-1 default-directory (point-min-marker)) |
285 (make-local-variable 'dired-move-to-filename-regexp) | 309 (make-local-variable 'dired-move-to-filename-regexp) |
310 ;; This should support both Unix and Windoze style names | |
286 (setq dired-move-to-filename-regexp | 311 (setq dired-move-to-filename-regexp |
287 (make-string locate-filename-indentation ?\ )) | 312 (concat "." |
313 (make-string (1- locate-filename-indentation) ?\ ) | |
314 "\\(/\\|[A-Za-z]:\\)")) | |
288 (make-local-variable 'dired-actual-switches) | 315 (make-local-variable 'dired-actual-switches) |
289 (setq dired-actual-switches "") | 316 (setq dired-actual-switches "") |
290 (make-local-variable 'dired-permission-flags-regexp) | 317 (make-local-variable 'dired-permission-flags-regexp) |
291 (setq dired-permission-flags-regexp "^\\( \\)") | 318 (setq dired-permission-flags-regexp |
319 (concat "^.\\(" | |
320 (make-string (1- locate-filename-indentation) ?\ ) | |
321 "\\)")) | |
292 (make-local-variable 'revert-buffer-function) | 322 (make-local-variable 'revert-buffer-function) |
293 (setq revert-buffer-function 'locate-update) | 323 (setq revert-buffer-function 'locate-update) |
294 (run-hooks 'locate-mode-hook)) | 324 (run-hooks 'locate-mode-hook)) |
295 | 325 |
296 (defun locate-do-setup () | 326 (defun locate-do-setup () |
297 (let ((search-string (car locate-history-list))) | 327 (let ((search-string (car locate-history-list))) |
298 (goto-char (point-min)) | 328 (goto-char (point-min)) |
299 (save-excursion | 329 (save-excursion |
300 | 330 |
301 ;; Nothing returned from locate command? | 331 ;; Nothing returned from locate command? |
302 (and (eobp) | 332 (and (eobp) |
303 (progn | 333 (progn |
304 (kill-buffer locate-buffer-name) | 334 (kill-buffer locate-buffer-name) |
305 (if locate-current-filter | 335 (if locate-current-filter |
306 (error "Locate: no match for %s in database using filter %s" | 336 (error "Locate: no match for %s in database using filter %s" |
307 search-string locate-current-filter) | 337 search-string locate-current-filter) |
308 (error "Locate: no match for %s in database" search-string)))) | 338 (error "Locate: no match for %s in database" search-string)))) |
309 | 339 |
310 (locate-insert-header search-string) | 340 (locate-insert-header search-string) |
311 | 341 |
312 (while (not (eobp)) | 342 (while (not (eobp)) |
313 (insert-char ?\ locate-filename-indentation t) | 343 (insert-char ?\ locate-filename-indentation t) |
314 (locate-set-properties) | 344 (locate-set-properties) |
315 (forward-line 1))))) | 345 (forward-line 1))))) |
316 | 346 |
317 (defun locate-set-properties () | 347 (defun locate-set-properties () |
318 (save-excursion | 348 (save-excursion |
319 (let ((pos (locate-get-file-positions))) | 349 (let ((pos (locate-get-file-positions))) |
320 (add-text-properties (elt pos 0) (elt pos 1) | 350 (dired-insert-set-properties (elt pos 0) (elt pos 1))))) |
321 (list 'mouse-face locate-mouse-face))))) | |
322 | 351 |
323 (defun locate-insert-header (search-string) | 352 (defun locate-insert-header (search-string) |
324 (let ((locate-format-string "Matches for %s") | 353 (let ((locate-format-string "Matches for %s") |
325 (locate-regexp-match | 354 (locate-regexp-match |
326 (concat " *Matches for \\(" (regexp-quote search-string) "\\)")) | 355 (concat " *Matches for \\(" (regexp-quote search-string) "\\)")) |
327 (locate-format-args (list search-string)) | 356 (locate-format-args (list search-string)) |
328 ) | 357 ) |
329 | 358 |
330 (and locate-fcodes-file | 359 (and locate-fcodes-file |
331 (setq locate-format-string | 360 (setq locate-format-string |
332 (concat locate-format-string " in %s") | 361 (concat locate-format-string " in %s") |
333 locate-regexp-match | 362 locate-regexp-match |
334 (concat locate-regexp-match | 363 (concat locate-regexp-match |
347 "\\(" | 376 "\\(" |
348 (regexp-quote locate-current-filter) | 377 (regexp-quote locate-current-filter) |
349 "\\)") | 378 "\\)") |
350 locate-format-args | 379 locate-format-args |
351 (append (list locate-current-filter) locate-format-args))) | 380 (append (list locate-current-filter) locate-format-args))) |
352 | 381 |
353 (setq locate-format-string | 382 (setq locate-format-string |
354 (concat locate-format-string ": \n\n") | 383 (concat locate-format-string ": \n\n") |
355 locate-regexp-match | 384 locate-regexp-match |
356 (concat locate-regexp-match ": \n")) | 385 (concat locate-regexp-match ": \n")) |
357 | 386 |
358 (insert (apply 'format locate-format-string (reverse locate-format-args))) | 387 (insert (apply 'format locate-format-string (reverse locate-format-args))) |
359 | 388 |
360 (save-excursion | 389 (save-excursion |
361 (goto-char (point-min)) | 390 (goto-char (point-min)) |
362 (if (not (looking-at locate-regexp-match)) | 391 (if (not (looking-at locate-regexp-match)) |
363 nil | 392 nil |
364 (add-text-properties (match-beginning 1) (match-end 1) | 393 (add-text-properties (match-beginning 1) (match-end 1) |
373 | 402 |
374 (defun locate-tags () | 403 (defun locate-tags () |
375 "Visit a tags table in `*Locate*' mode." | 404 "Visit a tags table in `*Locate*' mode." |
376 (interactive) | 405 (interactive) |
377 (let ((tags-table (locate-get-filename))) | 406 (let ((tags-table (locate-get-filename))) |
378 (and (y-or-n-p (format "Visit tags table %s? " tags-table)) | 407 (and (y-or-n-p (format "Visit tags table %s? " tags-table)) |
379 (visit-tags-table tags-table)))) | 408 (visit-tags-table tags-table)))) |
380 | 409 |
381 ;; From Stephen Eglen <stephen@cns.ed.ac.uk> | 410 ;; From Stephen Eglen <stephen@cns.ed.ac.uk> |
382 (defun locate-update (ignore1 ignore2) | 411 (defun locate-update (ignore1 ignore2) |
383 "Update the locate database. | 412 "Update the locate database. |
384 Database is updated using the shell command in `locate-update-command'." | 413 Database is updated using the shell command in `locate-update-command'." |
385 (let ((str (car locate-history-list))) | 414 (let ((str (car locate-history-list))) |
386 (cond ((yes-or-no-p "Update locate database (may take a few seconds)? ") | 415 (cond ((yes-or-no-p "Update locate database (may take a few seconds)? ") |
387 (shell-command locate-update-command) | 416 (shell-command locate-update-command) |
388 (locate str))))) | 417 (locate nil str))))) |
418 | |
419 ;;; Modified three functions from `dired.el': | |
420 ;;; dired-find-directory, | |
421 ;;; dired-find-directory-other-window | |
422 ;;; dired-get-filename | |
423 | |
424 (defun locate-find-directory () | |
425 "Visit the directory of the file mentioned on this line." | |
426 (interactive) | |
427 (let ((directory-name (locate-get-dirname))) | |
428 (if (file-directory-p directory-name) | |
429 (find-file directory-name) | |
430 (if (file-symlink-p directory-name) | |
431 (error "Directory is a symlink to a nonexistent target") | |
432 (error "Directory no longer exists; run `updatedb' to update database"))))) | |
433 | |
434 (defun locate-find-directory-other-window () | |
435 "Visit the directory of the file named on this line in other window." | |
436 (interactive) | |
437 (find-file-other-window (locate-get-dirname))) | |
438 | |
439 (defun locate-get-dirname () | |
440 "Return the directory name of the file mentioned on this line." | |
441 (let (file (filepos (locate-get-file-positions))) | |
442 (if (setq file (buffer-substring (nth 0 filepos) (nth 1 filepos))) | |
443 (progn | |
444 ;; Get rid of the mouse-face property that file names have. | |
445 (set-text-properties 0 (length file) nil file) | |
446 (setq file (file-name-directory file)) | |
447 ;; Unquote names quoted by ls or by dired-insert-directory. | |
448 ;; Using read to unquote is much faster than substituting | |
449 ;; \007 (4 chars) -> ^G (1 char) etc. in a lisp loop. | |
450 (setq file | |
451 (read | |
452 (concat "\"" | |
453 ;; some ls -b don't escape quotes, argh! | |
454 ;; This is not needed for GNU ls, though. | |
455 (or (dired-string-replace-match | |
456 "\\([^\\]\\|\\`\\)\"" file "\\1\\\\\"" nil t) | |
457 file) | |
458 "\""))))) | |
459 (and file buffer-file-coding-system | |
460 (not file-name-coding-system) | |
461 (setq file (encode-coding-string file buffer-file-coding-system))) | |
462 file)) | |
463 | |
464 ;; Only for GNU locate | |
465 (defun locate-in-alternate-database (search-string database) | |
466 "Run the GNU locate command, using an alternate database." | |
467 (interactive | |
468 (list | |
469 (progn | |
470 ;; (require 'locate) | |
471 (read-from-minibuffer "Locate: " nil nil | |
472 nil 'locate-history-list)) | |
473 (read-file-name "Locate using Database: " ) | |
474 )) | |
475 (or (file-exists-p database) | |
476 (error "Database file %s does not exist" database)) | |
477 (let ((locate-make-command-line | |
478 (function (lambda (string) | |
479 (cons locate-command | |
480 (list (concat "--database=" | |
481 (expand-file-name database)) | |
482 string)))))) | |
483 (locate nil search-string))) | |
389 | 484 |
390 (provide 'locate) | 485 (provide 'locate) |
391 | 486 |
392 ;;; locate.el ends here | 487 ;;; locate.el ends here |