]> code.delx.au - gnu-emacs/blobdiff - lisp/locate.el
upstream
[gnu-emacs] / lisp / locate.el
index c0523a4b74be6865c3b69c6e8bb5bb75ee129458..29d7c75cbb2696305b2ae958d3970b61490b20f1 100644 (file)
@@ -1,7 +1,6 @@
 ;;; locate.el --- interface to the locate command
 
-;; Copyright (C) 1996, 1998, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1996, 1998, 2001-2012  Free Software Foundation, Inc.
 
 ;; Author: Peter Breton <pbreton@cs.umb.edu>
 ;; Keywords: unix files
@@ -97,7 +96,7 @@
 ;; (defadvice dired-make-relative (before set-no-error activate)
 ;;   "For locate mode and Windows, don't return errors"
 ;;   (if (and (eq   major-mode  'locate-mode)
-;;        (memq system-type (list 'windows-nt 'ms-dos)))
+;;        (memq system-type '(windows-nt ms-dos)))
 ;;       (ad-set-arg 2 t)
 ;;     ))
 ;;
 \f
 ;;; Code:
 
-(eval-when-compile
-  (require 'dired))
+(require 'dired)
 
 ;; Variables
 
@@ -146,6 +144,11 @@ the version.)"
   :type 'string
   :group 'locate)
 
+(defcustom locate-post-command-hook nil
+  "List of hook functions run after `locate' (see `run-hooks')."
+  :type  'hook
+  :group 'locate)
+
 (defvar locate-history-list nil
   "The history list used by the \\[locate] command.")
 
@@ -185,7 +188,7 @@ or `locate-make-command-line', determines the database."
   :group 'locate)
 
 ;;;###autoload
-(defcustom locate-ls-subdir-switches "-al"
+(defcustom locate-ls-subdir-switches (purecopy "-al")
   "`ls' switches for inserting subdirectories in `*Locate*' buffers.
 This should contain the \"-l\" switch, but not the \"-F\" or \"-b\" switches."
   :type 'string
@@ -227,6 +230,11 @@ that is, with a prefix arg, you get the default behavior."
   :group 'locate
   :type 'boolean)
 
+(defcustom locate-mode-hook nil
+  "List of hook functions run by `locate-mode' (see `run-mode-hooks')."
+  :type  'hook
+  :group 'locate)
+
 ;; Functions
 
 (defun locate-default-make-command-line (search-string)
@@ -271,7 +279,7 @@ that is, with a prefix arg, you get the default behavior."
 (defun locate (search-string &optional filter arg)
   "Run the program `locate', putting results in `*Locate*' buffer.
 Pass it SEARCH-STRING as argument.  Interactively, prompt for SEARCH-STRING.
-With prefix arg, prompt for the exact shell command to run instead.
+With prefix arg ARG, prompt for the exact shell command to run instead.
 
 This program searches for those file names in a database that match
 SEARCH-STRING and normally outputs all matching absolute file names,
@@ -287,7 +295,8 @@ the variables `locate-command' or `locate-make-command-line'.
 The main use of FILTER is to implement `locate-with-filter'.  See
 the docstring of that function for its meaning.
 
-ARG is the interactive prefix arg."
+After preparing the results buffer, this runs `dired-mode-hook' and
+then `locate-post-command-hook'."
   (interactive
    (list
     (locate-prompt-for-search-string)
@@ -301,8 +310,7 @@ ARG is the interactive prefix arg."
         (locate-cmd-args (cdr locate-cmd-list))
         (run-locate-command
          (or (and arg (not locate-prompt-for-command))
-             (and (not arg) locate-prompt-for-command)))
-        )
+             (and (not arg) locate-prompt-for-command))))
 
     ;; Find the Locate buffer
     (save-window-excursion
@@ -324,16 +332,13 @@ ARG is the interactive prefix arg."
        (and filter
             (locate-filter-output filter))
 
-       (locate-do-setup search-string)
-       ))
+       (locate-do-setup search-string)))
     (and (not (string-equal (buffer-name) locate-buffer-name))
-       (switch-to-buffer-other-window locate-buffer-name))
+       (pop-to-buffer locate-buffer-name))
 
     (run-hooks 'dired-mode-hook)
     (dired-next-line 3)                        ;move to first matching file.
-    (run-hooks 'locate-post-command-hook)
-    )
-  )
+    (run-hooks 'locate-post-command-hook)))
 
 ;;;###autoload
 (defun locate-with-filter (search-string filter &optional arg)
@@ -363,31 +368,22 @@ except that FILTER is not optional."
   (goto-char (point-min))
   (keep-lines filter))
 
-(defvar locate-mode-map nil
+(defvar locate-mode-map
+  (let ((map (copy-keymap dired-mode-map)))
+    ;; Undefine Useless Dired Menu bars
+    (define-key map [menu-bar Dired]   'undefined)
+    (define-key map [menu-bar subdir]  'undefined)
+    (define-key map [menu-bar mark executables] 'undefined)
+    (define-key map [menu-bar mark directory]   'undefined)
+    (define-key map [menu-bar mark directories] 'undefined)
+    (define-key map [menu-bar mark symlinks]    'undefined)
+    (define-key map [M-mouse-2] 'locate-mouse-view-file)
+    (define-key map "\C-c\C-t"  'locate-tags)
+    (define-key map "l"       'locate-do-redisplay)
+    (define-key map "U"       'dired-unmark-all-files)
+    (define-key map "V"       'locate-find-directory)
+    map)
   "Local keymap for Locate mode buffers.")
-(if locate-mode-map
-    nil
-
-   (require 'dired)
-
-   (setq locate-mode-map (copy-keymap dired-mode-map))
-
-   ;; Undefine Useless Dired Menu bars
-   (define-key locate-mode-map [menu-bar Dired]   'undefined)
-   (define-key locate-mode-map [menu-bar subdir]  'undefined)
-
-   (define-key locate-mode-map [menu-bar mark executables] 'undefined)
-   (define-key locate-mode-map [menu-bar mark directory]   'undefined)
-   (define-key locate-mode-map [menu-bar mark directories] 'undefined)
-   (define-key locate-mode-map [menu-bar mark symlinks]    'undefined)
-
-   (define-key locate-mode-map [M-mouse-2] 'locate-mouse-view-file)
-   (define-key locate-mode-map "\C-c\C-t"  'locate-tags)
-
-   (define-key locate-mode-map "l"       'locate-do-redisplay)
-   (define-key locate-mode-map "U"       'dired-unmark-all-files)
-   (define-key locate-mode-map "V"       'locate-find-directory)
-)
 
 ;; This variable is used to indent the lines and then to search for
 ;; the file name
@@ -457,6 +453,7 @@ file name or is inside a subdirectory."
 \\<locate-mode-map>\
 In that buffer, you can use almost all the usual dired bindings.
 \\[locate-find-directory] visits the directory of the file on the current line.
+This function runs `locate-mode-hook' before returning.
 
 Operating on listed files works, but does not always
 automatically update the buffer as in ordinary Dired.
@@ -483,9 +480,9 @@ do not work in subdirectories.
   (make-local-variable 'directory-listing-before-filename-regexp)
   ;; This should support both Unix and Windoze style names
   (setq directory-listing-before-filename-regexp
-       (concat "^."
+       (concat "^.\\("
                (make-string (1- locate-filename-indentation) ?\s)
-               "\\(/\\|[A-Za-z]:\\)\\|"
+                "\\)\\|"
                (default-value 'directory-listing-before-filename-regexp)))
   (make-local-variable 'dired-actual-switches)
   (setq dired-actual-switches "")
@@ -591,7 +588,7 @@ do not work in subdirectories.
     (message "This command only works inside main listing.")))
 
 ;; From Stephen Eglen <stephen@cns.ed.ac.uk>
-(defun locate-update (ignore1 ignore2)
+(defun locate-update (_ignore1 _ignore2)
   "Revert the *Locate* buffer.
 If `locate-update-when-revert' is non-nil, offer to update the
 locate database using the shell command in `locate-update-command'."
@@ -697,5 +694,4 @@ the database on the command line."
 
 (provide 'locate)
 
-;; arch-tag: 60c4d098-b5d5-4b3c-a3e0-51a2e9f43898
 ;;; locate.el ends here