]> code.delx.au - gnu-emacs/blobdiff - lisp/progmodes/fortran.el
Many trivial doc fixes.
[gnu-emacs] / lisp / progmodes / fortran.el
index a845358a6a2a0cb7280d48dd758b870ec440eba0..7f17de99c45cad208745b9e3049908c42d3a0445 100644 (file)
@@ -1,10 +1,10 @@
 ;;; fortran.el --- Fortran mode for GNU Emacs
 
-;; Copyright (c) 1986, 93, 94, 95, 97, 98, 99, 2000
+;; Copyright (c) 1986, 93, 94, 95, 97, 98, 99, 2000, 2001
 ;;   Free Software Foundation, Inc.
 
 ;; Author: Michael D. Prange <prange@erl.mit.edu>
-;; Maintainer: Dave Love <fx@gnu.org>
+;; Maintainer: Glenn Morris <gmorris@ast.cam.ac.uk>
 ;; Keywords: languages
 
 ;; This file is part of GNU Emacs.
@@ -30,7 +30,9 @@
 ;;
 ;; Note that it is for editing Fortran77 or Fortran90 fixed source
 ;; form.  For editing Fortran 90 free format source, use `f90-mode'
-;; (f90.el).
+;; (f90.el).  It is meant to support the GNU Fortran language
+;; implemented by g77 (its extensions to Fortran77 and
+;; interpretations, e.g. of blackslash in strings).
 
 ;;; History:
 
@@ -49,7 +51,7 @@
 ;; * Implement insertion and removal of statement continuations in
 ;;   mixed f77/f90 style, with the first `&' past column 72 and the
 ;;   second in column 6.
-;; * Support any other extensions to f77 grokked by GNU Fortran.
+;; * Support any other extensions to f77 grokked by GNU Fortran I've missed.
 
 (defgroup fortran nil
   "Fortran mode for Emacs"
@@ -106,11 +108,12 @@ with a character in column 6."
 (defcustom fortran-comment-indent-style 'fixed
   "*How to indent comments.
 nil forces comment lines not to be touched,
-'fixed makes fixed comment indentation to `fortran-comment-line-extra-indent'
-columns beyond `fortran-minimum-statement-indent-fixed' (for
-`indent-tabs-mode' of nil) or `fortran-minimum-statement-indent-tab' (for
-`indent-tabs-mode' of t), and 'relative indents to current
-Fortran indentation plus `fortran-comment-line-extra-indent'."
+`fixed' makes fixed comment indentation to `fortran-comment-line-extra-indent'
+  columns beyond `fortran-minimum-statement-indent-fixed' (for
+  `indent-tabs-mode' of nil) or `fortran-minimum-statement-indent-tab' (for
+  `indent-tabs-mode' of t), and
+`relative' indents to current Fortran indentation plus
+  `fortran-comment-line-extra-indent'."
   :type '(radio (const :tag "Untouched" nil) (const fixed) (const relative))
   :group 'fortran-indent)
 
@@ -136,6 +139,15 @@ You might want to change this to \"*\", for instance."
   :type 'regexp
   :group 'fortran-comment)
 
+(defcustom fortran-directive-re
+  "^[ \t]*#.*"
+  "*Regexp to match a directive line.
+The matching text will be fontified with `font-lock-keyword-face'.
+The matching line will be given zero indentation."
+  :version "21.4"
+  :type 'regexp
+  :group 'fortran-indent)
+
 (defcustom fortran-minimum-statement-indent-fixed 6
   "*Minimum statement indentation for fixed format continuation style."
   :type 'integer
@@ -232,6 +244,7 @@ format style.")
     (modify-syntax-entry ?/ "." table)
     (modify-syntax-entry ?\' "\"" table)
     (modify-syntax-entry ?\" "\"" table)
+    ;; Consistent with GNU Fortran -- see the manual.
     (modify-syntax-entry ?\\ "\\" table)
     ;; This might be better as punctuation, as for C, but this way you
     ;; can treat floating-point numbers as symbols.
@@ -292,7 +305,8 @@ These get fixed-format comments fontified.")
          (regexp-opt '("continue" "format" "end" "enddo" "if" "then"
                        "else" "endif" "elseif" "while" "inquire" "stop"
                        "return" "include" "open" "close" "read" "write"
-                       "format" "print" "select" "case" "cycle" "exit"))))
+                       "format" "print" "select" "case" "cycle" "exit"
+                      "rewind" "backspace"))))
       (fortran-logicals
        (eval-when-compile
          (regexp-opt '("and" "or" "not" "lt" "le" "eq" "ge" "gt" "ne"
@@ -361,9 +375,10 @@ These get fixed-format comments fontified.")
           ;; TAB-formatted line.
           '("^     \\([^ 0]\\)" 1 font-lock-string-face)
           '("^\t\\([1-9]\\)" 1 font-lock-string-face))
-        (list 
+        (list
          ;; cpp stuff (ugh)
-         '("^# *[a-z]+" . font-lock-keyword-face))
+;;;      '("^# *[a-z]+" . font-lock-keyword-face))
+          `(,fortran-directive-re (0 font-lock-keyword-face t)))
          ;; The list `fortran-font-lock-keywords-2' less that for types
          ;; (see above).
          (cdr (nthcdr (length fortran-font-lock-keywords-1)
@@ -473,64 +488,64 @@ These get fixed-format comments fontified.")
 (defvar fortran-mode-abbrev-table
   (let ((ac abbrevs-changed))
     (define-abbrev-table 'fortran-mode-abbrev-table ())
-    (define-abbrev fortran-mode-abbrev-table  ";au"  "automatic" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";b"   "byte" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";bd"  "block data" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ch"  "character" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";cl"  "close" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";c"   "continue" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";cm"  "common" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";cx"  "complex" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";df"  "define" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";di"  "dimension" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";do"  "double" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";dc"  "double complex" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";dp"  "double precision" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";dw"  "do while" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";e"   "else" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ed"  "enddo" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";el"  "elseif" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";en"  "endif" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";eq"  "equivalence" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ew"  "endwhere" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ex"  "external" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ey"  "entry" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";f"   "format" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";fa"  ".false." nil)
-    (define-abbrev fortran-mode-abbrev-table  ";fu"  "function" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";g"   "goto" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";im"  "implicit" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ib"  "implicit byte" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ic"  "implicit complex" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ich" "implicit character" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ii"  "implicit integer" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";il"  "implicit logical" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ir"  "implicit real" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";inc" "include" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";in"  "integer" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";intr" "intrinsic" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";l"   "logical" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";n"   "namelist" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";o"   "open" nil) ; was ;op
-    (define-abbrev fortran-mode-abbrev-table  ";pa"  "parameter" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";pr"  "program" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ps"  "pause" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";p"   "print" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";rc"  "record" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";re"  "real" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";r"   "read" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";rt"  "return" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";rw"  "rewind" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";s"   "stop" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";sa"  "save" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";st"  "structure" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";sc"  "static" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";su"  "subroutine" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";tr"  ".true." nil)
-    (define-abbrev fortran-mode-abbrev-table  ";ty"  "type" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";vo"  "volatile" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";w"   "write" nil)
-    (define-abbrev fortran-mode-abbrev-table  ";wh"  "where" nil)
+    (define-abbrev fortran-mode-abbrev-table  ";au"  "automatic" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";b"   "byte" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";bd"  "block data" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ch"  "character" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";cl"  "close" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";c"   "continue" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";cm"  "common" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";cx"  "complex" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";df"  "define" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";di"  "dimension" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";do"  "double" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";dc"  "double complex" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";dp"  "double precision" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";dw"  "do while" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";e"   "else" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ed"  "enddo" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";el"  "elseif" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";en"  "endif" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";eq"  "equivalence" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ew"  "endwhere" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ex"  "external" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ey"  "entry" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";f"   "format" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";fa"  ".false." nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";fu"  "function" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";g"   "goto" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";im"  "implicit" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ib"  "implicit byte" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ic"  "implicit complex" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ich" "implicit character" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ii"  "implicit integer" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";il"  "implicit logical" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ir"  "implicit real" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";inc" "include" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";in"  "integer" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";intr" "intrinsic" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";l"   "logical" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";n"   "namelist" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";o"   "open" nil 0 t) ; was ;op
+    (define-abbrev fortran-mode-abbrev-table  ";pa"  "parameter" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";pr"  "program" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ps"  "pause" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";p"   "print" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";rc"  "record" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";re"  "real" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";r"   "read" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";rt"  "return" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";rw"  "rewind" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";s"   "stop" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";sa"  "save" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";st"  "structure" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";sc"  "static" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";su"  "subroutine" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";tr"  ".true." nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";ty"  "type" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";vo"  "volatile" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";w"   "write" nil 0 t)
+    (define-abbrev fortran-mode-abbrev-table  ";wh"  "where" nil 0 t)
     (setq abbrevs-changed ac)
     fortran-mode-abbrev-table))
 \f
@@ -633,8 +648,13 @@ with no args, if that value is non-nil."
   (setq indent-line-function 'fortran-indent-line)
   (make-local-variable 'comment-indent-function)
   (setq comment-indent-function 'fortran-comment-indent)
-  (make-local-variable 'comment-start-skip)
-  (setq comment-start-skip "![ \t]*")
+  (set (make-local-variable 'comment-start-skip)
+       ;; We can't reuse `fortran-comment-line-start-skip' directly because
+       ;; it contains backrefs whereas we need submatch-1 to end at the
+       ;; beginning of the comment delimiter.
+       ;; (concat "\\(\\)\\(![ \t]*\\|" fortran-comment-line-start-skip "\\)")
+       "\\(\\)\\(?:^[CcDd*]\\|!\\)\\(?:\\([^ \t\n]\\)\\2+\\)?[ \t]*")
+  (set (make-local-variable 'comment-padding) "$$$")
   (make-local-variable 'comment-start)
   (setq comment-start fortran-comment-line-start)
   (make-local-variable 'require-final-newline)
@@ -677,35 +697,34 @@ with no args, if that value is non-nil."
 \f
 (defsubst fortran-comment-indent ()
   (save-excursion
-    (skip-chars-backward " \t")
-    (max (+ 1 (current-column))
-        comment-column)))
+    (if (looking-at fortran-comment-line-start-skip) 0
+      (skip-chars-backward " \t")
+      (max (+ 1 (current-column))
+          comment-column))))
 
 (defun fortran-indent-comment ()
   "Align or create comment on current line.
 Existing comments of all types are recognized and aligned.
 If the line has no comment, a side-by-side comment is inserted and aligned
-if the value of  `comment-start'  is not nil.
+if the value of `comment-start' is not nil and allows such comments.
 Otherwise, a separate-line comment is inserted, on this line
 or on a new line inserted before this line if this line is not blank."
   (interactive)
   (beginning-of-line)
   ;; Recognize existing comments of either kind.
-  (cond ((looking-at fortran-comment-line-start-skip)
-        (fortran-indent-line))
-       ((fortran-find-comment-start-skip) ; catches any inline comment and
-                                       ; leaves point after comment-start-skip
-        (if comment-start-skip
-            (progn (goto-char (match-beginning 0))
-                   (if (not (= (current-column)
-                               (fortran-comment-indent)))
-                       (progn (delete-horizontal-space)
-                              (indent-to (fortran-comment-indent)))))
-          (end-of-line)))        ; otherwise goto end of line or sth else?
+  (cond ((fortran-find-comment-start-skip 'all)
+        (goto-char (match-beginning 0))
+        (if (bolp)
+            (fortran-indent-line)
+          (if (not (= (current-column)
+                      (fortran-comment-indent)))
+              (progn (delete-horizontal-space)
+                     (indent-to (fortran-comment-indent))))))
        ;; No existing comment.
        ;; If side-by-side comments are defined, insert one,
        ;; unless line is now blank.
-       ((and comment-start (not (looking-at "^[ \t]*$")))
+       ((and comment-start (not (looking-at "[ \t]*$"))
+             (string-match comment-start-skip (concat " " comment-start)))
         (end-of-line)
         (delete-horizontal-space)
         (indent-to (fortran-comment-indent))
@@ -729,7 +748,7 @@ Puts `fortran-comment-region' at the beginning of every line in the region.
 BEG-REGION and END-REGION are args which specify the region boundaries.
 With non-nil ARG, uncomments the region."
   (interactive "*r\nP")
-  (let ((end-region-mark (copy-marker beg-region))
+  (let ((end-region-mark (copy-marker end-region))
        (save-point (point-marker)))
     (goto-char beg-region)
     (beginning-of-line)
@@ -799,22 +818,18 @@ The key typed is executed unless it is SPC."
   "Make the window 72 columns wide.
 See also `fortran-window-create-momentarily'."
   (interactive)
-  (condition-case error
-      (progn
-       (let ((window-min-width 2))
-         (if (< (window-width) (frame-width))
-             (enlarge-window-horizontally (- (frame-width)
-                                             (window-width) 1)))
-         (let* ((window-edges (window-edges))
-                (scroll-bar-width (- (nth 2 window-edges)
-                                     (car window-edges)
-                                     (window-width))))
-           (split-window-horizontally (+ 72 scroll-bar-width)))
-         (other-window 1)
-         (switch-to-buffer " fortran-window-extra" t)
-         (select-window (previous-window))))
-    (error (message "No room for Fortran window.")
-          'error)))
+  (let ((window-min-width 2))
+    (if (< (window-width) (frame-width))
+       (enlarge-window-horizontally (- (frame-width)
+                                       (window-width) 1)))
+    (let* ((window-edges (window-edges))
+          (scroll-bar-width (- (nth 2 window-edges)
+                               (car window-edges)
+                               (window-width))))
+      (split-window-horizontally (+ 72 scroll-bar-width)))
+    (other-window 1)
+    (switch-to-buffer " fortran-window-extra" t)
+    (select-window (previous-window))))
 
 (defun fortran-window-create-momentarily (&optional arg)
   "Momentarily make the window 72 columns wide.
@@ -824,11 +839,14 @@ See also `fortran-window-create'."
   (if (or (not arg)
          (= arg 1))
       (save-window-excursion
-       (if (not (equal (fortran-window-create) 'error))
-           (progn (message "Type SPC to continue editing.")
-                  (let ((char (read-event)))
-                    (or (equal char (string-to-char " "))
-                        (setq unread-command-events (list char)))))))
+       (progn
+         (condition-case nil
+             (fortran-window-create)
+           (error (error "No room for Fortran window")))
+         (message "Type SPC to continue editing.")
+         (let ((char (read-event)))
+           (or (equal char (string-to-char " "))
+               (setq unread-command-events (list char))))))
     (fortran-window-create)))
 
 (defun fortran-split-line ()
@@ -836,9 +854,11 @@ See also `fortran-window-create'."
   (interactive)
   (delete-horizontal-space)
   (if (save-excursion
-       (beginning-of-line)
-       (looking-at fortran-comment-line-start-skip))
-      (insert ?\n fortran-comment-line-start ? )
+       (let ((pos (point)))
+         (beginning-of-line)
+         (and (fortran-find-comment-start-skip 'all)
+              (< (match-beginning 0) pos))))
+      (insert ?\n (match-string 0))
     (if indent-tabs-mode
        (insert ?\n ?\t (fortran-numerical-continuation-char))
       (insert "\n " fortran-continuation-string))) ; Space after \n important
@@ -929,7 +949,7 @@ Auto-indent does not happen if a numeric ARG is used."
 ;; Note that you can't just check backwards for `subroutine' &c in
 ;; case of un-marked main programs not at the start of the file.
 (defun fortran-beginning-of-subprogram ()
-  "Moves point to the beginning of the current Fortran subprogram."
+  "Move point to the beginning of the current Fortran subprogram."
   (interactive)
   (save-match-data
     (let ((case-fold-search t))
@@ -941,7 +961,7 @@ Auto-indent does not happen if a numeric ARG is used."
          (forward-line)))))
 
 (defun fortran-end-of-subprogram ()
-  "Moves point to the end of the current Fortran subprogram."
+  "Move point to the end of the current Fortran subprogram."
   (interactive)
   (save-match-data
     (let ((case-fold-search t))
@@ -959,21 +979,24 @@ Auto-indent does not happen if a numeric ARG is used."
        (forward-line)))))
 
 (defun fortran-previous-statement ()
-  "Moves point to beginning of the previous Fortran statement.
-Returns `first-statement' if that statement is the first
-non-comment Fortran statement in the file, and nil otherwise."
+  "Move point to beginning of the previous Fortran statement.
+Returns 'first-statement if that statement is the first
+non-comment Fortran statement in the file, and nil otherwise.
+Directive lines are treated as comments."
   (interactive)
   (let (not-first-statement continue-test)
     (beginning-of-line)
     (setq continue-test
          (and
           (not (looking-at fortran-comment-line-start-skip))
+           (not (looking-at fortran-directive-re))
           (or (looking-at
                (concat "[ \t]*"
                        (regexp-quote fortran-continuation-string)))
               (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]"))))
     (while (and (setq not-first-statement (= (forward-line -1) 0))
                (or (looking-at fortran-comment-line-start-skip)
+                    (looking-at fortran-directive-re)
                    (looking-at "[ \t]*$\\| \\{5\\}[^ 0\n]\\|\t[1-9]")
                    (looking-at (concat "[ \t]*" comment-start-skip)))))
     (cond ((and continue-test
@@ -985,9 +1008,10 @@ non-comment Fortran statement in the file, and nil otherwise."
           'first-statement))))
 
 (defun fortran-next-statement ()
-  "Moves point to beginning of the next Fortran statement.
-Returns `last-statement' if that statement is the last
-non-comment Fortran statement in the file, and nil otherwise."
+  "Move point to beginning of the next Fortran statement.
+Returns 'last-statement if that statement is the last
+non-comment Fortran statement in the file, and nil otherwise.
+Directive lines are treated as comments."
   (interactive)
   (let (not-last-statement)
     (beginning-of-line)
@@ -995,6 +1019,7 @@ non-comment Fortran statement in the file, and nil otherwise."
                      (and (= (forward-line 1) 0)
                           (not (eobp))))
                (or (looking-at fortran-comment-line-start-skip)
+                    (looking-at fortran-directive-re)
                    (looking-at "[ \t]*$\\|     [^ 0\n]\\|\t[1-9]")
                    (looking-at (concat "[ \t]*" comment-start-skip)))))
     (if (not not-last-statement)
@@ -1097,7 +1122,7 @@ Return point or nil."
                                (fortran-check-end-prog-re))))
            (skip-chars-forward " \t0-9")
            (cond ((looking-at
-                   "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?do[ \t]+[^0-9]")
+                   "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?do[ \t]+")
                   (setq count (1- count)))
                  ((looking-at "end[ \t]*do\\b")
                   (setq count (1+ count)))))
@@ -1214,7 +1239,7 @@ Return point or nil."
                                  (setq then-test
                                        (looking-at
                                         (concat ".*then\\b[ \t]*"
-                                                "[^ \t(=a-z[0-9]]"))))))
+                                                "[^ \t(=a-z0-9]"))))))
                            then-test))
                         (setq count (- count 1)))))
                  ((looking-at "end[ \t]*if\\b")
@@ -1234,8 +1259,7 @@ Return point or nil."
                   (not (fortran-line-number-indented-correctly-p))))
          (fortran-indent-to-column cfi)
        (beginning-of-line)
-       (if (and (not (looking-at fortran-comment-line-start-skip))
-                (fortran-find-comment-start-skip))
+       (if (fortran-find-comment-start-skip)
            (fortran-indent-comment))))
     ;; Never leave point in left margin.
     (if (< (current-column) cfi)
@@ -1262,8 +1286,7 @@ Return point or nil."
                       (not (fortran-line-number-indented-correctly-p))))
              (fortran-indent-to-column cfi)
            (beginning-of-line)
-           (if (and (not (looking-at fortran-comment-line-start-skip))
-                    (fortran-find-comment-start-skip))
+           (if (fortran-find-comment-start-skip)
                (fortran-indent-comment))))
        (fortran-fill)
        ;; Never leave point in left margin.
@@ -1336,6 +1359,9 @@ Return point or nil."
     (save-excursion
       (beginning-of-line)
       (cond ((looking-at "[ \t]*$"))
+            ;; Check for directive before comment, so as not to indent.
+           ((looking-at fortran-directive-re)
+            (setq fortran-minimum-statement-indent 0 icol 0))
            ((looking-at fortran-comment-line-start-skip)
             (cond ((eq fortran-comment-indent-style 'relative)
                    (setq icol (+ icol fortran-comment-line-extra-indent)))
@@ -1348,8 +1374,6 @@ Return point or nil."
                                      fortran-continuation-string)))
                 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]"))
             (setq icol (+ icol fortran-continuation-indent)))
-           ((looking-at "[ \t]*#")     ; Check for cpp directive.
-            (setq fortran-minimum-statement-indent 0 icol 0))
            (first-statement)
            ((and fortran-check-all-num-for-matching-do
                  (looking-at "[ \t]*[0-9]+")
@@ -1462,11 +1486,9 @@ notes: 1) A non-zero/non-blank character in column 5 indicates a continuation
       (delete-horizontal-space)
       (indent-to col)
       ;; Indent any comment following code on the same line.
-      (if (and comment-start-skip
-              (fortran-find-comment-start-skip))
+      (if (fortran-find-comment-start-skip)
          (progn (goto-char (match-beginning 0))
-                (if (not (= (current-column)
-                            (fortran-comment-indent)))
+                (if (not (= (current-column) (fortran-comment-indent)))
                     (progn (delete-horizontal-space)
                            (indent-to (fortran-comment-indent)))))))))
 
@@ -1510,27 +1532,28 @@ Otherwise return nil."
                      (concat "^[ \t0-9]*do[ \t]*0*"
                              charnum))))))))))
 
-(defun fortran-find-comment-start-skip ()
+(defun fortran-find-comment-start-skip (&optional all)
   "Move to past `comment-start-skip' found on current line.
-Return t if `comment-start-skip' found, nil if not."
-  ;; In order to move point only if comment-start-skip is found, this
-  ;; one uses a lot of save-excursions.  Note that re-search-forward
-  ;; moves point even if comment-start-skip is inside a string-constant.
-  ;; Some code expects certain values for match-beginning and end.
+Return non-nil if `comment-start-skip' found, nil if not.
+If ALL is nil, only match comments that start in column > 0."
   (interactive)
-  (if (and comment-start-skip
-          (save-excursion
-            (re-search-forward comment-start-skip (line-end-position) t)))
-      (let ((save-match-beginning (match-beginning 0))
-           (save-match-end (match-end 0)))
-       (if (fortran-is-in-string-p (match-beginning 0))
-           (save-excursion
-             (goto-char save-match-end)
-             (fortran-find-comment-start-skip)) ; recurse for rest of line
-         (goto-char save-match-beginning)
-         (re-search-forward comment-start-skip (line-end-position) t)
-         (goto-char (match-end 0))
-         t))))
+  ;; Hopefully at some point we can just use the line below!  -stef
+  ;; (comment-search-forward (line-end-position) t))
+  (when (or all comment-start-skip)
+    (let ((pos (point))
+         (css (if comment-start-skip
+                  (concat fortran-comment-line-start-skip
+                          "\\|" comment-start-skip)
+                fortran-comment-line-start-skip)))
+      (when (re-search-forward css (line-end-position) t)
+       (if (and (or all (> (match-beginning 0) (line-beginning-position)))
+                (or (save-match-data
+                      (not (fortran-is-in-string-p (match-beginning 0))))
+                    ;; Recurse for rest of line.
+                    (fortran-find-comment-start-skip all)))
+           (point)
+         (goto-char pos)
+         nil)))))
 
 ;;From: ralf@up3aud1.gwdg.de (Ralf Fassel)
 ;; Test if TAB format continuation lines work.
@@ -1646,40 +1669,35 @@ Return t if `comment-start-skip' found, nil if not."
     ;;
     ;; Need to use fortran-find-comment-start-skip to make sure that quoted !'s
     ;; don't prevent a break.
-    (if (not (or (save-excursion
-                  (if (and comment-start-skip
-                           (re-search-backward comment-start-skip bol t)
-                           (not (fortran-is-in-string-p (point))))
-                      (progn
-                        (skip-chars-backward " \t")
-                        (< (current-column) (1+ fill-column)))))
-                (save-excursion
-                  (goto-char fill-point)
-                  (bolp))))
-       (when (> (save-excursion
-                  (goto-char opoint)
-                  (current-column))
-                (min (1+ fill-column)
-                     (+ (fortran-calculate-indent)
-                        fortran-continuation-indent)))
-         (goto-char fill-point)
-         (fortran-break-line)
-         (end-of-line)))))
+    (when (and (save-excursion
+                (beginning-of-line)
+                (when (fortran-find-comment-start-skip)
+                  (goto-char (match-beginning 0))
+                  (>= (point) fill-point)))
+              (save-excursion
+                (goto-char fill-point)
+                (not (bolp)))
+              (> (save-excursion
+                   (goto-char opoint)
+                   (current-column))
+                 (min (1+ fill-column)
+                      (+ (fortran-calculate-indent)
+                         fortran-continuation-indent))))
+      (goto-char fill-point)
+      (fortran-break-line)
+      (end-of-line))))
 
 (defun fortran-break-line ()
   (let ((opoint (point))
        (bol (line-beginning-position))
-       (eol (line-end-position))
-       (comment-string nil))
-    (save-excursion
-      (if (and comment-start-skip (fortran-find-comment-start-skip))
-         (progn
-           (re-search-backward comment-start-skip bol t)
-           (setq comment-string (buffer-substring (point) eol))
-           (delete-region (point) eol))))
+       (comment-string
+        (save-excursion
+          (if (fortran-find-comment-start-skip)
+              (delete-and-extract-region
+               (match-beginning 0) (line-end-position))))))
     ;; Forward line 1 really needs to go to next non white line
     (if (save-excursion (forward-line)
-                       (or (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")))
+                       (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]"))
        (progn
          (end-of-line)
          (delete-region (point) (match-end 0))
@@ -1733,7 +1751,7 @@ Intended as the value of `fill-paragraph-function'."
        ;; paragraph, delimited either by non-comment lines or empty
        ;; comments.  (Get positions as markers, since the
        ;; `indent-region' below can shift the block's end).
-       (let* ((non-empty-comment 
+       (let* ((non-empty-comment
                (concat fortran-comment-line-start-skip "[^ \t\n]"))
               (start (save-excursion
                        ;; Find (start of) first line.
@@ -1744,7 +1762,7 @@ Intended as the value of `fill-paragraph-function'."
                        (point-marker)))
               (end (save-excursion
                      ;; Find start of first line past region to fill.
-                     (while (progn 
+                     (while (progn
                               (forward-line)
                               (looking-at non-empty-comment)))
                      (point-marker))))
@@ -1772,8 +1790,7 @@ Intended as the value of `fill-paragraph-function'."
               (or (looking-at "[ \t]*$")
                   (looking-at fortran-comment-line-start-skip)
                   (and comment-start-skip
-                       (looking-at (concat "[ \t]*"
-                                           comment-start-skip))))))
+                       (looking-at (concat "[ \t]*" comment-start-skip))))))
        (save-excursion
          ;; Find beginning of statement.
          (fortran-next-statement)
@@ -1788,10 +1805,10 @@ Intended as the value of `fill-paragraph-function'."
          (fortran-previous-statement)))
     (fortran-indent-line)))
 
-(defun fortran-strip-sqeuence-nos (&optional do-space)
-  "Delete all text after column 72 (assumed to be sequence numbers).
-Also delete trailing whitespace after stripping such text.  Supplying
-prefix arg DO-SPACE prevents stripping the whitespace."
+(defun fortran-strip-sequence-nos (&optional do-space)
+  "Delete all text in column 72 and up (assumed to be sequence numbers).
+Normally also deletes trailing whitespace after stripping such text.
+Supplying prefix arg DO-SPACE prevents stripping the whitespace."
   (interactive "p")
   (save-excursion
     (goto-char (point-min))