# HG changeset patch # User Glenn Morris # Date 1270865523 25200 # Node ID 470fef5038b3fa3aa90a6930fc9610f76d8288d6 # Parent b8bbaa0c915f43aee6a76430324c797acbe82869 Close bug#1835. * progmodes/fortran.el (fortran-match-and-skip-declaration): New function. (fortran-font-lock-keywords-3): Use it. (Bug#1835) diff -r b8bbaa0c915f -r 470fef5038b3 lisp/ChangeLog --- a/lisp/ChangeLog Thu Apr 08 18:20:45 2010 -0700 +++ b/lisp/ChangeLog Fri Apr 09 19:12:03 2010 -0700 @@ -1,3 +1,9 @@ +2010-04-10 Glenn Morris + + * progmodes/fortran.el (fortran-match-and-skip-declaration): + New function. + (fortran-font-lock-keywords-3): Use it. (Bug#1835) + 2010-04-07 Kenichi Handa * language/indian.el (malayalam-composable-pattern): Fix previous diff -r b8bbaa0c915f -r 470fef5038b3 lisp/progmodes/fortran.el --- a/lisp/progmodes/fortran.el Thu Apr 08 18:20:45 2010 -0700 +++ b/lisp/progmodes/fortran.el Fri Apr 09 19:12:03 2010 -0700 @@ -403,6 +403,28 @@ '("^ *\\([0-9]+\\)" . font-lock-constant-face))) "Medium level highlighting for Fortran mode.") +;; See bug#1835. Never really looked into _why_ this matters... +(defun fortran-match-and-skip-declaration (limit) + "Like `font-lock-match-c-style-declaration-item-and-skip-to-next'. +The only difference is, it returns t in a case when the default returns nil." + (when (looking-at "[ \n\t*]*\\(\\sw+\\)[ \t\n]*\\(((?\\)?") + (when (and (match-end 2) (> (- (match-end 2) (match-beginning 2)) 1)) + (let ((pos (point))) + (skip-chars-backward " \t\n") + (skip-syntax-backward "w") + (unless (looking-at "\\(\\sw+\\)[ \t\n]*\\sw+[ \t\n]*\\(((?\\)?") + (goto-char pos) + (looking-at "[ \n\t*]*\\(\\sw+\\)[ \t\n]*\\(((?\\)?")))) + (save-match-data + (condition-case nil + (save-restriction + (narrow-to-region (point-min) limit) + (goto-char (match-end 1)) + (while (not (looking-at "[ \t\n]*\\(\\(,\\)\\|;\\|\\'\\)")) + (goto-char (or (scan-sexps (point) 1) (point-max)))) + (goto-char (match-end 2))) + (error t))))) + (defvar fortran-font-lock-keywords-3 (append fortran-font-lock-keywords-1 @@ -412,7 +434,7 @@ ;; Type specifier. '(1 font-lock-type-face) ;; Declaration item (or just /.../ block name). - `(font-lock-match-c-style-declaration-item-and-skip-to-next + `(fortran-match-and-skip-declaration ;; Start after any *(...) expression. (condition-case nil (and (match-beginning ,(1+ (regexp-opt-depth