Mercurial > emacs
changeset 61106:888d43e15dfd
(f90-end-block-re, f90-start-block-re): Doc fix. Tweak regexp.
(f90-beginning-of-block): Push mark first.
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Tue, 29 Mar 2005 18:34:22 +0000 |
parents | 77c8d33d2543 |
children | 9554f19ae068 |
files | lisp/progmodes/f90.el |
diffstat | 1 files changed, 10 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/progmodes/f90.el Tue Mar 29 18:33:56 2005 +0000 +++ b/lisp/progmodes/f90.el Tue Mar 29 18:34:22 2005 +0000 @@ -597,41 +597,32 @@ ;; Hideshow support. (defconst f90-end-block-re - (concat "^[ \t0-9]*\\<end\\>[ \t]*" + (concat "^[ \t0-9]*\\<end[ \t]*" (regexp-opt '("do" "if" "forall" "function" "interface" - "module" "program" "select" "subroutine" + "module" "program" "select" "subroutine" "type" "where" ) t) "[ \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'.") ;; Ignore the fact that FUNCTION, SUBROUTINE, WHERE, FORALL have a -;; following "(". DO, CASE, IF can have labels; IF must be -;; 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. +;; following "(". DO, CASE, IF can have labels. (defconst f90-start-block-re (concat "^[ \t0-9]*" ; statement number "\\(\\(" "\\(\\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. "\\(where\\|forall\\)[ \t]*(.*)[ \t]*\\(!\\|$\\)\\)\\)" "\\|" "program\\|interface\\|module\\|type\\|function\\|subroutine" - ;; ") THEN" at line end. Problem - also does ELSE. -;;; "\\|.*)[ \t]*then[ \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 tries to strike a compromise between complexity and flexibility. Used in the F90 entry in `hs-special-modes-alist'.") @@ -1305,12 +1296,12 @@ Does not check the outermost block, because it may be incomplete. Interactively, pushes mark before moving point." (interactive "p") + (if (interactive-p) (push-mark (point) t)) (and num (< num 0) (f90-end-of-block (- num))) (let ((case-fold-search t) (count (or num 1)) end-list end-this end-type end-label start-this start-type start-label) - (if (interactive-p) (push-mark (point) t)) (beginning-of-line) ; probably want this (while (and (> count 0) (re-search-backward f90-blocks-re nil 'move)) (beginning-of-line)