# HG changeset patch # User Glenn Morris # Date 1019771739 0 # Node ID 582f083ed5791777da435c5db38939c051df5d52 # Parent 590c97430876a4048367d6ae056c801d81ef29f9 General tidy-up of commentary and some doc strings. diff -r 590c97430876 -r 582f083ed579 lisp/progmodes/f90.el --- a/lisp/progmodes/f90.el Thu Apr 25 21:45:49 2002 +0000 +++ b/lisp/progmodes/f90.el Thu Apr 25 21:55:39 2002 +0000 @@ -25,24 +25,29 @@ ;;; Commentary: -;; Smart mode for editing F90 programs in FREE FORMAT. +;; Major mode for editing F90 programs in FREE FORMAT. +;; The minor language revision F95 is also supported (with font-locking). + ;; Knows about continuation lines, named structured statements, and other -;; new features in F90 including HPF (High Performance Fortran) structures. -;; The basic feature is to provide an accurate indentation of F90 programs. +;; features in F90 including HPF (High Performance Fortran) structures. +;; The basic feature provides accurate indentation of F90 programs. ;; In addition, there are many more features like automatic matching of all ;; end statements, an auto-fill function to break long lines, a join-lines -;; function which joins continued lines etc etc. -;; To facilitate typing, a fairly complete list of abbreviations is provided. -;; For example, `i is short-hand for integer (if abbrev-mode is on). +;; function which joins continued lines, etc. -;; There are two separate features for highlighting the code. +;; To facilitate typing, a fairly complete list of abbreviations is provided. +;; All abbreviations begin with the backquote character "`" +;; (this requires modification of the syntax-table). +;; For example, `i expands to integer (if abbrev-mode is on). + +;; There are two separate features for altering the appearance of code: ;; 1) Upcasing or capitalizing of all keywords. -;; 2) Colors/fonts using font-lock-mode. (only when using X-windows) -;; Automatic upcase of downcase of keywords is controlled by the parameter -;; f90-auto-keyword-case. +;; 2) Colors/fonts using font-lock-mode. +;; Automatic upcase or downcase of keywords is controlled by the variable +;; f90-auto-keyword-case. ;; The indentations of lines starting with ! is determined by the first of the -;; following matches (the values in the left column are the default values): +;; following matches (values in the left column are the defaults): ;; start-string/regexp indent variable holding start-string/regexp ;; !!! 0 @@ -56,25 +61,27 @@ ;; ! as code as code ;; !! comment-column as code ;; ![^!] as code comment-column -;; Trailing comments are indented to comment-column with indent-for-comment M-; -;; f90-comment-region (C-c;) toggles insertion of f90-comment-region in region. +;; Trailing comments are indented to comment-column with indent-for-comment. +;; The function f90-comment-region toggles insertion of +;; the variable f90-comment-region in every line of the region. ;; One common convention for free vs. fixed format is that free-format files -;; have the ending .f90 while the fixed format files have the ending .f. -;; To make f90-mode work, put this file in, for example, your directory -;; ~/lisp, and be sure that you have the following in your .emacs-file -;; (setq load-path (append load-path '("~/lisp"))) -;; (autoload 'f90-mode "f90" -;; "Major mode for editing Fortran 90 code in free format." t) -;; (setq auto-mode-alist (append auto-mode-alist -;; (list '("\\.f90$" . f90-mode)))) +;; have the ending .f90 or .f95 while fixed format files have the ending .f. +;; Emacs automatically loads Fortran files in the appropriate mode based +;; on extension. You can modify this by adjusting the variable auto-mode-alist. +;; For example: +;; (add-to-list 'auto-mode-alist '("\\.f\\'" . f90-mode)) + ;; Once you have entered f90-mode, you may get more info by using -;; the command describe-mode (C-h m). For online help describing various -;; functions use C-h f +;; the command describe-mode (C-h m). For online help use +;; C-h f , or +;; C-h v . -;; To customize the f90-mode for your taste, use, for example: -;; (you don't have to specify values for all the parameters below) +;; To customize f90-mode for your taste, use, for example: +;; (you don't have to specify values for all the parameters below) +;; ;;(add-hook 'f90-mode-hook +;; ;; These are the default values. ;; '(lambda () (setq f90-do-indent 3 ;; f90-if-indent 3 ;; f90-type-indent 3 @@ -83,33 +90,35 @@ ;; f90-comment-region "!!$" ;; f90-directive-comment-re "!hpf\\$" ;; f90-indented-comment-re "!" -;; f90-break-delimiters "[-+\\*/,><=% \t]" +;; f90-break-delimiters "[-+\\*/><=,% \t]" ;; f90-break-before-delimiters t ;; f90-beginning-ampersand t ;; f90-smart-end 'blink ;; f90-auto-keyword-case nil -;; f90-leave-line-no nil +;; f90-leave-line-no nil ;; indent-tabs-mode nil ;; f90-font-lock-keywords f90-font-lock-keywords-2 ;; ) -;; ;;The rest is not default. +;; ;; These are not default. ;; (abbrev-mode 1) ; turn on abbreviation mode ;; (f90-add-imenu-menu) ; extra menu with functions etc. ;; (if f90-auto-keyword-case ; change case of all keywords on startup ;; (f90-change-keywords f90-auto-keyword-case)) ;; )) -;; in your .emacs file (the shown values are the defaults). You can also -;; change the values of the lists f90-keywords etc. -;; The auto-fill and abbreviation minor modes are accessible from the menu, +;; +;; in your .emacs file. You can also customize the lists +;; f90-font-lock-keywords, etc. +;; +;; The auto-fill and abbreviation minor modes are accessible from the F90 menu, ;; or by using M-x auto-fill-mode and M-x abbrev-mode, respectively. ;; Remarks ;; 1) Line numbers are by default left-justified. If f90-leave-line-no is ;; non-nil, the line numbers are never touched. -;; 2) Multi-; statements like > do i=1,20 ; j=j+i ; end do < are not handled +;; 2) Multi-; statements like "do i=1,20 ; j=j+i ; end do" are not handled ;; correctly, but I imagine them to be rare. ;; 3) Regexps for hilit19 are no longer supported. -;; 4) For FIXED FORMAT code, use the ordinary fortran mode. +;; 4) For FIXED FORMAT code, use fortran mode. ;; 5) This mode does not work under emacs-18.x. ;; 6) Preprocessor directives, i.e., lines starting with # are left-justified ;; and are untouched by all case-changing commands. There is, at present, no @@ -134,22 +143,27 @@ ;; f90-add-imenu-menu ;; f90-font-lock-1, f90-font-lock-2, f90-font-lock-3, f90-font-lock-4 +;; Original author's thanks ;; Thanks to all the people who have tested the mode. Special thanks to Jens ;; Bloch Helmers for encouraging me to write this code, for creative ;; suggestions as well as for the lists of hpf-commands. ;; Also thanks to the authors of the fortran and pascal modes, on which some ;; of this code is built. +;; TODO +;; Support for hideshow, align. +;; OpenMP, preprocessor highlighting. + ;;; Code: ;; User options (defgroup f90 nil - "Fortran-90 mode" + "Major mode for editing Fortran 90,95 code." :group 'languages) (defgroup f90-indent nil - "Fortran-90 indentation" + "Indentation in free-format Fortran." :prefix "f90-" :group 'f90) @@ -180,13 +194,12 @@ :group 'f90-indent) (defcustom f90-comment-region "!!$" - "*String inserted by \\[f90-comment-region]\ - at start of each line in region." + "*String inserted by \\[f90-comment-region] at start of each line in region." :type 'string :group 'f90-indent) (defcustom f90-indented-comment-re "!" - "*Regexp saying which comments to be indented like code." + "*Regexp saying which comments to indent like code." :type 'regexp :group 'f90-indent) @@ -196,7 +209,7 @@ :group 'f90-indent) (defcustom f90-beginning-ampersand t - "*t makes automatic insertion of \& at beginning of continuation line." + "*Non-nil gives automatic insertion of \& at start of continuation line." :type 'boolean :group 'f90) @@ -219,13 +232,13 @@ (defcustom f90-auto-keyword-case nil "*Automatic case conversion of keywords. - The options are 'downcase-word, 'upcase-word, 'capitalize-word and nil" +The options are 'downcase-word, 'upcase-word, 'capitalize-word and nil." :type '(choice (const downcase-word) (const upcase-word) (const capitalize-word) (const nil)) :group 'f90) (defcustom f90-leave-line-no nil - "*If nil, left-justify linenumbers." + "*If non-nil, line numbers are not left justified." :type 'boolean :group 'f90) @@ -259,7 +272,6 @@ "elemental" "pure") 'words) "Keyword-regexp for font-lock level >= 3.") - (defconst f90-procedures-re (concat "\\<" (regexp-opt @@ -356,7 +368,7 @@ (1 font-lock-keyword-face) (2 font-lock-constant-face)) ;; line numbers (lines whose first character after number is letter) '("^[ \t]*\\([0-9]+\\)[ \t]*[a-z]+" (1 font-lock-constant-face t)))) - "Highlights declarations, do-loops and other constructions") + "Highlights declarations, do-loops and other constructs.") (defvar f90-font-lock-keywords-3 (append f90-font-lock-keywords-2 @@ -374,7 +386,7 @@ "Highlights all F90 and HPF keywords.") (defvar f90-font-lock-keywords - f90-font-lock-keywords-2 + f90-font-lock-keywords-2 "*Default expressions to highlight in F90 mode.") ;; syntax table @@ -644,11 +656,11 @@ "\\)" "[ \t]*\\(function\\|subroutine\\)[ \t]+\\(\\sw+\\)") 4))) - "imenu generic expression for F90 mode.") + "Generic imenu expression for F90 mode.") (defun f90-add-imenu-menu () + "Add an imenu menu to the menubar." (interactive) - "Add an imenu menu to the menubar." (if (not f90-imenu) (progn (imenu-add-to-menubar "F90-imenu") @@ -735,12 +747,12 @@ ;;;###autoload (defun f90-mode () - "Major mode for editing Fortran 90 code in free format. + "Major mode for editing Fortran 90,95 code in free format. \\[f90-indent-new-line] corrects current indentation and creates new\ indented line. -\\[f90-indent-line] indents the current line correctly. -\\[f90-indent-subprogram] indents the current subprogram. +\\[f90-indent-line] indents the current line correctly. +\\[f90-indent-subprogram] indents the current subprogram. Type `? or `\\[help-command] to display a list of built-in\ abbrevs for F90 keywords. @@ -750,44 +762,44 @@ Variables controlling indentation style and extra features: - f90-do-indent + `f90-do-indent' Extra indentation within do blocks. (default 3) - f90-if-indent - Extra indentation within if/select case/where/forall blocks. (default 3) - f90-type-indent + `f90-if-indent' + Extra indentation within if/select case/where/forall blocks. (default 3) + `f90-type-indent' Extra indentation within type/interface/block-data blocks. (default 3) - f90-program-indent + `f90-program-indent' Extra indentation within program/module/subroutine/function blocks. - (default 2) - f90-continuation-indent + (default 2) + `f90-continuation-indent' Extra indentation applied to continuation lines. (default 5) - f90-comment-region + `f90-comment-region' String inserted by \\[f90-comment-region] at start of each line in region. (default \"!!!$\") - f90-indented-comment-re + `f90-indented-comment-re' Regexp determining the type of comment to be intended like code. (default \"!\") - f90-directive-comment-re + `f90-directive-comment-re' Regexp of comment-like directive like \"!HPF\\\\$\", not to be indented. (default \"!hpf\\\\$\") - f90-break-delimiters + `f90-break-delimiters' Regexp holding list of delimiters at which lines may be broken. (default \"[-+*/><=,% \\t]\") - f90-break-before-delimiters + `f90-break-before-delimiters' Non-nil causes `f90-do-auto-fill' to break lines before delimiters. (default t) - f90-beginning-ampersand + `f90-beginning-ampersand' Automatic insertion of \& at beginning of continuation lines. (default t) - f90-smart-end + `f90-smart-end' From an END statement, check and fill the end using matching block start. Allowed values are 'blink, 'no-blink, and nil, which determine - whether to blink the matching beginning.) (default 'blink) - f90-auto-keyword-case - Automatic change of case of keywords. (default nil) + whether to blink the matching beginning. (default 'blink) + `f90-auto-keyword-case' + Automatic change of case of keywords. (default nil) The possibilities are 'downcase-word, 'upcase-word, 'capitalize-word. - f90-leave-line-no - Do not left-justify line numbers. (default nil) - f90-keywords-re + `f90-leave-line-no' + Do not left-justify line numbers. (default nil) + `f90-keywords-re' List of keywords used for highlighting/upcase-keywords etc. Turning on F90 mode calls the value of the variable `f90-mode-hook' @@ -877,7 +889,7 @@ (defsubst f90-indent-to (col &optional no-line-number) "Indent current line to column COL. -If no-line-number nil, jump over a possible line-number." +If optional argument NO-LINE-NUMBER is nil, jump over a possible line-number." (beginning-of-line) (if (not no-line-number) (skip-chars-forward " \t0-9")) @@ -1040,8 +1052,8 @@ (f90-change-keywords f90-auto-keyword-case bol eol)))))) (defun f90-electric-insert () + "Call `f90-do-auto-fill' at each operator insertion." (interactive) - "Calls f90-do-auto-fill at each operator insertion." (self-insert-command 1) (f90-update-line) (if auto-fill-function (f90-do-auto-fill))) @@ -1241,7 +1253,9 @@ (set-marker end nil))) (defun f90-indent-line (&optional no-update) - "Indent current line as F90 code." + "Indent current line as F90 code. +Unless optional argument NO-UPDATE is non-nil, call `f90-update-line' +after indenting." (interactive) (let (indent (no-line-number nil) (pos (make-marker)) (case-fold-search t)) (set-marker pos (point)) @@ -1266,8 +1280,8 @@ (set-marker pos nil))) (defun f90-indent-new-line () - "Reindent the current F90 line, insert a newline and indent the newline. -An abbrev before point is expanded if `abbrev-mode' is non-nil. + "Reindent current line, insert a newline and indent the newline. +An abbrev before point is expanded if the variable `abbrev-mode' is non-nil. If run in the middle of a line, the line is not broken." (interactive) (let (string cont (case-fold-search t)) @@ -1408,7 +1422,9 @@ ;; autofill and break-line (defun f90-break-line (&optional no-update) - "Break line at point, insert continuation marker(s) and indent." + "Break line at point, insert continuation marker(s) and indent. +Unless in a string or comment, or if the optional argument NO-UPDATE +is non-nil, call `f90-update-line' after inserting the continuation marker." (interactive) (let (ctype) (cond ((f90-in-string) @@ -1424,7 +1440,7 @@ (indent-according-to-mode)) (defun f90-find-breakpoint () - "From fill-column, search backward for break-delimiter." + "From `fill-column', search backward for break-delimiter." (let ((bol (line-beginning-position))) (re-search-backward f90-break-delimiters bol) (if f90-break-before-delimiters @@ -1436,7 +1452,7 @@ (forward-char))))) (defun f90-do-auto-fill () - "Break line if non-white characters beyond fill-column. Also, update line. " + "Break line if non-white characters beyond `fill-column'. Also, update line." (interactive) ;; Break the line before or after the last delimiter (non-word char) if ;; position is beyond fill-column. @@ -1585,7 +1601,7 @@ (f90-block-match beg-block beg-name end-block end-name))))))) (defun f90-insert-end () - "Inserts an complete end statement matching beginning of present block." + "Insert a complete end statement matching beginning of present block." (interactive) (let ((f90-smart-end (if f90-smart-end f90-smart-end 'blink))) (insert "end")