diff options
| author | Erik Naggum | 1996-08-14 01:59:41 +0000 |
|---|---|---|
| committer | Erik Naggum | 1996-08-14 01:59:41 +0000 |
| commit | b974df0a9fc48ac76cc9b95ed3dce95d18787a7b (patch) | |
| tree | 829e3f89482e9ccdaf2599c3ed540448c32c88f6 | |
| parent | 9ba7f85cde4c9f932ac714f465f119658f1f9d27 (diff) | |
| download | emacs-b974df0a9fc48ac76cc9b95ed3dce95d18787a7b.tar.gz emacs-b974df0a9fc48ac76cc9b95ed3dce95d18787a7b.zip | |
new version from Torbj�Einarsson.
| -rw-r--r-- | lisp/progmodes/f90.el | 346 |
1 files changed, 198 insertions, 148 deletions
diff --git a/lisp/progmodes/f90.el b/lisp/progmodes/f90.el index 642b1b73972..ec1ac0c6597 100644 --- a/lisp/progmodes/f90.el +++ b/lisp/progmodes/f90.el | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | ;; Copyright (C) 1995, 1996 Free Software Foundation, Inc. | 3 | ;; Copyright (C) 1995, 1996 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | ;; Author: Torbj\"orn Einarsson <T.Einarsson@clab.ericsson.se> | 5 | ;; Author: Torbj\"orn Einarsson <T.Einarsson@clab.ericsson.se> |
| 6 | ;; Created: Apr. 18, 1996 | 6 | ;; Last Change: Aug. 12, 1996 |
| 7 | ;; Keywords: fortran, f90, languages | 7 | ;; Keywords: fortran, f90, languages |
| 8 | 8 | ||
| 9 | ;; This file is part of GNU Emacs. | 9 | ;; This file is part of GNU Emacs. |
| @@ -91,18 +91,19 @@ | |||
| 91 | ;; f90-leave-line-no nil | 91 | ;; f90-leave-line-no nil |
| 92 | ;; f90-startup-message t | 92 | ;; f90-startup-message t |
| 93 | ;; indent-tabs-mode nil | 93 | ;; indent-tabs-mode nil |
| 94 | ;; f90-font-lock-keywords f90-font-lock-keywords-2 | ||
| 94 | ;; ) | 95 | ;; ) |
| 95 | ;; ;;The rest is not default. | 96 | ;; ;;The rest is not default. |
| 96 | ;; (abbrev-mode 1) ; turn on abbreviation mode | 97 | ;; (abbrev-mode 1) ; turn on abbreviation mode |
| 97 | ;; (f90-auto-fill-mode 1) ; turn on auto-filling | ||
| 98 | ;; (turn-on-font-lock) ; for highlighting | 98 | ;; (turn-on-font-lock) ; for highlighting |
| 99 | ;; (f90-add-imenu-menu) ; extra menu with functions etc. | ||
| 99 | ;; (if f90-auto-keyword-case ; change case of all keywords on startup | 100 | ;; (if f90-auto-keyword-case ; change case of all keywords on startup |
| 100 | ;; (f90-change-keywords f90-auto-keyword-case)) | 101 | ;; (f90-change-keywords f90-auto-keyword-case)) |
| 101 | ;; )) | 102 | ;; )) |
| 102 | ;; in your .emacs file (the shown values are the defaults). You can also | 103 | ;; in your .emacs file (the shown values are the defaults). You can also |
| 103 | ;; change the values of the lists f90-keywords etc. | 104 | ;; change the values of the lists f90-keywords etc. |
| 104 | ;; The auto-fill and abbreviation minor modes are accessible from the menu, | 105 | ;; The auto-fill and abbreviation minor modes are accessible from the menu, |
| 105 | ;; or by using M-x f90-auto-fill-mode and M-x abbrev-mode, respectively. | 106 | ;; or by using M-x auto-fill-mode and M-x abbrev-mode, respectively. |
| 106 | 107 | ||
| 107 | ;; Remarks | 108 | ;; Remarks |
| 108 | ;; 1) Line numbers are by default left-justified. If f90-leave-line-no is | 109 | ;; 1) Line numbers are by default left-justified. If f90-leave-line-no is |
| @@ -127,12 +128,13 @@ | |||
| 127 | ;; f90-indent-region (can be called by calling indent-region) | 128 | ;; f90-indent-region (can be called by calling indent-region) |
| 128 | ;; f90-indent-subprogram | 129 | ;; f90-indent-subprogram |
| 129 | ;; f90-break-line f90-join-lines | 130 | ;; f90-break-line f90-join-lines |
| 130 | ;; f90-auto-fill-mode | ||
| 131 | ;; f90-fill-region | 131 | ;; f90-fill-region |
| 132 | ;; f90-insert-end | 132 | ;; f90-insert-end |
| 133 | ;; f90-upcase-keywords f90-upcase-region-keywords | 133 | ;; f90-upcase-keywords f90-upcase-region-keywords |
| 134 | ;; f90-downcase-keywords f90-downcase-region-keywords | 134 | ;; f90-downcase-keywords f90-downcase-region-keywords |
| 135 | ;; f90-capitalize-keywords f90-capitalize-region-keywords | 135 | ;; f90-capitalize-keywords f90-capitalize-region-keywords |
| 136 | ;; f90-add-imenu-menu | ||
| 137 | ;; f90-font-lock-1, f90-font-lock-2, f90-font-lock-3, f90-font-lock-4 | ||
| 136 | 138 | ||
| 137 | ;; Thanks to all the people who have tested the mode. Special thanks to Jens | 139 | ;; Thanks to all the people who have tested the mode. Special thanks to Jens |
| 138 | ;; Bloch Helmers for encouraging me to write this code, for creative | 140 | ;; Bloch Helmers for encouraging me to write this code, for creative |
| @@ -323,80 +325,24 @@ whether to blink the matching beginning.") | |||
| 323 | ;; Highlighting patterns | 325 | ;; Highlighting patterns |
| 324 | 326 | ||
| 325 | (defvar f90-font-lock-keywords-1 | 327 | (defvar f90-font-lock-keywords-1 |
| 326 | (if (string-match "XEmacs" emacs-version) | 328 | (list ; Emacs |
| 327 | (list ; XEmacs | 329 | '("\\<\\(end[ \t]*\\(program\\|module\\|function\\|subroutine\\|type\\)\\)\\>[ \t]*\\(\\sw+\\)?" |
| 328 | '("\\<\\(end[ \t]*\\(program\\|module\\|function\\|subroutine\\|type\\)\\)\\>" | 330 | (1 font-lock-keyword-face) (3 font-lock-function-name-face nil t)) |
| 329 | 1 font-lock-keyword-face) | 331 | '("\\<\\(program\\|call\\|module\\|subroutine\\|function\\|use\\)\\>[ \t]*\\(\\sw+\\)?" |
| 330 | '("\\<\\(end[ \t]*\\(program\\|module\\|function\\|subroutine\\|type\\)\\)\\>[ \t]*\\(\\sw+\\)" | 332 | (1 font-lock-keyword-face) (2 font-lock-function-name-face nil t)) |
| 331 | 3 font-lock-function-name-face) | 333 | ;; Special highlighting of "module procedure foo-list" |
| 332 | '("\\<\\(program\\|call\\|module\\|subroutine\\|function\\|use\\)\\>" | 334 | '("\\<\\(module[ \t]*procedure\\)\\>" (1 font-lock-keyword-face t)) |
| 333 | 1 font-lock-keyword-face) | 335 | ;; Highlight definition of new type |
| 334 | '("\\<\\(program\\|call\\|module\\|subroutine\\|function\\|use\\)\\>[ \t]*\\(\\sw+\\)" | 336 | '("\\<\\(type\\)[ \t]*\\(,.*::[ \t]*\\|[ \t]+\\)\\(\\sw+\\)" |
| 335 | 2 font-lock-function-name-face nil t) | 337 | (1 font-lock-keyword-face) (3 font-lock-function-name-face)) |
| 336 | ;; Special highlighting of "module procedure foo-list" | 338 | "\\<\\(\\(end[ \t]*\\)?\\(interface\\|block[ \t]*data\\)\\|contains\\)\\>") |
| 337 | '("\\<\\(module[ \t]*procedure\\)\\>" 1 font-lock-keyword-face t) | ||
| 338 | ;; Highlight definition of new type | ||
| 339 | '("\\<\\(type\\)[ \t]*\\(,.*::[ \t]*\\|[ \t]+\\)\\(\\sw+\\)" | ||
| 340 | 1 font-lock-keyword-face) | ||
| 341 | '("\\<\\(type\\)[ \t]*\\(,.*::[ \t]*\\|[ \t]+\\)\\(\\sw+\\)" | ||
| 342 | 3 font-lock-function-name-face) | ||
| 343 | "\\<\\(\\(end[ \t]*\\)?\\(interface\\|block[ \t]*data\\)\\|contains\\)\\>") | ||
| 344 | (list ; Emacs | ||
| 345 | '("\\<\\(end[ \t]*\\(program\\|module\\|function\\|subroutine\\|type\\)\\)\\>[ \t]*\\(\\sw+\\)?" | ||
| 346 | (1 font-lock-keyword-face) (3 font-lock-function-name-face nil t)) | ||
| 347 | '("\\<\\(program\\|call\\|module\\|subroutine\\|function\\|use\\)\\>[ \t]*\\(\\sw+\\)?" | ||
| 348 | (1 font-lock-keyword-face) (2 font-lock-function-name-face nil t)) | ||
| 349 | ;; Special highlighting of "module procedure foo-list" | ||
| 350 | '("\\<\\(module[ \t]*procedure\\)\\>" (1 font-lock-keyword-face t)) | ||
| 351 | ;; Highlight definition of new type | ||
| 352 | '("\\<\\(type\\)[ \t]*\\(,.*::[ \t]*\\|[ \t]+\\)\\(\\sw+\\)" | ||
| 353 | (1 font-lock-keyword-face) (3 font-lock-function-name-face)) | ||
| 354 | "\\<\\(\\(end[ \t]*\\)?\\(interface\\|block[ \t]*data\\)\\|contains\\)\\>")) | ||
| 355 | "This does fairly subdued highlighting of comments and function calls.") | 339 | "This does fairly subdued highlighting of comments and function calls.") |
| 356 | 340 | ||
| 357 | (defvar f90-font-lock-keywords-2 | 341 | (defvar f90-font-lock-keywords-2 |
| 358 | (append f90-font-lock-keywords-1 | 342 | (append f90-font-lock-keywords-1 |
| 359 | (if (string-match "XEmacs" emacs-version) | 343 | (list |
| 360 | (list ; XEmacs | ||
| 361 | ;; Variable declarations (avoid the real function call) | 344 | ;; Variable declarations (avoid the real function call) |
| 362 | '("^[ \t0-9]*\\(real\\|integer\\|c\\(haracter\\|omplex\\)\\|logical\\|type[ \t]*(\\sw+)\\)" | 345 | '("^[ \t0-9]*\\(real\\|integer\\|c\\(haracter\\|omplex\\)\\|logical\\|type[ \t]*(\\sw+)\\)\\(.*::\\|[ \t]*(.*)\\)?\\([^!\n]*\\)" |
| 363 | 1 font-lock-type-face) | ||
| 364 | '("^[ \t0-9]*\\(real\\|integer\\|c\\(haracter\\|omplex\\)\\|logical\\|type[ \t]*(\\sw+)\\)\\(.*::\\|[ \t]*(.*)\\)?\\(.*\\)" | ||
| 365 | 4 font-lock-doc-string-face) | ||
| 366 | ;; do, if and select constructs | ||
| 367 | '("\\<\\(end[ \t]*\\(do\\|if\\|select\\)\\)\\>" | ||
| 368 | 1 font-lock-keyword-face) | ||
| 369 | '("\\<\\(end[ \t]*\\(do\\|if\\|select\\)\\)\\>\\([ \t]+\\(\\sw+\\)\\)" | ||
| 370 | 3 font-lock-doc-string-face) | ||
| 371 | '("^[ \t0-9]*\\(\\(\\sw+\\)[ \t]*:[ \t]*\\)\\(\\(if\\|do\\([ \t]*while\\)?\\|select[ \t]*case\\)\\)\\>" | ||
| 372 | 2 font-lock-doc-string-face) | ||
| 373 | '("^[ \t0-9]*\\(\\(\\sw+\\)[ \t]*:[ \t]*\\)?\\(\\(if\\|do\\([ \t]*while\\)?\\|select[ \t]*case\\)\\)\\>" | ||
| 374 | 3 font-lock-keyword-face) | ||
| 375 | ;; implicit declaration | ||
| 376 | '("\\<\\(implicit\\)[ \t]*\\(real\\|integer\\|c\\(haracter\\|omplex\\)\\|logical\\|type[ \t]*(\\sw+)\\|none\\)\\>" | ||
| 377 | 1 font-lock-keyword-face) | ||
| 378 | '("\\<\\(implicit\\)[ \t]*\\(real\\|integer\\|c\\(haracter\\|omplex\\)\\|logical\\|type[ \t]*(\\sw+)\\|none\\)\\>" | ||
| 379 | 2 font-lock-type-face) | ||
| 380 | '("\\<\\(namelist\\|common\\)[ \t]*\/\\(\\sw+\\)?\/" | ||
| 381 | 1 font-lock-keyword-face) | ||
| 382 | '("\\<\\(namelist\\|common\\)[ \t]*\/\\(\\sw+\\)\/" | ||
| 383 | 2 font-lock-doc-string-face nil t) | ||
| 384 | '("\\<\\(where\\|forall\\)[ \t]*(" . 1) | ||
| 385 | "\\<e\\(lse\\([ \t]*if\\|where\\)?\\|nd[ \t]*\\(where\\|forall\\)\\)\\>" | ||
| 386 | "\\<\\(then\\|continue\\|format\\|include\\|stop\\|return\\)\\>" | ||
| 387 | '("\\<\\(exit\\|cycle\\)\\>" | ||
| 388 | 1 font-lock-keyword-face) | ||
| 389 | '("\\<\\(exit\\|cycle\\)[ \t]*\\(\\sw+\\)2\\>" | ||
| 390 | 2 font-lock-doc-string-face) | ||
| 391 | '("\\<\\(case\\)[ \t]*\\(default\\|(\\)" . 1) | ||
| 392 | '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)" | ||
| 393 | 1 font-lock-keyword-face) | ||
| 394 | '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)" | ||
| 395 | 2 font-lock-doc-string-face) | ||
| 396 | '("^[ \t]*\\([0-9]+\\)" 1 font-lock-doc-string-face t)) | ||
| 397 | (list ; Emacs | ||
| 398 | ;; Variable declarations (avoid the real function call) | ||
| 399 | '("^[ \t0-9]*\\(real\\|integer\\|c\\(haracter\\|omplex\\)\\|logical\\|type[ \t]*(\\sw+)\\)\\(.*::\\|[ \t]*(.*)\\)?\\(.*\\)" | ||
| 400 | (1 font-lock-type-face) (4 font-lock-variable-name-face)) | 346 | (1 font-lock-type-face) (4 font-lock-variable-name-face)) |
| 401 | ;; do, if and select constructs | 347 | ;; do, if and select constructs |
| 402 | '("\\<\\(end[ \t]*\\(do\\|if\\|select\\)\\)\\>\\([ \t]+\\(\\sw+\\)\\)?" | 348 | '("\\<\\(end[ \t]*\\(do\\|if\\|select\\)\\)\\>\\([ \t]+\\(\\sw+\\)\\)?" |
| @@ -414,7 +360,8 @@ whether to blink the matching beginning.") | |||
| 414 | '("\\<\\(case\\)[ \t]*\\(default\\|(\\)" . 1) | 360 | '("\\<\\(case\\)[ \t]*\\(default\\|(\\)" . 1) |
| 415 | '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)" | 361 | '("\\<\\(do\\|go *to\\)\\>[ \t]*\\([0-9]+\\)" |
| 416 | (1 font-lock-keyword-face) (2 font-lock-reference-face)) | 362 | (1 font-lock-keyword-face) (2 font-lock-reference-face)) |
| 417 | '("^[ \t]*\\([0-9]+\\)" (1 font-lock-reference-face t))))) | 363 | ;; line numbers (lines whose first character after number is letter) |
| 364 | '("^[ \t]*\\([0-9]+\\)[ \t]*[a-z]+" (1 font-lock-reference-face t)))) | ||
| 418 | "Highlights declarations, do-loops and other constructions") | 365 | "Highlights declarations, do-loops and other constructions") |
| 419 | 366 | ||
| 420 | (defvar f90-font-lock-keywords-3 | 367 | (defvar f90-font-lock-keywords-3 |
| @@ -483,6 +430,7 @@ whether to blink the matching beginning.") | |||
| 483 | (define-key f90-mode-map "\C-c\C-w" 'f90-insert-end) | 430 | (define-key f90-mode-map "\C-c\C-w" 'f90-insert-end) |
| 484 | (define-key f90-mode-map "\t" 'f90-indent-line)) | 431 | (define-key f90-mode-map "\t" 'f90-indent-line)) |
| 485 | 432 | ||
| 433 | |||
| 486 | ;; menus | 434 | ;; menus |
| 487 | (if (string-match "XEmacs" emacs-version) | 435 | (if (string-match "XEmacs" emacs-version) |
| 488 | (defvar f90-xemacs-menu | 436 | (defvar f90-xemacs-menu |
| @@ -499,7 +447,7 @@ whether to blink the matching beginning.") | |||
| 499 | ["Break Line at Point" f90-break-line t] | 447 | ["Break Line at Point" f90-break-line t] |
| 500 | ["Join with Next Line" f90-join-lines t] | 448 | ["Join with Next Line" f90-join-lines t] |
| 501 | ["Insert Newline" newline t] | 449 | ["Insert Newline" newline t] |
| 502 | ["Insert End" f90-insert-end t] | 450 | ["Insert Block End" f90-insert-end t] |
| 503 | "-----" | 451 | "-----" |
| 504 | ["Upcase Keywords (buffer)" f90-upcase-keywords t] | 452 | ["Upcase Keywords (buffer)" f90-upcase-keywords t] |
| 505 | ["Upcase Keywords (region)" f90-upcase-region-keywords | 453 | ["Upcase Keywords (region)" f90-upcase-region-keywords |
| @@ -512,40 +460,135 @@ whether to blink the matching beginning.") | |||
| 512 | f90-downcase-region-keywords t] | 460 | f90-downcase-region-keywords t] |
| 513 | "-----" | 461 | "-----" |
| 514 | ["Toggle abbrev-mode" abbrev-mode t] | 462 | ["Toggle abbrev-mode" abbrev-mode t] |
| 515 | ["Toggle auto-fill" f90-auto-fill-mode t]) | 463 | ["Toggle auto-fill" auto-fill-mode t]) |
| 516 | "XEmacs menu for F90 mode.") | 464 | "XEmacs menu for F90 mode.") |
| 517 | ;; Emacs | 465 | ;; Emacs |
| 466 | |||
| 467 | (defvar f90-change-case-menu | ||
| 468 | (let ((map (make-sparse-keymap "Change Keyword Case"))) | ||
| 469 | |||
| 470 | (define-key map [dkr] (cons "Downcase Keywords (region)" | ||
| 471 | 'f90-downcase-region-keywords)) | ||
| 472 | (put 'f90-downcase-region-keywords 'menu-enable 'mark-active) | ||
| 473 | |||
| 474 | (define-key map [ckr] (cons "Capitalize Keywords (region)" | ||
| 475 | 'f90-capitalize-region-keywords)) | ||
| 476 | (put 'f90-capitalize-region-keywords 'menu-enable 'mark-active) | ||
| 477 | |||
| 478 | (define-key map [ukr] (cons "Upcase Keywords (region)" | ||
| 479 | 'f90-upcase-region-keywords)) | ||
| 480 | (put 'f90-upcase-region-keywords 'menu-enable 'mark-active) | ||
| 481 | |||
| 482 | (define-key map [line] (list "-----------------")) | ||
| 483 | |||
| 484 | (define-key map [dkb] (cons "Downcase Keywords (buffer)" | ||
| 485 | 'f90-downcase-keywords)) | ||
| 486 | |||
| 487 | (define-key map [ckb] (cons "Capitalize Keywords (buffer)" | ||
| 488 | 'f90-capitalize-keywords)) | ||
| 489 | |||
| 490 | (define-key map [ukb] (cons "Upcase Keywords (buffer)" | ||
| 491 | 'f90-upcase-keywords)) | ||
| 492 | map) | ||
| 493 | "Submenu for change of case.") | ||
| 494 | (defalias 'f90-change-case-menu f90-change-case-menu) | ||
| 495 | |||
| 496 | ;; font-lock-menu and function calls | ||
| 497 | (defalias 'f90-font-lock-on 'font-lock-mode) | ||
| 498 | (defalias 'f90-font-lock-off 'font-lock-mode) | ||
| 499 | (put 'f90-font-lock-on 'menu-enable 'font-lock-mode) | ||
| 500 | (put 'f90-font-lock-off 'menu-enable '(not font-lock-mode)) | ||
| 501 | |||
| 502 | (defun f90-font-lock-1 () | ||
| 503 | (interactive) | ||
| 504 | "Set font-lock-keywords to f90-font-lock-keywords-1." | ||
| 505 | (font-lock-mode 1) | ||
| 506 | (setq font-lock-keywords f90-font-lock-keywords-1) | ||
| 507 | (font-lock-fontify-buffer)) | ||
| 508 | |||
| 509 | (defun f90-font-lock-2 () | ||
| 510 | (interactive) | ||
| 511 | "Set font-lock-keywords to f90-font-lock-keywords-2." | ||
| 512 | (font-lock-mode 1) | ||
| 513 | (setq font-lock-keywords f90-font-lock-keywords-2) | ||
| 514 | (font-lock-fontify-buffer)) | ||
| 515 | |||
| 516 | (defun f90-font-lock-3 () | ||
| 517 | (interactive) | ||
| 518 | "Set font-lock-keywords to f90-font-lock-keywords-3." | ||
| 519 | (font-lock-mode 1) | ||
| 520 | (setq font-lock-keywords f90-font-lock-keywords-3) | ||
| 521 | (font-lock-fontify-buffer)) | ||
| 522 | |||
| 523 | (defun f90-font-lock-4 () | ||
| 524 | (interactive) | ||
| 525 | "Set font-lock-keywords to f90-font-lock-keywords-4." | ||
| 526 | (font-lock-mode 1) | ||
| 527 | (setq font-lock-keywords f90-font-lock-keywords-4) | ||
| 528 | (font-lock-fontify-buffer)) | ||
| 529 | |||
| 530 | (defvar f90-font-lock-menu | ||
| 531 | (let ((map (make-sparse-keymap "f90-font-lock-menu"))) | ||
| 532 | (define-key map [h4] (cons "Maximum highlighting (level 4)" | ||
| 533 | 'f90-font-lock-4)) | ||
| 534 | (define-key map [h3] (cons "Heavy highlighting (level 3)" | ||
| 535 | 'f90-font-lock-3)) | ||
| 536 | (define-key map [h2] (cons "Default highlighting (level 2)" | ||
| 537 | 'f90-font-lock-2)) | ||
| 538 | (define-key map [h1] (cons "Light highlighting (level 1)" | ||
| 539 | 'f90-font-lock-1)) | ||
| 540 | (define-key map [line] (list "-----------------")) | ||
| 541 | (define-key map [floff] (cons "Turn off font-lock-mode" | ||
| 542 | 'f90-font-lock-on)) | ||
| 543 | (define-key map [flon] (cons "Turn on font-lock-mode" | ||
| 544 | 'f90-font-lock-off)) | ||
| 545 | map) | ||
| 546 | "Submenu for highlighting using font-lock-mode.") | ||
| 547 | (defalias 'f90-font-lock-menu f90-font-lock-menu) | ||
| 548 | |||
| 518 | (define-key f90-mode-map [menu-bar] (make-sparse-keymap)) | 549 | (define-key f90-mode-map [menu-bar] (make-sparse-keymap)) |
| 519 | (define-key f90-mode-map [menu-bar f90] | 550 | (define-key f90-mode-map [menu-bar f90] |
| 520 | (cons "F90" (make-sparse-keymap "f90"))) | 551 | (cons "F90" (make-sparse-keymap "f90"))) |
| 552 | |||
| 553 | (define-key f90-mode-map [menu-bar f90 f90-imenu-menu] | ||
| 554 | '("Add imenu Menu" . f90-add-imenu-menu)) | ||
| 521 | (define-key f90-mode-map [menu-bar f90 abbrev-mode] | 555 | (define-key f90-mode-map [menu-bar f90 abbrev-mode] |
| 522 | '("Toggle abbrev-mode" . abbrev-mode)) | 556 | '("Toggle abbrev-mode" . abbrev-mode)) |
| 523 | (define-key f90-mode-map [menu-bar f90 f90-auto-fill-mode] | 557 | (define-key f90-mode-map [menu-bar f90 auto-fill-mode] |
| 524 | '("Toggle auto-fill" . f90-auto-fill-mode)) | 558 | '("Toggle auto-fill" . auto-fill-mode)) |
| 525 | (define-key f90-mode-map [menu-bar f90 f90-downcase-region-keywords] | 559 | (define-key f90-mode-map [menu-bar f90 line1] |
| 526 | '("Downcase Keywords (region)" . f90-downcase-region-keywords)) | 560 | '("----")) |
| 527 | (define-key f90-mode-map [menu-bar f90 f90-downcase-keywords] | 561 | (define-key f90-mode-map [menu-bar f90 f90-change-case-menu] |
| 528 | '("Downcase Keywords (buffer)" . f90-downcase-keywords)) | 562 | (cons "Change Keyword Case" 'f90-change-case-menu)) |
| 529 | (define-key f90-mode-map [menu-bar f90 f90-capitalize-keywords] | 563 | (define-key f90-mode-map [menu-bar f90 f90-font-lock-menu] |
| 530 | '("Capitalize Keywords (region)" . f90-capitalize-region-keywords)) | 564 | (cons "Highlighting" 'f90-font-lock-menu)) |
| 531 | (define-key f90-mode-map [menu-bar f90 f90-capitalize-region-keywords] | 565 | (define-key f90-mode-map [menu-bar f90 line2] |
| 532 | '("Capitalize Keywords (buffer)" . f90-capitalize-keywords)) | 566 | '("----")) |
| 533 | (define-key f90-mode-map [menu-bar f90 f90-upcase-region-keywords] | 567 | |
| 534 | '("Upcase Keywords (region)" . f90-upcase-region-keywords)) | ||
| 535 | (define-key f90-mode-map [menu-bar f90 f90-upcase-keywords] | ||
| 536 | '("Upcase Keywords (buffer)" . f90-upcase-keywords)) | ||
| 537 | (define-key f90-mode-map [menu-bar f90 f90-insert-end] | 568 | (define-key f90-mode-map [menu-bar f90 f90-insert-end] |
| 538 | '("Insert end" . f90-insert-end)) | 569 | '("Insert Block End" . f90-insert-end)) |
| 539 | (define-key f90-mode-map [menu-bar f90 f90-join-lines] | 570 | (define-key f90-mode-map [menu-bar f90 f90-join-lines] |
| 540 | '("Join with Next Line" . f90-join-lines)) | 571 | '("Join with Next Line" . f90-join-lines)) |
| 541 | (define-key f90-mode-map [menu-bar f90 f90-break-line] | 572 | (define-key f90-mode-map [menu-bar f90 f90-break-line] |
| 542 | '("Break Line at Point" . f90-break-line)) | 573 | '("Break Line at Point" . f90-break-line)) |
| 574 | |||
| 575 | (define-key f90-mode-map [menu-bar f90 line3] | ||
| 576 | '("----")) | ||
| 577 | |||
| 543 | (define-key f90-mode-map [menu-bar f90 f90-fill-region] | 578 | (define-key f90-mode-map [menu-bar f90 f90-fill-region] |
| 544 | '("Fill Region" . f90-fill-region)) | 579 | '("Fill Region" . f90-fill-region)) |
| 580 | (put 'f90-fill-region 'menu-enable 'mark-active) | ||
| 581 | |||
| 545 | (define-key f90-mode-map [menu-bar f90 indent-region] | 582 | (define-key f90-mode-map [menu-bar f90 indent-region] |
| 546 | '("Indent Region" . indent-region)) | 583 | '("Indent Region" . indent-region)) |
| 584 | |||
| 547 | (define-key f90-mode-map [menu-bar f90 f90-comment-region] | 585 | (define-key f90-mode-map [menu-bar f90 f90-comment-region] |
| 548 | '("(Un)Comment Region" . f90-comment-region)) | 586 | '("(Un)Comment Region" . f90-comment-region)) |
| 587 | (put 'f90-comment-region 'menu-enable 'mark-active) | ||
| 588 | |||
| 589 | (define-key f90-mode-map [menu-bar f90 line4] | ||
| 590 | '("----")) | ||
| 591 | |||
| 549 | (define-key f90-mode-map [menu-bar f90 f90-end-of-subprogram] | 592 | (define-key f90-mode-map [menu-bar f90 f90-end-of-subprogram] |
| 550 | '("End of Subprogram" . f90-end-of-subprogram)) | 593 | '("End of Subprogram" . f90-end-of-subprogram)) |
| 551 | (define-key f90-mode-map [menu-bar f90 f90-beginning-of-subprogram] | 594 | (define-key f90-mode-map [menu-bar f90 f90-beginning-of-subprogram] |
| @@ -553,8 +596,9 @@ whether to blink the matching beginning.") | |||
| 553 | (define-key f90-mode-map [menu-bar f90 f90-mark-subprogram] | 596 | (define-key f90-mode-map [menu-bar f90 f90-mark-subprogram] |
| 554 | '("Mark Subprogram" . f90-mark-subprogram)) | 597 | '("Mark Subprogram" . f90-mark-subprogram)) |
| 555 | (define-key f90-mode-map [menu-bar f90 f90-indent-subprogram] | 598 | (define-key f90-mode-map [menu-bar f90 f90-indent-subprogram] |
| 556 | '("Indent Subprogram" . f90-indent-subprogram))) | 599 | '("Indent Subprogram" . f90-indent-subprogram)) |
| 557 | 600 | ) | |
| 601 | |||
| 558 | ;; Regexps for finding program structures. | 602 | ;; Regexps for finding program structures. |
| 559 | (defconst f90-blocks-re | 603 | (defconst f90-blocks-re |
| 560 | "\\(block[ \t]*data\\|do\\|if\\|interface\\|function\\|module\\|\ | 604 | "\\(block[ \t]*data\\|do\\|if\\|interface\\|function\\|module\\|\ |
| @@ -573,23 +617,50 @@ program\\|select\\|subroutine\\|type\\|where\\|forall\\)\\>") | |||
| 573 | ;; A temporary position to make region operators faster | 617 | ;; A temporary position to make region operators faster |
| 574 | (defvar f90-cache-position nil) | 618 | (defvar f90-cache-position nil) |
| 575 | (make-variable-buffer-local 'f90-cache-position) | 619 | (make-variable-buffer-local 'f90-cache-position) |
| 620 | ;; A flag to tell whether f90-imenu is turned on. | ||
| 621 | (defvar f90-imenu nil) | ||
| 622 | (make-variable-buffer-local 'f90-imenu) | ||
| 576 | 623 | ||
| 624 | |||
| 577 | ;; Imenu support | 625 | ;; Imenu support |
| 578 | (defvar f90-imenu-generic-expression | 626 | (defvar f90-imenu-generic-expression |
| 579 | (cons | 627 | (let ((good-char "[^!\"\&\n \t]") (not-e "[^e!\n\"\& \t]") |
| 580 | (concat | 628 | (not-n "[^n!\n\"\& \t]") (not-d "[^d!\n\"\& \t]")) |
| 581 | "^[ \t0-9]*\\(" | 629 | (list |
| 582 | "program[ \t]+\\(\\sw+\\)\\|" | 630 | '(nil "^[ \t0-9]*program[ \t]+\\(\\sw+\\)" 1) |
| 583 | "module[ \t]+\\(\\sw+\\)[ \t]*\\(!\\|$\\)\\|" | 631 | '("Modules" "^[ \t0-9]*module[ \t]+\\(\\sw+\\)[ \t]*\\(!\\|$\\)" 1) |
| 584 | "\\(pure\\|recursive\\|extrinsic([^)]+)\\)?[ \t]*" | 632 | '("Types" "^[ \t0-9]*type[ \t]+\\(\\sw+\\)" 1) |
| 585 | "subroutine[ \t]+\\(\\sw+\\)\\|" | 633 | (list |
| 586 | ; avoid end function, but allow for most other things | 634 | "Procedures" |
| 587 | "\\([^!]*\\([^e!].[^ \t!]\\|.[^n!][^ \t!]\\|..[^d \t!]\\)" | 635 | (concat |
| 588 | "\\|[^!]?[^!]?\\)[ \t]*function[ \t]+\\(\\sw+\\)" | 636 | "^[ \t0-9]*" |
| 589 | "\\)") | 637 | "\\(" |
| 590 | (list 2 3 6 9)) | 638 | ;; At least three non-space characters before function/subroutine |
| 639 | ;; Check that the last three non-space characters don't spell E N D | ||
| 640 | "[^!\"\&\n]*\\(" | ||
| 641 | not-e good-char good-char "\\|" | ||
| 642 | good-char not-n good-char "\\|" | ||
| 643 | good-char good-char not-d "\\)" | ||
| 644 | "\\|" | ||
| 645 | ;; Less than three non-space characters before function/subroutine | ||
| 646 | good-char "?" good-char "?" | ||
| 647 | "\\)" | ||
| 648 | "[ \t]*\\(function\\|subroutine\\)[ \t]+\\(\\sw+\\)") | ||
| 649 | 4))) | ||
| 591 | "imenu generic expression for F90 mode.") | 650 | "imenu generic expression for F90 mode.") |
| 592 | 651 | ||
| 652 | (defun f90-add-imenu-menu () | ||
| 653 | (interactive) | ||
| 654 | "Add an imenu menu to the menubar." | ||
| 655 | (if (not f90-imenu) | ||
| 656 | (progn | ||
| 657 | (imenu-add-to-menubar "F90-imenu") | ||
| 658 | (redraw-frame (selected-frame)) | ||
| 659 | (setq f90-imenu t)) | ||
| 660 | (message "%s" "F90-imenu already exists."))) | ||
| 661 | (put 'f90-add-imenu-menu 'menu-enable '(not f90-imenu)) | ||
| 662 | |||
| 663 | |||
| 593 | ;; When compiling under GNU Emacs, load imenu during compilation. If | 664 | ;; When compiling under GNU Emacs, load imenu during compilation. If |
| 594 | ;; you have 19.22 or earlier, comment this out, or get imenu. | 665 | ;; you have 19.22 or earlier, comment this out, or get imenu. |
| 595 | (and (fboundp 'eval-when-compile) | 666 | (and (fboundp 'eval-when-compile) |
| @@ -597,8 +668,6 @@ program\\|select\\|subroutine\\|type\\|where\\|forall\\)\\>") | |||
| 597 | (if (not (string-match "XEmacs" emacs-version)) | 668 | (if (not (string-match "XEmacs" emacs-version)) |
| 598 | (require 'imenu)) | 669 | (require 'imenu)) |
| 599 | ())) | 670 | ())) |
| 600 | |||
| 601 | |||
| 602 | 671 | ||
| 603 | ;; abbrevs have generally two letters, except standard types `c, `i, `r, `t | 672 | ;; abbrevs have generally two letters, except standard types `c, `i, `r, `t |
| 604 | (defvar f90-mode-abbrev-table nil) | 673 | (defvar f90-mode-abbrev-table nil) |
| @@ -743,6 +812,8 @@ with no args, if that value is non-nil." | |||
| 743 | (setq comment-indent-function 'f90-comment-indent) | 812 | (setq comment-indent-function 'f90-comment-indent) |
| 744 | (make-local-variable 'abbrev-all-caps) | 813 | (make-local-variable 'abbrev-all-caps) |
| 745 | (setq abbrev-all-caps t) | 814 | (setq abbrev-all-caps t) |
| 815 | (make-local-variable 'normal-auto-fill-function) | ||
| 816 | (setq normal-auto-fill-function 'f90-do-auto-fill) | ||
| 746 | (setq indent-tabs-mode nil) | 817 | (setq indent-tabs-mode nil) |
| 747 | ;; Setting up things for font-lock | 818 | ;; Setting up things for font-lock |
| 748 | (if (string-match "Xemacs" emacs-version) | 819 | (if (string-match "Xemacs" emacs-version) |
| @@ -757,12 +828,8 @@ with no args, if that value is non-nil." | |||
| 757 | (setq font-lock-keywords f90-font-lock-keywords)) | 828 | (setq font-lock-keywords f90-font-lock-keywords)) |
| 758 | ;; Emacs | 829 | ;; Emacs |
| 759 | (make-local-variable 'font-lock-defaults) | 830 | (make-local-variable 'font-lock-defaults) |
| 760 | (setq font-lock-defaults | 831 | (setq font-lock-defaults '(f90-font-lock-keywords nil t)) |
| 761 | '((f90-font-lock-keywords f90-font-lock-keywords-1 | 832 | |
| 762 | f90-font-lock-keywords-2 | ||
| 763 | f90-font-lock-keywords-3 | ||
| 764 | f90-font-lock-keywords-4) | ||
| 765 | nil t)) | ||
| 766 | ;; Tell imenu how to handle f90. | 833 | ;; Tell imenu how to handle f90. |
| 767 | (make-local-variable 'imenu-generic-expression) | 834 | (make-local-variable 'imenu-generic-expression) |
| 768 | (setq imenu-generic-expression f90-imenu-generic-expression)) | 835 | (setq imenu-generic-expression f90-imenu-generic-expression)) |
| @@ -914,12 +981,8 @@ Name is non-nil only for type." | |||
| 914 | ((and (not (looking-at "module[ \t]*procedure\\>")) | 981 | ((and (not (looking-at "module[ \t]*procedure\\>")) |
| 915 | (looking-at "\\(module\\)[ \t]+\\(\\sw+\\)\\>")) | 982 | (looking-at "\\(module\\)[ \t]+\\(\\sw+\\)\\>")) |
| 916 | (list (f90-match-piece 1) (f90-match-piece 2))) | 983 | (list (f90-match-piece 1) (f90-match-piece 2))) |
| 917 | ((looking-at (concat | 984 | ((and (not (looking-at "end[ \t]*\\(function\\|subroutine\\)")) |
| 918 | "\\(pure\\|recursive\\|extrinsic([^)]+)\\)?[ \t]*" | 985 | (looking-at "[^!\"\&\n]*\\(function\\|subroutine\\)[ \t]+\\(\\sw+\\)")) |
| 919 | "\\(subroutine\\)[ \t]+\\(\\sw+\\)")) | ||
| 920 | (list (f90-match-piece 2) (f90-match-piece 3))) | ||
| 921 | ((and (not (looking-at "end[ \t]*function")) | ||
| 922 | (looking-at "[^!\"\&\\n]*\\(function\\)[ \t]+\\(\\sw+\\)")) | ||
| 923 | (list (f90-match-piece 1) (f90-match-piece 2))))) | 986 | (list (f90-match-piece 1) (f90-match-piece 2))))) |
| 924 | 987 | ||
| 925 | (defsubst f90-looking-at-program-block-end () | 988 | (defsubst f90-looking-at-program-block-end () |
| @@ -1319,7 +1382,7 @@ If run in the middle of a line, the line is not broken." | |||
| 1319 | (goto-char save-point) | 1382 | (goto-char save-point) |
| 1320 | (set-marker end-region-mark nil) | 1383 | (set-marker end-region-mark nil) |
| 1321 | (set-marker save-point nil) | 1384 | (set-marker save-point nil) |
| 1322 | (if (string-match "Xemacs" emacs-version) | 1385 | (if (string-match "XEmacs" emacs-version) |
| 1323 | (zmacs-deactivate-region) | 1386 | (zmacs-deactivate-region) |
| 1324 | (deactivate-mark)))) | 1387 | (deactivate-mark)))) |
| 1325 | 1388 | ||
| @@ -1348,14 +1411,13 @@ If run in the middle of a line, the line is not broken." | |||
| 1348 | (cond ((f90-in-string) | 1411 | (cond ((f90-in-string) |
| 1349 | (insert "&") (newline) (insert "&")) | 1412 | (insert "&") (newline) (insert "&")) |
| 1350 | ((f90-in-comment) | 1413 | ((f90-in-comment) |
| 1351 | (delete-horizontal-space) | ||
| 1352 | (setq ctype (f90-get-present-comment-type)) | 1414 | (setq ctype (f90-get-present-comment-type)) |
| 1353 | (newline) (insert (concat ctype " "))) | 1415 | (newline) |
| 1354 | (t (delete-horizontal-space) | 1416 | (insert ctype)) |
| 1355 | (insert "&") | 1417 | (t (insert "&") |
| 1356 | (if (not no-update) (f90-update-line)) | 1418 | (if (not no-update) (f90-update-line)) |
| 1357 | (newline) | 1419 | (newline) |
| 1358 | (if f90-beginning-ampersand (insert "& "))))) | 1420 | (if f90-beginning-ampersand (insert "&"))))) |
| 1359 | (if (not no-update) (f90-indent-line))) | 1421 | (if (not no-update) (f90-indent-line))) |
| 1360 | 1422 | ||
| 1361 | (defun f90-find-breakpoint () | 1423 | (defun f90-find-breakpoint () |
| @@ -1370,33 +1432,21 @@ If run in the middle of a line, the line is not broken." | |||
| 1370 | (forward-char 2) | 1432 | (forward-char 2) |
| 1371 | (forward-char))))) | 1433 | (forward-char))))) |
| 1372 | 1434 | ||
| 1373 | (defun f90-auto-fill-mode (arg) | ||
| 1374 | "Toggle f90-auto-fill mode. | ||
| 1375 | With ARG, turn `f90-auto-fill' mode on iff ARG is positive. | ||
| 1376 | In `f90-auto-fill' mode, inserting a space at a column beyond `fill-column' | ||
| 1377 | automatically breaks the line at a previous space." | ||
| 1378 | (interactive "P") | ||
| 1379 | (prog1 (setq auto-fill-function | ||
| 1380 | (if (if (null arg) | ||
| 1381 | (not auto-fill-function) | ||
| 1382 | (> (prefix-numeric-value arg) 0)) | ||
| 1383 | 'f90-do-auto-fill)) | ||
| 1384 | (force-mode-line-update))) | ||
| 1385 | |||
| 1386 | (defun f90-do-auto-fill () | 1435 | (defun f90-do-auto-fill () |
| 1387 | "Break line if non-white characters beyond fill-column." | 1436 | "Break line if non-white characters beyond fill-column." |
| 1388 | (interactive) | 1437 | (interactive) |
| 1389 | ;; Break the line before or after the last delimiter (non-word char). | 1438 | ;; Break the line before or after the last delimiter (non-word char) if |
| 1439 | ;; position is beyond fill-column. | ||
| 1390 | ;; Will not break **, //, or => (specified by f90-no-break-re). | 1440 | ;; Will not break **, //, or => (specified by f90-no-break-re). |
| 1391 | ;; Start by checking that line is longer than fill-column. | 1441 | (while (> (current-column) fill-column) |
| 1392 | (if (> (save-excursion (end-of-line) (current-column)) fill-column) | 1442 | (let ((pos-mark (point-marker))) |
| 1393 | (progn | ||
| 1394 | (move-to-column fill-column) | 1443 | (move-to-column fill-column) |
| 1395 | (if (and (looking-at "[ \t]*$") (not (f90-in-string))) | 1444 | (if (not (f90-in-string)) |
| 1396 | (delete-horizontal-space) | 1445 | (f90-find-breakpoint)) |
| 1397 | (f90-find-breakpoint) | 1446 | (f90-break-line) |
| 1398 | (f90-break-line) | 1447 | (goto-char pos-mark) |
| 1399 | (end-of-line))))) | 1448 | (set-marker pos-mark nil)))) |
| 1449 | |||
| 1400 | 1450 | ||
| 1401 | (defun f90-join-lines () | 1451 | (defun f90-join-lines () |
| 1402 | "Join present line with next line, if this line ends with \&." | 1452 | "Join present line with next line, if this line ends with \&." |
| @@ -1523,7 +1573,7 @@ Leave point at the end of line." | |||
| 1523 | (f90-update-line) | 1573 | (f90-update-line) |
| 1524 | (if (eq f90-smart-end 'blink) | 1574 | (if (eq f90-smart-end 'blink) |
| 1525 | (if (< (point) top-of-window) | 1575 | (if (< (point) top-of-window) |
| 1526 | (message "Matches %d: %s" | 1576 | (message "Matches %s: %s" |
| 1527 | (what-line) | 1577 | (what-line) |
| 1528 | (buffer-substring | 1578 | (buffer-substring |
| 1529 | (progn (beginning-of-line) (point)) | 1579 | (progn (beginning-of-line) (point)) |