emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] /srv/bzr/emacs/trunk r99729: Implement Occur multi-line ma


From: Juri Linkov
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r99729: Implement Occur multi-line matches.
Date: Tue, 23 Mar 2010 18:09:45 +0200
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 99729
committer: Juri Linkov <address@hidden>
branch nick: trunk
timestamp: Tue 2010-03-23 18:09:45 +0200
message:
  Implement Occur multi-line matches.
  http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg01044.html
  
  * replace.el (occur): Doc fix.
  (occur-engine): Set `begpt' to the beginning of the first line.
  Set `endpt' to the end of the last match line.  At first, count
  line numbers between `origpt' and `begpt'.  Split out code from
  `out-line' variable to new let-bindings `match-prefix' and
  `match-str'.  In `out-line' add non-numeric prefix to all
  non-first lines of multi-line matches.  Finally, count lines
  between `begpt' and `endpt' and add to `lines'.
modified:
  etc/TODO
  lisp/ChangeLog
  lisp/replace.el
=== modified file 'etc/TODO'
--- a/etc/TODO  2010-03-07 20:08:38 +0000
+++ b/etc/TODO  2010-03-23 16:09:45 +0000
@@ -105,9 +105,6 @@
 
 ** erase-buffer should perhaps disregard read-only properties of text.
 
-** Make occur correctly handle matches that span more than one line,
-   as well as overlapping matches.
-
 ** Fix the kill/yank treatment of invisible text.  At the moment,
   invisible text is placed in the kill-ring, so that the contents of
   the ring may not correspond to the text as displayed to the user.

=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2010-03-23 15:48:09 +0000
+++ b/lisp/ChangeLog    2010-03-23 16:09:45 +0000
@@ -1,5 +1,19 @@
 2010-03-23  Juri Linkov  <address@hidden>
 
+       Implement Occur multi-line matches.
+       http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg01044.html
+
+       * replace.el (occur): Doc fix.
+       (occur-engine): Set `begpt' to the beginning of the first line.
+       Set `endpt' to the end of the last match line.  At first, count
+       line numbers between `origpt' and `begpt'.  Split out code from
+       `out-line' variable to new let-bindings `match-prefix' and
+       `match-str'.  In `out-line' add non-numeric prefix to all
+       non-first lines of multi-line matches.  Finally, count lines
+       between `begpt' and `endpt' and add to `lines'.
+
+2010-03-23  Juri Linkov  <address@hidden>
+
        * replace.el (occur-accumulate-lines, occur-engine):
        Use `occur-engine-line' instead of duplicate code.
        (occur-engine-line): New function created from duplicate code

=== modified file 'lisp/replace.el'
--- a/lisp/replace.el   2010-03-23 15:48:09 +0000
+++ b/lisp/replace.el   2010-03-23 16:09:45 +0000
@@ -1045,7 +1045,7 @@
 
 (defun occur (regexp &optional nlines)
   "Show all lines in the current buffer containing a match for REGEXP.
-This function can not handle matches that span more than one line.
+If a match spreads across multiple lines, all those lines are shown.
 
 Each line is displayed with NLINES lines before and after, or -NLINES
 before if NLINES is negative.
@@ -1210,11 +1210,14 @@
                  (when (setq endpt (re-search-forward regexp nil t))
                    (setq matches (1+ matches)) ;; increment match count
                    (setq matchbeg (match-beginning 0))
-                   (setq lines (+ lines (1- (count-lines origpt endpt))))
+                   ;; Get beginning of first match line and end of the last.
                    (save-excursion
                      (goto-char matchbeg)
-                     (setq begpt (line-beginning-position)
-                           endpt (line-end-position)))
+                     (setq begpt (line-beginning-position))
+                     (goto-char endpt)
+                     (setq endpt (line-end-position)))
+                   ;; Sum line numbers up to the first match line.
+                   (setq lines (+ lines (count-lines origpt begpt)))
                    (setq marker (make-marker))
                    (set-marker marker matchbeg)
                    (setq curstring (occur-engine-line begpt endpt keep-props))
@@ -1234,24 +1237,33 @@
                         curstring)
                        (setq start (match-end 0))))
                    ;; Generate the string to insert for this match
-                   (let* ((out-line
+                   (let* ((match-prefix
+                           ;; Using 7 digits aligns tabs properly.
+                           (apply #'propertize (format "%7d:" lines)
+                                  (append
+                                   (when prefix-face
+                                     `(font-lock-face prefix-face))
+                                   `(occur-prefix t mouse-face (highlight)
+                                                  occur-target ,marker 
follow-link t
+                                                  help-echo "mouse-2: go to 
this occurrence"))))
+                          (match-str
+                           ;; We don't put `mouse-face' on the newline,
+                           ;; because that loses.  And don't put it
+                           ;; on context lines to reduce flicker.
+                           (propertize curstring 'mouse-face (list 'highlight)
+                                       'occur-target marker
+                                       'follow-link t
+                                       'help-echo
+                                       "mouse-2: go to this occurrence"))
+                          (out-line
                            (concat
-                            ;; Using 7 digits aligns tabs properly.
-                            (apply #'propertize (format "%7d:" lines)
-                                   (append
-                                    (when prefix-face
-                                      `(font-lock-face prefix-face))
-                                    `(occur-prefix t mouse-face (highlight)
-                                      occur-target ,marker follow-link t
-                                      help-echo "mouse-2: go to this 
occurrence")))
-                            ;; We don't put `mouse-face' on the newline,
-                            ;; because that loses.  And don't put it
-                            ;; on context lines to reduce flicker.
-                            (propertize curstring 'mouse-face (list 'highlight)
-                                        'occur-target marker
-                                        'follow-link t
-                                        'help-echo
-                                        "mouse-2: go to this occurrence")
+                            match-prefix
+                            ;; Add non-numeric prefix to all non-first lines
+                            ;; of multi-line matches.
+                            (replace-regexp-in-string
+                             "\n"
+                             "\n       :"
+                             match-str)
                             ;; Add marker at eol, but no mouse props.
                             (propertize "\n" 'occur-target marker)))
                           (data
@@ -1270,7 +1282,11 @@
                    (goto-char endpt))
                  (if endpt
                      (progn
-                       (setq lines (1+ lines))
+                       ;; Sum line numbers between first and last match lines.
+                       (setq lines (+ lines (count-lines begpt endpt)
+                                      ;; Add 1 for empty last match line since
+                                      ;; count-lines returns 1 line less.
+                                      (if (and (bolp) (eolp)) 1 0)))
                        ;; On to the next match...
                        (forward-line 1))
                    (goto-char (point-max))))))


reply via email to

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