0

I've written the following function to go from an error line to the next one:

(defconst mylog-mode-error-regexp
  "\\(\\[ERROR\\]\\|rule did fail\\)"
  "Regexp to recognize errors in my log file.")

(defun mylog-mode-next-error ()
  "Go to next error."
  (interactive)
  (let ((case-fold-search nil))
    (search-forward-regexp mylog-mode-error-regexp)
    (narrow-to-region 1 (line-end-position))
    (setq current-count (mylog-mode-count-errors))
    (widen)
    (message "Error %d/%d" current-count (mylog-mode-count-errors))))

I'd like to skip some lines, the ones matching:

[ERROR][2018-05-29 07:39:25,149][Authenticated] - [Page [/login.html] is not allowed]

… as those errors aren't real errors -- which I have to debug.

How could I do that?

Drew
  • 75,699
  • 9
  • 109
  • 225
  • 1
    Don't count them, in your `mylog-mode-count-errors`? – Drew May 29 '18 at 15:33
  • @Drew, that's another valid point, they should not be counted at all. The thing is I can't describe what must be counted, I only can describe what must NOT be counted (the line above). I should count all matches, and then substract the specific count that matches the above line, then? – user3341592 May 30 '18 at 07:42

1 Answers1

0

Obviously the trivial option is to change your regexp so that only matches things you want it to match.

I believe you're asking how to test the match results, though. As with any search, (search-forward-regexp mylog-mode-error-regexp) produces match data which you can easily use to perform further processing on what the search found. Exactly how you do that is up to you, and you should read C-hig (elisp)Match Data

Here's one possible approach, which keeps searching until (this-match-is-valid) is true.

(while (and (search-forward-regexp mylog-mode-error-regexp)
            (save-excursion
              (save-restriction
                (narrow-to-region (match-beginning 0) (match-end 0))
                (goto-char (point-min))
                (not (this-match-is-valid))))))
;; do things with the valid match
phils
  • 48,657
  • 3
  • 76
  • 115
  • IIUC, the matched data here will be the [ERROR] keyword only. How can I write the this-match-is-valid function to see if it matches some regexp? There must be a function, but I don't find it. Regarding the narrowing, I guess I would narrow between beginning of line and end of line, so that's OK. Only the matching part is missing now. Thanks for your info! – user3341592 May 30 '18 at 07:46
  • You'll probably find the `looking-at` function useful. – phils May 30 '18 at 08:38
  • And of course if the narrowing isn't useful to you, don't do it. There's no *need* to narrow here -- it's just an example of something you *could* do to assist with analysing the match. – phils May 30 '18 at 09:27
  • looking-at is certainly the function I was missing. And, of course, I agree about the narrowing… Thanks a lot! – user3341592 May 30 '18 at 11:54