all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Luc Teirlinck <teirllm@dms.auburn.edu>
Cc: pbreton@cs.umb.edu, emacs-devel@gnu.org
Subject: Re: locate-with-filter
Date: Tue, 14 Mar 2006 23:48:44 -0600 (CST)	[thread overview]
Message-ID: <200603150548.k2F5miF04800@raven.dms.auburn.edu> (raw)
In-Reply-To: <E1FJC5k-0001Y9-Py@fencepost.gnu.org> (message from Richard Stallman on Tue, 14 Mar 2006 11:09:48 -0500)

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)))
============================================================

  parent reply	other threads:[~2006-03-15  5:48 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-03-11 23:46 locate-with-filter Richard Stallman
2006-03-12 23:59 ` locate-with-filter Luc Teirlinck
2006-03-13  0:18   ` locate-with-filter Luc Teirlinck
2006-03-13  4:39     ` locate-with-filter Eli Zaretskii
2006-03-13 11:30       ` locate-with-filter Peter Breton
2006-03-13 12:55   ` locate-with-filter Richard Stallman
2006-03-14  2:55     ` locate-with-filter Luc Teirlinck
2006-03-14  4:41       ` locate-with-filter Eli Zaretskii
2006-03-14  5:39         ` locate-with-filter Luc Teirlinck
2006-03-14 16:09       ` locate-with-filter Richard Stallman
2006-03-15  5:41         ` locate-with-filter Luc Teirlinck
2006-03-15 13:33           ` locate-with-filter Luc Teirlinck
2006-03-15 13:39             ` locate-with-filter Luc Teirlinck
2006-03-15 20:23           ` locate-with-filter Richard Stallman
2006-03-15 22:47             ` locate-with-filter Luc Teirlinck
2006-03-16 20:18               ` locate-with-filter Richard Stallman
2006-03-17  1:38                 ` locate-with-filter Luc Teirlinck
2006-03-17  2:21                 ` locate-with-filter Luc Teirlinck
2006-03-18  8:44                   ` locate-with-filter Richard Stallman
2006-03-18  8:59                     ` locate-with-filter Nick Roberts
2006-03-18 17:16                       ` locate-with-filter Luc Teirlinck
2006-03-19  4:15                         ` locate-with-filter Nick Roberts
2006-03-19  3:50                           ` locate-with-filter Luc Teirlinck
2006-03-19  4:55                           ` locate-with-filter Luc Teirlinck
2006-03-19  5:09                             ` locate-with-filter Luc Teirlinck
2006-03-19  5:22                               ` locate-with-filter Luc Teirlinck
2006-03-19 21:51                             ` locate-with-filter Richard Stallman
2006-03-20  5:12                               ` locate-with-filter Luc Teirlinck
2006-03-21  1:02                                 ` locate-with-filter Richard Stallman
2006-03-21  1:13                                   ` locate-with-filter Luc Teirlinck
2006-03-29  4:09                                   ` locate-with-filter Luc Teirlinck
2006-03-29 23:02                                     ` locate-with-filter Richard Stallman
2006-03-30  0:29                                       ` locate-with-filter Luc Teirlinck
2006-03-31  3:10                                         ` locate-with-filter Richard Stallman
2006-04-01  1:34                                           ` locate-with-filter Luc Teirlinck
2006-04-01  1:52                                           ` locate-with-filter Luc Teirlinck
2006-03-19  9:09                       ` locate-with-filter Richard Stallman
2006-03-19 20:15                         ` locate-with-filter Nick Roberts
2006-03-19 20:19                           ` locate-with-filter Luc Teirlinck
2006-03-19 22:05                             ` locate-with-filter Nick Roberts
2006-03-20 15:05                           ` locate-with-filter Richard Stallman
2006-03-19  1:28                     ` locate-with-filter Luc Teirlinck
2006-03-19  2:29                       ` locate-with-filter Luc Teirlinck
2006-03-20  6:18                 ` locate-with-filter Stefan Monnier
2006-03-14 16:09       ` locate-with-filter Richard Stallman
2006-03-15  5:37         ` locate-with-filter Luc Teirlinck
2006-03-15  5:48         ` Luc Teirlinck [this message]
2006-03-15 20:23           ` locate-with-filter Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200603150548.k2F5miF04800@raven.dms.auburn.edu \
    --to=teirllm@dms.auburn.edu \
    --cc=emacs-devel@gnu.org \
    --cc=pbreton@cs.umb.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.