⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fortran.el

📁 早期freebsd实现
💻 EL
📖 第 1 页 / 共 2 页
字号:
;;; Fortran mode for GNU Emacs  (beta test version 1.21, Oct. 1, 1985);;; Copyright (c) 1986 Free Software Foundation, Inc.;;; Written by Michael D. Prange (prange@erl.mit.edu);; This file is part of GNU Emacs.;; GNU Emacs is free software; you can redistribute it and/or modify;; it under the terms of the GNU General Public License as published by;; the Free Software Foundation; either version 1, or (at your option);; any later version.;; GNU Emacs is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License;; along with GNU Emacs; see the file COPYING.  If not, write to;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.;;; Author acknowledges help from Stephen Gildea <gildea@erl.mit.edu>;;; Bugs to bug-fortran-mode@erl.mit.edu.(defvar fortran-do-indent 3  "*Extra indentation applied to `do' blocks.")(defvar fortran-if-indent 3  "*Extra indentation applied to `if' blocks.")(defvar fortran-continuation-indent 5  "*Extra indentation applied to `continuation' lines.")(defvar fortran-comment-indent-style 'fixed  "*nil forces comment lines not to be touched,'fixed produces fixed comment indentation to comment-column,and 'relative indents to current fortran indentation plus comment-column.")(defvar fortran-comment-line-column 6  "*Indentation for text in comment lines.")(defvar comment-line-start nil  "*Delimiter inserted to start new full-line comment.")(defvar comment-line-start-skip nil  "*Regexp to match the start of a full-line comment.")(defvar fortran-minimum-statement-indent 6  "*Minimum indentation for fortran statements.");; Note that this is documented in the v18 manuals as being a string;; of length one rather than a single character.;; The code in this file accepts either format for compatibility.(defvar fortran-comment-indent-char ?   "*Character to be inserted for Fortran comment indentation.Normally a space.")(defvar fortran-line-number-indent 1  "*Maximum indentation for Fortran line numbers.5 means right-justify them within their five-column field.")(defvar fortran-check-all-num-for-matching-do nil  "*Non-nil causes all numbered lines to be treated as possible do-loop ends.")(defvar fortran-continuation-char ?$  "*Character which is inserted in column 5 by \\[fortran-split-line]to begin a continuation line.  Normally $.")(defvar fortran-comment-region "c$$$"  "*String inserted by \\[fortran-comment-region] at start of each line in region.")(defvar fortran-electric-line-number t  "*Non-nil causes line number digits to be moved to the correct column as typed.")(defvar fortran-startup-message t  "*Non-nil displays a startup message when fortran-mode is first called.")(defvar fortran-column-ruler  (concat "0   4 6  10        20        30        40        50        60        70\n"	  "[   ]|{   |    |    |    |    |    |    |    |    |    |    |    |    |}\n")  "*String displayed above current line by \\[fortran-column-ruler].")(defconst fortran-mode-version "1.21")(defvar fortran-mode-syntax-table nil  "Syntax table in use in fortran-mode buffers.")(if fortran-mode-syntax-table    ()  (setq fortran-mode-syntax-table (make-syntax-table))  (modify-syntax-entry ?\; "w" fortran-mode-syntax-table)  (modify-syntax-entry ?+ "." fortran-mode-syntax-table)  (modify-syntax-entry ?- "." fortran-mode-syntax-table)  (modify-syntax-entry ?* "." fortran-mode-syntax-table)  (modify-syntax-entry ?/ "." fortran-mode-syntax-table)  (modify-syntax-entry ?\' "\"" fortran-mode-syntax-table)  (modify-syntax-entry ?\" "\"" fortran-mode-syntax-table)  (modify-syntax-entry ?\\ "/" fortran-mode-syntax-table)  (modify-syntax-entry ?. "w" fortran-mode-syntax-table)  (modify-syntax-entry ?\n ">" fortran-mode-syntax-table))(defvar fortran-mode-map ()   "Keymap used in fortran mode.")(if fortran-mode-map    ()  (setq fortran-mode-map (make-sparse-keymap))  (define-key fortran-mode-map ";" 'fortran-abbrev-start)  (define-key fortran-mode-map "\C-c;" 'fortran-comment-region)  (define-key fortran-mode-map "\e\C-a" 'beginning-of-fortran-subprogram)  (define-key fortran-mode-map "\e\C-e" 'end-of-fortran-subprogram)  (define-key fortran-mode-map "\e;" 'fortran-indent-comment)  (define-key fortran-mode-map "\e\C-h" 'mark-fortran-subprogram)  (define-key fortran-mode-map "\e\n" 'fortran-split-line)  (define-key fortran-mode-map "\e\C-q" 'fortran-indent-subprogram)  (define-key fortran-mode-map "\C-c\C-w" 'fortran-window-create)  (define-key fortran-mode-map "\C-c\C-r" 'fortran-column-ruler)  (define-key fortran-mode-map "\C-c\C-p" 'fortran-previous-statement)  (define-key fortran-mode-map "\C-c\C-n" 'fortran-next-statement)  (define-key fortran-mode-map "\t" 'fortran-indent-line)  (define-key fortran-mode-map "0" 'fortran-electric-line-number)  (define-key fortran-mode-map "1" 'fortran-electric-line-number)  (define-key fortran-mode-map "2" 'fortran-electric-line-number)  (define-key fortran-mode-map "3" 'fortran-electric-line-number)  (define-key fortran-mode-map "4" 'fortran-electric-line-number)  (define-key fortran-mode-map "5" 'fortran-electric-line-number)  (define-key fortran-mode-map "6" 'fortran-electric-line-number)  (define-key fortran-mode-map "7" 'fortran-electric-line-number)  (define-key fortran-mode-map "8" 'fortran-electric-line-number)  (define-key fortran-mode-map "9" 'fortran-electric-line-number))(defvar fortran-mode-abbrev-table nil)(if fortran-mode-abbrev-table    ()  (define-abbrev-table 'fortran-mode-abbrev-table ())  (let ((abbrevs-changed nil))    (define-abbrev fortran-mode-abbrev-table  ";b"   "byte" nil)    (define-abbrev fortran-mode-abbrev-table  ";ch"  "character" nil)    (define-abbrev fortran-mode-abbrev-table  ";cl"  "close" nil)    (define-abbrev fortran-mode-abbrev-table  ";c"   "continue" nil)    (define-abbrev fortran-mode-abbrev-table  ";cm"  "common" nil)    (define-abbrev fortran-mode-abbrev-table  ";cx"  "complex" nil)    (define-abbrev fortran-mode-abbrev-table  ";di"  "dimension" nil)    (define-abbrev fortran-mode-abbrev-table  ";do"  "double" nil)    (define-abbrev fortran-mode-abbrev-table  ";dc"  "double complex" nil)    (define-abbrev fortran-mode-abbrev-table  ";dp"  "double precision" nil)    (define-abbrev fortran-mode-abbrev-table  ";dw"  "do while" nil)    (define-abbrev fortran-mode-abbrev-table  ";e"   "else" nil)    (define-abbrev fortran-mode-abbrev-table  ";ed"  "enddo" nil)    (define-abbrev fortran-mode-abbrev-table  ";el"  "elseif" nil)    (define-abbrev fortran-mode-abbrev-table  ";en"  "endif" nil)    (define-abbrev fortran-mode-abbrev-table  ";eq"  "equivalence" nil)    (define-abbrev fortran-mode-abbrev-table  ";ex"  "external" nil)    (define-abbrev fortran-mode-abbrev-table  ";ey"  "entry" nil)    (define-abbrev fortran-mode-abbrev-table  ";f"   "format" nil)    (define-abbrev fortran-mode-abbrev-table  ";fu"  "function" nil)    (define-abbrev fortran-mode-abbrev-table  ";g"   "goto" nil)    (define-abbrev fortran-mode-abbrev-table  ";im"  "implicit" nil)    (define-abbrev fortran-mode-abbrev-table  ";ib"  "implicit byte" nil)    (define-abbrev fortran-mode-abbrev-table  ";ic"  "implicit complex" nil)    (define-abbrev fortran-mode-abbrev-table  ";ich" "implicit character" nil)    (define-abbrev fortran-mode-abbrev-table  ";ii"  "implicit integer" nil)    (define-abbrev fortran-mode-abbrev-table  ";il"  "implicit logical" nil)    (define-abbrev fortran-mode-abbrev-table  ";ir"  "implicit real" nil)    (define-abbrev fortran-mode-abbrev-table  ";inc" "include" nil)    (define-abbrev fortran-mode-abbrev-table  ";in"  "integer" nil)    (define-abbrev fortran-mode-abbrev-table  ";intr" "intrinsic" nil)    (define-abbrev fortran-mode-abbrev-table  ";l"   "logical" nil)    (define-abbrev fortran-mode-abbrev-table  ";op"  "open" nil)    (define-abbrev fortran-mode-abbrev-table  ";pa"  "parameter" nil)    (define-abbrev fortran-mode-abbrev-table  ";pr"  "program" nil)    (define-abbrev fortran-mode-abbrev-table  ";p"   "print" nil)    (define-abbrev fortran-mode-abbrev-table  ";re"  "real" nil)    (define-abbrev fortran-mode-abbrev-table  ";r"   "read" nil)    (define-abbrev fortran-mode-abbrev-table  ";rt"  "return" nil)    (define-abbrev fortran-mode-abbrev-table  ";rw"  "rewind" nil)    (define-abbrev fortran-mode-abbrev-table  ";s"   "stop" nil)    (define-abbrev fortran-mode-abbrev-table  ";su"  "subroutine" nil)    (define-abbrev fortran-mode-abbrev-table  ";ty"  "type" nil)    (define-abbrev fortran-mode-abbrev-table  ";w"   "write" nil)))(defun fortran-mode ()  "Major mode for editing fortran code.Tab indents the current fortran line correctly. `do' statements must not share a common `continue'.Type `;?' or `;\\[help-command]' to display a list of built-in abbrevs for Fortran keywords.Variables controlling indentation style and extra features: comment-start    Normally nil in Fortran mode.  If you want to use comments    starting with `!', set this to the string \"!\". fortran-do-indent    Extra indentation within do blocks.  (default 3) fortran-if-indent    Extra indentation within if blocks.  (default 3) fortran-continuation-indent    Extra indentation appled to continuation statements.  (default 5) fortran-comment-line-column    Amount of indentation for text within full-line comments. (default 6) fortran-comment-indent-style    nil    means don't change indentation of text in full-line comments,    fixed  means indent that text at column fortran-comment-line-column    relative  means indent at fortran-comment-line-column beyond the 	      indentation for a line of code.    Default value is fixed. fortran-comment-indent-char    Character to be inserted instead of space for full-line comment    indentation.  (default is a space) fortran-minimum-statement-indent    Minimum indentation for fortran statements. (default 6) fortran-line-number-indent    Maximum indentation for line numbers.  A line number will get    less than this much indentation if necessary to avoid reaching    column 5.  (default 1) fortran-check-all-num-for-matching-do    Non-nil causes all numbered lines to be treated as possible 'continue'    statements.  (default nil) fortran-continuation-char    character to be inserted in column 5 of a continuation line.    (default $) fortran-comment-region    String inserted by \\[fortran-comment-region] at start of each line in     region.  (default \"c$$$\") fortran-electric-line-number    Non-nil causes line number digits to be moved to the correct column     as typed.  (default t) fortran-startup-message    Set to nil to inhibit message first time fortran-mode is used.Turning on Fortran mode calls the value of the variable fortran-mode-hook with no args, if that value is non-nil.\\{fortran-mode-map}"  (interactive)  (kill-all-local-variables)  (if fortran-startup-message      (message "Emacs Fortran mode version %s.  Bugs to bug-fortran-mode@erl.mit.edu" fortran-mode-version))  (setq fortran-startup-message nil)  (setq local-abbrev-table fortran-mode-abbrev-table)  (set-syntax-table fortran-mode-syntax-table)  (make-local-variable 'indent-line-function)  (setq indent-line-function 'fortran-indent-line)  (make-local-variable 'comment-indent-hook)  (setq comment-indent-hook 'fortran-comment-hook)  (make-local-variable 'comment-line-start-skip)  (setq comment-line-start-skip "^[Cc*][^ \t\n]*[ \t]*") ;[^ \t\n]* handles comment strings such as c$$$  (make-local-variable 'comment-line-start)  (setq comment-line-start "c")  (make-local-variable 'comment-start-skip)  (setq comment-start-skip "![ \t]*")  (make-local-variable 'comment-start)  (setq comment-start nil)  (make-local-variable 'require-final-newline)  (setq require-final-newline t)  (make-local-variable 'abbrev-all-caps)  (setq abbrev-all-caps t)  (make-local-variable 'indent-tabs-mode)  (setq indent-tabs-mode nil)  (use-local-map fortran-mode-map)  (setq mode-name "Fortran")  (setq major-mode 'fortran-mode)  (run-hooks 'fortran-mode-hook))(defun fortran-comment-hook ()  (save-excursion    (skip-chars-backward " \t")    (max (+ 1 (current-column))	 comment-column)))(defun fortran-indent-comment ()  "Align or create comment on current line.Existing comments of all types are recognized and aligned.If the line has no comment, a side-by-side comment is inserted and alignedif the value of  comment-start  is not nil.Otherwise, a separate-line comment is inserted, on this lineor on a new line inserted before this line if this line is not blank."  (interactive)  (beginning-of-line)  ;; Recognize existing comments of either kind.  (cond ((looking-at comment-line-start-skip)	 (fortran-indent-line))	((re-search-forward comment-start-skip			    (save-excursion (end-of-line) (point)) t)	 (indent-for-comment))	;; No existing comment.	;; If side-by-side comments are defined, insert one,	;; unless line is now blank.	((and comment-start (not (looking-at "^[ \t]*$")))	 (end-of-line)	 (delete-horizontal-space)	 (indent-to (fortran-comment-hook))	 (insert comment-start))	;; Else insert separate-line comment, making a new line if nec.	(t	 (if (looking-at "^[ \t]*$")	     (delete-horizontal-space)	   (beginning-of-line)	   (insert "\n")	   (forward-char -1))	 (insert comment-line-start)	 (insert-char (if (stringp fortran-comment-indent-char)			  (aref fortran-comment-indent-char 0)			  fortran-comment-indent-char)		      (- (calculate-fortran-indent) (current-column))))))(defun fortran-comment-region (beg-region end-region arg)  "Comments every line in the region.Puts fortran-comment-region at the beginning of every line in the region. BEG-REGION and END-REGION are args which specify the region boundaries. With non-nil ARG, uncomments the region."  (interactive "*r\nP")  (let ((end-region-mark (make-marker)) (save-point (point-marker)))    (set-marker end-region-mark end-region)    (goto-char beg-region)    (beginning-of-line)    (if (not arg)			;comment the region	(progn (insert fortran-comment-region)	       (while (and  (= (forward-line 1) 0)			    (< (point) end-region-mark))		 (insert fortran-comment-region)))      (let ((com (regexp-quote fortran-comment-region))) ;uncomment the region	(if (looking-at com)	    (delete-region (point) (match-end 0)))	(while (and  (= (forward-line 1) 0)		     (< (point) end-region-mark))	  (if (looking-at com)	      (delete-region (point) (match-end 0))))))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -