From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Luc Teirlinck Newsgroups: gmane.emacs.devel Subject: Re: locate-with-filter Date: Tue, 14 Mar 2006 23:48:44 -0600 (CST) Message-ID: <200603150548.k2F5miF04800@raven.dms.auburn.edu> References: <200603122359.k2CNxE111892@raven.dms.auburn.edu> <200603140255.k2E2tFs05130@raven.dms.auburn.edu> NNTP-Posting-Host: main.gmane.org X-Trace: sea.gmane.org 1142555599 16411 80.91.229.2 (17 Mar 2006 00:33:19 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Fri, 17 Mar 2006 00:33:19 +0000 (UTC) Cc: pbreton@cs.umb.edu, emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Mar 17 01:33:18 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1FK2u3-000356-Su for ged-emacs-devel@m.gmane.org; Fri, 17 Mar 2006 01:33:16 +0100 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FK2u3-0004lA-7S for ged-emacs-devel@m.gmane.org; Thu, 16 Mar 2006 19:33:15 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1FJOxZ-00075K-RJ for emacs-devel@gnu.org; Wed, 15 Mar 2006 00:54:13 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1FJOxZ-00074u-0C for emacs-devel@gnu.org; Wed, 15 Mar 2006 00:54:13 -0500 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FJOxY-00074r-Pz for emacs-devel@gnu.org; Wed, 15 Mar 2006 00:54:12 -0500 Original-Received: from [131.204.53.104] (helo=manatee.dms.auburn.edu) by monty-python.gnu.org with esmtp (Exim 4.52) id 1FJP1r-0005VA-At; Wed, 15 Mar 2006 00:58:39 -0500 Original-Received: from raven.dms.auburn.edu (raven.dms.auburn.edu [131.204.53.29]) by manatee.dms.auburn.edu (8.13.3+Sun/8.13.3) with ESMTP id k2F5s1Y3002262; Tue, 14 Mar 2006 23:54:01 -0600 (CST) Original-Received: (from teirllm@localhost) by raven.dms.auburn.edu (8.11.7p1+Sun/8.11.7) id k2F5miF04800; Tue, 14 Mar 2006 23:48:44 -0600 (CST) X-Authentication-Warning: raven.dms.auburn.edu: teirllm set sender to teirllm@dms.auburn.edu using -f Original-To: rms@gnu.org In-reply-to: (message from Richard Stallman on Tue, 14 Mar 2006 11:09:48 -0500) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.0.1 (manatee.dms.auburn.edu [131.204.53.104]); Tue, 14 Mar 2006 23:54:01 -0600 (CST) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:51726 Archived-At: Here is my latest suggested patch. It also gives `locate-get-file-positions' a docstring, since there are situations in which a user may have to change this function. The one added code change just gives a better error message if a user invokes `locate-find-directory-other-window' on a line with no file, or inside an inserted subdirectory, where the function does not work. ===File ~/locate-diff======================================= *** locate.el 06 Feb 2006 16:01:50 -0600 1.35 --- locate.el 14 Mar 2006 23:14:00 -0600 *************** *** 122,128 **** :group 'external) (defcustom locate-command "locate" ! "*The executable program used to search a database of files." :type 'string :group 'locate) --- 122,147 ---- :group 'external) (defcustom locate-command "locate" ! "Executable program for searching a database of files. ! The Emacs commands `locate' and `locate-with-filter' use this. ! The value should be a program that can be called from a shell ! with one argument, SEARCH-STRING. The program determines which ! database it searches. The output of the program should consist ! of those file names in the database that match SEARCH-STRING, ! listed one per line, possibly with leading or trailing ! whitespace. If the output is in another form, you may have to ! redefine the function `locate-get-file-positions'. ! ! The program may interpret SEARCH-STRING as a literal string, a ! shell pattern or a regular expression. The exact rules of what ! constitutes a match may also depend on the program. ! ! The standard value of this variable is \"locate\". ! This program normally searches a database of all files on your ! system, or of all files that you have access to. Consult the ! documentation of that program for the details about how it determines ! which file names match SEARCH-STRING. (Those details vary highly with ! the version.)" :type 'string :group 'locate) *************** *** 133,139 **** "The history list used by the \\[locate-with-filter] command.") (defcustom locate-make-command-line 'locate-default-make-command-line ! "*Function used to create the locate command line." :type 'function :group 'locate) --- 152,163 ---- "The history list used by the \\[locate-with-filter] command.") (defcustom locate-make-command-line 'locate-default-make-command-line ! "Function used to create the locate command line. ! The Emacs commands `locate' and `locate-with-filter' use this. ! This function should take one argument, a string (the name to find) ! and return a list of strings. The first element of the list should be ! the name of a command to be executed by a shell, the remaining elements ! should be the arguments to that command (including the name to find)." :type 'function :group 'locate) *************** *** 143,149 **** :group 'locate) (defcustom locate-fcodes-file nil ! "*File name for the database of file names." :type '(choice (const :tag "None" nil) file) :group 'locate) --- 167,180 ---- :group 'locate) (defcustom locate-fcodes-file nil ! "File name for the database of file names used by `locate'. ! If non-nil, `locate' uses this name in the header of the `*Locate*' ! buffer. If nil, it mentions no file name in that header. ! ! Just setting this variable does not actually change the database ! that `locate' searches. The executive program that the Emacs ! function `locate' uses, as given by the variables `locate-command' ! or `locate-make-command-line', determines the database." :type '(choice (const :tag "None" nil) file) :group 'locate) *************** *** 161,172 **** :version "22.1") (defcustom locate-update-command "updatedb" ! "The command used to update the locate database." :type 'string :group 'locate) (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." :group 'locate :type 'boolean --- 192,203 ---- :version "22.1") (defcustom locate-update-command "updatedb" ! "The executable program used to update the locate database." :type 'string :group 'locate) (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." :group 'locate :type 'boolean *************** *** 191,197 **** ;;;###autoload (defun locate (search-string &optional filter) "Run the program `locate', putting results in `*Locate*' buffer. ! With prefix arg, prompt for the locate command to run." (interactive (list (if (or (and current-prefix-arg --- 222,243 ---- ;;;###autoload (defun locate (search-string &optional filter) "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. ! ! This program searches for those file names in a database that match ! SEARCH-STRING and normally outputs all matching absolute file names, ! one per line. The database normally consists of all files on your ! system, or of all files that you have access to. Consult the ! documentation of the program for the details about how it determines ! which file names match SEARCH-STRING. (Those details vary highly with ! the version.) ! ! 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." (interactive (list (if (or (and current-prefix-arg *************** *** 255,264 **** ;;;###autoload (defun locate-with-filter (search-string filter) ! "Run the locate command with a filter. ! The filter is a regular expression. Only results matching the filter are ! shown; this is often useful to constrain a big search." (interactive (list (read-from-minibuffer "Locate: " nil nil nil 'locate-history-list) --- 301,317 ---- ;;;###autoload (defun locate-with-filter (search-string filter) ! "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 ! prompts for both SEARCH-STRING and FILTER. It passes SEARCH-STRING ! to the locate executable program. It produces a `*Locate*' buffer ! 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. ! 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) *************** *** 269,275 **** (defun locate-filter-output (filter) "Filter output from the locate command." (goto-char (point-min)) ! (delete-non-matching-lines filter)) (defvar locate-mode-map nil "Local keymap for Locate mode buffers.") --- 322,328 ---- (defun locate-filter-output (filter) "Filter output from the locate command." (goto-char (point-min)) ! (keep-lines filter)) (defvar locate-mode-map nil "Local keymap for Locate mode buffers.") *************** *** 303,308 **** --- 356,370 ---- "The amount of indentation for each file.") (defun locate-get-file-positions () + "Return list of start and end of the file name on the current line. + This is a list of two buffer positions. + + You should only call this function on lines that contain a file name + listed by the locate program. Inside inserted subdirectories, or if + there is no file name on the current line, the return value is + meaningless. You can check whether the current line contains a file + listed by the locate program, using the function + `locate-main-listing-line-p'." (save-excursion (end-of-line) (let ((eol (point))) *************** *** 320,325 **** --- 382,393 ---- 1 0))) + ;; You should only call this function on lines that contain a file name + ;; listed by the locate program. Inside inserted subdirectories, or if + ;; there is no file name on the current line, the return value is + ;; meaningless. You can check whether the current line contains a file + ;; listed by the locate program, using the function + ;; `locate-main-listing-line-p'. (defun locate-get-filename () (let ((pos (locate-get-file-positions)) (lineno (locate-current-line-number))) *************** *** 516,523 **** (defun locate-find-directory-other-window () "Visit the directory of the file named on this line in other window." (interactive) ! (find-file-other-window (locate-get-dirname))) (defun locate-get-dirname () "Return the directory name of the file mentioned on this line." (let (file (filepos (locate-get-file-positions))) --- 584,599 ---- (defun locate-find-directory-other-window () "Visit the directory of the file named on this line in other window." (interactive) ! (if (locate-main-listing-line-p) ! (find-file-other-window (locate-get-dirname)) ! (message "This command only works inside main listing."))) + ;; You should only call this function on lines that contain a file name + ;; listed by the locate program. Inside inserted subdirectories, or if + ;; there is no file name on the current line, the return value is + ;; meaningless. You can check whether the current line contains a file + ;; listed by the locate program, using the function + ;; `locate-main-listing-line-p'. (defun locate-get-dirname () "Return the directory name of the file mentioned on this line." (let (file (filepos (locate-get-file-positions))) ============================================================