Commit fcca5273 authored by Glenn Morris's avatar Glenn Morris
Browse files

(f90-end-block-re, f90-start-block-re): Doc fix. Tweak regexp.

(f90-beginning-of-block): Push mark first.
parent 0d6d7be5
...@@ -597,41 +597,32 @@ characters long.") ...@@ -597,41 +597,32 @@ characters long.")
;; Hideshow support. ;; Hideshow support.
(defconst f90-end-block-re (defconst f90-end-block-re
(concat "^[ \t0-9]*\\<end\\>[ \t]*" (concat "^[ \t0-9]*\\<end[ \t]*"
(regexp-opt '("do" "if" "forall" "function" "interface" (regexp-opt '("do" "if" "forall" "function" "interface"
"module" "program" "select" "subroutine" "module" "program" "select" "subroutine"
"type" "where" ) t) "type" "where" ) t)
"[ \t]*\\sw*") "[ \t]*\\sw*")
"Regexp matching the end of a \"block\" of F90 code. "Regexp matching the end of an F90 \"block\", from the line start.
Used in the F90 entry in `hs-special-modes-alist'.") Used in the F90 entry in `hs-special-modes-alist'.")
;; Ignore the fact that FUNCTION, SUBROUTINE, WHERE, FORALL have a ;; Ignore the fact that FUNCTION, SUBROUTINE, WHERE, FORALL have a
;; following "(". DO, CASE, IF can have labels; IF must be ;; following "(". DO, CASE, IF can have labels.
;; accompanied by THEN.
;; A big problem is that many of these statements can be broken over
;; lines, even with embedded comments. We only try to handle this for
;; IF ... THEN statements, assuming and hoping it will be less common
;; for other constructs. We match up to one new-line, provided ")
;; THEN" appears on one line. Matching on just ") THEN" is no good,
;; since that includes ELSE branches.
;; For a fully accurate solution, hideshow would probably have to be
;; modified to allow functions as well as regexps to be used to
;; specify block start and end positions.
(defconst f90-start-block-re (defconst f90-start-block-re
(concat (concat
"^[ \t0-9]*" ; statement number "^[ \t0-9]*" ; statement number
"\\(\\(" "\\(\\("
"\\(\\sw+[ \t]*:[ \t]*\\)?" ; structure label "\\(\\sw+[ \t]*:[ \t]*\\)?" ; structure label
"\\(do\\|select[ \t]*case\\|if[ \t]*(.*\n?.*)[ \t]*then\\|" "\\(do\\|select[ \t]*case\\|"
;; See comments in fortran-start-block-re for the problems of IF.
"if[ \t]*(\\(.*\\|"
".*\n\\([^if]*\\([^i].\\|.[^f]\\|.\\>\\)\\)\\)\\<then\\|"
;; Distinguish WHERE block from isolated WHERE. ;; Distinguish WHERE block from isolated WHERE.
"\\(where\\|forall\\)[ \t]*(.*)[ \t]*\\(!\\|$\\)\\)\\)" "\\(where\\|forall\\)[ \t]*(.*)[ \t]*\\(!\\|$\\)\\)\\)"
"\\|" "\\|"
"program\\|interface\\|module\\|type\\|function\\|subroutine" "program\\|interface\\|module\\|type\\|function\\|subroutine"
;; ") THEN" at line end. Problem - also does ELSE.
;;; "\\|.*)[ \t]*then[ \t]*\\($\\|!\\)"
"\\)" "\\)"
"[ \t]*") "[ \t]*")
"Regexp matching the start of a \"block\" of F90 code. "Regexp matching the start of an F90 \"block\", from the line start.
A simple regexp cannot do this in fully correct fashion, so this A simple regexp cannot do this in fully correct fashion, so this
tries to strike a compromise between complexity and flexibility. tries to strike a compromise between complexity and flexibility.
Used in the F90 entry in `hs-special-modes-alist'.") Used in the F90 entry in `hs-special-modes-alist'.")
...@@ -1305,12 +1296,12 @@ Checks for consistency of block types and labels (if present). ...@@ -1305,12 +1296,12 @@ Checks for consistency of block types and labels (if present).
Does not check the outermost block, because it may be incomplete. Does not check the outermost block, because it may be incomplete.
Interactively, pushes mark before moving point." Interactively, pushes mark before moving point."
(interactive "p") (interactive "p")
(if (interactive-p) (push-mark (point) t))
(and num (< num 0) (f90-end-of-block (- num))) (and num (< num 0) (f90-end-of-block (- num)))
(let ((case-fold-search t) (let ((case-fold-search t)
(count (or num 1)) (count (or num 1))
end-list end-this end-type end-label end-list end-this end-type end-label
start-this start-type start-label) start-this start-type start-label)
(if (interactive-p) (push-mark (point) t))
(beginning-of-line) ; probably want this (beginning-of-line) ; probably want this
(while (and (> count 0) (re-search-backward f90-blocks-re nil 'move)) (while (and (> count 0) (re-search-backward f90-blocks-re nil 'move))
(beginning-of-line) (beginning-of-line)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment