help-gnu-emacs
[Top][All Lists]
Advanced

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

Why I get different results running the same exp?


From: Yu,Gang
Subject: Why I get different results running the same exp?
Date: Thu, 7 Jun 2007 19:25:28 +0800

Hi, all:
   
    I'd like to search for special regexp on a directory list and collect the results to a buffer, I write the following code:


(defun stringlist-to-string (list connector)
  "translate string list to string , cons using connector"
  (let ((result ""))
    (mapcar (lambda (string)
          (setq result (concat result string connector))
          ) list)
    (substring result 0 -1)))


(defun def-in-dir (dir filename-exp regexp)
  "find regexp in source directory"
  (interactive)
  (let ((ldir (if (not (string-equal (substring dir -1) "/"))
          (concat dir "/")
        dir))
    command
    files)
    (if (file-exists-p ldir)
    (progn
      (setq default-directory ldir)
      (setq files (directory-files
               default-directory
               nil filename-exp))
      (if files
          (progn
        (setq command
              (concat "egrep -nH -e '" regexp "' "  (stringlist-to-string files " ")))
        (grep command)))))))

(defun ygrep (regexp filename-exp dir-list)
  "search special files in the directory list for matching regexp."
  (interactive
   (let* ((regexp (read-from-minibuffer "to search (in grep format): "))
      (filename-exp (read-from-minibuffer "file _expression_ (in emacs regexp format): "))
      (dir-list (read-minibuffer "directory-list: "))
      )
     (list regexp filename-exp (symbol-value dir-list))))
 
  (let ((result-buffer
     (progn
       (if (get-buffer "*grep result*")
           (kill-buffer "*grep result*"))
       (get-buffer-create "*grep result*")))
    (total-result 0))
    (switch-to-buffer result-buffer)
    (compilation-mode)
   
    (if buffer-read-only
    (toggle-read-only))
   
   
    (dolist (dir dir-list)
      (def-in-dir dir filename-exp regexp)
      (let ((grep-process (get-buffer-process (get-buffer "*grep*"))))
    (while (and
        grep-process
        (not (equal (process-status grep-process) 'exit)))
      (sleep-for 0 100)))
      (switch-to-buffer "*grep*")
      (goto-char 1)
      (if (not (string-match "no matches" (buffer-string)))
      (while (not (equal (point) (point-max)))
        (let ((line (buffer-substring (line-beginning-position) (line-end-position))))
          (if (string-match "\\(^.*\\)\\(:[0-9]*:\\)\\(.*\\)" line)
          (if (file-exists-p (match-string 1 line))
              (save-excursion
            (switch-to-buffer result-buffer)
            (setq total-result (+ total-result 1))
            (insert (concat "\n"
                    (if (not (string-equal (substring dir -1) "/"))
                        (concat dir "/")
                      dir)
                    (match-string 1 line)
                    (match-string 2 line)
                    ;;(format " [%d] " total-result) //for debug
                    (match-string 3 line)))
            (goto-char (point-max))               
        ))))
        (switch-to-buffer "*grep*")
        (forward-line)))
      (kill-buffer "*grep*"))
   
    (switch-to-buffer result-buffer)
    (goto-char 1)
    (insert (format "Grep search for regexp %s in file %s\n" regexp filename-exp))
    (if (equal total-result 0)
    (insert (format "Sorry no matches found! "))
    (insert (format "%d matches found! " total-result)))
    (toggle-read-only)
    ))

but, everytime I run:

(ygrep "(start|stop)-process" "\\.el$" load-path)

in the *scratch* buffer, I get a different result.

What's wrong??

Thanks

--
YuGang
reply via email to

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