comparison lisp/progmodes/f90.el @ 47010:dd3a10c87fe8

(f90-xemacs-flag, f90-xemacs-menu, f90-menu-bar-menu, f90-change-case-menu) (f90-font-lock-on, f90-font-lock-off, f90-font-lock-menu): Deleted. Use easy-menu-define instead. (f90-mode): Use easy-menu-add. No longer (require 'imenu) when compiling. (f90-mark-subprogram, f90-indent-region, f90-fill-region) (f90-abbrev-start): Use fboundp.
author Glenn Morris <rgm@gnu.org>
date Sat, 24 Aug 2002 00:47:17 +0000
parents c4e4658185e3
children 978b0db16be0
comparison
equal deleted inserted replaced
47009:2ed348de0e05 47010:dd3a10c87fe8
154 ;; Support for hideshow, align. 154 ;; Support for hideshow, align.
155 ;; OpenMP, preprocessor highlighting. 155 ;; OpenMP, preprocessor highlighting.
156 156
157 ;;; Code: 157 ;;; Code:
158 158
159 (eval-and-compile
160 (defconst f90-xemacs-flag (string-match "XEmacs\\|Lucid" emacs-version)
161 "Non-nil means F90 mode thinks it is running under XEmacs."))
162
163 ;; Most of these are just to quieten the byte-compiler.
164 (eval-when-compile 159 (eval-when-compile
165 (defvar comment-auto-fill-only-comments) 160 (defvar comment-auto-fill-only-comments)
166 (defvar font-lock-keywords) 161 (defvar font-lock-keywords))
167 (unless f90-xemacs-flag
168 ;; If you have GNU Emacs 19.22 or earlier, comment this out, or get imenu.
169 (require 'imenu)
170 (defvar current-menubar)))
171 162
172 ;; User options 163 ;; User options
173 164
174 (defgroup f90 nil 165 (defgroup f90 nil
175 "Major mode for editing Fortran 90,95 code." 166 "Major mode for editing Fortran 90,95 code."
466 (define-key map "*" 'f90-electric-insert) 457 (define-key map "*" 'f90-electric-insert)
467 (define-key map "/" 'f90-electric-insert) 458 (define-key map "/" 'f90-electric-insert)
468 map) 459 map)
469 "Keymap used in F90 mode.") 460 "Keymap used in F90 mode.")
470 461
471 ;; Menu bar support. 462
472 (if f90-xemacs-flag 463 (easy-menu-define f90-menu f90-mode-map "Menu for F90 mode."
473 (defvar f90-xemacs-menu 464 '("F90"
474 '("F90" 465 ["Indent Subprogram" f90-indent-subprogram t]
475 ["Indent Subprogram" f90-indent-subprogram t] 466 ["Mark Subprogram" f90-mark-subprogram t]
476 ["Mark Subprogram" f90-mark-subprogram t] 467 ["Beginning of Subprogram" f90-beginning-of-subprogram t]
477 ["Beginning of Subprogram" f90-beginning-of-subprogram t] 468 ["End of Subprogram" f90-end-of-subprogram t]
478 ["End of Subprogram" f90-end-of-subprogram t] 469 "--"
479 "-----" 470 ["(Un)Comment Region" f90-comment-region mark-active]
480 ["(Un)Comment Region" f90-comment-region t] 471 ["Indent Region" f90-indent-region mark-active]
481 ["Indent Region" indent-region t] 472 ["Fill Region" f90-fill-region mark-active]
482 ["Fill Region" f90-fill-region t] 473 "--"
483 "-----" 474 ["Break Line at Point" f90-break-line t]
484 ["Break Line at Point" f90-break-line t] 475 ["Join with Next Line" f90-join-lines t]
485 ["Join with Next Line" f90-join-lines t] 476 ["Insert Block End" f90-insert-end t]
486 ["Insert Newline" newline t] 477 "--"
487 ["Insert Block End" f90-insert-end t] 478 ("Highlighting"
488 "-----" 479 ["Toggle font-lock-mode" font-lock-mode :active t
489 ["Upcase Keywords (buffer)" f90-upcase-keywords t] 480 :selected font-lock-mode :style toggle]
490 ["Upcase Keywords (region)" f90-upcase-region-keywords t] 481 "--"
491 ["Capitalize Keywords (buffer)" f90-capitalize-keywords t] 482 ["Light highlighting (level 1)" f90-font-lock-1 t]
492 ["Capitalize Keywords (region)" f90-capitalize-region-keywords t] 483 ["Moderate highlighting (level 2)" f90-font-lock-2 t]
493 ["Downcase Keywords (buffer)" f90-downcase-keywords t] 484 ["Heavy highlighting (level 3)" f90-font-lock-3 t]
494 ["Downcase Keywords (region)" f90-downcase-region-keywords t] 485 ["Maximum highlighting (level 4)" f90-font-lock-4 t]
495 "-----" 486 )
496 ["Toggle abbrev-mode" abbrev-mode t] 487 ("Change Keyword Case"
497 ["Toggle auto-fill" auto-fill-mode t]) 488 ["Upcase Keywords (buffer)" f90-upcase-keywords t]
498 "XEmacs menu for F90 mode.") 489 ["Capitalize Keywords (buffer)" f90-capitalize-keywords t]
499 490 ["Downcase Keywords (buffer)" f90-downcase-keywords t]
500 ;; Emacs. 491 "--"
501 (defvar f90-menu-bar-menu 492 ["Upcase Keywords (region)" f90-upcase-region-keywords mark-active]
502 (let ((map (make-sparse-keymap "F90"))) 493 ["Capitalize Keywords (region)" f90-capitalize-region-keywords
503 (define-key map [f90-imenu-menu] 494 mark-active]
504 '("Add imenu Menu" . f90-add-imenu-menu)) 495 ["Downcase Keywords (region)" f90-downcase-region-keywords mark-active]
505 (define-key map [abbrev-mode] 496 )
506 '("Toggle abbrev-mode" . abbrev-mode)) 497 "--"
507 (define-key map [auto-fill-mode] 498 ["Toggle auto-fill" auto-fill-mode :active t :selected auto-fill-function
508 '("Toggle auto-fill" . auto-fill-mode)) 499 :style toggle]
509 (define-key map [line1] '("--")) 500 ["Toggle abbrev-mode" abbrev-mode :active t :selected abbrev-mode
510 (define-key map [f90-change-case-menu] 501 :style toggle]
511 '("Change Keyword Case" . f90-change-case-menu)) 502 ["Add imenu Menu" f90-add-imenu-menu :active (not f90-imenu-flag)
512 (define-key map [f90-font-lock-menu] 503 :visible (fboundp 'imenu-add-to-menubar)]
513 '("Highlighting" . f90-font-lock-menu)) 504 ))
514 (define-key map [line2] '("--")) 505
515 (define-key map [f90-insert-end] 506 (defun f90-font-lock-1 ()
516 '("Insert Block End" . f90-insert-end)) 507 "Set `font-lock-keywords' to `f90-font-lock-keywords-1'."
517 (define-key map [f90-join-lines] 508 (interactive)
518 '("Join with Next Line" . f90-join-lines)) 509 (font-lock-mode 1)
519 (define-key map [f90-break-line] 510 (setq font-lock-keywords f90-font-lock-keywords-1)
520 '("Break Line at Point" . f90-break-line)) 511 (font-lock-fontify-buffer))
521 (define-key map [line3] '("--")) 512
522 (define-key map [f90-fill-region] 513 (defun f90-font-lock-2 ()
523 '("Fill Region" . f90-fill-region)) 514 "Set `font-lock-keywords' to `f90-font-lock-keywords-2'."
524 (put 'f90-fill-region 'menu-enable 'mark-active) 515 (interactive)
525 (define-key map [indent-region] 516 (font-lock-mode 1)
526 '("Indent Region" . indent-region)) 517 (setq font-lock-keywords f90-font-lock-keywords-2)
527 (define-key map [f90-comment-region] 518 (font-lock-fontify-buffer))
528 '("(Un)Comment Region" . f90-comment-region)) 519
529 (put 'f90-comment-region 'menu-enable 'mark-active) 520 (defun f90-font-lock-3 ()
530 (define-key map [line4] '("--")) 521 "Set `font-lock-keywords' to `f90-font-lock-keywords-3'."
531 (define-key map [f90-end-of-subprogram] 522 (interactive)
532 '("End of Subprogram" . f90-end-of-subprogram)) 523 (font-lock-mode 1)
533 (define-key map [f90-beginning-of-subprogram] 524 (setq font-lock-keywords f90-font-lock-keywords-3)
534 '("Beginning of Subprogram" . f90-beginning-of-subprogram)) 525 (font-lock-fontify-buffer))
535 (define-key map [f90-mark-subprogram] 526
536 '("Mark Subprogram" . f90-mark-subprogram)) 527 (defun f90-font-lock-4 ()
537 (define-key map [f90-indent-subprogram] 528 "Set `font-lock-keywords' to `f90-font-lock-keywords-4'."
538 '("Indent Subprogram" . f90-indent-subprogram)) 529 (interactive)
539 map) 530 (font-lock-mode 1)
540 "F90 mode top-level menu bar menu.") 531 (setq font-lock-keywords f90-font-lock-keywords-4)
541 532 (font-lock-fontify-buffer))
542 (define-key f90-mode-map [menu-bar f90-menu] 533
543 (cons "F90" f90-menu-bar-menu)) 534
544
545 (defvar f90-change-case-menu
546 (let ((map (make-sparse-keymap "Change Keyword Case")))
547 (define-key map [dkr]
548 '("Downcase Keywords (region)" . f90-downcase-region-keywords))
549 (put 'f90-downcase-region-keywords 'menu-enable 'mark-active)
550 (define-key map [ckr]
551 '("Capitalize Keywords (region)" . f90-capitalize-region-keywords))
552 (put 'f90-capitalize-region-keywords 'menu-enable 'mark-active)
553 (define-key map [ukr]
554 '("Upcase Keywords (region)" . f90-upcase-region-keywords))
555 (put 'f90-upcase-region-keywords 'menu-enable 'mark-active)
556 (define-key map [line] '("--"))
557 (define-key map [dkb]
558 '("Downcase Keywords (buffer)" . f90-downcase-keywords))
559 (define-key map [ckb]
560 '("Capitalize Keywords (buffer)" . f90-capitalize-keywords))
561 (define-key map [ukb]
562 '("Upcase Keywords (buffer)" . f90-upcase-keywords))
563 map)
564 "Submenu for change of case.")
565
566 (defalias 'f90-change-case-menu f90-change-case-menu)
567
568 ;; Font-lock-menu and function calls.
569 (defalias 'f90-font-lock-on 'font-lock-mode)
570 (put 'f90-font-lock-on 'menu-enable 'font-lock-mode)
571 (put 'f90-font-lock-on 'menu-alias t)
572
573 (defalias 'f90-font-lock-off 'font-lock-mode)
574 (put 'f90-font-lock-off 'menu-enable '(not font-lock-mode))
575 (put 'f90-font-lock-off 'menu-alias t)
576
577 (defun f90-font-lock-1 ()
578 "Set `font-lock-keywords' to `f90-font-lock-keywords-1'."
579 (interactive)
580 (font-lock-mode 1)
581 (setq font-lock-keywords f90-font-lock-keywords-1)
582 (font-lock-fontify-buffer))
583
584 (defun f90-font-lock-2 ()
585 "Set `font-lock-keywords' to `f90-font-lock-keywords-2'."
586 (interactive)
587 (font-lock-mode 1)
588 (setq font-lock-keywords f90-font-lock-keywords-2)
589 (font-lock-fontify-buffer))
590
591 (defun f90-font-lock-3 ()
592 "Set `font-lock-keywords' to `f90-font-lock-keywords-3'."
593 (interactive)
594 (font-lock-mode 1)
595 (setq font-lock-keywords f90-font-lock-keywords-3)
596 (font-lock-fontify-buffer))
597
598 (defun f90-font-lock-4 ()
599 "Set `font-lock-keywords' to `f90-font-lock-keywords-4'."
600 (interactive)
601 (font-lock-mode 1)
602 (setq font-lock-keywords f90-font-lock-keywords-4)
603 (font-lock-fontify-buffer))
604
605 (defvar f90-font-lock-menu
606 (let ((map (make-sparse-keymap "f90-font-lock-menu")))
607 (define-key map [h4]
608 '("Maximum highlighting (level 4)" . f90-font-lock-4))
609 (define-key map [h3]
610 '("Heavy highlighting (level 3)" . f90-font-lock-3))
611 (define-key map [h2]
612 '("Default highlighting (level 2)" . f90-font-lock-2))
613 (define-key map [h1]
614 '("Light highlighting (level 1)" . f90-font-lock-1))
615 (define-key map [line] '("--"))
616 (define-key map [floff]
617 '("Turn off font-lock-mode" . f90-font-lock-on))
618 (define-key map [flon]
619 '("Turn on font-lock-mode" . f90-font-lock-off))
620 map)
621 "Submenu for highlighting using font-lock-mode.")
622
623 (defalias 'f90-font-lock-menu f90-font-lock-menu)
624
625 )
626
627 ;; Regexps for finding program structures. 535 ;; Regexps for finding program structures.
628 (defconst f90-blocks-re 536 (defconst f90-blocks-re
629 (concat "\\(block[ \t]*data\\|" 537 (concat "\\(block[ \t]*data\\|"
630 (regexp-opt '("do" "if" "interface" "function" "module" "program" 538 (regexp-opt '("do" "if" "interface" "function" "module" "program"
631 "select" "subroutine" "type" "where" "forall")) 539 "select" "subroutine" "type" "where" "forall"))
850 (set (make-local-variable 'comment-start-skip) "!+ *") 758 (set (make-local-variable 'comment-start-skip) "!+ *")
851 (set (make-local-variable 'comment-indent-function) 'f90-comment-indent) 759 (set (make-local-variable 'comment-indent-function) 'f90-comment-indent)
852 (set (make-local-variable 'abbrev-all-caps) t) 760 (set (make-local-variable 'abbrev-all-caps) t)
853 (set (make-local-variable 'normal-auto-fill-function) 'f90-do-auto-fill) 761 (set (make-local-variable 'normal-auto-fill-function) 'f90-do-auto-fill)
854 (setq indent-tabs-mode nil) ; auto buffer local 762 (setq indent-tabs-mode nil) ; auto buffer local
763 (easy-menu-add f90-menu)
855 ;; Setting up things for font-lock. 764 ;; Setting up things for font-lock.
856 (when f90-xemacs-flag
857 (put 'f90-mode 'font-lock-keywords-case-fold-search t)
858 (when (and (featurep 'menubar)
859 current-menubar
860 (not (assoc "F90" current-menubar)))
861 (set-buffer-menubar (copy-sequence current-menubar))
862 (add-submenu nil f90-xemacs-menu)))
863 ;; XEmacs: Does not need a special case, since both emacsen work alike -sb.
864 (set (make-local-variable 'font-lock-defaults) 765 (set (make-local-variable 'font-lock-defaults)
865 '((f90-font-lock-keywords f90-font-lock-keywords-1 766 '((f90-font-lock-keywords f90-font-lock-keywords-1
866 f90-font-lock-keywords-2 767 f90-font-lock-keywords-2
867 f90-font-lock-keywords-3 768 f90-font-lock-keywords-3
868 f90-font-lock-keywords-4) 769 f90-font-lock-keywords-4)
1394 (let ((pos (point)) program) 1295 (let ((pos (point)) program)
1395 (f90-end-of-subprogram) 1296 (f90-end-of-subprogram)
1396 (push-mark) 1297 (push-mark)
1397 (goto-char pos) 1298 (goto-char pos)
1398 (setq program (f90-beginning-of-subprogram)) 1299 (setq program (f90-beginning-of-subprogram))
1399 (if f90-xemacs-flag 1300 (if (fboundp 'zmacs-activate-region)
1400 (zmacs-activate-region) 1301 (zmacs-activate-region)
1401 (setq mark-active t 1302 (setq mark-active t
1402 deactivate-mark nil)) 1303 deactivate-mark nil))
1403 program)) 1304 program))
1404 1305
1572 ;; Restore point, etc. 1473 ;; Restore point, etc.
1573 (setq f90-cache-position nil) 1474 (setq f90-cache-position nil)
1574 (goto-char save-point) 1475 (goto-char save-point)
1575 (set-marker end-region-mark nil) 1476 (set-marker end-region-mark nil)
1576 (set-marker save-point nil) 1477 (set-marker save-point nil)
1577 (if f90-xemacs-flag 1478 (if (fboundp 'zmacs-deactivate-region)
1578 (zmacs-deactivate-region) 1479 (zmacs-deactivate-region)
1579 (deactivate-mark)))) 1480 (deactivate-mark))))
1580 1481
1581 (defun f90-indent-subprogram () 1482 (defun f90-indent-subprogram ()
1582 "Properly indent the subprogram containing point." 1483 "Properly indent the subprogram containing point."
1683 (f90-break-line 'no-update)) 1584 (f90-break-line 'no-update))
1684 (setq go-on (and (< (point) (marker-position end-region-mark)) 1585 (setq go-on (and (< (point) (marker-position end-region-mark))
1685 (zerop (forward-line 1))) 1586 (zerop (forward-line 1)))
1686 f90-cache-position (point))) 1587 f90-cache-position (point)))
1687 (setq f90-cache-position nil) 1588 (setq f90-cache-position nil)
1688 (if f90-xemacs-flag 1589 (if (fboundp 'zmacs-deactivate-region)
1689 (zmacs-deactivate-region) 1590 (zmacs-deactivate-region)
1690 (deactivate-mark)))) 1591 (deactivate-mark))))
1691 1592
1692 (defun f90-block-match (beg-block beg-name end-block end-name) 1593 (defun f90-block-match (beg-block beg-name end-block end-name)
1693 "Match end-struct with beg-struct and complete end-block if possible. 1594 "Match end-struct with beg-struct and complete end-block if possible.
1779 "Typing `\\[help-command] or `? lists all the F90 abbrevs. 1680 "Typing `\\[help-command] or `? lists all the F90 abbrevs.
1780 Any other key combination is executed normally." 1681 Any other key combination is executed normally."
1781 (interactive) 1682 (interactive)
1782 (let (c) 1683 (let (c)
1783 (insert last-command-char) 1684 (insert last-command-char)
1784 (if f90-xemacs-flag 1685 (setq c (if (fboundp 'next-command-event) ; XEmacs
1785 (setq c (event-to-character (next-command-event))) 1686 (event-to-character (next-command-event))
1786 (setq c (read-event))) 1687 (read-event)))
1787 ;; Insert char if not equal to `?'. 1688 ;; Insert char if not equal to `?'.
1788 (if (or (eq c ??) (eq c help-char)) 1689 (if (or (eq c ??) (eq c help-char))
1789 (f90-abbrev-help) 1690 (f90-abbrev-help)
1790 (setq unread-command-events (list c))))) 1691 (setq unread-command-events (list c)))))
1791 1692