156 |
|
|
157 |
;;; Code: |
;;; Code: |
158 |
|
|
|
(eval-and-compile |
|
|
(defconst f90-xemacs-flag (string-match "XEmacs\\|Lucid" emacs-version) |
|
|
"Non-nil means F90 mode thinks it is running under XEmacs.")) |
|
|
|
|
|
;; Most of these are just to quieten the byte-compiler. |
|
159 |
(eval-when-compile |
(eval-when-compile |
160 |
(defvar comment-auto-fill-only-comments) |
(defvar comment-auto-fill-only-comments) |
161 |
(defvar font-lock-keywords) |
(defvar font-lock-keywords)) |
|
(unless f90-xemacs-flag |
|
|
;; If you have GNU Emacs 19.22 or earlier, comment this out, or get imenu. |
|
|
(require 'imenu) |
|
|
(defvar current-menubar))) |
|
162 |
|
|
163 |
;; User options |
;; User options |
164 |
|
|
459 |
map) |
map) |
460 |
"Keymap used in F90 mode.") |
"Keymap used in F90 mode.") |
461 |
|
|
|
;; Menu bar support. |
|
|
(if f90-xemacs-flag |
|
|
(defvar f90-xemacs-menu |
|
|
'("F90" |
|
|
["Indent Subprogram" f90-indent-subprogram t] |
|
|
["Mark Subprogram" f90-mark-subprogram t] |
|
|
["Beginning of Subprogram" f90-beginning-of-subprogram t] |
|
|
["End of Subprogram" f90-end-of-subprogram t] |
|
|
"-----" |
|
|
["(Un)Comment Region" f90-comment-region t] |
|
|
["Indent Region" indent-region t] |
|
|
["Fill Region" f90-fill-region t] |
|
|
"-----" |
|
|
["Break Line at Point" f90-break-line t] |
|
|
["Join with Next Line" f90-join-lines t] |
|
|
["Insert Newline" newline t] |
|
|
["Insert Block End" f90-insert-end t] |
|
|
"-----" |
|
|
["Upcase Keywords (buffer)" f90-upcase-keywords t] |
|
|
["Upcase Keywords (region)" f90-upcase-region-keywords t] |
|
|
["Capitalize Keywords (buffer)" f90-capitalize-keywords t] |
|
|
["Capitalize Keywords (region)" f90-capitalize-region-keywords t] |
|
|
["Downcase Keywords (buffer)" f90-downcase-keywords t] |
|
|
["Downcase Keywords (region)" f90-downcase-region-keywords t] |
|
|
"-----" |
|
|
["Toggle abbrev-mode" abbrev-mode t] |
|
|
["Toggle auto-fill" auto-fill-mode t]) |
|
|
"XEmacs menu for F90 mode.") |
|
|
|
|
|
;; Emacs. |
|
|
(defvar f90-menu-bar-menu |
|
|
(let ((map (make-sparse-keymap "F90"))) |
|
|
(define-key map [f90-imenu-menu] |
|
|
'("Add imenu Menu" . f90-add-imenu-menu)) |
|
|
(define-key map [abbrev-mode] |
|
|
'("Toggle abbrev-mode" . abbrev-mode)) |
|
|
(define-key map [auto-fill-mode] |
|
|
'("Toggle auto-fill" . auto-fill-mode)) |
|
|
(define-key map [line1] '("--")) |
|
|
(define-key map [f90-change-case-menu] |
|
|
'("Change Keyword Case" . f90-change-case-menu)) |
|
|
(define-key map [f90-font-lock-menu] |
|
|
'("Highlighting" . f90-font-lock-menu)) |
|
|
(define-key map [line2] '("--")) |
|
|
(define-key map [f90-insert-end] |
|
|
'("Insert Block End" . f90-insert-end)) |
|
|
(define-key map [f90-join-lines] |
|
|
'("Join with Next Line" . f90-join-lines)) |
|
|
(define-key map [f90-break-line] |
|
|
'("Break Line at Point" . f90-break-line)) |
|
|
(define-key map [line3] '("--")) |
|
|
(define-key map [f90-fill-region] |
|
|
'("Fill Region" . f90-fill-region)) |
|
|
(put 'f90-fill-region 'menu-enable 'mark-active) |
|
|
(define-key map [indent-region] |
|
|
'("Indent Region" . indent-region)) |
|
|
(define-key map [f90-comment-region] |
|
|
'("(Un)Comment Region" . f90-comment-region)) |
|
|
(put 'f90-comment-region 'menu-enable 'mark-active) |
|
|
(define-key map [line4] '("--")) |
|
|
(define-key map [f90-end-of-subprogram] |
|
|
'("End of Subprogram" . f90-end-of-subprogram)) |
|
|
(define-key map [f90-beginning-of-subprogram] |
|
|
'("Beginning of Subprogram" . f90-beginning-of-subprogram)) |
|
|
(define-key map [f90-mark-subprogram] |
|
|
'("Mark Subprogram" . f90-mark-subprogram)) |
|
|
(define-key map [f90-indent-subprogram] |
|
|
'("Indent Subprogram" . f90-indent-subprogram)) |
|
|
map) |
|
|
"F90 mode top-level menu bar menu.") |
|
|
|
|
|
(define-key f90-mode-map [menu-bar f90-menu] |
|
|
(cons "F90" f90-menu-bar-menu)) |
|
|
|
|
|
(defvar f90-change-case-menu |
|
|
(let ((map (make-sparse-keymap "Change Keyword Case"))) |
|
|
(define-key map [dkr] |
|
|
'("Downcase Keywords (region)" . f90-downcase-region-keywords)) |
|
|
(put 'f90-downcase-region-keywords 'menu-enable 'mark-active) |
|
|
(define-key map [ckr] |
|
|
'("Capitalize Keywords (region)" . f90-capitalize-region-keywords)) |
|
|
(put 'f90-capitalize-region-keywords 'menu-enable 'mark-active) |
|
|
(define-key map [ukr] |
|
|
'("Upcase Keywords (region)" . f90-upcase-region-keywords)) |
|
|
(put 'f90-upcase-region-keywords 'menu-enable 'mark-active) |
|
|
(define-key map [line] '("--")) |
|
|
(define-key map [dkb] |
|
|
'("Downcase Keywords (buffer)" . f90-downcase-keywords)) |
|
|
(define-key map [ckb] |
|
|
'("Capitalize Keywords (buffer)" . f90-capitalize-keywords)) |
|
|
(define-key map [ukb] |
|
|
'("Upcase Keywords (buffer)" . f90-upcase-keywords)) |
|
|
map) |
|
|
"Submenu for change of case.") |
|
|
|
|
|
(defalias 'f90-change-case-menu f90-change-case-menu) |
|
|
|
|
|
;; Font-lock-menu and function calls. |
|
|
(defalias 'f90-font-lock-on 'font-lock-mode) |
|
|
(put 'f90-font-lock-on 'menu-enable 'font-lock-mode) |
|
|
(put 'f90-font-lock-on 'menu-alias t) |
|
|
|
|
|
(defalias 'f90-font-lock-off 'font-lock-mode) |
|
|
(put 'f90-font-lock-off 'menu-enable '(not font-lock-mode)) |
|
|
(put 'f90-font-lock-off 'menu-alias t) |
|
|
|
|
|
(defun f90-font-lock-1 () |
|
|
"Set `font-lock-keywords' to `f90-font-lock-keywords-1'." |
|
|
(interactive) |
|
|
(font-lock-mode 1) |
|
|
(setq font-lock-keywords f90-font-lock-keywords-1) |
|
|
(font-lock-fontify-buffer)) |
|
|
|
|
|
(defun f90-font-lock-2 () |
|
|
"Set `font-lock-keywords' to `f90-font-lock-keywords-2'." |
|
|
(interactive) |
|
|
(font-lock-mode 1) |
|
|
(setq font-lock-keywords f90-font-lock-keywords-2) |
|
|
(font-lock-fontify-buffer)) |
|
|
|
|
|
(defun f90-font-lock-3 () |
|
|
"Set `font-lock-keywords' to `f90-font-lock-keywords-3'." |
|
|
(interactive) |
|
|
(font-lock-mode 1) |
|
|
(setq font-lock-keywords f90-font-lock-keywords-3) |
|
|
(font-lock-fontify-buffer)) |
|
|
|
|
|
(defun f90-font-lock-4 () |
|
|
"Set `font-lock-keywords' to `f90-font-lock-keywords-4'." |
|
|
(interactive) |
|
|
(font-lock-mode 1) |
|
|
(setq font-lock-keywords f90-font-lock-keywords-4) |
|
|
(font-lock-fontify-buffer)) |
|
|
|
|
|
(defvar f90-font-lock-menu |
|
|
(let ((map (make-sparse-keymap "f90-font-lock-menu"))) |
|
|
(define-key map [h4] |
|
|
'("Maximum highlighting (level 4)" . f90-font-lock-4)) |
|
|
(define-key map [h3] |
|
|
'("Heavy highlighting (level 3)" . f90-font-lock-3)) |
|
|
(define-key map [h2] |
|
|
'("Default highlighting (level 2)" . f90-font-lock-2)) |
|
|
(define-key map [h1] |
|
|
'("Light highlighting (level 1)" . f90-font-lock-1)) |
|
|
(define-key map [line] '("--")) |
|
|
(define-key map [floff] |
|
|
'("Turn off font-lock-mode" . f90-font-lock-on)) |
|
|
(define-key map [flon] |
|
|
'("Turn on font-lock-mode" . f90-font-lock-off)) |
|
|
map) |
|
|
"Submenu for highlighting using font-lock-mode.") |
|
462 |
|
|
463 |
(defalias 'f90-font-lock-menu f90-font-lock-menu) |
(easy-menu-define f90-menu f90-mode-map "Menu for F90 mode." |
464 |
|
'("F90" |
465 |
|
["Indent Subprogram" f90-indent-subprogram t] |
466 |
|
["Mark Subprogram" f90-mark-subprogram t] |
467 |
|
["Beginning of Subprogram" f90-beginning-of-subprogram t] |
468 |
|
["End of Subprogram" f90-end-of-subprogram t] |
469 |
|
"--" |
470 |
|
["(Un)Comment Region" f90-comment-region mark-active] |
471 |
|
["Indent Region" f90-indent-region mark-active] |
472 |
|
["Fill Region" f90-fill-region mark-active] |
473 |
|
"--" |
474 |
|
["Break Line at Point" f90-break-line t] |
475 |
|
["Join with Next Line" f90-join-lines t] |
476 |
|
["Insert Block End" f90-insert-end t] |
477 |
|
"--" |
478 |
|
("Highlighting" |
479 |
|
["Toggle font-lock-mode" font-lock-mode :active t |
480 |
|
:selected font-lock-mode :style toggle] |
481 |
|
"--" |
482 |
|
["Light highlighting (level 1)" f90-font-lock-1 t] |
483 |
|
["Moderate highlighting (level 2)" f90-font-lock-2 t] |
484 |
|
["Heavy highlighting (level 3)" f90-font-lock-3 t] |
485 |
|
["Maximum highlighting (level 4)" f90-font-lock-4 t] |
486 |
|
) |
487 |
|
("Change Keyword Case" |
488 |
|
["Upcase Keywords (buffer)" f90-upcase-keywords t] |
489 |
|
["Capitalize Keywords (buffer)" f90-capitalize-keywords t] |
490 |
|
["Downcase Keywords (buffer)" f90-downcase-keywords t] |
491 |
|
"--" |
492 |
|
["Upcase Keywords (region)" f90-upcase-region-keywords mark-active] |
493 |
|
["Capitalize Keywords (region)" f90-capitalize-region-keywords |
494 |
|
mark-active] |
495 |
|
["Downcase Keywords (region)" f90-downcase-region-keywords mark-active] |
496 |
|
) |
497 |
|
"--" |
498 |
|
["Toggle auto-fill" auto-fill-mode :active t :selected auto-fill-function |
499 |
|
:style toggle] |
500 |
|
["Toggle abbrev-mode" abbrev-mode :active t :selected abbrev-mode |
501 |
|
:style toggle] |
502 |
|
["Add imenu Menu" f90-add-imenu-menu :active (not f90-imenu-flag) |
503 |
|
:visible (fboundp 'imenu-add-to-menubar)] |
504 |
|
)) |
505 |
|
|
506 |
) |
(defun f90-font-lock-1 () |
507 |
|
"Set `font-lock-keywords' to `f90-font-lock-keywords-1'." |
508 |
|
(interactive) |
509 |
|
(font-lock-mode 1) |
510 |
|
(setq font-lock-keywords f90-font-lock-keywords-1) |
511 |
|
(font-lock-fontify-buffer)) |
512 |
|
|
513 |
|
(defun f90-font-lock-2 () |
514 |
|
"Set `font-lock-keywords' to `f90-font-lock-keywords-2'." |
515 |
|
(interactive) |
516 |
|
(font-lock-mode 1) |
517 |
|
(setq font-lock-keywords f90-font-lock-keywords-2) |
518 |
|
(font-lock-fontify-buffer)) |
519 |
|
|
520 |
|
(defun f90-font-lock-3 () |
521 |
|
"Set `font-lock-keywords' to `f90-font-lock-keywords-3'." |
522 |
|
(interactive) |
523 |
|
(font-lock-mode 1) |
524 |
|
(setq font-lock-keywords f90-font-lock-keywords-3) |
525 |
|
(font-lock-fontify-buffer)) |
526 |
|
|
527 |
|
(defun f90-font-lock-4 () |
528 |
|
"Set `font-lock-keywords' to `f90-font-lock-keywords-4'." |
529 |
|
(interactive) |
530 |
|
(font-lock-mode 1) |
531 |
|
(setq font-lock-keywords f90-font-lock-keywords-4) |
532 |
|
(font-lock-fontify-buffer)) |
533 |
|
|
534 |
|
|
535 |
;; Regexps for finding program structures. |
;; Regexps for finding program structures. |
536 |
(defconst f90-blocks-re |
(defconst f90-blocks-re |
537 |
(concat "\\(block[ \t]*data\\|" |
(concat "\\(block[ \t]*data\\|" |
760 |
(set (make-local-variable 'abbrev-all-caps) t) |
(set (make-local-variable 'abbrev-all-caps) t) |
761 |
(set (make-local-variable 'normal-auto-fill-function) 'f90-do-auto-fill) |
(set (make-local-variable 'normal-auto-fill-function) 'f90-do-auto-fill) |
762 |
(setq indent-tabs-mode nil) ; auto buffer local |
(setq indent-tabs-mode nil) ; auto buffer local |
763 |
|
(easy-menu-add f90-menu) |
764 |
;; Setting up things for font-lock. |
;; Setting up things for font-lock. |
|
(when f90-xemacs-flag |
|
|
(put 'f90-mode 'font-lock-keywords-case-fold-search t) |
|
|
(when (and (featurep 'menubar) |
|
|
current-menubar |
|
|
(not (assoc "F90" current-menubar))) |
|
|
(set-buffer-menubar (copy-sequence current-menubar)) |
|
|
(add-submenu nil f90-xemacs-menu))) |
|
|
;; XEmacs: Does not need a special case, since both emacsen work alike -sb. |
|
765 |
(set (make-local-variable 'font-lock-defaults) |
(set (make-local-variable 'font-lock-defaults) |
766 |
'((f90-font-lock-keywords f90-font-lock-keywords-1 |
'((f90-font-lock-keywords f90-font-lock-keywords-1 |
767 |
f90-font-lock-keywords-2 |
f90-font-lock-keywords-2 |
1297 |
(push-mark) |
(push-mark) |
1298 |
(goto-char pos) |
(goto-char pos) |
1299 |
(setq program (f90-beginning-of-subprogram)) |
(setq program (f90-beginning-of-subprogram)) |
1300 |
(if f90-xemacs-flag |
(if (fboundp 'zmacs-activate-region) |
1301 |
(zmacs-activate-region) |
(zmacs-activate-region) |
1302 |
(setq mark-active t |
(setq mark-active t |
1303 |
deactivate-mark nil)) |
deactivate-mark nil)) |
1475 |
(goto-char save-point) |
(goto-char save-point) |
1476 |
(set-marker end-region-mark nil) |
(set-marker end-region-mark nil) |
1477 |
(set-marker save-point nil) |
(set-marker save-point nil) |
1478 |
(if f90-xemacs-flag |
(if (fboundp 'zmacs-deactivate-region) |
1479 |
(zmacs-deactivate-region) |
(zmacs-deactivate-region) |
1480 |
(deactivate-mark)))) |
(deactivate-mark)))) |
1481 |
|
|
1586 |
(zerop (forward-line 1))) |
(zerop (forward-line 1))) |
1587 |
f90-cache-position (point))) |
f90-cache-position (point))) |
1588 |
(setq f90-cache-position nil) |
(setq f90-cache-position nil) |
1589 |
(if f90-xemacs-flag |
(if (fboundp 'zmacs-deactivate-region) |
1590 |
(zmacs-deactivate-region) |
(zmacs-deactivate-region) |
1591 |
(deactivate-mark)))) |
(deactivate-mark)))) |
1592 |
|
|
1682 |
(interactive) |
(interactive) |
1683 |
(let (c) |
(let (c) |
1684 |
(insert last-command-char) |
(insert last-command-char) |
1685 |
(if f90-xemacs-flag |
(setq c (if (fboundp 'next-command-event) ; XEmacs |
1686 |
(setq c (event-to-character (next-command-event))) |
(event-to-character (next-command-event)) |
1687 |
(setq c (read-event))) |
(read-event))) |
1688 |
;; Insert char if not equal to `?'. |
;; Insert char if not equal to `?'. |
1689 |
(if (or (eq c ??) (eq c help-char)) |
(if (or (eq c ??) (eq c help-char)) |
1690 |
(f90-abbrev-help) |
(f90-abbrev-help) |