-(defvar fortran-mode-abbrev-table nil)
-(if fortran-mode-abbrev-table
- ()
- (let ((ac abbrevs-changed))
- (define-abbrev-table 'fortran-mode-abbrev-table ())
- (define-abbrev fortran-mode-abbrev-table ";au" "automatic" nil)
- (define-abbrev fortran-mode-abbrev-table ";b" "byte" nil)
- (define-abbrev fortran-mode-abbrev-table ";bd" "block data" nil)
- (define-abbrev fortran-mode-abbrev-table ";ch" "character" nil)
- (define-abbrev fortran-mode-abbrev-table ";cl" "close" nil)
- (define-abbrev fortran-mode-abbrev-table ";c" "continue" nil)
- (define-abbrev fortran-mode-abbrev-table ";cm" "common" nil)
- (define-abbrev fortran-mode-abbrev-table ";cx" "complex" nil)
- (define-abbrev fortran-mode-abbrev-table ";df" "define" nil)
- (define-abbrev fortran-mode-abbrev-table ";di" "dimension" nil)
- (define-abbrev fortran-mode-abbrev-table ";do" "double" nil)
- (define-abbrev fortran-mode-abbrev-table ";dc" "double complex" nil)
- (define-abbrev fortran-mode-abbrev-table ";dp" "double precision" nil)
- (define-abbrev fortran-mode-abbrev-table ";dw" "do while" nil)
- (define-abbrev fortran-mode-abbrev-table ";e" "else" nil)
- (define-abbrev fortran-mode-abbrev-table ";ed" "enddo" nil)
- (define-abbrev fortran-mode-abbrev-table ";el" "elseif" nil)
- (define-abbrev fortran-mode-abbrev-table ";en" "endif" nil)
- (define-abbrev fortran-mode-abbrev-table ";eq" "equivalence" nil)
- (define-abbrev fortran-mode-abbrev-table ";ew" "endwhere" nil)
- (define-abbrev fortran-mode-abbrev-table ";ex" "external" nil)
- (define-abbrev fortran-mode-abbrev-table ";ey" "entry" nil)
- (define-abbrev fortran-mode-abbrev-table ";f" "format" nil)
- (define-abbrev fortran-mode-abbrev-table ";fa" ".false." nil)
- (define-abbrev fortran-mode-abbrev-table ";fu" "function" nil)
- (define-abbrev fortran-mode-abbrev-table ";g" "goto" nil)
- (define-abbrev fortran-mode-abbrev-table ";im" "implicit" nil)
- (define-abbrev fortran-mode-abbrev-table ";ib" "implicit byte" nil)
- (define-abbrev fortran-mode-abbrev-table ";ic" "implicit complex" nil)
- (define-abbrev fortran-mode-abbrev-table ";ich" "implicit character" nil)
- (define-abbrev fortran-mode-abbrev-table ";ii" "implicit integer" nil)
- (define-abbrev fortran-mode-abbrev-table ";il" "implicit logical" nil)
- (define-abbrev fortran-mode-abbrev-table ";ir" "implicit real" nil)
- (define-abbrev fortran-mode-abbrev-table ";inc" "include" nil)
- (define-abbrev fortran-mode-abbrev-table ";in" "integer" nil)
- (define-abbrev fortran-mode-abbrev-table ";intr" "intrinsic" nil)
- (define-abbrev fortran-mode-abbrev-table ";l" "logical" nil)
- (define-abbrev fortran-mode-abbrev-table ";n" "namelist" nil)
- (define-abbrev fortran-mode-abbrev-table ";o" "open" nil) ; was ;op
- (define-abbrev fortran-mode-abbrev-table ";pa" "parameter" nil)
- (define-abbrev fortran-mode-abbrev-table ";pr" "program" nil)
- (define-abbrev fortran-mode-abbrev-table ";ps" "pause" nil)
- (define-abbrev fortran-mode-abbrev-table ";p" "print" nil)
- (define-abbrev fortran-mode-abbrev-table ";rc" "record" nil)
- (define-abbrev fortran-mode-abbrev-table ";re" "real" nil)
- (define-abbrev fortran-mode-abbrev-table ";r" "read" nil)
- (define-abbrev fortran-mode-abbrev-table ";rt" "return" nil)
- (define-abbrev fortran-mode-abbrev-table ";rw" "rewind" nil)
- (define-abbrev fortran-mode-abbrev-table ";s" "stop" nil)
- (define-abbrev fortran-mode-abbrev-table ";sa" "save" nil)
- (define-abbrev fortran-mode-abbrev-table ";st" "structure" nil)
- (define-abbrev fortran-mode-abbrev-table ";sc" "static" nil)
- (define-abbrev fortran-mode-abbrev-table ";su" "subroutine" nil)
- (define-abbrev fortran-mode-abbrev-table ";tr" ".true." nil)
- (define-abbrev fortran-mode-abbrev-table ";ty" "type" nil)
- (define-abbrev fortran-mode-abbrev-table ";vo" "volatile" nil)
- (define-abbrev fortran-mode-abbrev-table ";w" "write" nil)
- (define-abbrev fortran-mode-abbrev-table ";wh" "where" nil)
- (setq abbrevs-changed ac)))
+(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)
+ (define-key map "3" 'fortran-electric-line-number)
+ (define-key map "4" 'fortran-electric-line-number)
+ (define-key map "5" 'fortran-electric-line-number)
+ (define-key map "6" 'fortran-electric-line-number)
+ (define-key map "7" 'fortran-electric-line-number)
+ (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.")
+