emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: locate-with-filter


From: Luc Teirlinck
Subject: Re: locate-with-filter
Date: Tue, 14 Mar 2006 23:48:44 -0600 (CST)

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]