# HG changeset patch # User Glenn Morris # Date 1213152963 0 # Node ID 1d1f23bbdc8133d9e3d7ee049448a5a91c179ae5 # Parent 6f2d537d8c7a87ea90729127d5872a10d98d802a (fortran-end-of-subprogram): Check for a match before trying to move there. (fortran-calculate-indent): When fortran-check-all-num-for-matching-do is non-nil, indent most terminating statements like loop body. diff -r 6f2d537d8c7a -r 1d1f23bbdc81 lisp/progmodes/fortran.el --- a/lisp/progmodes/fortran.el Wed Jun 11 02:47:57 2008 +0000 +++ b/lisp/progmodes/fortran.el Wed Jun 11 02:56:03 2008 +0000 @@ -1187,12 +1187,12 @@ (fortran-check-end-prog-re))) (forward-line) (beginning-of-line 2) - (catch 'ok - (while (re-search-forward fortran-end-prog-re nil 'move) - (if (fortran-check-end-prog-re) - (throw 'ok t)))) - (goto-char (match-beginning 0)) - (forward-line))))) + (when (catch 'ok + (while (re-search-forward fortran-end-prog-re nil 'move) + (if (fortran-check-end-prog-re) + (throw 'ok t)))) + (goto-char (match-beginning 0)) + (forward-line)))))) (defun fortran-previous-statement () "Move point to beginning of the previous Fortran statement. @@ -1651,7 +1651,17 @@ ((and (looking-at fortran-end-prog-re1) (fortran-check-end-prog-re)) ;; Previous END resets indent to minimum. - (setq icol fortran-minimum-statement-indent))))) + (setq icol fortran-minimum-statement-indent)) + ;; Previous statement was a numbered DO loop without a + ;; closing CONTINUE or END DO, so we indented the + ;; terminator like the loop body. + ((and fortran-check-all-num-for-matching-do + (not (looking-at "\\(continue\\|end[ \t]*do\\)\\>")) + (progn + (beginning-of-line) + (and (looking-at "[ \t]*[0-9]+") + (fortran-check-for-matching-do)))) + (setq icol (- icol fortran-do-indent)))))) (save-excursion (beginning-of-line) (cond ((looking-at "[ \t]*$")) @@ -1676,8 +1686,12 @@ 6 (+ icol fortran-continuation-indent)))) (first-statement) + ;; The terminating statement is actually part of the + ;; loop body, so unless it is a CONTINUE or END DO, we + ;; indent it like the loop body (see above). ((and fortran-check-all-num-for-matching-do - (looking-at "[ \t]*[0-9]+") + (looking-at "[ \t]*[0-9]+[ \t]*\ +\\(continue\\|end[ \t]*do\\)\\>") (fortran-check-for-matching-do)) (setq icol (- icol fortran-do-indent))) (t