emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/progmodes/fortran.el [lexbind]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/lisp/progmodes/fortran.el [lexbind]
Date: Tue, 14 Oct 2003 19:30:27 -0400

Index: emacs/lisp/progmodes/fortran.el
diff -c emacs/lisp/progmodes/fortran.el:1.96.2.1 
emacs/lisp/progmodes/fortran.el:1.96.2.2
*** emacs/lisp/progmodes/fortran.el:1.96.2.1    Fri Apr  4 01:20:32 2003
--- emacs/lisp/progmodes/fortran.el     Tue Oct 14 19:30:17 2003
***************
*** 1,11 ****
  ;;; fortran.el --- Fortran mode for GNU Emacs
  
! ;; Copyright (c) 1986, 93, 94, 95, 97, 98, 99, 2000, 2001
  ;;   Free Software Foundation, Inc.
  
  ;; Author: Michael D. Prange <address@hidden>
  ;; Maintainer: Glenn Morris <address@hidden>
! ;; Keywords: languages
  
  ;; This file is part of GNU Emacs.
  
--- 1,11 ----
  ;;; fortran.el --- Fortran mode for GNU Emacs
  
! ;; Copyright (c) 1986, 93, 94, 95, 97, 98, 99, 2000, 01, 2003
  ;;   Free Software Foundation, Inc.
  
  ;; Author: Michael D. Prange <address@hidden>
  ;; Maintainer: Glenn Morris <address@hidden>
! ;; Keywords: fortran, languages
  
  ;; This file is part of GNU Emacs.
  
***************
*** 53,125 ****
  ;;   second in column 6.
  ;; * Support any other extensions to f77 grokked by GNU Fortran I've missed.
  
  (defgroup fortran nil
!   "Fortran mode for Emacs"
!   :link '(custom-manual "(emacs)Fortran")
    :group 'languages)
  
  (defgroup fortran-indent nil
!   "Indentation variables in Fortran mode"
    :prefix "fortran-"
!   :group 'fortran)
  
  (defgroup fortran-comment nil
!   "Comment-handling variables in Fortran mode"
    :prefix "fortran-"
!   :group 'fortran)
  
  
  ;;;###autoload
  (defcustom fortran-tab-mode-default nil
    "*Default tabbing/carriage control style for empty files in Fortran mode.
! A value of t specifies tab-digit style of continuation control.
  A value of nil specifies that continuation lines are marked
  with a character in column 6."
!   :type 'boolean
    :group 'fortran-indent)
  
! ;; Buffer local, used to display mode line.
! (defcustom fortran-tab-mode-string nil
!   "String to appear in mode line when TAB format mode is on."
!   :type '(choice (const nil) string)
    :group 'fortran-indent)
- (make-variable-buffer-local 'fortran-tab-mode-string)
  
  (defcustom fortran-do-indent 3
    "*Extra indentation applied to DO blocks."
!   :type 'integer
    :group 'fortran-indent)
  
  (defcustom fortran-if-indent 3
    "*Extra indentation applied to IF blocks."
!   :type 'integer
    :group 'fortran-indent)
  
  (defcustom fortran-structure-indent 3
    "*Extra indentation applied to STRUCTURE, UNION, MAP and INTERFACE blocks."
!   :type 'integer
    :group 'fortran-indent)
  
  (defcustom fortran-continuation-indent 5
!   "*Extra indentation applied to Fortran continuation lines."
!   :type 'integer
    :group 'fortran-indent)
  
  (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'."
!   :type '(radio (const :tag "Untouched" nil) (const fixed) (const relative))
    :group 'fortran-indent)
  
  (defcustom fortran-comment-line-extra-indent 0
    "*Amount of extra indentation for text within full-line comments."
!   :type 'integer
    :group 'fortran-indent
    :group 'fortran-comment)
  
--- 53,128 ----
  ;;   second in column 6.
  ;; * Support any other extensions to f77 grokked by GNU Fortran I've missed.
  
+ (eval-when-compile                    ; silence compiler
+   (defvar dabbrev-case-fold-search)
+   (defvar imenu-case-fold-search)
+   (defvar imenu-syntax-alist))
+ 
+ 
  (defgroup fortran nil
!   "Major mode for editing fixed format Fortran code."
!   :link  '(custom-manual "(emacs)Fortran")
    :group 'languages)
  
  (defgroup fortran-indent nil
!   "Indentation variables in Fortran mode."
    :prefix "fortran-"
!   :group  'fortran)
  
  (defgroup fortran-comment nil
!   "Comment-handling variables in Fortran mode."
    :prefix "fortran-"
!   :group  'fortran)
  
  
  ;;;###autoload
  (defcustom fortran-tab-mode-default nil
    "*Default tabbing/carriage control style for empty files in Fortran mode.
! A non-nil value specifies tab-digit style of continuation control.
  A value of nil specifies that continuation lines are marked
  with a character in column 6."
!   :type  'boolean
    :group 'fortran-indent)
  
! (defcustom fortran-tab-mode-string "/t"
!   "*String to appear in mode line in TAB format buffers."
!   :type  'string
    :group 'fortran-indent)
  
  (defcustom fortran-do-indent 3
    "*Extra indentation applied to DO blocks."
!   :type  'integer
    :group 'fortran-indent)
  
  (defcustom fortran-if-indent 3
    "*Extra indentation applied to IF blocks."
!   :type  'integer
    :group 'fortran-indent)
  
  (defcustom fortran-structure-indent 3
    "*Extra indentation applied to STRUCTURE, UNION, MAP and INTERFACE blocks."
!   :type  'integer
    :group 'fortran-indent)
  
  (defcustom fortran-continuation-indent 5
!   "*Extra indentation applied to continuation lines."
!   :type  'integer
    :group 'fortran-indent)
  
  (defcustom fortran-comment-indent-style 'fixed
    "*How to indent comments.
! nil forces comment lines not to be touched;
! `fixed' indents to `fortran-comment-line-extra-indent' columns beyond
!   `fortran-minimum-statement-indent-fixed' (if `indent-tabs-mode' nil), or
!   `fortran-minimum-statement-indent-tab' (if `indent-tabs-mode' non-nil);
  `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)
  
  (defcustom fortran-comment-line-extra-indent 0
    "*Amount of extra indentation for text within full-line comments."
!   :type  'integer
    :group 'fortran-indent
    :group 'fortran-comment)
  
***************
*** 127,134 ****
    "*Delimiter inserted to start new full-line comment.
  You might want to change this to \"*\", for instance."
    :version "21.1"
!   :type 'string
!   :group 'fortran-comment)
  
  ;; This used to match preprocessor lines too, but that messes up
  ;; filling and doesn't seem to be necessary.
--- 130,137 ----
    "*Delimiter inserted to start new full-line comment.
  You might want to change this to \"*\", for instance."
    :version "21.1"
!   :type    'string
!   :group   'fortran-comment)
  
  ;; This used to match preprocessor lines too, but that messes up
  ;; filling and doesn't seem to be necessary.
***************
*** 136,143 ****
    "^[CcDd*!]\\(\\([^ \t\n]\\)\\2+\\)?[ \t]*"
    "*Regexp to match the start of a full-line comment."
    :version "21.1"
!   :type 'regexp
!   :group 'fortran-comment)
  
  (defcustom fortran-directive-re
    "^[ \t]*#.*"
--- 139,146 ----
    "^[CcDd*!]\\(\\([^ \t\n]\\)\\2+\\)?[ \t]*"
    "*Regexp to match the start of a full-line comment."
    :version "21.1"
!   :type    'regexp
!   :group   'fortran-comment)
  
  (defcustom fortran-directive-re
    "^[ \t]*#.*"
***************
*** 145,161 ****
  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
    :group 'fortran-indent)
  
  (defcustom fortran-minimum-statement-indent-tab (max tab-width 6)
    "*Minimum statement indentation for TAB format continuation style."
!   :type 'integer
    :group 'fortran-indent)
  
  ;; Note that this is documented in the v18 manuals as being a string
--- 148,164 ----
  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
    :group 'fortran-indent)
  
  (defcustom fortran-minimum-statement-indent-tab (max tab-width 6)
    "*Minimum statement indentation for TAB format continuation style."
!   :type  'integer
    :group 'fortran-indent)
  
  ;; Note that this is documented in the v18 manuals as being a string
***************
*** 164,392 ****
  (defcustom fortran-comment-indent-char " "
    "*Single-character string inserted for Fortran comment indentation.
  Normally a space."
!   :type 'string
    :group 'fortran-comment)
  
  (defcustom fortran-line-number-indent 1
    "*Maximum indentation for Fortran line numbers.
  5 means right-justify them within their five-column field."
!   :type 'integer
    :group 'fortran-indent)
  
  (defcustom fortran-check-all-num-for-matching-do nil
    "*Non-nil causes all numbered lines to be treated as possible DO loop ends."
!   :type 'boolean
    :group 'fortran)
  
  (defcustom fortran-blink-matching-if nil
!   "*Non-nil causes \\[fortran-indent-line] on ENDIF statement to blink on 
matching IF.
  Also, from an ENDDO statement blink on matching DO [WHILE] statement."
!   :type 'boolean
    :group 'fortran)
  
  (defcustom fortran-continuation-string "$"
    "*Single-character string used for Fortran continuation lines.
  In fixed format continuation style, this character is inserted in
  column 6 by \\[fortran-split-line] to begin a continuation line.
! Also, if \\[fortran-indent-line] finds this at the beginning of a line, it 
will
! convert the line into a continuation line of the appropriate style.
! Normally $."
!   :type 'string
    :group 'fortran)
  
  (defcustom fortran-comment-region "c$$$"
    "*String inserted by \\[fortran-comment-region] at start of each \
  line in region."
!   :type 'string
    :group 'fortran-comment)
  
  (defcustom fortran-electric-line-number t
!   "*Non-nil causes line number digits to be moved to the correct \
! column as typed."
!   :type 'boolean
    :group 'fortran)
  
! (defvar fortran-column-ruler-fixed
    "0   4 6  10        20        30        40        5\
  0        60        70\n\
  \[   ]|{   |    |    |    |    |    |    |    |    \
  \|    |    |    |    |}\n"
    "String displayed above current line by \\[fortran-column-ruler].
! This variable used in fixed format mode.")
  
! (defvar fortran-column-ruler-tab
    "0       810        20        30        40        5\
  0        60        70\n\
  \[   ]|  { |    |    |    |    |    |    |    |    \
  \|    |    |    |    |}\n"
    "String displayed above current line by \\[fortran-column-ruler].
! This variable used in TAB format mode.")
  
! (defvar fortran-analyze-depth 100
!   "Number of lines to scan to determine whether to use fixed or TAB \
! format style.")
  
  (defcustom fortran-break-before-delimiters t
!   "*Non-nil causes filling to break lines before delimiters."
!   :type 'boolean
    :group 'fortran)
  
! (defvar fortran-mode-syntax-table
!   (let ((table (make-syntax-table)))
!     ;; We might like `;' to be punctuation (g77 multi-statement
!     ;; lines), but that screws abbrevs.
!     (modify-syntax-entry ?\; "w" table)
!     (modify-syntax-entry ?\r " " table)
!     (modify-syntax-entry ?+ "." table)
!     (modify-syntax-entry ?- "." table)
!     (modify-syntax-entry ?= "." table)
!     (modify-syntax-entry ?* "." table)
!     (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.
!     (modify-syntax-entry ?. "_" table)        ; e.g. `a.ne.b'
!     (modify-syntax-entry ?_ "_" table)
!     (modify-syntax-entry ?$ "_" table)        ; esp. VMSisms
!     (modify-syntax-entry ?\! "<" table)
!     (modify-syntax-entry ?\n ">" table)
!     table)
!   "Syntax table in use in Fortran mode buffers.")
  
! ;; Comments are real pain in Fortran because there is no way to
! ;; represent the standard comment syntax in an Emacs syntax table.
! ;; (We can do so for F90-style).  Therefore an unmatched quote in a
! ;; standard comment will throw fontification off on the wrong track.
! ;; So we do syntactic fontification with regexps.
  
! (defvar fortran-font-lock-keywords-1 nil
    "Subdued level highlighting for Fortran mode.")
  
! (defvar fortran-font-lock-keywords-2 nil
    "Medium level highlighting for Fortran mode.")
  
! (defvar fortran-font-lock-keywords-3 nil
    "Gaudy level highlighting for Fortran mode.")
  
! (defvar fortran-font-lock-syntactic-keywords nil
    "`font-lock-syntactic-keywords' for Fortran.
  These get fixed-format comments fontified.")
  
- (let ((comment-chars "cd\\*")         ; `d' for `debugging' comments
-       (fortran-type-types
-        (eval-when-compile
-        (let ((re (regexp-opt
-                   (let ((simple-types
-                          '("character" "byte" "integer" "logical"
-                            "none" "real" "complex"
-                            "double precision" "double complex"))
-                         (structured-types '("structure" "union" "map"))
-                         (other-types '("record" "dimension"
-                                        "parameter" "common" "save"
-                                        "external" "intrinsic" "data"
-                                        "equivalence")))
-                     (append
-                      (mapcar (lambda (x) (concat "implicit " x))
-                              simple-types)
-                      simple-types
-                      (mapcar (lambda (x) (concat "end " x))
-                              structured-types)
-                      structured-types
-                      other-types)))))
-          ;; In the optimized regexp above, replace spaces by a
-          ;; regexp for optional whitespace; regexp-opt would have
-          ;; escaped that.
-          (mapconcat #'identity (split-string re) "[ \t]*"))))
-       (fortran-keywords
-        (eval-when-compile
-          (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"
-                      "rewind" "backspace"))))
-       (fortran-logicals
-        (eval-when-compile
-          (regexp-opt '("and" "or" "not" "lt" "le" "eq" "ge" "gt" "ne"
-                        "true" "false")))))
-   (setq fortran-font-lock-syntactic-keywords
-       ;; Fixed format comments.  (!-style handled normally.)
-       (list
-        (list (concat "^[" comment-chars "]") 0 '(11))
-        (list (concat "^[^" comment-chars "\t\n]" ".\\{71\\}"
-                      "\\([^\n]+\\)")
-              1 '(11))))
-   (setq fortran-font-lock-keywords-1
-         (list
-          ;; Program, subroutine and function declarations, plus calls.
-          (list (concat "\\<\\(block[ \t]*data\\|call\\|entry\\|function\\|"
-                        "program\\|subroutine\\)\\>[ \t]*\\(\\sw+\\)?")
-                '(1 font-lock-keyword-face)
-                '(2 font-lock-function-name-face nil t))))
-   (setq fortran-font-lock-keywords-2
-         (append fortran-font-lock-keywords-1
-                 (list
-                  ;; Fontify all type specifiers (must be first; see below).
-                  (cons (concat "\\<\\(" fortran-type-types "\\)\\>")
-                        'font-lock-type-face)
-                  ;; Fontify all builtin keywords (except logical, do
-                  ;; and goto; see below).
-                  (concat "\\<\\(" fortran-keywords "\\)\\>")
-                  ;; Fontify all builtin operators.
-                  (concat "\\.\\(" fortran-logicals "\\)\\.")
-                  ;; Fontify do/goto keywords and targets, and goto tags.
-                  (list "\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)?"
-                        '(1 font-lock-keyword-face)
-                        '(2 font-lock-constant-face nil t))
-                  (cons "^ *\\([0-9]+\\)" 'font-lock-constant-face))))
-   (setq fortran-font-lock-keywords-3
-         (append
-          ;; The list `fortran-font-lock-keywords-1'.
-          fortran-font-lock-keywords-1
-          ;; Fontify all type specifiers plus their declared items.
-          (list
-           (list (concat "\\<\\(" fortran-type-types "\\)\\>[ \t(/]*\\(*\\)?")
-                 ;; Fontify the type specifier.
-                 '(1 font-lock-type-face)
-                 ;; Fontify each declaration item (or just the /.../ block 
name).
-                 `(font-lock-match-c-style-declaration-item-and-skip-to-next
-                   ;; Start after any *(...) expression.
-                   (condition-case nil
-                     (and (and (match-beginning ,(+ 2 (regexp-opt-depth
-                                                       fortran-type-types)))
-                               (forward-sexp))
-                          (forward-sexp))
-                   (error nil))
-                   ;; No need to clean up.
-                   nil
-                   ;; Fontify as a variable name, functions are
-                   ;; fontified elsewhere.
-                   (1 font-lock-variable-name-face nil t))))
-          ;; Things extra to `fortran-font-lock-keywords-3'
-          ;; (must be done first).
-          (list
-           ;; Fontify goto-like `err=label'/`end=label' in read/write
-           ;; statements.
-           '(", *\\(e\\(nd\\|rr\\)\\)\\> *\\(= *\\([0-9]+\\)\\)?"
-             (1 font-lock-keyword-face) (4 font-lock-constant-face nil t))
-           ;; Highlight standard continuation character and in a
-           ;; TAB-formatted line.
-           '("^     \\([^ 0]\\)" 1 font-lock-string-face)
-           '("^\t\\([1-9]\\)" 1 font-lock-string-face))
-        (list
-         ;; cpp stuff (ugh)
- ;;;     '("^# *[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)
-                       fortran-font-lock-keywords-2)))))
- 
  (defvar fortran-font-lock-keywords fortran-font-lock-keywords-1
    "Default expressions to highlight in Fortran mode.")
! 
  (defvar fortran-imenu-generic-expression
    ;; These patterns could be confused by sequence nos. in cols 72+ and
    ;; don't allow continuations everywhere.
--- 167,374 ----
  (defcustom fortran-comment-indent-char " "
    "*Single-character string inserted for Fortran comment indentation.
  Normally a space."
!   :type  'string
    :group 'fortran-comment)
  
  (defcustom fortran-line-number-indent 1
    "*Maximum indentation for Fortran line numbers.
  5 means right-justify them within their five-column field."
!   :type  'integer
    :group 'fortran-indent)
  
  (defcustom fortran-check-all-num-for-matching-do nil
    "*Non-nil causes all numbered lines to be treated as possible DO loop ends."
!   :type  'boolean
    :group 'fortran)
  
  (defcustom fortran-blink-matching-if nil
!   "*Non-nil causes \\[fortran-indent-line] on ENDIF to blink on matching IF.
  Also, from an ENDDO statement blink on matching DO [WHILE] statement."
!   :type  'boolean
    :group 'fortran)
  
  (defcustom fortran-continuation-string "$"
    "*Single-character string used for Fortran continuation lines.
  In fixed format continuation style, this character is inserted in
  column 6 by \\[fortran-split-line] to begin a continuation line.
! Also, if \\[fortran-indent-line] finds this at the beginning of a
! line, it will convert the line into a continuation line of the
! appropriate style. Normally $."
!   :type  'string
    :group 'fortran)
  
  (defcustom fortran-comment-region "c$$$"
    "*String inserted by \\[fortran-comment-region] at start of each \
  line in region."
!   :type  'string
    :group 'fortran-comment)
  
  (defcustom fortran-electric-line-number t
!   "*Non-nil causes line numbers to be moved to the correct column as typed."
!   :type  'boolean
    :group 'fortran)
  
! (defcustom fortran-column-ruler-fixed
    "0   4 6  10        20        30        40        5\
  0        60        70\n\
  \[   ]|{   |    |    |    |    |    |    |    |    \
  \|    |    |    |    |}\n"
    "String displayed above current line by \\[fortran-column-ruler].
! This variable is used in fixed format mode.
! See the variable `fortran-column-ruler-tab' for TAB format mode."
!   :type  'string
!   :group 'fortran)
  
! (defcustom fortran-column-ruler-tab
    "0       810        20        30        40        5\
  0        60        70\n\
  \[   ]|  { |    |    |    |    |    |    |    |    \
  \|    |    |    |    |}\n"
    "String displayed above current line by \\[fortran-column-ruler].
! This variable is used in TAB format mode.
! See the variable `fortran-column-ruler-fixed' for fixed format mode."
!   :type  'string
!   :group 'fortran)
  
! (defcustom fortran-analyze-depth 100
!   "Number of lines to scan to identify fixed or TAB format style."
!   :type  'integer
!   :group 'fortran)
  
  (defcustom fortran-break-before-delimiters t
!   "*Non-nil causes filling to break lines before delimiters.
! Delimiters are whitespace, commas, quotes, and operators."
!   :type  'boolean
    :group 'fortran)
  
! (defcustom fortran-mode-hook nil
!   "Hook run when entering Fortran mode."
!   :type  'hook
!   :group 'fortran)
  
! 
! (defvar fortran-if-start-re "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?if[ \t]*("
!   "Regexp matching the start of an IF statement.")
! 
! (defvar fortran-end-prog-re1
!   "end\
! \\([ \t]*\\(program\\|subroutine\\|function\\|block[ \t]*data\\)\\>\
! \\([ \t]*\\(\\sw\\|\\s_\\)+\\)?\\)?"
!   "Regexp possibly matching the end of a subprogram.")
! 
! (defvar fortran-end-prog-re
!   (concat "^[ \t0-9]*" fortran-end-prog-re1)
!   "Regexp possibly matching the end of a subprogram, from the line start.
! See also `fortran-end-prog-re1'.")
  
! (defconst fortran-type-types
!   (concat "\\<"
!           (mapconcat 'identity          ; " " -> "[ \t]*"
!                      (split-string
!                       (regexp-opt
!                        (let ((simple-types
!                               '("character" "byte" "integer" "logical"
!                                 "none" "real" "complex"
!                                 "double precision" "double complex"))
!                              (structured-types '("structure" "union" "map"))
!                              (other-types '("record" "dimension"
!                                             "parameter" "common" "save"
!                                             "external" "intrinsic" "data"
!                                             "equivalence")))
!                          (append
!                           (mapcar (lambda (x) (concat "implicit " x))
!                                   simple-types)
!                           simple-types
!                           (mapcar (lambda (x) (concat "end " x))
!                                   structured-types)
!                           structured-types
!                           other-types)) 'paren))
!                      "[ \t]*") "\\>")
!   "Regexp matching Fortran types.")
! 
! (defvar fortran-font-lock-keywords-1
!   ;; Program, subroutine and function declarations, plus calls.
!   '(("\\<\\(block[ \t]*data\\|call\\|entry\\|function\\|\
! program\\|subroutine\\)\\>[ \t]*\\(\\sw+\\)?"
!      (1 font-lock-keyword-face)
!      (2 font-lock-function-name-face nil t)))
    "Subdued level highlighting for Fortran mode.")
  
! (defvar fortran-font-lock-keywords-2
!   (append fortran-font-lock-keywords-1
!           (list
!            ;; Fontify all type specifiers (must be first - see below).
!            (cons fortran-type-types 'font-lock-type-face)
!            ;; Builtin keywords (except logical, do and goto - see below).
!            (concat "\\<" (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" "rewind" "backspace")
!                           'paren) "\\>")
!            ;; Builtin operators.
!            (concat "\\." (regexp-opt
!                           '("and" "or" "not" "lt" "le" "eq" "ge"
!                             "gt" "ne" "true" "false")
!                           'paren) "\\.")
!            ;; do/goto keywords and targets, and goto tags.
!            '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)?"
!              (1 font-lock-keyword-face)
!              (2 font-lock-constant-face nil t))
!            '("^ *\\([0-9]+\\)" . font-lock-constant-face)))
    "Medium level highlighting for Fortran mode.")
  
! (defvar fortran-font-lock-keywords-3
!   (append
!    fortran-font-lock-keywords-1
!    ;; All type specifiers plus their declared items.
!    (list
!     (list (concat fortran-type-types "[ \t(/]*\\(*\\)?")
!           ;; Type specifier.
!           '(1 font-lock-type-face)
!           ;; Declaration item (or just /.../ block name).
!           `(font-lock-match-c-style-declaration-item-and-skip-to-next
!             ;; Start after any *(...) expression.
!             (condition-case nil
!                 (and (match-beginning ,(1+ (regexp-opt-depth
!                                             fortran-type-types)))
!                      (forward-sexp)
!                      (forward-sexp))
!               (error nil))
!             ;; No need to clean up.
!             nil
!             ;; Fontify as a variable name, functions fontified elsewhere.
!             (1 font-lock-variable-name-face nil t))))
!    ;; Things extra to `fortran-font-lock-keywords-3' (must be done first).
!    (list
!     ;; Goto-like `err=label'/`end=label' in read/write statements.
!     '(", *\\(e\\(nd\\|rr\\)\\)\\> *\\(= *\\([0-9]+\\)\\)?"
!       (1 font-lock-keyword-face) (4 font-lock-constant-face nil t))
!     ;; Standard continuation character and in a TAB-formatted line.
!     '("^ \\{5\\}\\([^ 0\n]\\)" 1 font-lock-string-face)
!     '("^\t\\([1-9]\\)"         1 font-lock-string-face))
!    `((,fortran-directive-re (0 font-lock-keyword-face t)))
!    ;; `fortran-font-lock-keywords-2' without types (see above).
!    (cdr (nthcdr (length fortran-font-lock-keywords-1)
!                 fortran-font-lock-keywords-2)))
    "Gaudy level highlighting for Fortran mode.")
  
! ;; Comments are real pain in Fortran because there is no way to
! ;; represent the standard comment syntax in an Emacs syntax table.
! ;; (We can do so for F90-style).  Therefore an unmatched quote in a
! ;; standard comment will throw fontification off on the wrong track.
! ;; So we do syntactic fontification with regexps.
! (defvar fortran-font-lock-syntactic-keywords
!   '(("^[cd\\*]" 0 (11))
!     ("^[^cd\\*\t\n].\\{71\\}\\([^\n]+\\)" 1 (11)))
    "`font-lock-syntactic-keywords' for Fortran.
  These get fixed-format comments fontified.")
  
  (defvar fortran-font-lock-keywords fortran-font-lock-keywords-1
    "Default expressions to highlight in Fortran mode.")
! 
  (defvar fortran-imenu-generic-expression
    ;; These patterns could be confused by sequence nos. in cols 72+ and
    ;; don't allow continuations everywhere.
***************
*** 407,429 ****
       ;; Variable to index:
       "\\(\\sw+\\)")
      3)
!    ;; Un-named block data
!    (list nil "^\\s-+\\(block\\s-*data\\)\\s-*$" 1))
!   "Imenu generic expression for `imenu-default-create-index-function'.")
  
  (defvar fortran-mode-map
    (let ((map (make-sparse-keymap)))
!     (define-key map ";" 'fortran-abbrev-start)
!     (define-key map "\C-c;" 'fortran-comment-region)
!     (define-key map "\M-;" 'fortran-indent-comment)
!     (define-key map "\M-\n" 'fortran-split-line)
!     (define-key map "\M-\C-q" 'fortran-indent-subprogram)
      (define-key map "\C-c\C-w" 'fortran-window-create-momentarily)
      (define-key map "\C-c\C-r" 'fortran-column-ruler)
      (define-key map "\C-c\C-p" 'fortran-previous-statement)
      (define-key map "\C-c\C-n" 'fortran-next-statement)
      (define-key map "\C-c\C-d" 'fortran-join-line) ; like f90
!     (define-key map "\M-^" 'fortran-join-line) ; subvert delete-indentation
      (define-key map "0" 'fortran-electric-line-number)
      (define-key map "1" 'fortran-electric-line-number)
      (define-key map "2" 'fortran-electric-line-number)
--- 389,443 ----
       ;; Variable to index:
       "\\(\\sw+\\)")
      3)
!    ;; Un-named block data.
!    '(nil "^\\s-+\\(block\\s-*data\\)\\s-*$" 1))
!   "Value for `imenu-generic-expression' in Fortran mode.")
! 
! 
! (defvar fortran-mode-syntax-table
!   (let ((table (make-syntax-table)))
!     ;; We might like `;' to be punctuation (g77 multi-statement
!     ;; lines), but that screws abbrevs.
!     (modify-syntax-entry ?\; "w"  table)
!     (modify-syntax-entry ?\r " "  table)
!     (modify-syntax-entry ?+  "."  table)
!     (modify-syntax-entry ?-  "."  table)
!     (modify-syntax-entry ?=  "."  table)
!     (modify-syntax-entry ?*  "."  table)
!     (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.
!     (modify-syntax-entry ?.  "_"  table) ; e.g. `a.ne.b'
!     (modify-syntax-entry ?_  "_"  table)
!     (modify-syntax-entry ?$  "_"  table) ; esp. VMSisms
!     (modify-syntax-entry ?\! "<"  table)
!     (modify-syntax-entry ?\n ">"  table)
!     table)
!   "Syntax table used in Fortran mode.")
! 
! (defvar fortran-gud-syntax-table
!   (let ((st (make-syntax-table fortran-mode-syntax-table)))
!     (modify-syntax-entry ?\n "." st)
!     st)
!   "Syntax table used to parse Fortran expressions for printing in GUD.")
  
  (defvar fortran-mode-map
    (let ((map (make-sparse-keymap)))
!     (define-key map ";"        'fortran-abbrev-start)
!     (define-key map "\C-c;"    'fortran-comment-region)
!     (define-key map "\M-;"     'fortran-indent-comment)
!     (define-key map "\M-\n"    'fortran-split-line)
!     (define-key map "\M-\C-q"  'fortran-indent-subprogram)
      (define-key map "\C-c\C-w" 'fortran-window-create-momentarily)
      (define-key map "\C-c\C-r" 'fortran-column-ruler)
      (define-key map "\C-c\C-p" 'fortran-previous-statement)
      (define-key map "\C-c\C-n" 'fortran-next-statement)
      (define-key map "\C-c\C-d" 'fortran-join-line) ; like f90
!     (define-key map "\M-^"     'fortran-join-line) ; subvert 
delete-indentation
      (define-key map "0" 'fortran-electric-line-number)
      (define-key map "1" 'fortran-electric-line-number)
      (define-key map "2" 'fortran-electric-line-number)
***************
*** 435,489 ****
      (define-key map "8" 'fortran-electric-line-number)
      (define-key map "9" 'fortran-electric-line-number)
  
!     ;; Menu
!     (easy-menu-define
!      fortran-mode-menu map ""
!      `("Fortran"
!        ["Manual" (info "(emacs)Fortran")]
!        ("Customization"
!       ,(custom-menu-create 'fortran)
!       ["Set" Custom-set t]
!       ["Save" Custom-save t]
!       ["Reset to Current" Custom-reset-current t]
!       ["Reset to Saved" Custom-reset-saved t]
!       ["Reset to Standard Settings" Custom-reset-standard t])
!        "----"
!        ["Toggle Auto-fill" auto-fill-mode :style toggle
!       :selected auto-fill-function]
!        ["Toggle abbrev-mode" abbrev-mode :style toggle :selected abbrev-mode]
!        "----"
!        ["Comment-out Region" fortran-comment-region mark-active]
!        ["Uncomment-out region"
!       (fortran-comment-region (region-beginning) (region-end) 1)
!       mark-active]
!        ["Indent Region" indent-region mark-active]
!        ["Indent Subprogram" fortran-indent-subprogram t]
!        "----"
!        ["Beginning of Subprogram" fortran-beginning-of-subprogram t]
!        ["End of Subprogram" fortran-end-of-subprogram t]
!        ("Mark"
!       ["Subprogram" mark-defun t]
!       ["IF Block" fortran-mark-if t]
!       ["DO Block" fortran-mark-do t])
!        ["Narrow to Subprogram" narrow-to-defun t]
!        ["Widen" widen t]
!        "----"
!        ["Temporary column ruler" fortran-column-ruler t]
!        ["72-column window" fortran-window-create t]
!        ["Full Width Window"
!       (enlarge-window-horizontally (- (frame-width) (window-width)))
!       (< (window-width) (frame-width))]
!        ["Momentary 72-column window" fortran-window-create-momentarily t]
!        "----"
!        ["Break Line at Point" fortran-split-line t]
!        ["Join Line" fortran-join-line t]
!        ["Fill Statement/Comment" fill-paragraph  t]
!        "----"
!        ["Add imenu menu"
!       imenu-add-menubar-index (not (and (boundp 'imenu--index-alist)
!                                         imenu--index-alist))]))
      map)
    "Keymap used in Fortran mode.")
  
  (defvar fortran-mode-abbrev-table
    (let (abbrevs-changed)
--- 449,504 ----
      (define-key map "8" 'fortran-electric-line-number)
      (define-key map "9" 'fortran-electric-line-number)
  
!     (easy-menu-define fortran-menu map "Menu for Fortran mode."
!       `("Fortran"
!         ["Manual" (info "(emacs)Fortran")]
!         ("Customization"
!          ,(custom-menu-create 'fortran)
!          ["Set"  Custom-set t]
!          ["Save" Custom-save t]
!          ["Reset to Current" Custom-reset-current t]
!          ["Reset to Saved"   Custom-reset-saved t]
!          ["Reset to Standard Settings" Custom-reset-standard t]
!          )
!         "--"
!         ["Comment Region" fortran-comment-region mark-active]
!         ["Uncomment Region"
!          (fortran-comment-region (region-beginning) (region-end) 1)
!          mark-active]
!         ["Indent Region"     indent-region mark-active]
!         ["Indent Subprogram" fortran-indent-subprogram t]
!         "--"
!         ["Beginning of Subprogram" fortran-beginning-of-subprogram t]
!         ["End of Subprogram"       fortran-end-of-subprogram       t]
!         ("Mark"
!          ["Subprogram" mark-defun      t]
!          ["IF Block"   fortran-mark-if t]
!          ["DO Block"   fortran-mark-do t]
!          )
!         ["Narrow to Subprogram" narrow-to-defun t]
!         ["Widen" widen t]
!         "--"
!         ["Temporary column ruler" fortran-column-ruler  t]
!         ["72-column window"       fortran-window-create t]
!         ["Full Width Window"
!          (enlarge-window-horizontally (- (frame-width) (window-width)))
!          (< (window-width) (frame-width))]
!         ["Momentary 72-column window" fortran-window-create-momentarily t]
!         "--"
!         ["Break Line at Point"    fortran-split-line t]
!         ["Join Line"              fortran-join-line  t]
!         ["Fill Statement/Comment" fill-paragraph     t]
!         "--"
!         ["Toggle auto-fill"   auto-fill-mode :selected auto-fill-function
!          :style toggle]
!         ["Toggle abbrev-mode" abbrev-mode    :selected abbrev-mode
!          :style toggle]
!         ["Add imenu Menu" imenu-add-menubar-index
!          :active   (not (lookup-key (current-local-map) [menu-bar index]))
!          :included (fboundp 'imenu-add-to-menubar)]))
      map)
    "Keymap used in Fortran mode.")
+ 
  
  (defvar fortran-mode-abbrev-table
    (let (abbrevs-changed)
***************
*** 557,701 ****
         (";w"    "write"             )
         (";wh"   "where"             )))
      fortran-mode-abbrev-table))
- 
- (eval-when-compile                    ; silence compiler
-   (defvar imenu-case-fold-search)
-   (defvar imenu-syntax-alist))
  
! (defcustom fortran-mode-hook nil
!   "Hook run by Fortran mode."
!   :type 'hook
!   :group 'fortran)
  
  ;;;###autoload
  (defun fortran-mode ()
!   "Major mode for editing Fortran code.
  \\[fortran-indent-line] indents the current Fortran line correctly.
! DO statements must not share a common CONTINUE.
  
! Type ;? or ;\\[help-command] to display a list of built-in abbrevs for
! Fortran keywords.
  
  Key definitions:
  \\{fortran-mode-map}
  
  Variables controlling indentation style and extra features:
  
!  `comment-start'
!     If you want to use comments starting with `!',
!     set this to the string \"!\".
!  `fortran-do-indent'
!     Extra indentation within do blocks.  (default 3)
!  `fortran-if-indent'
!     Extra indentation within if blocks.  (default 3)
!  `fortran-structure-indent'
!     Extra indentation within structure, union, map and interface blocks.
!     (default 3)
!  `fortran-continuation-indent'
!     Extra indentation applied to continuation statements.  (default 5)
!  `fortran-comment-line-extra-indent'
!     Amount of extra indentation for text within full-line comments.  (default 
0)
!  `fortran-comment-indent-style'
!     nil    means don't change indentation of text in full-line comments,
!     fixed  means indent that text at `fortran-comment-line-extra-indent' 
beyond
!            the value of `fortran-minimum-statement-indent-fixed' (for fixed
!            format continuation style) or 
`fortran-minimum-statement-indent-tab'
!            (for TAB format continuation style).
!     relative  means indent at `fortran-comment-line-extra-indent' beyond the
              indentation for a line of code.
!     (default 'fixed)
!  `fortran-comment-indent-char'
!     Single-character string to be inserted instead of space for
!     full-line comment indentation.  (default \" \")
!  `fortran-minimum-statement-indent-fixed'
!     Minimum indentation for Fortran statements in fixed format mode.  (def.6)
!  `fortran-minimum-statement-indent-tab'
!     Minimum indentation for Fortran statements in TAB format mode.  (default 
9)
!  `fortran-line-number-indent'
!     Maximum indentation for line numbers.  A line number will get
!     less than this much indentation if necessary to avoid reaching
!     column 5.  (default 1)
!  `fortran-check-all-num-for-matching-do'
!     Non-nil causes all numbered lines to be treated as possible \"continue\"
!     statements.  (default nil)
!  `fortran-blink-matching-if'
!     Non-nil causes \\[fortran-indent-line] on an ENDIF statement to blink on
!     matching IF.  Also, from an ENDDO statement, blink on matching DO [WHILE]
!     statement.  (default nil)
!  `fortran-continuation-string'
!     Single-character string to be inserted in column 5 of a continuation
!     line.  (default \"$\")
!  `fortran-comment-region'
!     String inserted by \\[fortran-comment-region] at start of each line in
!     region.  (default \"c$$$\")
!  `fortran-electric-line-number'
!     Non-nil causes line number digits to be moved to the correct column
!     as typed.  (default t)
!  `fortran-break-before-delimiters'
!     Non-nil causes lines to be broken before delimiters.
!     (default t)
  
  Turning on Fortran mode calls the value of the variable `fortran-mode-hook'
  with no args, if that value is non-nil."
    (interactive)
    (kill-all-local-variables)
!   (setq local-abbrev-table fortran-mode-abbrev-table)
    (set-syntax-table fortran-mode-syntax-table)
!   ;; Font Lock mode support.
!   (make-local-variable 'font-lock-defaults)
!   (setq font-lock-defaults '((fortran-font-lock-keywords
!                             fortran-font-lock-keywords-1
!                             fortran-font-lock-keywords-2
!                             fortran-font-lock-keywords-3)
!                            nil t ((?/ . "$/") ("_$" . "w"))
!                            fortran-beginning-of-subprogram))
!   (set (make-local-variable 'font-lock-syntactic-keywords)
!        fortran-font-lock-syntactic-keywords)
!   (make-local-variable 'fortran-break-before-delimiters)
!   (setq fortran-break-before-delimiters t)
!   (make-local-variable 'indent-line-function)
!   (setq indent-line-function 'fortran-indent-line)
!   (make-local-variable 'comment-indent-function)
!   (setq comment-indent-function 'fortran-comment-indent)
    (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) "$$$")
!   (set (make-local-variable 'comment-start) fortran-comment-line-start)
!   ;; The syntax tables don't understand the column-0 comment-markers.
!   (set (make-local-variable 'comment-use-syntax) nil)
!   (make-local-variable 'require-final-newline)
!   (setq require-final-newline t)
!   (make-local-variable 'abbrev-all-caps)
!   (setq abbrev-all-caps t)
!   (make-local-variable 'indent-tabs-mode)
!   (setq indent-tabs-mode nil)
! ;;;(setq abbrev-mode t) ; ?? (abbrev-mode 1) instead??
    (set (make-local-variable 'fill-column) 72)
-   (use-local-map fortran-mode-map)
-   (setq mode-name "Fortran")
-   (setq major-mode 'fortran-mode)
-   (make-local-variable 'fortran-comment-line-extra-indent)
-   (make-local-variable 'fortran-minimum-statement-indent-fixed)
-   (make-local-variable 'fortran-minimum-statement-indent-tab)
-   (make-local-variable 'fortran-column-ruler-fixed)
-   (make-local-variable 'fortran-column-ruler-tab)
-   (setq fortran-tab-mode-string " TAB-format")
-   (setq indent-tabs-mode (fortran-analyze-file-format))
-   (setq imenu-case-fold-search t)
-   (setq imenu-generic-expression fortran-imenu-generic-expression)
-   (setq imenu-syntax-alist '(("_$" . "w")))
    (set (make-local-variable 'fill-paragraph-function) 'fortran-fill-paragraph)
!   (set (make-local-variable 'normal-auto-fill-function) 'fortran-auto-fill)
!   (set (make-local-variable 'indent-line-function) 'fortran-indent-line)
!   (set (make-local-variable 'indent-region-function)
!        (lambda (start end)
!          (let (fortran-blink-matching-if ; avoid blinking delay
!                indent-region-function)
!            (indent-region start end nil))))
    (set (make-local-variable 'beginning-of-defun-function)
         #'fortran-beginning-of-subprogram)
    (set (make-local-variable 'end-of-defun-function)
--- 572,695 ----
         (";w"    "write"             )
         (";wh"   "where"             )))
      fortran-mode-abbrev-table))
  
! 
  
  ;;;###autoload
  (defun fortran-mode ()
!   "Major mode for editing Fortran code in fixed format.
! For free format code, use `f90-mode'.
! 
  \\[fortran-indent-line] indents the current Fortran line correctly.
! Note that DO statements must not share a common CONTINUE.
  
! Type ;? or ;\\[help-command] to display a list of built-in abbrevs for\
!  Fortran keywords.
  
  Key definitions:
  \\{fortran-mode-map}
  
  Variables controlling indentation style and extra features:
  
! `comment-start'
!   To use comments starting with `!', set this to the string \"!\".
! `fortran-do-indent'
!   Extra indentation within DO blocks (default 3).
! `fortran-if-indent'
!   Extra indentation within IF blocks (default 3).
! `fortran-structure-indent'
!   Extra indentation within STRUCTURE, UNION, MAP and INTERFACE blocks.
!   (default 3)
! `fortran-continuation-indent'
!   Extra indentation applied to continuation statements (default 5).
! `fortran-comment-line-extra-indent'
!   Amount of extra indentation for text in full-line comments (default 0).
! `fortran-comment-indent-style'
!   How to indent the text in full-line comments. Allowed values are:
!   nil       don't change the indentation
!   fixed     indent to `fortran-comment-line-extra-indent' beyond the
!               value of either
!                 `fortran-minimum-statement-indent-fixed' (fixed format) or
!                 `fortran-minimum-statement-indent-tab' (TAB format),
!               depending on the continuation format in use.
!   relative  indent to `fortran-comment-line-extra-indent' beyond the
              indentation for a line of code.
!   (default 'fixed)
! `fortran-comment-indent-char'
!   Single-character string to be inserted instead of space for
!   full-line comment indentation (default \" \").
! `fortran-minimum-statement-indent-fixed'
!   Minimum indentation for statements in fixed format mode (default 6).
! `fortran-minimum-statement-indent-tab'
!   Minimum indentation for statements in TAB format mode (default 9).
! `fortran-line-number-indent'
!   Maximum indentation for line numbers (default 1).  A line number will
!   get less than this much indentation if necessary to avoid reaching
!   column 5.
! `fortran-check-all-num-for-matching-do'
!   Non-nil causes all numbered lines to be treated as possible \"continue\"
!   statements (default nil).
! `fortran-blink-matching-if'
!   Non-nil causes \\[fortran-indent-line] on an ENDIF (or ENDDO) statement
!   to blink on the matching IF (or DO [WHILE]).  (default nil)
! `fortran-continuation-string'
!   Single-character string to be inserted in column 5 of a continuation
!   line (default \"$\").
! `fortran-comment-region'
!   String inserted by \\[fortran-comment-region] at start of each line in
!   the region (default \"c$$$\").
! `fortran-electric-line-number'
!   Non-nil causes line number digits to be moved to the correct column
!   as typed (default t).
! `fortran-break-before-delimiters'
!   Non-nil causes lines to be broken before delimiters (default t).
  
  Turning on Fortran mode calls the value of the variable `fortran-mode-hook'
  with no args, if that value is non-nil."
    (interactive)
    (kill-all-local-variables)
!   (setq major-mode 'fortran-mode
!         mode-name "Fortran"
!         local-abbrev-table fortran-mode-abbrev-table)
    (set-syntax-table fortran-mode-syntax-table)
!   (use-local-map fortran-mode-map)
!   (set (make-local-variable 'indent-line-function) 'fortran-indent-line)
!   (set (make-local-variable 'indent-region-function)
!        (lambda (start end)
!          (let (fortran-blink-matching-if ; avoid blinking delay
!                indent-region-function)
!            (indent-region start end nil))))
!   (set (make-local-variable 'require-final-newline) t)
!   ;; The syntax tables don't understand the column-0 comment-markers.
!   (set (make-local-variable 'comment-use-syntax) nil)
!   (set (make-local-variable 'comment-padding) "$$$")
!   (set (make-local-variable 'comment-start) fortran-comment-line-start)
    (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-indent-function) 'fortran-comment-indent)
!   (set (make-local-variable 'abbrev-all-caps) t)
!   (set (make-local-variable 'normal-auto-fill-function) 'fortran-auto-fill)
!   (set (make-local-variable 'indent-tabs-mode) (fortran-analyze-file-format))
!   (setq mode-line-process '(indent-tabs-mode fortran-tab-mode-string))
    (set (make-local-variable 'fill-column) 72)
    (set (make-local-variable 'fill-paragraph-function) 'fortran-fill-paragraph)
!   (set (make-local-variable 'font-lock-defaults)
!        '((fortran-font-lock-keywords
!           fortran-font-lock-keywords-1
!           fortran-font-lock-keywords-2
!           fortran-font-lock-keywords-3)
!          nil t ((?/ . "$/") ("_$" . "w"))
!          fortran-beginning-of-subprogram))
!   (set (make-local-variable 'font-lock-syntactic-keywords)
!        fortran-font-lock-syntactic-keywords)
!   (set (make-local-variable 'imenu-case-fold-search) t)
!   (set (make-local-variable 'imenu-generic-expression)
!        fortran-imenu-generic-expression)
!   (set (make-local-variable 'imenu-syntax-alist) '(("_$" . "w")))
    (set (make-local-variable 'beginning-of-defun-function)
         #'fortran-beginning-of-subprogram)
    (set (make-local-variable 'end-of-defun-function)
***************
*** 703,735 ****
    (set (make-local-variable 'add-log-current-defun-function)
         #'fortran-current-defun)
    (set (make-local-variable 'dabbrev-case-fold-search) 'case-fold-search)
    (run-hooks 'fortran-mode-hook))
  
  (defsubst fortran-comment-indent ()
!   (save-excursion
!     (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 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 ((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.
--- 697,737 ----
    (set (make-local-variable 'add-log-current-defun-function)
         #'fortran-current-defun)
    (set (make-local-variable 'dabbrev-case-fold-search) 'case-fold-search)
+   (set (make-local-variable 'gud-find-expr-function) 'fortran-gud-find-expr)
    (run-hooks 'fortran-mode-hook))
+ 
  
+ (defun fortran-gud-find-expr ()
+   ;; Consider \n as punctuation (end of expression).
+   (with-syntax-table fortran-gud-syntax-table
+     (gud-find-c-expr)))
+ 
  (defsubst fortran-comment-indent ()
!   "Return the indentation appropriate for the current comment line.
! This is 0 for a line matching `fortran-comment-line-start-skip', else
! the value of `comment-column' (leaving at least one space after code)."
!   (if (looking-at fortran-comment-line-start-skip) 0
!     (save-excursion
        (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 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 ((fortran-find-comment-start-skip 'all)
         (goto-char (match-beginning 0))
         (if (bolp)
             (fortran-indent-line)
!          (unless (= (current-column) (fortran-comment-indent))
!              (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.
***************
*** 753,793 ****
                      (- (fortran-calculate-indent) (current-column))))))
  
  (defun fortran-comment-region (beg-region end-region arg)
!   "Comments every line in the region.
! 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 end-region))
        (save-point (point-marker)))
      (goto-char beg-region)
      (beginning-of-line)
!     (if (not arg)                     ;comment the region
!       (progn (insert fortran-comment-region)
!              (while (and  (= (forward-line 1) 0)
!                           (< (point) end-region-mark))
!                (insert fortran-comment-region)))
!       (let ((com (regexp-quote fortran-comment-region))) ;uncomment the region
!       (if (looking-at com)
!           (delete-region (point) (match-end 0)))
!       (while (and  (= (forward-line 1) 0)
!                    (< (point) end-region-mark))
!         (if (looking-at com)
!             (delete-region (point) (match-end 0))))))
      (goto-char save-point)
      (set-marker end-region-mark nil)
      (set-marker save-point nil)))
  
  (defun fortran-abbrev-start ()
    "Typing ;\\[help-command] or ;? lists all the Fortran abbrevs.
  Any other key combination is executed normally."
!   (interactive)
!   (let (c)
!     (insert last-command-char)
!     (if (or (eq (setq c (read-event)) ??)    ;insert char if not equal to `?'
!           (eq c help-char))
        (fortran-abbrev-help)
!       (setq unread-command-events (list c)))))
  
  (defun fortran-abbrev-help ()
    "List the currently defined abbrevs in Fortran mode."
--- 755,802 ----
                      (- (fortran-calculate-indent) (current-column))))))
  
  (defun fortran-comment-region (beg-region end-region arg)
!   "Comment every line in the region.
! Inserts the string variable `fortran-comment-region' at the beginning of
! every line in the region.
! BEG-REGION and END-REGION specify the region boundaries.
  With non-nil ARG, uncomments the region."
    (interactive "*r\nP")
    (let ((end-region-mark (copy-marker end-region))
        (save-point (point-marker)))
      (goto-char beg-region)
      (beginning-of-line)
!     (if arg
!         (let ((com (regexp-quote fortran-comment-region))) ; uncomment
!           (if (looking-at com)
!               (delete-region (point) (match-end 0)))
!           (while (and (zerop (forward-line 1))
!                       (< (point) end-region-mark))
!             (if (looking-at com)
!                 (delete-region (point) (match-end 0)))))
!       (insert fortran-comment-region)   ; comment
!       (while (and (zerop (forward-line 1))
!                   (< (point) end-region-mark))
!         (insert fortran-comment-region)))
      (goto-char save-point)
      (set-marker end-region-mark nil)
      (set-marker save-point nil)))
+ 
  
  (defun fortran-abbrev-start ()
    "Typing ;\\[help-command] or ;? lists all the Fortran abbrevs.
  Any other key combination is executed normally."
!   (interactive "*")
!   (insert last-command-char)
!   (let (char event)
!     (if (fboundp 'next-command-event) ; XEmacs
!         (setq event (next-command-event)
!               char (event-to-character event))
!       (setq event (read-event)
!             char event))
!     ;; Insert char if not equal to `?', or if abbrev-mode is off.
!     (if (and abbrev-mode (or (eq char ??) (eq char help-char)))
        (fortran-abbrev-help)
!       (setq unread-command-events (list event)))))
  
  (defun fortran-abbrev-help ()
    "List the currently defined abbrevs in Fortran mode."
***************
*** 797,802 ****
--- 806,812 ----
    (message "Listing abbrev table...done"))
  
  (defun fortran-prepare-abbrev-list-buffer ()
+   "Create a buffer listing the Fortran mode abbreviations."
    (save-excursion
      (set-buffer (get-buffer-create "*Abbrevs*"))
      (erase-buffer)
***************
*** 808,816 ****
  
  (defun fortran-column-ruler ()
    "Insert a column ruler momentarily above current line, till next keystroke.
! The ruler is defined by the value of `fortran-column-ruler-fixed' when in 
fixed
! format mode, and `fortran-column-ruler-tab' when in TAB format mode.
! The key typed is executed unless it is SPC."
    (interactive)
    (momentary-string-display
     (if indent-tabs-mode
--- 818,826 ----
  
  (defun fortran-column-ruler ()
    "Insert a column ruler momentarily above current line, till next keystroke.
! The ruler is defined by the value of `fortran-column-ruler-fixed' in fixed
! format mode, and `fortran-column-ruler-tab' in TAB format mode.
! The next key typed is executed unless it is SPC."
    (interactive)
    (momentary-string-display
     (if indent-tabs-mode
***************
*** 861,867 ****
  
  (defun fortran-split-line ()
    "Break line at point and insert continuation marker and alignment."
!   (interactive)
    (delete-horizontal-space)
    (if (save-excursion
        (let ((pos (point)))
--- 871,877 ----
  
  (defun fortran-split-line ()
    "Break line at point and insert continuation marker and alignment."
!   (interactive "*")
    (delete-horizontal-space)
    (if (save-excursion
        (let ((pos (point)))
***************
*** 871,884 ****
        (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
!   (fortran-indent-line))              ; when the cont string is C, c or *.
  
  (defun fortran-remove-continuation ()
!   (if (looking-at "\\(     [^ 0\n]\\|\t[1-9]\\|&\\)")
!       (progn (replace-match "")
!            (delete-indentation)
!            t)))
  
  (defun fortran-join-line (arg)
    "Join current line to the previous one and re-indent.
--- 881,896 ----
        (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
!   (fortran-indent-line))               ; when cont string is C, c or *
  
  (defun fortran-remove-continuation ()
!   "Delete any Fortran continuation characters at point.
! Returns t if anything actually deleted."
!   (when (looking-at "\\( \\{5\\}[^ 0\n]\\|\t[1-9]\\|&\\)")
!     (replace-match "")
!     (delete-indentation)
!     t))
  
  (defun fortran-join-line (arg)
    "Join current line to the previous one and re-indent.
***************
*** 899,917 ****
  
  (defun fortran-numerical-continuation-char ()
    "Return a digit for tab-digit style of continuation lines.
! If, previous line is a tab-digit continuation line, returns that digit
! plus one.  Otherwise return 1.  Zero not allowed."
    (save-excursion
      (forward-line -1)
      (if (looking-at "\t[1-9]")
!       (+ ?1 (% (- (char-after (+ (point) 1)) ?0) 9))
        ?1)))
  
  (put 'fortran-electric-line-number 'delete-selection t)
  (defun fortran-electric-line-number (arg)
    "Self insert, but if part of a Fortran line number indent it automatically.
  Auto-indent does not happen if a numeric ARG is used."
!   (interactive "P")
    (if (or arg (not fortran-electric-line-number))
        (if arg
          (self-insert-command (prefix-numeric-value arg))
--- 911,929 ----
  
  (defun fortran-numerical-continuation-char ()
    "Return a digit for tab-digit style of continuation lines.
! If previous line is a tab-digit continuation line, return that digit
! plus one, otherwise return 1.  Zero not allowed."
    (save-excursion
      (forward-line -1)
      (if (looking-at "\t[1-9]")
!       (+ ?1 (% (- (char-after (1+ (point))) ?0) 9))
        ?1)))
  
  (put 'fortran-electric-line-number 'delete-selection t)
  (defun fortran-electric-line-number (arg)
    "Self insert, but if part of a Fortran line number indent it automatically.
  Auto-indent does not happen if a numeric ARG is used."
!   (interactive "*P")
    (if (or arg (not fortran-electric-line-number))
        (if arg
          (self-insert-command (prefix-numeric-value arg))
***************
*** 919,951 ****
      (if (or (and (= 5 (current-column))
                 (save-excursion
                   (beginning-of-line)
!                  (looking-at " \\{5\\}"))) ;In col 5 with only spaces to left.
            (and (= (if indent-tabs-mode
                        fortran-minimum-statement-indent-tab
                      fortran-minimum-statement-indent-fixed) (current-column))
!                (eq ?\t (char-after (line-beginning-position))) ;In col 8
!                                       ; with a single tab to the left.
                 (not (or (eq last-command 'fortran-indent-line)
                          (eq last-command
                              'fortran-indent-new-line))))
            (save-excursion
              (re-search-backward "[^ \t0-9]"
                                  (line-beginning-position)
!                                 t))   ;not a line number
!           (looking-at "[0-9]"))       ;within a line number
        (self-insert-command (prefix-numeric-value arg))
        (skip-chars-backward " \t")
        (insert last-command-char)
        (fortran-indent-line))))
- 
- (defvar fortran-end-prog-re1
-   "end\
- \\([ \t]*\\(program\\|subroutine\\|function\\|block[ \t]*data\\)\\>\
- \\([ \t]*\\(\\sw\\|\\s_\\)+\\)?\\)?")
- (defvar fortran-end-prog-re
-   (concat "^[ \t0-9]*" fortran-end-prog-re1)
-   "Regexp possibly marking subprogram end.")
  
  (defun fortran-check-end-prog-re ()
    "Check a preliminary match against `fortran-end-prog-re'."
    ;; Having got a possible match for the subprogram end, we need a
--- 931,957 ----
      (if (or (and (= 5 (current-column))
                 (save-excursion
                   (beginning-of-line)
!                     ;; In col 5 with only spaces to the left.
!                  (looking-at " \\{5\\}")))
            (and (= (if indent-tabs-mode
                        fortran-minimum-statement-indent-tab
                      fortran-minimum-statement-indent-fixed) (current-column))
!                  ;; In col 8 with a single tab to the left.
!                (eq ?\t (char-after (line-beginning-position))) 
                 (not (or (eq last-command 'fortran-indent-line)
                          (eq last-command
                              'fortran-indent-new-line))))
            (save-excursion
              (re-search-backward "[^ \t0-9]"
                                  (line-beginning-position)
!                                 t))   ; not a line number
!           (looking-at "[0-9]"))       ; within a line number
        (self-insert-command (prefix-numeric-value arg))
        (skip-chars-backward " \t")
        (insert last-command-char)
        (fortran-indent-line))))
  
+ 
  (defun fortran-check-end-prog-re ()
    "Check a preliminary match against `fortran-end-prog-re'."
    ;; Having got a possible match for the subprogram end, we need a
***************
*** 1004,1012 ****
                (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
--- 1010,1021 ----
                (concat "[ \t]*"
                        (regexp-quote fortran-continuation-string)))
               (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]"))))
!     (while (and (setq not-first-statement (zerop (forward-line -1)))
                (or (looking-at fortran-comment-line-start-skip)
                      (looking-at fortran-directive-re)
+                     (looking-at
+                      (concat "[ \t]*"
+                              (regexp-quote fortran-continuation-string)))
                    (looking-at "[ \t]*$\\| \\{5\\}[^ 0\n]\\|\t[1-9]")
                    (looking-at (concat "[ \t]*" comment-start-skip)))))
      (cond ((and continue-test
***************
*** 1026,1032 ****
    (let (not-last-statement)
      (beginning-of-line)
      (while (and (setq not-last-statement
!                     (and (= (forward-line 1) 0)
                           (not (eobp))))
                (or (looking-at fortran-comment-line-start-skip)
                      (looking-at fortran-directive-re)
--- 1035,1041 ----
    (let (not-last-statement)
      (beginning-of-line)
      (while (and (setq not-last-statement
!                     (and (zerop (forward-line 1))
                           (not (eobp))))
                (or (looking-at fortran-comment-line-start-skip)
                      (looking-at fortran-directive-re)
***************
*** 1034,1039 ****
--- 1043,1049 ----
                    (looking-at (concat "[ \t]*" comment-start-skip)))))
      (if (not not-last-statement)
        'last-statement)))
+ 
  
  (defun fortran-blink-match (regex keyword find-begin)
    "From a line matching REGEX, blink matching KEYWORD statement line.
***************
*** 1043,1068 ****
        (case-fold-search t)
        matching
        message)
!     (if (save-excursion
!         (beginning-of-line)
!         (skip-chars-forward " \t0-9")
!         (looking-at regex))
!       (progn
!           (if (not (setq matching (funcall find-begin)))
!               (setq message (concat "No matching " keyword "."))
!             (if (< matching top-of-window)
!                 (save-excursion
!                   (goto-char matching)
!                   (beginning-of-line)
!                   (setq message
!                         (concat "Matches "
!                                 (buffer-substring (point)
!                                                 (line-end-position)))))))
!         (if message
!             (message "%s" message)
!           (goto-char matching)
!           (sit-for 1)
!           (goto-char end-point))))))
  
  (defun fortran-blink-matching-if ()
    "From an ENDIF or ELSE statement, blink the matching IF statement."
--- 1053,1077 ----
        (case-fold-search t)
        matching
        message)
!     (when (save-excursion
!             (beginning-of-line)
!             (skip-chars-forward " \t0-9")
!             (looking-at regex))
!       (if (not (setq matching (funcall find-begin)))
!           (setq message (concat "No matching " keyword "."))
!         (if (< matching top-of-window)
!             (save-excursion
!               (goto-char matching)
!               (beginning-of-line)
!               (setq message
!                     (concat "Matches "
!                             (buffer-substring (point)
!                                               (line-end-position)))))))
!       (if message
!           (message "%s" message)
!         (goto-char matching)
!         (sit-for 1)
!         (goto-char end-point)))))
  
  (defun fortran-blink-matching-if ()
    "From an ENDIF or ELSE statement, blink the matching IF statement."
***************
*** 1097,1105 ****
        ;; Search for one.
        (save-excursion
        (let ((count 1))
!         (while (and (not (= count 0))
                      (not (eq (fortran-next-statement) 'last-statement))
!                     ;; Keep local to subprogram
                      (not (and (looking-at fortran-end-prog-re)
                                (fortran-check-end-prog-re))))
            (skip-chars-forward " \t0-9")
--- 1106,1114 ----
        ;; Search for one.
        (save-excursion
        (let ((count 1))
!         (while (and (not (zerop count))
                      (not (eq (fortran-next-statement) 'last-statement))
!                     ;; Keep local to subprogram.
                      (not (and (looking-at fortran-end-prog-re)
                                (fortran-check-end-prog-re))))
            (skip-chars-forward " \t0-9")
***************
*** 1107,1114 ****
                   (setq count (1- count)))
                  ((looking-at
                    "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?do[ \t]+[^0-9]")
!                  (setq count (+ count 1)))))
!         (and (= count 0)
               ;; All pairs accounted for.
               (point)))))))
  
--- 1116,1123 ----
                   (setq count (1- count)))
                  ((looking-at
                    "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?do[ \t]+[^0-9]")
!                  (setq count (1+ count)))))
!         (and (zerop count)
               ;; All pairs accounted for.
               (point)))))))
  
***************
*** 1126,1134 ****
        ;; Search for one.
        (save-excursion
        (let ((count 1))
!         (while (and (not (= count 0))
                      (not (eq (fortran-previous-statement) 'first-statement))
!                     ;; Keep local to subprogram
                      (not (and (looking-at fortran-end-prog-re)
                                (fortran-check-end-prog-re))))
            (skip-chars-forward " \t0-9")
--- 1135,1143 ----
        ;; Search for one.
        (save-excursion
        (let ((count 1))
!         (while (and (not (zerop count))
                      (not (eq (fortran-previous-statement) 'first-statement))
!                     ;; Keep local to subprogram.
                      (not (and (looking-at fortran-end-prog-re)
                                (fortran-check-end-prog-re))))
            (skip-chars-forward " \t0-9")
***************
*** 1137,1143 ****
                    ;; Note labelled loop ends not considered.
                  ((looking-at "end[ \t]*do\\b")
                   (setq count (1+ count)))))
!         (and (= count 0)
               ;; All pairs accounted for.
               (point)))))))
  
--- 1146,1152 ----
                    ;; Note labelled loop ends not considered.
                  ((looking-at "end[ \t]*do\\b")
                   (setq count (1+ count)))))
!         (and (zerop count)
               ;; All pairs accounted for.
               (point)))))))
  
***************
*** 1154,1161 ****
            (push-mark)
            (goto-char if-point)))))
  
- (defvar fortran-if-start-re "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?if[ \t]*(")
- 
  (defun fortran-end-if ()
    "Search forwards for first unmatched ENDIF.
  Return point or nil."
--- 1163,1168 ----
***************
*** 1169,1190 ****
        ;; letter on line but this should not cause troubles.
        (save-excursion
        (let ((count 1))
!         (while (and (not (= count 0))
                      (not (eq (fortran-next-statement) 'last-statement))
                      ;; Keep local to subprogram.
                      (not (and (looking-at fortran-end-prog-re)
                                (fortran-check-end-prog-re))))
            (skip-chars-forward " \t0-9")
            (cond ((looking-at "end[ \t]*if\\b")
!                  (setq count (- count 1)))
                  ((looking-at fortran-if-start-re)
                   (save-excursion
                     (if (or
                          (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]")
!                         (let (then-test) ; Multi-line if-then.
                            (while
                                (and
!                                (= (forward-line 1) 0)
                                 ;; Search forward for then.
                                 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")
                                 (not
--- 1176,1197 ----
        ;; letter on line but this should not cause troubles.
        (save-excursion
        (let ((count 1))
!         (while (and (not (zerop count))
                      (not (eq (fortran-next-statement) 'last-statement))
                      ;; Keep local to subprogram.
                      (not (and (looking-at fortran-end-prog-re)
                                (fortran-check-end-prog-re))))
            (skip-chars-forward " \t0-9")
            (cond ((looking-at "end[ \t]*if\\b")
!                  (setq count (1- count)))
                  ((looking-at fortran-if-start-re)
                   (save-excursion
                     (if (or
                          (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]")
!                         (let (then-test) ; multi-line if-then
                            (while
                                (and
!                                (zerop (forward-line 1))
                                 ;; Search forward for then.
                                 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")
                                 (not
***************
*** 1192,1199 ****
                                        (looking-at
                                         ".*then\\b[ \t]*[^ \t(=a-z0-9]")))))
                            then-test))
!                        (setq count (+ count 1)))))))
!         (and (= count 0)
               ;; All pairs accounted for.
               (point)))))))
  
--- 1199,1206 ----
                                        (looking-at
                                         ".*then\\b[ \t]*[^ \t(=a-z0-9]")))))
                            then-test))
!                        (setq count (1+ count)))))))
!         (and (zerop count)
               ;; All pairs accounted for.
               (point)))))))
  
***************
*** 1217,1223 ****
                 ;; Multi-line if-then.
                 (let (then-test)
                   (while
!                      (and (= (forward-line 1) 0)
                            ;; Search forward for then.
                            (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")
                            (not
--- 1224,1230 ----
                 ;; Multi-line if-then.
                 (let (then-test)
                   (while
!                        (and (zerop (forward-line 1))
                            ;; Search forward for then.
                            (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")
                            (not
***************
*** 1230,1236 ****
        ;; Search for one.
        (save-excursion
        (let ((count 1))
!         (while (and (not (= count 0))
                      (not (eq (fortran-previous-statement) 'first-statement))
                      ;; Keep local to subprogram.
                      (not (and (looking-at fortran-end-prog-re)
--- 1237,1243 ----
        ;; Search for one.
        (save-excursion
        (let ((count 1))
!         (while (and (not (zerop count))
                      (not (eq (fortran-previous-statement) 'first-statement))
                      ;; Keep local to subprogram.
                      (not (and (looking-at fortran-end-prog-re)
***************
*** 1240,1249 ****
                   (save-excursion
                     (if (or
                          (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]")
!                         (let (then-test) ; Multi-line if-then.
                            (while
                                (and
!                                (= (forward-line 1) 0)
                                 ;; Search forward for then.
                                 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")
                                 (not
--- 1247,1256 ----
                   (save-excursion
                     (if (or
                          (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]")
!                         (let (then-test) ; multi-line if-then
                            (while
                                (and
!                                (zerop (forward-line 1))
                                 ;; Search forward for then.
                                 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")
                                 (not
***************
*** 1252,1267 ****
                                         (concat ".*then\\b[ \t]*"
                                                 "[^ \t(=a-z0-9]"))))))
                            then-test))
!                        (setq count (- count 1)))))
                  ((looking-at "end[ \t]*if\\b")
!                  (setq count (+ count 1)))))
!         (and (= count 0)
               ;; All pairs accounted for.
               (point)))))))
  
  (defun fortran-indent-line ()
    "Indent current Fortran line based on its contents and on previous lines."
!   (interactive)
    (let ((cfi (fortran-calculate-indent)))
      (save-excursion
        (beginning-of-line)
--- 1259,1275 ----
                                         (concat ".*then\\b[ \t]*"
                                                 "[^ \t(=a-z0-9]"))))))
                            then-test))
!                        (setq count (1- count)))))
                  ((looking-at "end[ \t]*if\\b")
!                  (setq count (1+ count)))))
!         (and (zerop count)
               ;; All pairs accounted for.
               (point)))))))
+ 
  
  (defun fortran-indent-line ()
    "Indent current Fortran line based on its contents and on previous lines."
!   (interactive "*")
    (let ((cfi (fortran-calculate-indent)))
      (save-excursion
        (beginning-of-line)
***************
*** 1275,1292 ****
      ;; Never leave point in left margin.
      (if (< (current-column) cfi)
        (move-to-column cfi))
!     (if (and auto-fill-function
!            (> (save-excursion (end-of-line) (current-column))
!               fill-column))
!       (save-excursion
!         (end-of-line)
!         (fortran-fill)))
!     (if fortran-blink-matching-if
!         (progn
!         (fortran-blink-matching-if)
!         (fortran-blink-matching-do)))))
  
  (defun fortran-auto-fill ()
    (if (> (current-column) (current-fill-column))
        (let ((cfi (fortran-calculate-indent)))
        (save-excursion
--- 1283,1300 ----
      ;; Never leave point in left margin.
      (if (< (current-column) cfi)
        (move-to-column cfi))
!     (and auto-fill-function
!          (> (save-excursion (end-of-line) (current-column))
!             fill-column)
!          (save-excursion
!            (end-of-line)
!            (fortran-fill)))
!     (when fortran-blink-matching-if
!       (fortran-blink-matching-if)
!       (fortran-blink-matching-do))))
  
  (defun fortran-auto-fill ()
+   "Function to use for `normal-auto-fill-function' in Fortran mode."
    (if (> (current-column) (current-fill-column))
        (let ((cfi (fortran-calculate-indent)))
        (save-excursion
***************
*** 1309,1316 ****
  (defalias 'fortran-indent-new-line 'reindent-then-newline-and-indent)
  
  (defun fortran-indent-subprogram ()
!   "Properly indent the Fortran subprogram which contains point."
!   (interactive)
    (save-excursion
      (mark-defun)
      (message "Indenting subprogram...")
--- 1317,1324 ----
  (defalias 'fortran-indent-new-line 'reindent-then-newline-and-indent)
  
  (defun fortran-indent-subprogram ()
!   "Properly indent the Fortran subprogram containing point."
!   (interactive "*")
    (save-excursion
      (mark-defun)
      (message "Indenting subprogram...")
***************
*** 1328,1372 ****
        (setq first-statement (fortran-previous-statement))
        (if first-statement
          (setq icol fortran-minimum-statement-indent)
!       (progn
!         (if (= (point) (point-min))
!             (setq icol fortran-minimum-statement-indent)
!           (setq icol (fortran-current-line-indentation)))
!         (skip-chars-forward " \t0-9")
!         (cond ((looking-at "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?if[ \t]*(")
!                (if (or (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t_$(=a-z0-9]")
!                        (let (then-test)       ;multi-line if-then
!                          (while (and (= (forward-line 1) 0)
!                                      ;;search forward for then
!                                      (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")
!                                      (not (setq then-test
!                                                 (looking-at
!                                                  ".*then\\b[ \t]\
  *[^ \t_$(=a-z0-9]")))))
!                          then-test))
!                    (setq icol (+ icol fortran-if-indent))))
!               ((looking-at "else\\(if\\)?\\b")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "select[ \t]*case[ \t](.*)")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "case[ \t]*(.*)")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "case[ \t]*default\\b")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "\\(otherwise\\|else[ \t]*where\\)\\b")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "where[ \t]*(.*)[ \t]*\n")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "do\\b")
!                (setq icol (+ icol fortran-do-indent)))
!               ((looking-at
!                 "\\(structure\\|union\\|map\\|interface\\)\
  \\b[ \t]*[^ \t=(a-z]")
!                (setq icol (+ icol fortran-structure-indent)))
!               ((and (looking-at fortran-end-prog-re1)
!                     (fortran-check-end-prog-re))
!                ;; Previous END resets indent to minimum
!                (setq icol fortran-minimum-statement-indent))))))
      (save-excursion
        (beginning-of-line)
        (cond ((looking-at "[ \t]*$"))
--- 1336,1379 ----
        (setq first-statement (fortran-previous-statement))
        (if first-statement
          (setq icol fortran-minimum-statement-indent)
!         (if (= (point) (point-min))
!             (setq icol fortran-minimum-statement-indent)
!           (setq icol (fortran-current-line-indentation)))
!         (skip-chars-forward " \t0-9")
!         (cond ((looking-at "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?if[ \t]*(")
!                (if (or (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t_$(=a-z0-9]")
!                        (let (then-test)       ; multi-line if-then
!                          (while (and (zerop (forward-line 1))
!                                      ;; Search forward for then.
!                                      (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")
!                                      (not (setq then-test
!                                                 (looking-at
!                                                  ".*then\\b[ \t]\
  *[^ \t_$(=a-z0-9]")))))
!                          then-test))
!                    (setq icol (+ icol fortran-if-indent))))
!               ((looking-at "else\\(if\\)?\\b")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "select[ \t]*case[ \t](.*)")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "case[ \t]*(.*)")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "case[ \t]*default\\b")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "\\(otherwise\\|else[ \t]*where\\)\\b")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "where[ \t]*(.*)[ \t]*\n")
!                (setq icol (+ icol fortran-if-indent)))
!               ((looking-at "do\\b")
!                (setq icol (+ icol fortran-do-indent)))
!               ((looking-at
!                 "\\(structure\\|union\\|map\\|interface\\)\
  \\b[ \t]*[^ \t=(a-z]")
!                (setq icol (+ icol fortran-structure-indent)))
!               ((and (looking-at fortran-end-prog-re1)
!                     (fortran-check-end-prog-re))
!                ;; Previous END resets indent to minimum.
!                (setq icol fortran-minimum-statement-indent)))))
      (save-excursion
        (beginning-of-line)
        (cond ((looking-at "[ \t]*$"))
***************
*** 1380,1390 ****
                    (setq icol (+ fortran-minimum-statement-indent
                                  fortran-comment-line-extra-indent))))
             (setq fortran-minimum-statement-indent 0))
!           ((or (looking-at (concat "[ \t]*"
                                     (regexp-quote
                                      fortran-continuation-string)))
                 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]"))
!            (setq icol (+ icol fortran-continuation-indent)))
            (first-statement)
            ((and fortran-check-all-num-for-matching-do
                  (looking-at "[ \t]*[0-9]+")
--- 1387,1402 ----
                    (setq icol (+ fortran-minimum-statement-indent
                                  fortran-comment-line-extra-indent))))
             (setq fortran-minimum-statement-indent 0))
!           ((or (looking-at (concat "[ \t]*"
                                     (regexp-quote
                                      fortran-continuation-string)))
                 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]"))
!              (skip-chars-forward " \t")
!              ;; Do not introduce extra whitespace into a broken string.
!              (setq icol
!                    (if (fortran-is-in-string-p (point))
!                        6
!                      (+ icol fortran-continuation-indent))))
            (first-statement)
            ((and fortran-check-all-num-for-matching-do
                  (looking-at "[ \t]*[0-9]+")
***************
*** 1414,1419 ****
--- 1426,1432 ----
                    (message "Warning: `end' not in column %d.  Probably\
   an unclosed block." fortran-minimum-statement-indent))))))
      (max fortran-minimum-statement-indent icol)))
+ 
  
  (defun fortran-current-line-indentation ()
    "Indentation of current line, ignoring Fortran line number or continuation.
***************
*** 1439,1445 ****
      (current-column)))
  
  (defun fortran-indent-to-column (col)
!   "Indent current line with spaces to column COL.
  notes: 1) A non-zero/non-blank character in column 5 indicates a continuation
            line, and this continuation character is retained on indentation;
         2) If `fortran-continuation-string' is the first non-whitespace
--- 1452,1458 ----
      (current-column)))
  
  (defun fortran-indent-to-column (col)
!   "Indent current line to column COL.
  notes: 1) A non-zero/non-blank character in column 5 indicates a continuation
            line, and this continuation character is retained on indentation;
         2) If `fortran-continuation-string' is the first non-whitespace
***************
*** 1472,1479 ****
                       (insert ?\t (fortran-numerical-continuation-char) 1))
              (forward-char 6))
          (delete-horizontal-space)
!         ;; Put line number in columns 0-4
!         ;; or put continuation character in column 5.
          (cond ((eobp))
                ((looking-at (regexp-quote fortran-continuation-string))
                 (if indent-tabs-mode
--- 1485,1492 ----
                       (insert ?\t (fortran-numerical-continuation-char) 1))
              (forward-char 6))
          (delete-horizontal-space)
!         ;; Put line number in columns 0-4, or
!           ;; continuation character in column 5.
          (cond ((eobp))
                ((looking-at (regexp-quote fortran-continuation-string))
                 (if indent-tabs-mode
***************
*** 1497,1507 ****
        (delete-horizontal-space)
        (indent-to col)
        ;; Indent any comment following code on the same line.
!       (if (fortran-find-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)))))))))
  
  (defun fortran-line-number-indented-correctly-p ()
    "Return t if current line's line number is correctly indented.
--- 1510,1520 ----
        (delete-horizontal-space)
        (indent-to col)
        ;; Indent any comment following code on the same line.
!       (when (fortran-find-comment-start-skip)
!         (goto-char (match-beginning 0))
!         (unless (= (current-column) (fortran-comment-indent))
!           (delete-horizontal-space)
!           (indent-to (fortran-comment-indent)))))))
  
  (defun fortran-line-number-indented-correctly-p ()
    "Return t if current line's line number is correctly indented.
***************
*** 1521,1553 ****
        charnum)
      (save-excursion
        (beginning-of-line)
!       (if (looking-at "[ \t]*[0-9]+")
!         (progn
!           (skip-chars-forward " \t")
!           (skip-chars-forward "0")    ;skip past leading zeros
!           (setq charnum
!                 (buffer-substring (point) (progn
!                                             (skip-chars-forward "0-9")
!                                             (point))))
!           (beginning-of-line)
!           (save-restriction
!             (save-excursion
!               (narrow-to-defun)
!               (and (re-search-backward
!                     (concat
!                      "\\(^[ \t0-9]*do[ \t]*0*"
!                      charnum "\\b\\)\\|" "\\(^[ \t]*0*"
!                      charnum "\\b\\)")
!                     nil t)
!                    (looking-at
!                     (concat "^[ \t0-9]*do[ \t]*0*"
!                             charnum))))))))))
  
  (defun fortran-find-comment-start-skip (&optional all)
    "Move to past `comment-start-skip' found on current line.
  Return non-nil if `comment-start-skip' found, nil if not.
  If ALL is nil, only match comments that start in column > 0."
-   (interactive)
    ;; 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)
--- 1534,1564 ----
        charnum)
      (save-excursion
        (beginning-of-line)
!       (when (looking-at "[ \t]*[0-9]+")
!         (skip-chars-forward " \t")
!         (skip-chars-forward "0")      ; skip past leading zeros
!         (setq charnum
!               (buffer-substring (point) (progn
!                                           (skip-chars-forward "0-9")
!                                           (point))))
!         (beginning-of-line)
!         (save-restriction
!           (save-excursion
!             (narrow-to-defun)
!             (and (re-search-backward
!                   (concat
!                    "\\(^[ \t0-9]*do[ \t]*0*"
!                    charnum "\\b\\)\\|" "\\(^[ \t]*0*"
!                    charnum "\\b\\)")
!                   nil t)
!                  (looking-at
!                   (concat "^[ \t0-9]*do[ \t]*0*"
!                           charnum)))))))))
  
  (defun fortran-find-comment-start-skip (&optional all)
    "Move to past `comment-start-skip' found on current line.
  Return non-nil if `comment-start-skip' found, nil if not.
  If ALL is nil, only match comments that start in column > 0."
    ;; 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)
***************
*** 1566,1572 ****
          (goto-char pos)
          nil)))))
  
! ;;From: address@hidden (Ralf Fassel)
  ;; Test if TAB format continuation lines work.
  (defun fortran-is-in-string-p (where)
    "Return non-nil iff WHERE (a buffer position) is inside a Fortran string."
--- 1577,1583 ----
          (goto-char pos)
          nil)))))
  
! ;; From: address@hidden (Ralf Fassel)
  ;; Test if TAB format continuation lines work.
  (defun fortran-is-in-string-p (where)
    "Return non-nil iff WHERE (a buffer position) is inside a Fortran string."
***************
*** 1577,1594 ****
       ((save-excursion                 ; comment lines too
        (beginning-of-line)
        (looking-at fortran-comment-line-start-skip)) nil)
!      (t (let (;; ok, serious now. Init some local vars:
!             (parse-state '(0 nil nil nil nil nil 0))
              (quoted-comment-start (if comment-start
                                        (regexp-quote comment-start)))
              (not-done t)
              parse-limit end-of-line)
!         ;; move to start of current statement
          (fortran-next-statement)
          (fortran-previous-statement)
!         ;; now parse up to WHERE
          (while not-done
!           (if (or ;; skip to next line if:
                 ;; - comment line?
                 (looking-at fortran-comment-line-start-skip)
                 ;; - at end of line?
--- 1588,1604 ----
       ((save-excursion                 ; comment lines too
        (beginning-of-line)
        (looking-at fortran-comment-line-start-skip)) nil)
!      (t (let ((parse-state '(0 nil nil nil nil nil 0))
              (quoted-comment-start (if comment-start
                                        (regexp-quote comment-start)))
              (not-done t)
              parse-limit end-of-line)
!         ;; Move to start of current statement.
          (fortran-next-statement)
          (fortran-previous-statement)
!         ;; Now parse up to WHERE.
          (while not-done
!           (if (or ;; Skip to next line if:
                 ;; - comment line?
                 (looking-at fortran-comment-line-start-skip)
                 ;; - at end of line?
***************
*** 1601,1635 ****
                (if (> (forward-line) 0)
                    (setq not-done nil))
              ;; else:
!             ;; if we are at beginning of code line, skip any
              ;; whitespace, labels and tab continuation markers.
              (if (bolp) (skip-chars-forward " \t0-9"))
!             ;; if we are in column <= 5 now, check for continuation char
              (cond ((= 5 (current-column)) (forward-char 1))
                    ((and (< (current-column) 5)
                          (equal fortran-continuation-string
                                 (char-to-string (following-char)))
                          (forward-char 1))))
!             ;; find out parse-limit from here
              (setq end-of-line (line-end-position))
              (setq parse-limit (min where end-of-line))
!             ;; parse max up to comment-start, if non-nil and in current line
              (if comment-start
                  (save-excursion
                    (if (re-search-forward quoted-comment-start end-of-line t)
                        (setq parse-limit (min (point) parse-limit)))))
!             ;; now parse if still in limits
              (if (< (point) where)
                  (setq parse-state (parse-partial-sexp
                                     (point) parse-limit nil nil parse-state))
                (setq not-done nil))))
!         ;; result is
          (nth 3 parse-state))))))
  
  ;; From old version.
  (defalias 'fortran-auto-fill-mode 'auto-fill-mode)
  
  (defun fortran-fill ()
    (let* ((auto-fill-function #'fortran-auto-fill)
         (opoint (point))
         (bol (line-beginning-position))
--- 1611,1646 ----
                (if (> (forward-line) 0)
                    (setq not-done nil))
              ;; else:
!             ;; If we are at beginning of code line, skip any
              ;; whitespace, labels and tab continuation markers.
              (if (bolp) (skip-chars-forward " \t0-9"))
!             ;; If we are in column <= 5 now, check for continuation char.
              (cond ((= 5 (current-column)) (forward-char 1))
                    ((and (< (current-column) 5)
                          (equal fortran-continuation-string
                                 (char-to-string (following-char)))
                          (forward-char 1))))
!             ;; Find out parse-limit from here.
              (setq end-of-line (line-end-position))
              (setq parse-limit (min where end-of-line))
!             ;; Parse max up to comment-start, if non-nil and in current line.
              (if comment-start
                  (save-excursion
                    (if (re-search-forward quoted-comment-start end-of-line t)
                        (setq parse-limit (min (point) parse-limit)))))
!             ;; Now parse if still in limits.
              (if (< (point) where)
                  (setq parse-state (parse-partial-sexp
                                     (point) parse-limit nil nil parse-state))
                (setq not-done nil))))
!         ;; Result.
          (nth 3 parse-state))))))
  
  ;; From old version.
  (defalias 'fortran-auto-fill-mode 'auto-fill-mode)
  
  (defun fortran-fill ()
+   "Fill the current line at an appropriate point(s)."
    (let* ((auto-fill-function #'fortran-auto-fill)
         (opoint (point))
         (bol (line-beginning-position))
***************
*** 1638,1652 ****
         (quote
          (save-excursion
            (goto-char bol)
!           (if (looking-at fortran-comment-line-start-skip)
!               nil                     ; OK to break quotes on comment lines.
              (move-to-column fill-column)
!             (if (fortran-is-in-string-p (point))
!                 (save-excursion (re-search-backward "\\S\"\\s\"\\S\"" bol t)
!                                 (if fortran-break-before-delimiters
!                                     (point)
!                                   (1+ (point))))))))
!        ;; decide where to split the line. If a position for a quoted
         ;; string was found above then use that, else break the line
         ;; before the last delimiter.
         ;; Delimiters are whitespace, commas, and operators.
--- 1649,1674 ----
         (quote
          (save-excursion
            (goto-char bol)
!           ;; OK to break quotes on comment lines.
!           (unless (looking-at fortran-comment-line-start-skip)
!               (let (fcpoint start)
              (move-to-column fill-column)
!             (when (fortran-is-in-string-p (setq fcpoint (point)))
!                 (save-excursion
!                   (re-search-backward "\\S\"\\s\"\\S\"" bol t)
!                   (setq start
!                         (if fortran-break-before-delimiters
!                             (point)
!                           (1+ (point)))))
!                 (if (re-search-forward "\\S\"\\s\"\\S\"" eol t)
!                     (backward-char 2))
!                 ;; If the current string is longer than 72 - 6 chars,
!                 ;; break it at the fill column (else infinite loop).
!                 (if (> (- (point) start)
!                        (- fill-column 6 fortran-continuation-indent))
!                     fcpoint
!                   start))))))
!        ;; Decide where to split the line. If a position for a quoted
         ;; string was found above then use that, else break the line
         ;; before the last delimiter.
         ;; Delimiters are whitespace, commas, and operators.
***************
*** 1655,1670 ****
          (or quote
              (save-excursion
                (move-to-column (1+ fill-column))
                (skip-chars-backward "^ \t\n,'+-/*=)"
  ;;;            (if fortran-break-before-delimiters
  ;;;                "^ \t\n,'+-/*=" "^ \t\n,'+-/*=)")
                 )
!               (if (<= (point) (1+ bos))
!                   (progn
!                     (move-to-column (1+ fill-column))
!                     ;;what is this doing???
!                     (if (not (re-search-forward "[\t\n,'+-/*)=]" eol t))
!                         (goto-char bol))))
                (if (bolp)
                    (re-search-forward "[ \t]" opoint t)
                  (backward-char)
--- 1677,1692 ----
          (or quote
              (save-excursion
                (move-to-column (1+ fill-column))
+                 ;; GM Make this a defcustom as in f90-mode? Add ", (?
                (skip-chars-backward "^ \t\n,'+-/*=)"
  ;;;            (if fortran-break-before-delimiters
  ;;;                "^ \t\n,'+-/*=" "^ \t\n,'+-/*=)")
                 )
!               (when (<= (point) (1+ bos))
!                   (move-to-column (1+ fill-column))
!                   ;; What is this doing???
!                   (or (re-search-forward "[\t\n,'+-/*)=]" eol t)
!                       (goto-char bol)))
                (if (bolp)
                    (re-search-forward "[ \t]" opoint t)
                  (backward-char)
***************
*** 1674,1685 ****
                (if fortran-break-before-delimiters
                    (point)
                  (1+ (point)))))))
!     ;; if we are in an in-line comment, don't break unless the
      ;; line of code is longer than it should be. Otherwise
      ;; break the line at the column computed above.
      ;;
!     ;; Need to use fortran-find-comment-start-skip to make sure that quoted 
!'s
!     ;; don't prevent a break.
      (when (and (save-excursion
                 (beginning-of-line)
                 (if (not (fortran-find-comment-start-skip))
--- 1696,1707 ----
                (if fortran-break-before-delimiters
                    (point)
                  (1+ (point)))))))
!     ;; If we are in an in-line comment, don't break unless the
      ;; line of code is longer than it should be. Otherwise
      ;; break the line at the column computed above.
      ;;
!     ;; Need to use fortran-find-comment-start-skip to make sure that
!     ;; quoted !'s don't prevent a break.
      (when (and (save-excursion
                 (beginning-of-line)
                 (if (not (fortran-find-comment-start-skip))
***************
*** 1700,1705 ****
--- 1722,1728 ----
        (end-of-line))))
  
  (defun fortran-break-line ()
+   "Call `fortran-split-line'.  Joins continuation lines first, then refills."
    (let ((opoint (point))
        (bol (line-beginning-position))
        (comment-string
***************
*** 1707,1713 ****
           (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)
                        (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]"))
        (progn
--- 1730,1736 ----
           (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)
                        (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]"))
        (progn
***************
*** 1726,1737 ****
  
  (defun fortran-analyze-file-format ()
    "Return nil if fixed format is used, t if TAB formatting is used.
! Use `fortran-tab-mode-default' if no non-comment statements are found in the
! file before the end or the first `fortran-analyze-depth' lines."
    (let ((i 0))
      (save-excursion
        (goto-char (point-min))
-       (setq i 0)
        (while (not (or
                   (eobp)
                   (eq (char-after) ?\t)
--- 1749,1759 ----
  
  (defun fortran-analyze-file-format ()
    "Return nil if fixed format is used, t if TAB formatting is used.
! Use `fortran-tab-mode-default' if no non-comment statements are found
! before the end or in the first `fortran-analyze-depth' lines."
    (let ((i 0))
      (save-excursion
        (goto-char (point-min))
        (while (not (or
                   (eobp)
                   (eq (char-after) ?\t)
***************
*** 1742,1793 ****
        (cond
         ((eq (char-after) ?\t) t)
         ((looking-at " \\{6\\}") nil)
!        (fortran-tab-mode-default t)
!        (t nil)))))
! 
! (or (assq 'fortran-tab-mode-string minor-mode-alist)
!     (setq minor-mode-alist (cons
!                           '(fortran-tab-mode-string
!                             (indent-tabs-mode fortran-tab-mode-string))
!                           minor-mode-alist)))
  
  (defun fortran-fill-paragraph (&optional justify)
    "Fill surrounding comment block as paragraphs, else fill statement.
! Intended as the value of `fill-paragraph-function'."
!   (interactive "P")
    (or (fill-comment-paragraph justify)
        (fortran-fill-statement)
        t))
  
  (defun fortran-fill-statement ()
!   "Fill a fortran statement up to `fill-column'."
!   (interactive)
    (let ((auto-fill-function #'fortran-auto-fill))
!     (if (not (save-excursion
!              (beginning-of-line)
!              (or (looking-at "[ \t]*$")
!                  (looking-at fortran-comment-line-start-skip)
!                  (and comment-start-skip
!                       (looking-at (concat "[ \t]*" comment-start-skip))))))
!       (save-excursion
!         ;; Find beginning of statement.
!         (fortran-next-statement)
!         (fortran-previous-statement)
!         ;; Re-indent initially.
!         (fortran-indent-line)
!         ;; Replace newline plus continuation field plus indentation with
!         ;; single space.
!         (while (progn
!                  (forward-line)
!                  (fortran-remove-continuation)))
!         (fortran-previous-statement)))
      (fortran-indent-line)))
  
  (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))
      (while (re-search-forward "^.\\{72\\}\\(.*\\)" nil t)
--- 1764,1811 ----
        (cond
         ((eq (char-after) ?\t) t)
         ((looking-at " \\{6\\}") nil)
!        (t fortran-tab-mode-default)))))
  
  (defun fortran-fill-paragraph (&optional justify)
    "Fill surrounding comment block as paragraphs, else fill statement.
! Intended as the value of `fill-paragraph-function'.
! A comment block is filled by calling `fill-comment-paragraph' with
! argument JUSTIFY, otherwise `fortran-fill-statement' is called.
! Always returns non-nil (to prevent `fill-paragraph' being called)."
!   (interactive "*P")
    (or (fill-comment-paragraph justify)
        (fortran-fill-statement)
        t))
  
  (defun fortran-fill-statement ()
!   "Fill a Fortran statement up to `fill-column'."
!   (interactive "*")
    (let ((auto-fill-function #'fortran-auto-fill))
!     (unless (save-excursion
!               (beginning-of-line)
!               (or (looking-at "[ \t]*$")
!                   (looking-at fortran-comment-line-start-skip)
!                   (and comment-start-skip
!                        (looking-at (concat "[ \t]*" comment-start-skip)))))
!       (save-excursion
!         ;; Find beginning of statement.
!         (fortran-next-statement)
!         (fortran-previous-statement)
!         ;; Re-indent initially.
!         (fortran-indent-line)
!         ;; Replace newline plus continuation field plus indentation with
!         ;; single space.
!         (while (progn
!                  (forward-line)
!                  (fortran-remove-continuation)))
!         (fortran-previous-statement)))
      (fortran-indent-line)))
  
  (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))
      (while (re-search-forward "^.\\{72\\}\\(.*\\)" nil t)
***************
*** 1802,1808 ****
      ;; We must be inside function body for this to work.
      (fortran-beginning-of-subprogram)
      (let ((case-fold-search t))               ; case-insensitive
!       ;; search for fortran subprogram start
        (if (re-search-forward
             (concat "^[ \t]*\\(program\\|subroutine\\|function"
                     "\\|[ \ta-z0-9*()]*[ \t]+function\\|"
--- 1820,1826 ----
      ;; We must be inside function body for this to work.
      (fortran-beginning-of-subprogram)
      (let ((case-fold-search t))               ; case-insensitive
!       ;; Search for fortran subprogram start.
        (if (re-search-forward
             (concat "^[ \t]*\\(program\\|subroutine\\|function"
                     "\\|[ \ta-z0-9*()]*[ \t]+function\\|"
***************
*** 1812,1818 ****
             t)
            (or (match-string-no-properties 2)
                (progn
!                 ;; move to EOL or before first left paren
                  (if (re-search-forward "[(\n]" nil t)
                      (progn (backward-char)
                             (skip-chars-backward " \t"))
--- 1830,1836 ----
             t)
            (or (match-string-no-properties 2)
                (progn
!                 ;; Move to EOL or before first left paren.
                  (if (re-search-forward "[(\n]" nil t)
                      (progn (backward-char)
                             (skip-chars-backward " \t"))
***************
*** 1824,1827 ****
--- 1842,1846 ----
  
  (provide 'fortran)
  
+ ;;; arch-tag: 74935096-21c4-4cab-8ee5-6ef16090dc04
  ;;; fortran.el ends here




reply via email to

[Prev in Thread] Current Thread [Next in Thread]