]> git.eshelyaron.com Git - emacs.git/commitdiff
(makefile-dependency-skip): New variable.
authorDaniel Pfeiffer <occitan@esperanto.org>
Tue, 17 May 2005 20:45:26 +0000 (20:45 +0000)
committerDaniel Pfeiffer <occitan@esperanto.org>
Tue, 17 May 2005 20:45:26 +0000 (20:45 +0000)
(makefile-previous-dependency): Inline the new matcher, because it is too complex to work in both directions.
(makefile-match-dependency): Eliminate `backward' arg (see above). Completely reimplemented so as to not sometimes go into an endless loop.  It should also be more efficient, because first it only searches for `:', instead of applying the very complex regexp.

lisp/ChangeLog
lisp/progmodes/make-mode.el

index 2cbb919600536620a7101d9600cb9d3bae88eecf..e9b5ddc832dc1c85c2e5f064eca4ee0b3b441cd2 100644 (file)
@@ -1,3 +1,13 @@
+2005-05-17  Daniel Pfeiffer  <occitan@esperanto.org>
+
+       * progmodes/make-mode.el (makefile-dependency-skip): New variable.
+       (makefile-previous-dependency): Inline the new matcher, because it
+       is too complex to work in both directions.
+       (makefile-match-dependency): Eliminate `backward' arg (see above).
+       Completely reimplemented so as to not sometimes go into an endless
+       loop.  It should also be more efficient, because first it only
+       searches for `:', instead of applying the very complex regexp.
+
 2005-05-17  Reiner Steib  <Reiner.Steib@gmx.de>
 
        * dired.el (dired-mode): Simplify.
index 8467310d1daadedabca54e7f742247953c2adf92..399f5376d58479657f1b57227d2e150997279506 100644 (file)
@@ -262,6 +262,9 @@ not be enclosed in { } or ( )."
   "^ *\\(\\(?: *\\$\\(?:[({]\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[^({]\\|.[^\n$#})]+?[})]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\| *[^ \n$#:=]+\\)+?\\)[ \t]*\\(:\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)"
   "Regex used to find dependency lines in a makefile.")
 
+(defvar makefile-dependency-skip "^:"
+  "Characters to skip to find a line that might be a dependency.")
+
 (defvar makefile-rule-action-regex
   "^\t[ \t]*\\([-@]*\\)[ \t]*\\(\\(?:.+\\\\\n\\)*.+\\)"
   "Regex used to highlight rule action lines in font lock mode.")
@@ -857,6 +860,7 @@ Makefile mode can be configured by modifying the following variables:
   (set (make-local-variable 'makefile-dependency-regex)
        ;; Identical to default, except allows `!' instead of `:'.
        "^ *\\(\\(?: *\\$\\(?:[({]\\(?:\\$\\(?:[({]\\(?:\\$\\(?:[^({]\\|.[^\n$#})]+?[})]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\|[^\n$#)}]\\)+?[})]\\|[^({]\\)\\| *[^ \n$#:=]+\\)+?\\)[ \t]*\\([:!]\\)\\(?:[ \t]*$\\|[^=\n]\\(?:[^#\n]*?;[ \t]*\\(.+\\)\\)?\\)")
+  (set (make-local-variable 'makefile-dependency-skip) "^:!")
   (set (make-local-variable 'makefile-rule-action-regex)
        "^\t[ \t]*\\([-+@]*\\)[ \t]*\\(\\(?:.+\\\\\n\\)*.+\\)")
   (setq font-lock-defaults
@@ -874,18 +878,26 @@ Makefile mode can be configured by modifying the following variables:
   (interactive)
   (let ((here (point)))
     (end-of-line)
-    (if (makefile-match-dependency (point-max))
+    (if (makefile-match-dependency nil)
        (progn (beginning-of-line) t)   ; indicate success
       (goto-char here) nil)))
 
 (defun makefile-previous-dependency ()
   "Move point to the beginning of the previous dependency line."
   (interactive)
-  (let ((here (point)))
+  (let ((pt (point)))
     (beginning-of-line)
-    (if (makefile-match-dependency (point-min) t)
-       (progn (beginning-of-line) t)   ; indicate success
-      (goto-char here) nil)))
+    ;; makefile-match-dependency done backwards:
+    (catch 'found
+      (while (and (< (skip-chars-backward makefile-dependency-skip) 0)
+                 (not (bobp)))
+       (backward-char)
+       (or (get-text-property (point) 'face)
+           (beginning-of-line)
+           (if (looking-at makefile-dependency-regex)
+               (throw 'found t))))
+      (goto-char pt)
+      nil)))
 
 \f
 
@@ -1683,16 +1695,23 @@ The anchor must have matched the opening parens in the first group."
                  ((string= s "{{") "\\(.*?\\)[ \t]*}}")))
     (if s (looking-at s))))
 
-(defun makefile-match-dependency (bound &optional backward)
+(defun makefile-match-dependency (bound)
   "Search for `makefile-dependency-regex' up to BOUND.
-Optionally search BACKWARD.
 Checks that the colon has not already been fontified, else we
 matched in a rule action."
   (catch 'found
-    (while (funcall (if backward 're-search-backward 're-search-forward)
-                   makefile-dependency-regex bound t)
-      (or (get-text-property (match-beginning 2) 'face)
-         (throw 'found t)))))
+    (let ((pt (point)))
+      (while (and (> (skip-chars-forward makefile-dependency-skip bound) 0)
+                 (not (eobp)))
+       (forward-char)
+       (or (get-text-property (1- (point)) 'face)
+           (when (save-excursion
+                   (beginning-of-line)
+                   (looking-at makefile-dependency-regex))
+             (end-of-line)
+             (throw 'found (point)))))
+      (goto-char pt))
+    nil))
 
 (defun makefile-match-action (bound)
   (catch 'found