X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9850eff524bd0747a9561f3b4c90dfc3749f4ecb..114f9c96795aff3b51b9060d7c9c1b77debcc99a:/lisp/progmodes/f90.el diff --git a/lisp/progmodes/f90.el b/lisp/progmodes/f90.el index 6e5dee5130..8f95da7046 100644 --- a/lisp/progmodes/f90.el +++ b/lisp/progmodes/f90.el @@ -1,7 +1,7 @@ ;;; f90.el --- Fortran-90 mode (free format) ;; Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2005, -;; 2006, 2007, 2008 Free Software Foundation, Inc. +;; 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: Torbj\"orn Einarsson ;; Maintainer: Glenn Morris @@ -182,63 +182,63 @@ (defcustom f90-do-indent 3 "Extra indentation applied to DO blocks." :type 'integer + :safe 'integerp :group 'f90-indent) -(put 'f90-do-indent 'safe-local-variable 'integerp) (defcustom f90-if-indent 3 "Extra indentation applied to IF, SELECT CASE, WHERE and FORALL blocks." :type 'integer + :safe 'integerp :group 'f90-indent) -(put 'f90-if-indent 'safe-local-variable 'integerp) (defcustom f90-type-indent 3 "Extra indentation applied to TYPE, ENUM, INTERFACE and BLOCK DATA blocks." :type 'integer + :safe 'integerp :group 'f90-indent) -(put 'f90-type-indent 'safe-local-variable 'integerp) (defcustom f90-program-indent 2 "Extra indentation applied to PROGRAM, MODULE, SUBROUTINE, FUNCTION blocks." :type 'integer + :safe 'integerp :group 'f90-indent) -(put 'f90-program-indent 'safe-local-variable 'integerp) (defcustom f90-associate-indent 2 "Extra indentation applied to ASSOCIATE blocks." :type 'integer + :safe 'integerp :group 'f90-indent :version "23.1") -(put 'f90-associate-indent 'safe-local-variable 'integerp) (defcustom f90-continuation-indent 5 "Extra indentation applied to continuation lines." :type 'integer + :safe 'integerp :group 'f90-indent) -(put 'f90-continuation-indent 'safe-local-variable 'integerp) (defcustom f90-comment-region "!!$" "String inserted by \\[f90-comment-region] at start of each line in region." :type 'string + :safe 'stringp :group 'f90-indent) -(put 'f90-comment-region 'safe-local-variable 'stringp) (defcustom f90-indented-comment-re "!" "Regexp matching comments to indent as code." :type 'regexp + :safe 'stringp :group 'f90-indent) -(put 'f90-indented-comment-re 'safe-local-variable 'stringp) (defcustom f90-directive-comment-re "!hpf\\$" "Regexp of comment-like directive like \"!HPF\\\\$\", not to be indented." :type 'regexp + :safe 'stringp :group 'f90-indent) -(put 'f90-directive-comment-re 'safe-local-variable 'stringp) (defcustom f90-beginning-ampersand t "Non-nil gives automatic insertion of \& at start of continuation line." :type 'boolean + :safe 'booleanp :group 'f90) -(put 'f90-beginning-ampersand 'safe-local-variable 'booleanp) (defcustom f90-smart-end 'blink "Qualification of END statements according to the matching block start. @@ -248,48 +248,47 @@ values are 'blink, 'no-blink, and nil. If nil, nothing is done. The other two settings have the same effect, but 'blink additionally blinks the cursor to the start of the block." :type '(choice (const blink) (const no-blink) (const nil)) + :safe (lambda (value) (memq value '(blink no-blink nil))) :group 'f90) -(put 'f90-smart-end 'safe-local-variable - (lambda (value) (memq value '(blink no-blink nil)))) (defcustom f90-break-delimiters "[-+\\*/><=,% \t]" "Regexp matching delimiter characters at which lines may be broken. -There are certain tokens comprised entirely of characters -matching this regexp that should not be split, and these are -specified by the constant `f90-no-break-re'." - :type 'regexp +There are some common two-character tokens where one or more of +the members matches this regexp. Although Fortran allows breaks +within lexical tokens (provided the next line has a beginning ampersand), +the constant `f90-no-break-re' ensures that such tokens are not split." + :type 'regexp + :safe 'stringp :group 'f90) -(put 'f90-break-delimiters 'safe-local-variable 'stringp) (defcustom f90-break-before-delimiters t "Non-nil causes `f90-do-auto-fill' to break lines before delimiters." - :type 'boolean + :type 'boolean + :safe 'booleanp :group 'f90) -(put 'f90-break-before-delimiters 'safe-local-variable 'booleanp) (defcustom f90-auto-keyword-case nil "Automatic case conversion of keywords. The options are 'downcase-word, 'upcase-word, 'capitalize-word and nil." :type '(choice (const downcase-word) (const upcase-word) (const capitalize-word) (const nil)) + :safe (lambda (value) (memq value '(downcase-word + capitalize-word upcase-word nil))) :group 'f90) -(put 'f90-auto-keyword-case 'safe-local-variable - (lambda (value) (memq value '(downcase-word - capitalize-word upcase-word nil)))) (defcustom f90-leave-line-no nil "If non-nil, line numbers are not left justified." :type 'boolean + :safe 'booleanp :group 'f90) -(put 'f90-leave-line-no 'safe-local-variable 'booleanp) (defcustom f90-mode-hook nil "Hook run when entering F90 mode." :type 'hook + ;; Not the only safe options, but some common ones. + :safe (lambda (value) (member value '((f90-add-imenu-menu) nil))) :options '(f90-add-imenu-menu) :group 'f90) -(put 'f90-mode-hook 'safe-local-variable - (lambda (value) (member value '((f90-add-imenu-menu) nil)))) ;; User options end here. @@ -653,7 +652,7 @@ Can be overridden by the value of `font-lock-maximum-decoration'.") (define-key map "\C-\M-p" 'f90-beginning-of-block) (define-key map "\C-\M-q" 'f90-indent-subprogram) (define-key map "\C-j" 'f90-indent-new-line) ; LFD equals C-j - (define-key map "\r" 'newline) +;;; (define-key map "\r" 'newline) (define-key map "\C-c\r" 'f90-break-line) ;;; (define-key map [M-return] 'f90-break-line) (define-key map "\C-c\C-a" 'f90-previous-block) @@ -663,7 +662,8 @@ Can be overridden by the value of `font-lock-maximum-decoration'.") (define-key map "\C-c\C-p" 'f90-previous-statement) (define-key map "\C-c\C-n" 'f90-next-statement) (define-key map "\C-c\C-w" 'f90-insert-end) - (define-key map "\t" 'f90-indent-line) + ;; Standard tab binding will call this, and also handle regions. +;;; (define-key map "\t" 'f90-indent-line) (define-key map "," 'f90-electric-insert) (define-key map "+" 'f90-electric-insert) (define-key map "-" 'f90-electric-insert) @@ -674,29 +674,44 @@ Can be overridden by the value of `font-lock-maximum-decoration'.") `("F90" ("Customization" ,(custom-menu-create 'f90) - ["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] + ;; FIXME useless? + ["Set" Custom-set :active t + :help "Set current value of all edited settings in the buffer"] + ["Save" Custom-save :active t + :help "Set and save all edited settings"] + ["Reset to Current" Custom-reset-current :active t + :help "Reset all edited settings to current"] + ["Reset to Saved" Custom-reset-saved :active t + :help "Reset all edited or set settings to saved"] + ["Reset to Standard Settings" Custom-reset-standard :active t + :help "Erase all cusomizations in buffer"] ) "--" - ["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] + ["Indent Subprogram" f90-indent-subprogram t] + ["Mark Subprogram" f90-mark-subprogram :active t :help + "Mark the end of the current subprogram, move point to the start"] + ["Beginning of Subprogram" f90-beginning-of-subprogram :active t + :help "Move point to the start of the current subprogram"] + ["End of Subprogram" f90-end-of-subprogram :active t + :help "Move point to the end of the current subprogram"] "--" - ["(Un)Comment Region" f90-comment-region mark-active] - ["Indent Region" f90-indent-region mark-active] - ["Fill Region" f90-fill-region mark-active] + ["(Un)Comment Region" f90-comment-region :active mark-active + :help "Comment or uncomment the region"] + ["Indent Region" f90-indent-region :active mark-active] + ["Fill Region" f90-fill-region :active mark-active + :help "Fill long lines in the region"] "--" - ["Break Line at Point" f90-break-line t] - ["Join with Previous Line" f90-join-lines t] - ["Insert Block End" f90-insert-end t] + ["Break Line at Point" f90-break-line :active t + :help "Break the current line at point"] + ["Join with Previous Line" f90-join-lines :active t + :help "Join the current line to the previous one"] + ["Insert Block End" f90-insert-end :active t + :help "Insert an end statement for the current code block"] "--" ("Highlighting" + :help "Fontify this buffer to varying degrees" ["Toggle font-lock-mode" font-lock-mode :selected font-lock-mode - :style toggle] + :style toggle :help "Fontify text in this buffer"] "--" ["Light highlighting (level 1)" f90-font-lock-1 t] ["Moderate highlighting (level 2)" f90-font-lock-2 t] @@ -704,6 +719,7 @@ Can be overridden by the value of `font-lock-maximum-decoration'.") ["Maximum highlighting (level 4)" f90-font-lock-4 t] ) ("Change Keyword Case" + :help "Change the case of keywords in the buffer or region" ["Upcase Keywords (buffer)" f90-upcase-keywords t] ["Capitalize Keywords (buffer)" f90-capitalize-keywords t] ["Downcase Keywords (buffer)" f90-downcase-keywords t] @@ -716,13 +732,16 @@ Can be overridden by the value of `font-lock-maximum-decoration'.") mark-active] ) "--" - ["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" f90-add-imenu-menu + ["Toggle Auto Fill" auto-fill-mode :selected auto-fill-function + :style toggle + :help "Automatically fill text while typing in this buffer"] + ["Toggle Abbrev Mode" abbrev-mode :selected abbrev-mode + :style toggle :help "Expand abbreviations while typing in this buffer"] + ["Add Imenu Menu" f90-add-imenu-menu :active (not (lookup-key (current-local-map) [menu-bar index])) - :included (fboundp 'imenu-add-to-menubar)])) + :included (fboundp 'imenu-add-to-menubar) + :help "Add an index menu to the menu-bar" + ])) map) "Keymap used in F90 mode.") @@ -803,12 +822,13 @@ Can be overridden by the value of `font-lock-maximum-decoration'.") "Regexp matching a CLASS/TYPE IS statement.") (defconst f90-no-break-re - (regexp-opt '("**" "//" "=>" ">=" "<=" "==" "/=") 'paren) - "Regexp specifying where not to break lines when filling. -This regexp matches certain tokens comprised entirely of -characters matching the regexp `f90-break-delimiters' that should -not be split by filling. Each element is assumed to be two -characters long.") + (regexp-opt '("**" "//" "=>" ">=" "<=" "==" "/=" "(/" "/)") 'paren) + "Regexp specifying two-character tokens not to split when breaking lines. +Each token has one or more of the characters from `f90-break-delimiters'. +Note that if only one of the characters is from that variable, +then the presence of the token here allows a line-break before or +after the other character, where a break would not normally be +allowed. This minor issue currently only affects \"(/\" and \"/)\".") (defvar f90-cache-position nil "Temporary position used to speed up region operations.") @@ -1336,9 +1356,8 @@ Does not check type and subprogram indentation." (let ((epnt (line-end-position)) icol cont) (save-excursion (while (and (f90-previous-statement) - (or (progn - (setq cont (f90-present-statement-cont)) - (or (eq cont 'end) (eq cont 'middle))) + (or (memq (setq cont (f90-present-statement-cont)) + '(middle end)) (looking-at "[ \t]*[0-9]")))) (setq icol (current-indentation)) (beginning-of-line) @@ -1486,7 +1505,8 @@ Return (TYPE NAME), or nil if not found." matching-beg ;; Note this includes the case of an un-named main program, ;; in which case we go to (point-min). - (if (interactive-p) (message "No beginning found")) + (if (called-interactively-p 'interactive) + (message "No beginning found")) nil))) (defun f90-end-of-subprogram () @@ -1511,7 +1531,8 @@ Return (TYPE NAME), or nil if not found." ;;; (forward-line 1) (if (zerop count) matching-end - (if (interactive-p) (message "No end found")) + (if (called-interactively-p 'interactive) + (message "No end found")) nil))) @@ -1523,7 +1544,8 @@ for consistency of block types and labels (if present), and completes outermost block if `f90-smart-end' is non-nil. Interactively, pushes mark before moving point." (interactive "p") - (if (interactive-p) (push-mark (point) t)) ; can move some distance + ;; Can move some distance. + (if (called-interactively-p 'any) (push-mark (point) t)) (and num (< num 0) (f90-beginning-of-block (- num))) (let ((f90-smart-end (if f90-smart-end 'no-blink)) ; for final match-end (case-fold-search t) @@ -1579,7 +1601,7 @@ Checks for consistency of block types and labels (if present). Does not check the outermost block, because it may be incomplete. Interactively, pushes mark before moving point." (interactive "p") - (if (interactive-p) (push-mark (point) t)) + (if (called-interactively-p 'any) (push-mark (point) t)) (and num (< num 0) (f90-end-of-block (- num))) (let ((case-fold-search t) (count (or num 1)) @@ -1757,7 +1779,7 @@ If run in the middle of a line, the line is not broken." (zerop (forward-line 1))) (< (point) end-region-mark))) (setq cont (f90-present-statement-cont)) - (while (and (or (eq cont 'middle) (eq cont 'end)) + (while (and (memq cont '(middle end)) (f90-previous-statement)) (setq cont (f90-present-statement-cont))) ;; Process present line for beginning of block. @@ -1885,6 +1907,8 @@ is non-nil, call `f90-update-line' after inserting the continuation marker." (t (insert "&") (or no-update (f90-update-line)) (newline 1) + ;; FIXME also need leading ampersand if split lexical token (eg ==). + ;; Or respect f90-no-break-re. (if f90-beginning-ampersand (insert "&")))) (indent-according-to-mode)) @@ -2073,7 +2097,7 @@ Leave point at the end of line." "Typing `\\[help-command] or `? lists all the F90 abbrevs. Any other key combination is executed normally." (interactive "*") - (insert last-command-char) + (insert last-command-event) (let (char event) (if (fboundp 'next-command-event) ; XEmacs (setq event (next-command-event) @@ -2082,7 +2106,7 @@ Any other key combination is executed normally." (setq event (read-event) char event)) ;; Insert char if not equal to `?', or if abbrev-mode is off. - (if (and abbrev-mode (or (eq char ??) (eq char help-char))) + (if (and abbrev-mode (memq char (list ?? help-char))) (f90-abbrev-help) (setq unread-command-events (list event)))))