The functions f90-beginning-of-subprogram and f90-end-of-subprogram do not work correctly if the source file contains lines which begin with the correct keywords but in fact belong to a continued string. For instance, in the following, subroutine foo() print*, '& end subroutine foo' ! The cursor is here end subroutine foo f90-beginning-of-subprogram jumps past the line containing 'subroutine foo()'. A similar example could be written for f90-end-of-subprogram. I propose to put a small check of whether the previous line ended with an ampersand into the F90 major mode source file: --- f90.el 2015-02-07 16:50:56.210519581 +0200 +++ f90_new.el 2015-02-07 16:56:44.997174743 +0200 @@ -1619,6 +1619,14 @@ (looking-at "[ \t0-9]*\\(!\\|$\\|#\\)"))) not-last-statement)) +(defsubst f90-test-string-continuation () + "Return true if the the current is a string continuation." + (save-excursion + (beginning-of-line) + (backward-char) + (skip-chars-backward " ") + (string= (string (char-before)) "&"))) + (defun f90-beginning-of-subprogram () "Move point to the beginning of the current subprogram. Return (TYPE NAME), or nil if not found." @@ -1629,9 +1637,13 @@ (re-search-backward f90-program-block-re nil 'move)) (beginning-of-line) (skip-chars-forward " \t0-9") - (cond ((setq matching-beg (f90-looking-at-program-block-start)) + (cond ((and + (setq matching-beg (f90-looking-at-program-block-start)) + (not (f90-test-string-continuation))) (setq count (1- count))) - ((f90-looking-at-program-block-end) + ((and + (f90-looking-at-program-block-end) + (not (f90-test-string-continuation))) (setq count (1+ count))))) (beginning-of-line) (if (zerop count) @@ -1654,9 +1666,13 @@ (re-search-forward f90-program-block-re nil 'move)) (beginning-of-line) (skip-chars-forward " \t0-9") - (cond ((f90-looking-at-program-block-start) + (cond ((and + (f90-looking-at-program-block-start) + (not (f90-test-string-continuation))) (setq count (1+ count))) - ((setq matching-end (f90-looking-at-program-block-end)) + ((and + (setq matching-end (f90-looking-at-program-block-end)) + (not (f90-test-string-continuation))) (setq count (1- count)))) (end-of-line)) ;; This means f90-end-of-subprogram followed by f90-start-of-subprogram Best wishes, Raul Laasner -- Raul Laasner Institute of Physics University of Tartu Ravila 14c, 50411, Estonia e-mail: raullaasner@gmail.com cell: (+372)5182268