diff options
Diffstat (limited to 'lisp/locate.el')
-rw-r--r-- | lisp/locate.el | 160 |
1 files changed, 89 insertions, 71 deletions
diff --git a/lisp/locate.el b/lisp/locate.el index e8dafa79048..58ec48c55c4 100644 --- a/lisp/locate.el +++ b/lisp/locate.el @@ -114,8 +114,10 @@ ;; Variables -(defvar locate-current-search nil) (defvar locate-current-filter nil) +(defvar locate-local-filter nil) +(defvar locate-local-search nil) +(defvar locate-local-prompt nil) (defgroup locate nil "Interface to the locate command." @@ -220,7 +222,10 @@ option to \"/\"." (defcustom locate-prompt-for-command nil "If non-nil, the `locate' command prompts for a command to run. -Otherwise, that behavior is invoked via a prefix argument." +Otherwise, that behavior is invoked via a prefix argument. + +Setting this option non-nil actually inverts the meaning of a prefix arg; +that is, with a prefix arg, you get the default behavior." :group 'locate :type 'boolean) @@ -240,8 +245,32 @@ Otherwise, that behavior is invoked via a prefix argument." (skip-chars-backward "." pt) (point))))) +;; Function for use in interactive declarations. +(defun locate-prompt-for-search-string () + (if (or (and current-prefix-arg + (not locate-prompt-for-command)) + (and (not current-prefix-arg) locate-prompt-for-command)) + (let ((locate-cmd (funcall locate-make-command-line ""))) + (read-from-minibuffer + "Run locate (like this): " + (cons + (concat (car locate-cmd) " " + (mapconcat 'identity (cdr locate-cmd) " ")) + (+ 2 (length (car locate-cmd)))) + nil nil 'locate-history-list)) + (let* ((default (locate-word-at-point)) + (input + (read-from-minibuffer + (if (> (length default) 0) + (format "Locate (default %s): " default) + (format "Locate: ")) + nil nil nil 'locate-history-list default t))) + (and (equal input "") default + (setq input default)) + input))) + ;;;###autoload -(defun locate (search-string &optional filter) +(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. @@ -258,68 +287,49 @@ You can specify another program for this command to run by customizing 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." +the docstring of that function for its meaning. + +ARG is the interactive prefix arg." (interactive - (list - (if (or (and current-prefix-arg - (not locate-prompt-for-command)) - (and (not current-prefix-arg) locate-prompt-for-command)) - (let ((locate-cmd (funcall locate-make-command-line ""))) - (read-from-minibuffer - "Run locate (like this): " - (cons - (concat (car locate-cmd) " " - (mapconcat 'identity (cdr locate-cmd) " ")) - (+ 2 (length (car locate-cmd)))) - nil nil 'locate-history-list)) - (let* ((default (locate-word-at-point)) - (input - (read-from-minibuffer - (if (> (length default) 0) - (format "Locate (default %s): " default) - (format "Locate: ")) - nil nil nil 'locate-history-list default t))) - (and (equal input "") default - (setq input default)) - input)))) + (list + (locate-prompt-for-search-string) + nil + current-prefix-arg)) + (if (equal search-string "") (error "Please specify a filename to search for")) (let* ((locate-cmd-list (funcall locate-make-command-line search-string)) (locate-cmd (car locate-cmd-list)) (locate-cmd-args (cdr locate-cmd-list)) (run-locate-command - (or (and current-prefix-arg (not locate-prompt-for-command)) - (and (not current-prefix-arg) locate-prompt-for-command))) - locate-buffer + (or (and arg (not locate-prompt-for-command)) + (and (not arg) locate-prompt-for-command))) ) ;; Find the Locate buffer - (setq locate-buffer (if (eq major-mode 'locate-mode) - (current-buffer) - (get-buffer-create locate-buffer-name))) - - (save-excursion - (set-buffer locate-buffer) + (save-window-excursion + (set-buffer (get-buffer-create locate-buffer-name)) (locate-mode) - (let ((inhibit-read-only t) - (buffer-undo-list t)) - (erase-buffer) + (buffer-undo-list t)) + (erase-buffer) - (set (make-local-variable 'locate-current-search) search-string) - (set (make-local-variable 'locate-current-filter) filter) + (setq locate-current-filter filter) + (set (make-local-variable 'locate-local-search) search-string) + (set (make-local-variable 'locate-local-filter) filter) + (set (make-local-variable 'locate-local-prompt) run-locate-command) - (if run-locate-command - (shell-command search-string) - (apply 'call-process locate-cmd nil t nil locate-cmd-args)) + (if run-locate-command + (shell-command search-string locate-buffer-name) + (apply 'call-process locate-cmd nil t nil locate-cmd-args)) - (and filter - (locate-filter-output filter)) + (and filter + (locate-filter-output filter)) - (locate-do-setup search-string))) - - (unless (eq (current-buffer) locate-buffer) - (switch-to-buffer-other-window locate-buffer)) + (locate-do-setup search-string) + )) + (and (not (string-equal (buffer-name) locate-buffer-name)) + (switch-to-buffer-other-window locate-buffer-name)) (run-hooks 'dired-mode-hook) (dired-next-line 3) ;move to first matching file. @@ -328,7 +338,7 @@ the docstring of that function for its meaning." ) ;;;###autoload -(defun locate-with-filter (search-string filter) +(defun locate-with-filter (search-string filter &optional arg) "Run the executable program `locate' with a filter. This function is similar to the function `locate', which see. The difference is that, when invoked interactively, the present function @@ -338,14 +348,17 @@ that lists only those lines in the output of the locate program that contain a match for the regular expression FILTER; this is often useful to constrain a big search. +ARG is the interactive prefix arg, which has the same effect as in `locate'. + When called from Lisp, this function is identical with `locate', except that FILTER is not optional." (interactive - (list (read-from-minibuffer "Locate: " nil nil - nil 'locate-history-list) - (read-from-minibuffer "Filter: " nil nil - nil 'locate-grep-history-list))) - (locate search-string filter)) + (list + (locate-prompt-for-search-string) + (read-from-minibuffer "Filter: " nil nil + nil 'locate-grep-history-list) + current-prefix-arg)) + (locate search-string filter arg)) (defun locate-filter-output (filter) "Filter output from the locate command." @@ -469,7 +482,6 @@ do not work in subdirectories. default-directory "/" buffer-read-only t selective-display t) - (buffer-disable-undo) (dired-alist-add-1 default-directory (point-min-marker)) (set (make-local-variable 'dired-directory) "/") (set (make-local-variable 'dired-subdir-switches) locate-ls-subdir-switches) @@ -501,12 +513,11 @@ do not work in subdirectories. ;; Nothing returned from locate command? (and (eobp) (progn - (let ((filter locate-current-filter)) ; local - (kill-buffer (current-buffer)) - (if filter - (error "Locate: no match for %s in database using filter %s" - search-string filter) - (error "Locate: no match for %s in database" search-string))))) + (kill-buffer locate-buffer-name) + (if locate-current-filter + (error "Locate: no match for %s in database using filter %s" + search-string locate-current-filter) + (error "Locate: no match for %s in database" search-string)))) (locate-insert-header search-string) @@ -590,14 +601,16 @@ do not work in subdirectories. "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'." - (and locate-update-when-revert - (yes-or-no-p "Update locate database (may take a few seconds)? ") - ;; `expand-file-name' is used in order to autoload Tramp if - ;; necessary. It cannot be loaded when `default-directory' - ;; is remote. - (let ((default-directory (expand-file-name locate-update-path))) - (shell-command locate-update-command))) - (locate locate-current-search locate-current-filter)) + (let ((locate-buffer-name (buffer-name)) + (locate-prompt-for-command locate-local-prompt)) + (and locate-update-when-revert + (yes-or-no-p "Update locate database (may take a few seconds)? ") + ;; `expand-file-name' is used in order to autoload Tramp if + ;; necessary. It cannot be loaded when `default-directory' + ;; is remote. + (let ((default-directory (expand-file-name locate-update-path))) + (shell-command locate-update-command))) + (locate locate-local-search locate-local-filter))) ;;; Modified three functions from `dired.el': ;;; dired-find-directory, @@ -656,7 +669,12 @@ locate database using the shell command in `locate-update-command'." ;; Only for GNU locate (defun locate-in-alternate-database (search-string database) - "Run the GNU locate command, using an alternate database." + "Run the GNU locate program, using an alternate database. + +This command only works if you use GNU locate. It does not work +properly if `locate-prompt-for-command' is set to t. In that +case, you can just run the regular `locate' command and specify +the database on the command line." (interactive (list (progn |