Mercurial > emacs
comparison lisp/progmodes/fortran.el @ 85579:fb34ccab73f6
Untabify.
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Tue, 23 Oct 2007 07:02:42 +0000 |
parents | e164769e7a33 |
children | b4eec406ec78 |
comparison
equal
deleted
inserted
replaced
85578:40360655a978 | 85579:fb34ccab73f6 |
---|---|
551 A simple regexp cannot do this in fully correct fashion, so this | 551 A simple regexp cannot do this in fully correct fashion, so this |
552 tries to strike a compromise between complexity and flexibility. | 552 tries to strike a compromise between complexity and flexibility. |
553 Used in the Fortran entry in `hs-special-modes-alist'.") | 553 Used in the Fortran entry in `hs-special-modes-alist'.") |
554 | 554 |
555 (add-to-list 'hs-special-modes-alist | 555 (add-to-list 'hs-special-modes-alist |
556 `(fortran-mode ,fortran-start-block-re ,fortran-end-block-re | 556 `(fortran-mode ,fortran-start-block-re ,fortran-end-block-re |
557 "^[cC*!]" fortran-end-of-block nil)) | 557 "^[cC*!]" fortran-end-of-block nil)) |
558 | 558 |
559 | 559 |
560 (defvar fortran-mode-syntax-table | 560 (defvar fortran-mode-syntax-table |
561 (let ((table (make-syntax-table))) | 561 (let ((table (make-syntax-table))) |
781 value of either | 781 value of either |
782 `fortran-minimum-statement-indent-fixed' (fixed format) or | 782 `fortran-minimum-statement-indent-fixed' (fixed format) or |
783 `fortran-minimum-statement-indent-tab' (TAB format), | 783 `fortran-minimum-statement-indent-tab' (TAB format), |
784 depending on the continuation format in use. | 784 depending on the continuation format in use. |
785 relative indent to `fortran-comment-line-extra-indent' beyond the | 785 relative indent to `fortran-comment-line-extra-indent' beyond the |
786 indentation for a line of code. | 786 indentation for a line of code. |
787 (default 'fixed) | 787 (default 'fixed) |
788 `fortran-comment-indent-char' | 788 `fortran-comment-indent-char' |
789 Single-character string to be inserted instead of space for | 789 Single-character string to be inserted instead of space for |
790 full-line comment indentation (default \" \"). | 790 full-line comment indentation (default \" \"). |
791 `fortran-minimum-statement-indent-fixed' | 791 `fortran-minimum-statement-indent-fixed' |
924 or on a new line inserted before this line if this line is not blank." | 924 or on a new line inserted before this line if this line is not blank." |
925 (interactive "*") | 925 (interactive "*") |
926 (beginning-of-line) | 926 (beginning-of-line) |
927 ;; Recognize existing comments of either kind. | 927 ;; Recognize existing comments of either kind. |
928 (cond ((fortran-find-comment-start-skip 'all) | 928 (cond ((fortran-find-comment-start-skip 'all) |
929 (goto-char (match-beginning 0)) | 929 (goto-char (match-beginning 0)) |
930 (if (bolp) | 930 (if (bolp) |
931 (fortran-indent-line) | 931 (fortran-indent-line) |
932 (unless (= (current-column) (fortran-comment-indent)) | 932 (unless (= (current-column) (fortran-comment-indent)) |
933 (delete-horizontal-space) | 933 (delete-horizontal-space) |
934 (indent-to (fortran-comment-indent))))) | 934 (indent-to (fortran-comment-indent))))) |
935 ;; No existing comment. | 935 ;; No existing comment. |
936 ;; If side-by-side comments are defined, insert one, | 936 ;; If side-by-side comments are defined, insert one, |
937 ;; unless line is now blank. | 937 ;; unless line is now blank. |
938 ((and comment-start (not (looking-at "[ \t]*$")) | 938 ((and comment-start (not (looking-at "[ \t]*$")) |
939 (string-match comment-start-skip (concat " " comment-start))) | 939 (string-match comment-start-skip (concat " " comment-start))) |
940 (end-of-line) | 940 (end-of-line) |
941 (delete-horizontal-space) | 941 (delete-horizontal-space) |
942 (indent-to (fortran-comment-indent)) | 942 (indent-to (fortran-comment-indent)) |
943 (insert comment-start)) | 943 (insert comment-start)) |
944 ;; Else insert separate-line comment, making a new line if nec. | 944 ;; Else insert separate-line comment, making a new line if nec. |
945 (t | 945 (t |
946 (if (looking-at "^[ \t]*$") | 946 (if (looking-at "^[ \t]*$") |
947 (delete-horizontal-space) | 947 (delete-horizontal-space) |
948 (beginning-of-line) | 948 (beginning-of-line) |
949 (insert ?\n) | 949 (insert ?\n) |
950 (forward-char -1)) | 950 (forward-char -1)) |
951 (insert fortran-comment-line-start) | 951 (insert fortran-comment-line-start) |
952 (insert-char (if (stringp fortran-comment-indent-char) | 952 (insert-char (if (stringp fortran-comment-indent-char) |
953 (aref fortran-comment-indent-char 0) | 953 (aref fortran-comment-indent-char 0) |
954 fortran-comment-indent-char) | 954 fortran-comment-indent-char) |
955 (- (fortran-calculate-indent) (current-column)))))) | 955 (- (fortran-calculate-indent) (current-column)))))) |
956 | 956 |
957 (defun fortran-comment-region (beg-region end-region arg) | 957 (defun fortran-comment-region (beg-region end-region arg) |
958 "Comment every line in the region. | 958 "Comment every line in the region. |
959 Inserts the string variable `fortran-comment-region' at the beginning of | 959 Inserts the string variable `fortran-comment-region' at the beginning of |
960 every line in the region. | 960 every line in the region. |
961 BEG-REGION and END-REGION specify the region boundaries. | 961 BEG-REGION and END-REGION specify the region boundaries. |
962 With non-nil ARG, uncomments the region." | 962 With non-nil ARG, uncomments the region." |
963 (interactive "*r\nP") | 963 (interactive "*r\nP") |
964 (let ((end-region-mark (copy-marker end-region)) | 964 (let ((end-region-mark (copy-marker end-region)) |
965 (save-point (point-marker))) | 965 (save-point (point-marker))) |
966 (goto-char beg-region) | 966 (goto-char beg-region) |
967 (beginning-of-line) | 967 (beginning-of-line) |
968 (if arg | 968 (if arg |
969 (let ((com (regexp-quote fortran-comment-region))) ; uncomment | 969 (let ((com (regexp-quote fortran-comment-region))) ; uncomment |
970 (if (looking-at com) | 970 (if (looking-at com) |
993 (char (if (fboundp 'event-to-character) | 993 (char (if (fboundp 'event-to-character) |
994 (event-to-character event) event))) | 994 (event-to-character event) event))) |
995 ;; Insert char if not equal to `?', or if abbrev-mode is off. | 995 ;; Insert char if not equal to `?', or if abbrev-mode is off. |
996 (if (and abbrev-mode (or (eq char ??) (eq char help-char) | 996 (if (and abbrev-mode (or (eq char ??) (eq char help-char) |
997 (memq event help-event-list))) | 997 (memq event help-event-list))) |
998 (fortran-abbrev-help) | 998 (fortran-abbrev-help) |
999 (push event unread-command-events)))) | 999 (push event unread-command-events)))) |
1000 | 1000 |
1001 (defun fortran-abbrev-help () | 1001 (defun fortran-abbrev-help () |
1002 "List the currently defined abbrevs in Fortran mode." | 1002 "List the currently defined abbrevs in Fortran mode." |
1003 (interactive) | 1003 (interactive) |
1026 fortran-column-ruler-tab | 1026 fortran-column-ruler-tab |
1027 fortran-column-ruler-fixed) | 1027 fortran-column-ruler-fixed) |
1028 (save-excursion | 1028 (save-excursion |
1029 (beginning-of-line) | 1029 (beginning-of-line) |
1030 (if (eq (window-start (selected-window)) | 1030 (if (eq (window-start (selected-window)) |
1031 (window-point (selected-window))) | 1031 (window-point (selected-window))) |
1032 (line-beginning-position 2) | 1032 (line-beginning-position 2) |
1033 (point))) | 1033 (point))) |
1034 nil "Type SPC or any command to erase ruler.")) | 1034 nil "Type SPC or any command to erase ruler.")) |
1035 | 1035 |
1036 (defun fortran-window-create () | 1036 (defun fortran-window-create () |
1037 "Make the window `fortran-line-length' (default 72) columns wide. | 1037 "Make the window `fortran-line-length' (default 72) columns wide. |
1038 See also `fortran-window-create-momentarily'." | 1038 See also `fortran-window-create-momentarily'." |
1039 (interactive) | 1039 (interactive) |
1040 (let ((window-min-width 2)) | 1040 (let ((window-min-width 2)) |
1041 (unless (window-full-width-p) | 1041 (unless (window-full-width-p) |
1042 (enlarge-window-horizontally (- (frame-width) | 1042 (enlarge-window-horizontally (- (frame-width) |
1043 (window-width) 1))) | 1043 (window-width) 1))) |
1044 (let* ((window-edges (window-edges)) | 1044 (let* ((window-edges (window-edges)) |
1045 (scroll-bar-width (- (nth 2 window-edges) | 1045 (scroll-bar-width (- (nth 2 window-edges) |
1046 (car window-edges) | 1046 (car window-edges) |
1047 (window-width)))) | 1047 (window-width)))) |
1048 (split-window-horizontally (+ fortran-line-length scroll-bar-width))) | 1048 (split-window-horizontally (+ fortran-line-length scroll-bar-width))) |
1049 (other-window 1) | 1049 (other-window 1) |
1050 (switch-to-buffer " fortran-window-extra" t) | 1050 (switch-to-buffer " fortran-window-extra" t) |
1051 (select-window (previous-window)))) | 1051 (select-window (previous-window)))) |
1052 | 1052 |
1054 "Momentarily make the window `fortran-line-length' (default 72) columns wide. | 1054 "Momentarily make the window `fortran-line-length' (default 72) columns wide. |
1055 Optional ARG non-nil and non-unity disables the momentary feature. | 1055 Optional ARG non-nil and non-unity disables the momentary feature. |
1056 See also `fortran-window-create'." | 1056 See also `fortran-window-create'." |
1057 (interactive "p") | 1057 (interactive "p") |
1058 (if (or (not arg) | 1058 (if (or (not arg) |
1059 (= arg 1)) | 1059 (= arg 1)) |
1060 (save-window-excursion | 1060 (save-window-excursion |
1061 (progn | 1061 (progn |
1062 (condition-case nil | 1062 (condition-case nil |
1063 (fortran-window-create) | 1063 (fortran-window-create) |
1064 (error (error "No room for Fortran window"))) | 1064 (error (error "No room for Fortran window"))) |
1065 (message "Type SPC to continue editing.") | 1065 (message "Type SPC to continue editing.") |
1066 (let ((char (read-event))) | 1066 (let ((char (read-event))) |
1067 (or (equal char ?\s) | 1067 (or (equal char ?\s) |
1068 (setq unread-command-events (list char)))))) | 1068 (setq unread-command-events (list char)))))) |
1069 (fortran-window-create))) | 1069 (fortran-window-create))) |
1070 | 1070 |
1071 (defun fortran-split-line () | 1071 (defun fortran-split-line () |
1072 "Break line at point and insert continuation marker and alignment." | 1072 "Break line at point and insert continuation marker and alignment." |
1073 (interactive "*") | 1073 (interactive "*") |
1074 (delete-horizontal-space) | 1074 (delete-horizontal-space) |
1075 (if (save-excursion | 1075 (if (save-excursion |
1076 (let ((pos (point))) | 1076 (let ((pos (point))) |
1077 (beginning-of-line) | 1077 (beginning-of-line) |
1078 (and (fortran-find-comment-start-skip 'all) | 1078 (and (fortran-find-comment-start-skip 'all) |
1079 (< (match-beginning 0) pos)))) | 1079 (< (match-beginning 0) pos)))) |
1080 (insert ?\n (match-string 0)) | 1080 (insert ?\n (match-string 0)) |
1081 (if indent-tabs-mode | 1081 (if indent-tabs-mode |
1082 (insert ?\n ?\t (fortran-numerical-continuation-char)) | 1082 (insert ?\n ?\t (fortran-numerical-continuation-char)) |
1083 (insert "\n " fortran-continuation-string))) ; space after \n important | 1083 (insert "\n " fortran-continuation-string))) ; space after \n important |
1084 (fortran-indent-line)) ; when cont string is C, c or * | 1084 (fortran-indent-line)) ; when cont string is C, c or * |
1085 | 1085 |
1086 (defun fortran-remove-continuation () | 1086 (defun fortran-remove-continuation () |
1087 "Delete any Fortran continuation characters at point. | 1087 "Delete any Fortran continuation characters at point. |
1113 If previous line is a tab-digit continuation line, return that digit | 1113 If previous line is a tab-digit continuation line, return that digit |
1114 plus one, otherwise return 1. Zero not allowed." | 1114 plus one, otherwise return 1. Zero not allowed." |
1115 (save-excursion | 1115 (save-excursion |
1116 (forward-line -1) | 1116 (forward-line -1) |
1117 (if (looking-at "\t[1-9]") | 1117 (if (looking-at "\t[1-9]") |
1118 (+ ?1 (% (- (char-after (1+ (point))) ?0) 9)) | 1118 (+ ?1 (% (- (char-after (1+ (point))) ?0) 9)) |
1119 ?1))) | 1119 ?1))) |
1120 | 1120 |
1121 (put 'fortran-electric-line-number 'delete-selection t) | 1121 (put 'fortran-electric-line-number 'delete-selection t) |
1122 (defun fortran-electric-line-number (arg) | 1122 (defun fortran-electric-line-number (arg) |
1123 "Self insert, but if part of a Fortran line number indent it automatically. | 1123 "Self insert, but if part of a Fortran line number indent it automatically. |
1124 Auto-indent does not happen if a numeric ARG is used." | 1124 Auto-indent does not happen if a numeric ARG is used." |
1125 (interactive "*P") | 1125 (interactive "*P") |
1126 (if (or arg (not fortran-electric-line-number)) | 1126 (if (or arg (not fortran-electric-line-number)) |
1127 (if arg | 1127 (if arg |
1128 (self-insert-command (prefix-numeric-value arg)) | 1128 (self-insert-command (prefix-numeric-value arg)) |
1129 (self-insert-command 1)) | 1129 (self-insert-command 1)) |
1130 (if (or (and (= 5 (current-column)) | 1130 (if (or (and (= 5 (current-column)) |
1131 (save-excursion | 1131 (save-excursion |
1132 (beginning-of-line) | 1132 (beginning-of-line) |
1133 ;; In col 5 with only spaces to the left. | 1133 ;; In col 5 with only spaces to the left. |
1134 (looking-at " \\{5\\}"))) | 1134 (looking-at " \\{5\\}"))) |
1135 (and (= (if indent-tabs-mode | 1135 (and (= (if indent-tabs-mode |
1136 fortran-minimum-statement-indent-tab | 1136 fortran-minimum-statement-indent-tab |
1137 fortran-minimum-statement-indent-fixed) (current-column)) | 1137 fortran-minimum-statement-indent-fixed) (current-column)) |
1138 ;; In col 8 with a single tab to the left. | 1138 ;; In col 8 with a single tab to the left. |
1139 (eq ?\t (char-after (line-beginning-position))) | 1139 (eq ?\t (char-after (line-beginning-position))) |
1140 (not (or (eq last-command 'fortran-indent-line) | 1140 (not (or (eq last-command 'fortran-indent-line) |
1141 (eq last-command | 1141 (eq last-command |
1142 'fortran-indent-new-line)))) | 1142 'fortran-indent-new-line)))) |
1143 (save-excursion | 1143 (save-excursion |
1144 (re-search-backward "[^ \t0-9]" | 1144 (re-search-backward "[^ \t0-9]" |
1145 (line-beginning-position) | 1145 (line-beginning-position) |
1146 t)) ; not a line number | 1146 t)) ; not a line number |
1147 (looking-at "[0-9]")) ; within a line number | 1147 (looking-at "[0-9]")) ; within a line number |
1148 (self-insert-command (prefix-numeric-value arg)) | 1148 (self-insert-command (prefix-numeric-value arg)) |
1149 (skip-chars-backward " \t") | 1149 (skip-chars-backward " \t") |
1150 (insert last-command-char) | 1150 (insert last-command-char) |
1151 (fortran-indent-line)))) | 1151 (fortran-indent-line)))) |
1152 | 1152 |
1153 | 1153 |
1155 "Check a preliminary match against `fortran-end-prog-re'." | 1155 "Check a preliminary match against `fortran-end-prog-re'." |
1156 ;; Having got a possible match for the subprogram end, we need a | 1156 ;; Having got a possible match for the subprogram end, we need a |
1157 ;; match of whitespace, avoiding possible column 73+ stuff. | 1157 ;; match of whitespace, avoiding possible column 73+ stuff. |
1158 (save-match-data | 1158 (save-match-data |
1159 (string-match "^\\s-*\\(\\'\\|\\s<\\)" | 1159 (string-match "^\\s-*\\(\\'\\|\\s<\\)" |
1160 (buffer-substring (match-end 0) | 1160 (buffer-substring (match-end 0) |
1161 (min (line-end-position) | 1161 (min (line-end-position) |
1162 (+ fortran-line-length | 1162 (+ fortran-line-length |
1163 (line-beginning-position))))))) | 1163 (line-beginning-position))))))) |
1164 | 1164 |
1165 ;; Note that you can't just check backwards for `subroutine' &c in | 1165 ;; Note that you can't just check backwards for `subroutine' &c in |
1166 ;; case of un-marked main programs not at the start of the file. | 1166 ;; case of un-marked main programs not at the start of the file. |
1167 (defun fortran-beginning-of-subprogram () | 1167 (defun fortran-beginning-of-subprogram () |
1169 (interactive) | 1169 (interactive) |
1170 (save-match-data | 1170 (save-match-data |
1171 (let ((case-fold-search t)) | 1171 (let ((case-fold-search t)) |
1172 (beginning-of-line -1) | 1172 (beginning-of-line -1) |
1173 (if (catch 'ok | 1173 (if (catch 'ok |
1174 (while (re-search-backward fortran-end-prog-re nil 'move) | 1174 (while (re-search-backward fortran-end-prog-re nil 'move) |
1175 (if (fortran-check-end-prog-re) | 1175 (if (fortran-check-end-prog-re) |
1176 (throw 'ok t)))) | 1176 (throw 'ok t)))) |
1177 (forward-line))))) | 1177 (forward-line))))) |
1178 | 1178 |
1179 (defun fortran-end-of-subprogram () | 1179 (defun fortran-end-of-subprogram () |
1180 "Move point to the end of the current Fortran subprogram." | 1180 "Move point to the end of the current Fortran subprogram." |
1181 (interactive) | 1181 (interactive) |
1182 (save-match-data | 1182 (save-match-data |
1183 (let ((case-fold-search t)) | 1183 (let ((case-fold-search t)) |
1184 (if (save-excursion ; on END | 1184 (if (save-excursion ; on END |
1185 (beginning-of-line) | 1185 (beginning-of-line) |
1186 (and (looking-at fortran-end-prog-re) | 1186 (and (looking-at fortran-end-prog-re) |
1187 (fortran-check-end-prog-re))) | 1187 (fortran-check-end-prog-re))) |
1188 (forward-line) | 1188 (forward-line) |
1189 (beginning-of-line 2) | 1189 (beginning-of-line 2) |
1190 (catch 'ok | 1190 (catch 'ok |
1191 (while (re-search-forward fortran-end-prog-re nil 'move) | 1191 (while (re-search-forward fortran-end-prog-re nil 'move) |
1192 (if (fortran-check-end-prog-re) | 1192 (if (fortran-check-end-prog-re) |
1193 (throw 'ok t)))) | 1193 (throw 'ok t)))) |
1194 (goto-char (match-beginning 0)) | 1194 (goto-char (match-beginning 0)) |
1195 (forward-line))))) | 1195 (forward-line))))) |
1196 | 1196 |
1197 (defun fortran-previous-statement () | 1197 (defun fortran-previous-statement () |
1198 "Move point to beginning of the previous Fortran statement. | 1198 "Move point to beginning of the previous Fortran statement. |
1199 Returns 'first-statement if that statement is the first | 1199 Returns 'first-statement if that statement is the first |
1200 non-comment Fortran statement in the file, and nil otherwise. | 1200 non-comment Fortran statement in the file, and nil otherwise. |
1201 Directive lines are treated as comments." | 1201 Directive lines are treated as comments." |
1202 (interactive) | 1202 (interactive) |
1203 (let (not-first-statement continue-test) | 1203 (let (not-first-statement continue-test) |
1204 (beginning-of-line) | 1204 (beginning-of-line) |
1205 (setq continue-test | 1205 (setq continue-test |
1206 (and | 1206 (and |
1207 (not (looking-at fortran-comment-line-start-skip)) | 1207 (not (looking-at fortran-comment-line-start-skip)) |
1208 (not (looking-at fortran-directive-re)) | 1208 (not (looking-at fortran-directive-re)) |
1209 (or (looking-at | 1209 (or (looking-at |
1210 (concat "[ \t]*" | 1210 (concat "[ \t]*" |
1211 (regexp-quote fortran-continuation-string))) | 1211 (regexp-quote fortran-continuation-string))) |
1212 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")))) | 1212 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")))) |
1213 (while (and (setq not-first-statement (zerop (forward-line -1))) | 1213 (while (and (setq not-first-statement (zerop (forward-line -1))) |
1214 (or (looking-at fortran-comment-line-start-skip) | 1214 (or (looking-at fortran-comment-line-start-skip) |
1215 (looking-at fortran-directive-re) | 1215 (looking-at fortran-directive-re) |
1216 (looking-at | 1216 (looking-at |
1217 (concat "[ \t]*" | 1217 (concat "[ \t]*" |
1218 (regexp-quote fortran-continuation-string))) | 1218 (regexp-quote fortran-continuation-string))) |
1219 (looking-at "[ \t]*$\\| \\{5\\}[^ 0\n]\\|\t[1-9]") | 1219 (looking-at "[ \t]*$\\| \\{5\\}[^ 0\n]\\|\t[1-9]") |
1220 (looking-at (concat "[ \t]*" comment-start-skip))))) | 1220 (looking-at (concat "[ \t]*" comment-start-skip))))) |
1221 (cond ((and continue-test | 1221 (cond ((and continue-test |
1222 (not not-first-statement)) | 1222 (not not-first-statement)) |
1223 (message "Incomplete continuation statement.")) | 1223 (message "Incomplete continuation statement.")) |
1224 (continue-test | 1224 (continue-test |
1225 (fortran-previous-statement)) | 1225 (fortran-previous-statement)) |
1226 ((not not-first-statement) | 1226 ((not not-first-statement) |
1227 'first-statement)))) | 1227 'first-statement)))) |
1228 | 1228 |
1229 (defun fortran-next-statement () | 1229 (defun fortran-next-statement () |
1230 "Move point to beginning of the next Fortran statement. | 1230 "Move point to beginning of the next Fortran statement. |
1231 Returns 'last-statement if that statement is the last | 1231 Returns 'last-statement if that statement is the last |
1232 non-comment Fortran statement in the file, and nil otherwise. | 1232 non-comment Fortran statement in the file, and nil otherwise. |
1233 Directive lines are treated as comments." | 1233 Directive lines are treated as comments." |
1234 (interactive) | 1234 (interactive) |
1235 (let (not-last-statement) | 1235 (let (not-last-statement) |
1236 (beginning-of-line) | 1236 (beginning-of-line) |
1237 (while (and (setq not-last-statement | 1237 (while (and (setq not-last-statement |
1238 (and (zerop (forward-line 1)) | 1238 (and (zerop (forward-line 1)) |
1239 (not (eobp)))) | 1239 (not (eobp)))) |
1240 (or (looking-at fortran-comment-line-start-skip) | 1240 (or (looking-at fortran-comment-line-start-skip) |
1241 (looking-at fortran-directive-re) | 1241 (looking-at fortran-directive-re) |
1242 (looking-at "[ \t]*$\\| [^ 0\n]\\|\t[1-9]") | 1242 (looking-at "[ \t]*$\\| [^ 0\n]\\|\t[1-9]") |
1243 (looking-at (concat "[ \t]*" comment-start-skip))))) | 1243 (looking-at (concat "[ \t]*" comment-start-skip))))) |
1244 (if (not not-last-statement) | 1244 (if (not not-last-statement) |
1245 'last-statement))) | 1245 'last-statement))) |
1246 | 1246 |
1247 (defun fortran-looking-at-if-then () | 1247 (defun fortran-looking-at-if-then () |
1248 "Return non-nil if at the start of a line with an IF ... THEN statement." | 1248 "Return non-nil if at the start of a line with an IF ... THEN statement." |
1249 ;; cf f90-looking-at-if-then. | 1249 ;; cf f90-looking-at-if-then. |
1250 (let ((p (point)) | 1250 (let ((p (point)) |
1325 | 1325 |
1326 (defun fortran-blink-match (regex keyword find-begin) | 1326 (defun fortran-blink-match (regex keyword find-begin) |
1327 "From a line matching REGEX, blink matching KEYWORD statement line. | 1327 "From a line matching REGEX, blink matching KEYWORD statement line. |
1328 Use function FIND-BEGIN to match it." | 1328 Use function FIND-BEGIN to match it." |
1329 (let ((top-of-window (window-start)) | 1329 (let ((top-of-window (window-start)) |
1330 (end-point (point)) | 1330 (end-point (point)) |
1331 (case-fold-search t) | 1331 (case-fold-search t) |
1332 matching | 1332 matching |
1333 message) | 1333 message) |
1334 (when (save-excursion | 1334 (when (save-excursion |
1335 (beginning-of-line) | 1335 (beginning-of-line) |
1336 (skip-chars-forward " \t0-9") | 1336 (skip-chars-forward " \t0-9") |
1337 (looking-at regex)) | 1337 (looking-at regex)) |
1338 (if (not (setq matching (funcall find-begin))) | 1338 (if (not (setq matching (funcall find-begin))) |
1352 (goto-char end-point))))) | 1352 (goto-char end-point))))) |
1353 | 1353 |
1354 (defun fortran-blink-matching-if () | 1354 (defun fortran-blink-matching-if () |
1355 "From an ENDIF or ELSE statement, blink the matching IF statement." | 1355 "From an ENDIF or ELSE statement, blink the matching IF statement." |
1356 (fortran-blink-match "e\\(nd[ \t]*if\\|lse\\([ \t]*if\\)?\\)\\b" | 1356 (fortran-blink-match "e\\(nd[ \t]*if\\|lse\\([ \t]*if\\)?\\)\\b" |
1357 "if" #'fortran-beginning-if)) | 1357 "if" #'fortran-beginning-if)) |
1358 | 1358 |
1359 (defun fortran-blink-matching-do () | 1359 (defun fortran-blink-matching-do () |
1360 "From an ENDDO statement, blink the matching DO or DO WHILE statement." | 1360 "From an ENDDO statement, blink the matching DO or DO WHILE statement." |
1361 (fortran-blink-match "end[ \t]*do\\b" "do" #'fortran-beginning-do)) | 1361 (fortran-blink-match "end[ \t]*do\\b" "do" #'fortran-beginning-do)) |
1362 | 1362 |
1375 (defun fortran-end-do () | 1375 (defun fortran-end-do () |
1376 "Search forward for first unmatched ENDDO. | 1376 "Search forward for first unmatched ENDDO. |
1377 Return point or nil." | 1377 Return point or nil." |
1378 (let ((case-fold-search t)) | 1378 (let ((case-fold-search t)) |
1379 (if (save-excursion (beginning-of-line) | 1379 (if (save-excursion (beginning-of-line) |
1380 (skip-chars-forward " \t0-9") | 1380 (skip-chars-forward " \t0-9") |
1381 (looking-at "end[ \t]*do\\b")) | 1381 (looking-at "end[ \t]*do\\b")) |
1382 ;; Sitting on one. | 1382 ;; Sitting on one. |
1383 (match-beginning 0) | 1383 (match-beginning 0) |
1384 ;; Search for one. | 1384 ;; Search for one. |
1385 (save-excursion | 1385 (save-excursion |
1386 (let ((count 1)) | 1386 (let ((count 1)) |
1387 (while (and (not (zerop count)) | 1387 (while (and (not (zerop count)) |
1388 (not (eq (fortran-next-statement) 'last-statement)) | 1388 (not (eq (fortran-next-statement) 'last-statement)) |
1389 ;; Keep local to subprogram. | 1389 ;; Keep local to subprogram. |
1390 (not (and (looking-at fortran-end-prog-re) | 1390 (not (and (looking-at fortran-end-prog-re) |
1391 (fortran-check-end-prog-re)))) | 1391 (fortran-check-end-prog-re)))) |
1392 (skip-chars-forward " \t0-9") | 1392 (skip-chars-forward " \t0-9") |
1393 (cond ((looking-at "end[ \t]*do\\b") | 1393 (cond ((looking-at "end[ \t]*do\\b") |
1394 (setq count (1- count))) | 1394 (setq count (1- count))) |
1395 ((looking-at | 1395 ((looking-at |
1396 "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?do[ \t]+[^0-9]") | 1396 "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?do[ \t]+[^0-9]") |
1397 (setq count (1+ count))))) | 1397 (setq count (1+ count))))) |
1398 (and (zerop count) | 1398 (and (zerop count) |
1399 ;; All pairs accounted for. | 1399 ;; All pairs accounted for. |
1400 (point))))))) | 1400 (point))))))) |
1401 | 1401 |
1402 (defun fortran-beginning-do () | 1402 (defun fortran-beginning-do () |
1403 "Search backwards for first unmatched DO [WHILE]. | 1403 "Search backwards for first unmatched DO [WHILE]. |
1404 Return point or nil. Ignores labelled DO loops (ie DO 10 ... 10 CONTINUE)." | 1404 Return point or nil. Ignores labelled DO loops (ie DO 10 ... 10 CONTINUE)." |
1405 (let ((case-fold-search t) | 1405 (let ((case-fold-search t) |
1406 (dostart-re "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?do[ \t]+[^0-9]")) | 1406 (dostart-re "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?do[ \t]+[^0-9]")) |
1407 (if (save-excursion | 1407 (if (save-excursion |
1408 (beginning-of-line) | 1408 (beginning-of-line) |
1409 (skip-chars-forward " \t0-9") | 1409 (skip-chars-forward " \t0-9") |
1410 (looking-at dostart-re)) | 1410 (looking-at dostart-re)) |
1411 ;; Sitting on one. | 1411 ;; Sitting on one. |
1412 (match-beginning 0) | 1412 (match-beginning 0) |
1413 ;; Search for one. | 1413 ;; Search for one. |
1414 (save-excursion | 1414 (save-excursion |
1415 (let ((count 1)) | 1415 (let ((count 1)) |
1416 (while (and (not (zerop count)) | 1416 (while (and (not (zerop count)) |
1417 (not (eq (fortran-previous-statement) 'first-statement)) | 1417 (not (eq (fortran-previous-statement) 'first-statement)) |
1418 ;; Keep local to subprogram. | 1418 ;; Keep local to subprogram. |
1419 (not (and (looking-at fortran-end-prog-re) | 1419 (not (and (looking-at fortran-end-prog-re) |
1420 (fortran-check-end-prog-re)))) | 1420 (fortran-check-end-prog-re)))) |
1421 (skip-chars-forward " \t0-9") | 1421 (skip-chars-forward " \t0-9") |
1422 (cond ((looking-at dostart-re) | 1422 (cond ((looking-at dostart-re) |
1423 (setq count (1- count))) | 1423 (setq count (1- count))) |
1424 ;; Note labelled loop ends not considered. | 1424 ;; Note labelled loop ends not considered. |
1425 ((looking-at "end[ \t]*do\\b") | 1425 ((looking-at "end[ \t]*do\\b") |
1426 (setq count (1+ count))))) | 1426 (setq count (1+ count))))) |
1427 (and (zerop count) | 1427 (and (zerop count) |
1428 ;; All pairs accounted for. | 1428 ;; All pairs accounted for. |
1429 (point))))))) | 1429 (point))))))) |
1430 | 1430 |
1431 (defun fortran-mark-if () | 1431 (defun fortran-mark-if () |
1432 "Put mark at end of Fortran IF-ENDIF construct, point at beginning. | 1432 "Put mark at end of Fortran IF-ENDIF construct, point at beginning. |
1433 The marks are pushed." | 1433 The marks are pushed." |
1434 (interactive) | 1434 (interactive) |
1444 (defun fortran-end-if () | 1444 (defun fortran-end-if () |
1445 "Search forwards for first unmatched ENDIF. | 1445 "Search forwards for first unmatched ENDIF. |
1446 Return point or nil." | 1446 Return point or nil." |
1447 (let ((case-fold-search t)) | 1447 (let ((case-fold-search t)) |
1448 (if (save-excursion (beginning-of-line) | 1448 (if (save-excursion (beginning-of-line) |
1449 (skip-chars-forward " \t0-9") | 1449 (skip-chars-forward " \t0-9") |
1450 (looking-at "end[ \t]*if\\b")) | 1450 (looking-at "end[ \t]*if\\b")) |
1451 ;; Sitting on one. | 1451 ;; Sitting on one. |
1452 (match-beginning 0) | 1452 (match-beginning 0) |
1453 ;; Search for one. The point has been already been moved to first | 1453 ;; Search for one. The point has been already been moved to first |
1454 ;; letter on line but this should not cause troubles. | 1454 ;; letter on line but this should not cause troubles. |
1455 (save-excursion | 1455 (save-excursion |
1456 (let ((count 1)) | 1456 (let ((count 1)) |
1457 (while (and (not (zerop count)) | 1457 (while (and (not (zerop count)) |
1458 (not (eq (fortran-next-statement) 'last-statement)) | 1458 (not (eq (fortran-next-statement) 'last-statement)) |
1459 ;; Keep local to subprogram. | 1459 ;; Keep local to subprogram. |
1460 (not (and (looking-at fortran-end-prog-re) | 1460 (not (and (looking-at fortran-end-prog-re) |
1461 (fortran-check-end-prog-re)))) | 1461 (fortran-check-end-prog-re)))) |
1462 (skip-chars-forward " \t0-9") | 1462 (skip-chars-forward " \t0-9") |
1463 (cond ((looking-at "end[ \t]*if\\b") | 1463 (cond ((looking-at "end[ \t]*if\\b") |
1464 (setq count (1- count))) | 1464 (setq count (1- count))) |
1465 ((looking-at fortran-if-start-re) | 1465 ((looking-at fortran-if-start-re) |
1466 (save-excursion | 1466 (save-excursion |
1467 (if (or | 1467 (if (or |
1468 (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]") | 1468 (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]") |
1469 (let (then-test) ; multi-line if-then | 1469 (let (then-test) ; multi-line if-then |
1470 (while | 1470 (while |
1471 (and | 1471 (and |
1472 (zerop (forward-line 1)) | 1472 (zerop (forward-line 1)) |
1473 ;; Search forward for then. | 1473 ;; Search forward for then. |
1474 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]") | 1474 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]") |
1475 (not | 1475 (not |
1476 (setq then-test | 1476 (setq then-test |
1477 (looking-at | 1477 (looking-at |
1478 ".*then\\b[ \t]*[^ \t(=a-z0-9]"))))) | 1478 ".*then\\b[ \t]*[^ \t(=a-z0-9]"))))) |
1479 then-test)) | 1479 then-test)) |
1480 (setq count (1+ count))))))) | 1480 (setq count (1+ count))))))) |
1481 (and (zerop count) | 1481 (and (zerop count) |
1482 ;; All pairs accounted for. | 1482 ;; All pairs accounted for. |
1483 (point))))))) | 1483 (point))))))) |
1484 | 1484 |
1485 (defun fortran-beginning-if () | 1485 (defun fortran-beginning-if () |
1486 "Search backwards for first unmatched IF-THEN. | 1486 "Search backwards for first unmatched IF-THEN. |
1487 Return point or nil." | 1487 Return point or nil." |
1488 (let ((case-fold-search t)) | 1488 (let ((case-fold-search t)) |
1489 (if (save-excursion | 1489 (if (save-excursion |
1490 ;; May be sitting on multi-line if-then statement, first | 1490 ;; May be sitting on multi-line if-then statement, first |
1491 ;; move to beginning of current statement. Note: | 1491 ;; move to beginning of current statement. Note: |
1492 ;; `fortran-previous-statement' moves to previous statement | 1492 ;; `fortran-previous-statement' moves to previous statement |
1493 ;; *unless* current statement is first one. Only move | 1493 ;; *unless* current statement is first one. Only move |
1494 ;; forward if not first-statement. | 1494 ;; forward if not first-statement. |
1495 (if (not (eq (fortran-previous-statement) 'first-statement)) | 1495 (if (not (eq (fortran-previous-statement) 'first-statement)) |
1496 (fortran-next-statement)) | 1496 (fortran-next-statement)) |
1497 (skip-chars-forward " \t0-9") | 1497 (skip-chars-forward " \t0-9") |
1498 (and | 1498 (and |
1499 (looking-at fortran-if-start-re) | 1499 (looking-at fortran-if-start-re) |
1500 (save-match-data | 1500 (save-match-data |
1501 (or (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]") | 1501 (or (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]") |
1502 ;; Multi-line if-then. | 1502 ;; Multi-line if-then. |
1503 (let (then-test) | 1503 (let (then-test) |
1504 (while | 1504 (while |
1505 (and (zerop (forward-line 1)) | 1505 (and (zerop (forward-line 1)) |
1506 ;; Search forward for then. | 1506 ;; Search forward for then. |
1507 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]") | 1507 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]") |
1508 (not | 1508 (not |
1509 (setq then-test | 1509 (setq then-test |
1510 (looking-at | 1510 (looking-at |
1511 ".*then\\b[ \t]*[^ \t(=a-z0-9]"))))) | 1511 ".*then\\b[ \t]*[^ \t(=a-z0-9]"))))) |
1512 then-test))))) | 1512 then-test))))) |
1513 ;; Sitting on one. | 1513 ;; Sitting on one. |
1514 (match-beginning 0) | 1514 (match-beginning 0) |
1515 ;; Search for one. | 1515 ;; Search for one. |
1516 (save-excursion | 1516 (save-excursion |
1517 (let ((count 1)) | 1517 (let ((count 1)) |
1518 (while (and (not (zerop count)) | 1518 (while (and (not (zerop count)) |
1519 (not (eq (fortran-previous-statement) 'first-statement)) | 1519 (not (eq (fortran-previous-statement) 'first-statement)) |
1520 ;; Keep local to subprogram. | 1520 ;; Keep local to subprogram. |
1521 (not (and (looking-at fortran-end-prog-re) | 1521 (not (and (looking-at fortran-end-prog-re) |
1522 (fortran-check-end-prog-re)))) | 1522 (fortran-check-end-prog-re)))) |
1523 (skip-chars-forward " \t0-9") | 1523 (skip-chars-forward " \t0-9") |
1524 (cond ((looking-at fortran-if-start-re) | 1524 (cond ((looking-at fortran-if-start-re) |
1525 (save-excursion | 1525 (save-excursion |
1526 (if (or | 1526 (if (or |
1527 (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]") | 1527 (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t(=a-z0-9]") |
1528 (let (then-test) ; multi-line if-then | 1528 (let (then-test) ; multi-line if-then |
1529 (while | 1529 (while |
1530 (and | 1530 (and |
1531 (zerop (forward-line 1)) | 1531 (zerop (forward-line 1)) |
1532 ;; Search forward for then. | 1532 ;; Search forward for then. |
1533 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]") | 1533 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]") |
1534 (not | 1534 (not |
1535 (setq then-test | 1535 (setq then-test |
1536 (looking-at | 1536 (looking-at |
1537 (concat ".*then\\b[ \t]*" | 1537 (concat ".*then\\b[ \t]*" |
1538 "[^ \t(=a-z0-9]")))))) | 1538 "[^ \t(=a-z0-9]")))))) |
1539 then-test)) | 1539 then-test)) |
1540 (setq count (1- count))))) | 1540 (setq count (1- count))))) |
1541 ((looking-at "end[ \t]*if\\b") | 1541 ((looking-at "end[ \t]*if\\b") |
1542 (setq count (1+ count))))) | 1542 (setq count (1+ count))))) |
1543 (and (zerop count) | 1543 (and (zerop count) |
1544 ;; All pairs accounted for. | 1544 ;; All pairs accounted for. |
1545 (point))))))) | 1545 (point))))))) |
1546 | 1546 |
1547 | 1547 |
1548 (defun fortran-indent-line () | 1548 (defun fortran-indent-line () |
1549 "Indent current Fortran line based on its contents and on previous lines." | 1549 "Indent current Fortran line based on its contents and on previous lines." |
1550 (interactive "*") | 1550 (interactive "*") |
1551 (let ((cfi (fortran-calculate-indent))) | 1551 (let ((cfi (fortran-calculate-indent))) |
1552 (save-excursion | 1552 (save-excursion |
1553 (beginning-of-line) | 1553 (beginning-of-line) |
1554 (if (or (not (= cfi (fortran-current-line-indentation))) | 1554 (if (or (not (= cfi (fortran-current-line-indentation))) |
1555 (and (re-search-forward "^[ \t]*[0-9]+" (+ (point) 4) t) | 1555 (and (re-search-forward "^[ \t]*[0-9]+" (+ (point) 4) t) |
1556 (not (fortran-line-number-indented-correctly-p)))) | 1556 (not (fortran-line-number-indented-correctly-p)))) |
1557 (fortran-indent-to-column cfi) | 1557 (fortran-indent-to-column cfi) |
1558 (beginning-of-line) | 1558 (beginning-of-line) |
1559 (if (fortran-find-comment-start-skip) | 1559 (if (fortran-find-comment-start-skip) |
1560 (fortran-indent-comment)))) | 1560 (fortran-indent-comment)))) |
1561 ;; Never leave point in left margin. | 1561 ;; Never leave point in left margin. |
1562 (if (< (current-column) cfi) | 1562 (if (< (current-column) cfi) |
1563 (move-to-column cfi)) | 1563 (move-to-column cfi)) |
1564 (and auto-fill-function | 1564 (and auto-fill-function |
1565 (> (save-excursion (end-of-line) (current-column)) | 1565 (> (save-excursion (end-of-line) (current-column)) |
1566 fill-column) | 1566 fill-column) |
1567 (save-excursion | 1567 (save-excursion |
1568 (end-of-line) | 1568 (end-of-line) |
1573 | 1573 |
1574 (defun fortran-auto-fill () | 1574 (defun fortran-auto-fill () |
1575 "Function to use for `normal-auto-fill-function' in Fortran mode." | 1575 "Function to use for `normal-auto-fill-function' in Fortran mode." |
1576 (if (> (current-column) (current-fill-column)) | 1576 (if (> (current-column) (current-fill-column)) |
1577 (let ((cfi (fortran-calculate-indent))) | 1577 (let ((cfi (fortran-calculate-indent))) |
1578 (save-excursion | 1578 (save-excursion |
1579 (beginning-of-line) | 1579 (beginning-of-line) |
1580 (if (or (not (= cfi (fortran-current-line-indentation))) | 1580 (if (or (not (= cfi (fortran-current-line-indentation))) |
1581 (and (re-search-forward "^[ \t]*[0-9]+" | 1581 (and (re-search-forward "^[ \t]*[0-9]+" |
1582 (+ (point) 4) t) | 1582 (+ (point) 4) t) |
1583 (not (fortran-line-number-indented-correctly-p)))) | 1583 (not (fortran-line-number-indented-correctly-p)))) |
1584 (fortran-indent-to-column cfi) | 1584 (fortran-indent-to-column cfi) |
1585 (beginning-of-line) | 1585 (beginning-of-line) |
1586 (if (fortran-find-comment-start-skip) | 1586 (if (fortran-find-comment-start-skip) |
1587 (fortran-indent-comment)))) | 1587 (fortran-indent-comment)))) |
1588 (fortran-fill) | 1588 (fortran-fill) |
1589 ;; Never leave point in left margin. | 1589 ;; Never leave point in left margin. |
1590 (if (< (current-column) cfi) | 1590 (if (< (current-column) cfi) |
1591 (move-to-column cfi))))) | 1591 (move-to-column cfi))))) |
1592 | 1592 |
1593 ;; Historically this was a separate function which advertised itself | 1593 ;; Historically this was a separate function which advertised itself |
1594 ;; as reindenting but only did so where `most likely to be necessary'. | 1594 ;; as reindenting but only did so where `most likely to be necessary'. |
1595 (defalias 'fortran-indent-new-line 'reindent-then-newline-and-indent) | 1595 (defalias 'fortran-indent-new-line 'reindent-then-newline-and-indent) |
1596 | 1596 |
1604 (message "Indenting subprogram...done.")) | 1604 (message "Indenting subprogram...done.")) |
1605 | 1605 |
1606 (defun fortran-calculate-indent () | 1606 (defun fortran-calculate-indent () |
1607 "Calculates the Fortran indent column based on previous lines." | 1607 "Calculates the Fortran indent column based on previous lines." |
1608 (let (icol first-statement (case-fold-search t) | 1608 (let (icol first-statement (case-fold-search t) |
1609 (fortran-minimum-statement-indent | 1609 (fortran-minimum-statement-indent |
1610 (if indent-tabs-mode | 1610 (if indent-tabs-mode |
1611 fortran-minimum-statement-indent-tab | 1611 fortran-minimum-statement-indent-tab |
1612 fortran-minimum-statement-indent-fixed))) | 1612 fortran-minimum-statement-indent-fixed))) |
1613 (save-excursion | 1613 (save-excursion |
1614 (setq first-statement (fortran-previous-statement)) | 1614 (setq first-statement (fortran-previous-statement)) |
1615 (if first-statement | 1615 (if first-statement |
1616 (setq icol fortran-minimum-statement-indent) | 1616 (setq icol fortran-minimum-statement-indent) |
1617 (if (= (point) (point-min)) | 1617 (if (= (point) (point-min)) |
1618 (setq icol fortran-minimum-statement-indent) | 1618 (setq icol fortran-minimum-statement-indent) |
1619 (setq icol (fortran-current-line-indentation))) | 1619 (setq icol (fortran-current-line-indentation))) |
1620 (skip-chars-forward " \t0-9") | 1620 (skip-chars-forward " \t0-9") |
1621 (cond ((looking-at "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?if[ \t]*(") | 1621 (cond ((looking-at "\\(\\(\\sw\\|\\s_\\)+:[ \t]*\\)?if[ \t]*(") |
1622 (if (or (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t_$(=a-z0-9]") | 1622 (if (or (looking-at ".*)[ \t]*then\\b[ \t]*[^ \t_$(=a-z0-9]") |
1623 (let (then-test) ; multi-line if-then | 1623 (let (then-test) ; multi-line if-then |
1624 (while (and (zerop (forward-line 1)) | 1624 (while (and (zerop (forward-line 1)) |
1625 ;; Search forward for then. | 1625 ;; Search forward for then. |
1626 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]") | 1626 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]") |
1627 (not (setq then-test | 1627 (not (setq then-test |
1628 (looking-at | 1628 (looking-at |
1654 (setq icol fortran-minimum-statement-indent))))) | 1654 (setq icol fortran-minimum-statement-indent))))) |
1655 (save-excursion | 1655 (save-excursion |
1656 (beginning-of-line) | 1656 (beginning-of-line) |
1657 (cond ((looking-at "[ \t]*$")) | 1657 (cond ((looking-at "[ \t]*$")) |
1658 ;; Check for directive before comment, so as not to indent. | 1658 ;; Check for directive before comment, so as not to indent. |
1659 ((looking-at fortran-directive-re) | 1659 ((looking-at fortran-directive-re) |
1660 (setq fortran-minimum-statement-indent 0 icol 0)) | 1660 (setq fortran-minimum-statement-indent 0 icol 0)) |
1661 ((looking-at fortran-comment-line-start-skip) | 1661 ((looking-at fortran-comment-line-start-skip) |
1662 (cond ((eq fortran-comment-indent-style 'relative) | 1662 (cond ((eq fortran-comment-indent-style 'relative) |
1663 (setq icol (+ icol fortran-comment-line-extra-indent))) | 1663 (setq icol (+ icol fortran-comment-line-extra-indent))) |
1664 ((eq fortran-comment-indent-style 'fixed) | 1664 ((eq fortran-comment-indent-style 'fixed) |
1665 (setq icol (+ fortran-minimum-statement-indent | 1665 (setq icol (+ fortran-minimum-statement-indent |
1666 fortran-comment-line-extra-indent)))) | 1666 fortran-comment-line-extra-indent)))) |
1667 (setq fortran-minimum-statement-indent 0)) | 1667 (setq fortran-minimum-statement-indent 0)) |
1668 ((or (looking-at (concat "[ \t]*" | 1668 ((or (looking-at (concat "[ \t]*" |
1669 (regexp-quote | 1669 (regexp-quote |
1670 fortran-continuation-string))) | 1670 fortran-continuation-string))) |
1671 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")) | 1671 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")) |
1672 (skip-chars-forward " \t") | 1672 (skip-chars-forward " \t") |
1673 ;; Do not introduce extra whitespace into a broken string. | 1673 ;; Do not introduce extra whitespace into a broken string. |
1674 (setq icol | 1674 (setq icol |
1675 (if (fortran-is-in-string-p (point)) | 1675 (if (fortran-is-in-string-p (point)) |
1676 6 | 1676 6 |
1677 (+ icol fortran-continuation-indent)))) | 1677 (+ icol fortran-continuation-indent)))) |
1678 (first-statement) | 1678 (first-statement) |
1679 ((and fortran-check-all-num-for-matching-do | 1679 ((and fortran-check-all-num-for-matching-do |
1680 (looking-at "[ \t]*[0-9]+") | 1680 (looking-at "[ \t]*[0-9]+") |
1681 (fortran-check-for-matching-do)) | 1681 (fortran-check-for-matching-do)) |
1682 (setq icol (- icol fortran-do-indent))) | 1682 (setq icol (- icol fortran-do-indent))) |
1683 (t | 1683 (t |
1684 (skip-chars-forward " \t0-9") | 1684 (skip-chars-forward " \t0-9") |
1685 (cond ((looking-at "end[ \t]*\\(if\\|select\\|where\\)\\b") | 1685 (cond ((looking-at "end[ \t]*\\(if\\|select\\|where\\)\\b") |
1686 (setq icol (- icol fortran-if-indent))) | 1686 (setq icol (- icol fortran-if-indent))) |
1687 ((looking-at "else\\(if\\)?\\b") | 1687 ((looking-at "else\\(if\\)?\\b") |
1688 (setq icol (- icol fortran-if-indent))) | 1688 (setq icol (- icol fortran-if-indent))) |
1689 ((looking-at "case[ \t]*\\((.*)\\|default\\>\\)") | 1689 ((looking-at "case[ \t]*\\((.*)\\|default\\>\\)") |
1690 (setq icol (- icol fortran-if-indent))) | 1690 (setq icol (- icol fortran-if-indent))) |
1691 ((looking-at "\\(otherwise\\|else[ \t]*where\\)\\b") | 1691 ((looking-at "\\(otherwise\\|else[ \t]*where\\)\\b") |
1692 (setq icol (- icol fortran-if-indent))) | 1692 (setq icol (- icol fortran-if-indent))) |
1693 ((and (looking-at "continue\\b") | 1693 ((and (looking-at "continue\\b") |
1694 (fortran-check-for-matching-do)) | 1694 (fortran-check-for-matching-do)) |
1695 (setq icol (- icol fortran-do-indent))) | 1695 (setq icol (- icol fortran-do-indent))) |
1696 ((looking-at "end[ \t]*do\\b") | 1696 ((looking-at "end[ \t]*do\\b") |
1697 (setq icol (- icol fortran-do-indent))) | 1697 (setq icol (- icol fortran-do-indent))) |
1698 ((looking-at "end[ \t]*\ | 1698 ((looking-at "end[ \t]*\ |
1699 \\(structure\\|union\\|map\\|interface\\)\\b[ \t]*[^ \t=(a-z]") | 1699 \\(structure\\|union\\|map\\|interface\\)\\b[ \t]*[^ \t=(a-z]") |
1700 (setq icol (- icol fortran-structure-indent))) | 1700 (setq icol (- icol fortran-structure-indent))) |
1701 ((and (looking-at fortran-end-prog-re1) | 1701 ((and (looking-at fortran-end-prog-re1) |
1702 (fortran-check-end-prog-re) | 1702 (fortran-check-end-prog-re) |
1703 (not (= icol fortran-minimum-statement-indent))) | 1703 (not (= icol fortran-minimum-statement-indent))) |
1704 (message "Warning: `end' not in column %d. Probably\ | 1704 (message "Warning: `end' not in column %d. Probably\ |
1705 an unclosed block." fortran-minimum-statement-indent)))))) | 1705 an unclosed block." fortran-minimum-statement-indent)))))) |
1706 (max fortran-minimum-statement-indent icol))) | 1706 (max fortran-minimum-statement-indent icol))) |
1707 | 1707 |
1708 | 1708 |
1709 (defun fortran-current-line-indentation () | 1709 (defun fortran-current-line-indentation () |
1713 For comment lines, returns indentation of the first | 1713 For comment lines, returns indentation of the first |
1714 non-indentation text within the comment." | 1714 non-indentation text within the comment." |
1715 (save-excursion | 1715 (save-excursion |
1716 (beginning-of-line) | 1716 (beginning-of-line) |
1717 (cond ((looking-at fortran-comment-line-start-skip) | 1717 (cond ((looking-at fortran-comment-line-start-skip) |
1718 (goto-char (match-end 0)) | 1718 (goto-char (match-end 0)) |
1719 (skip-chars-forward | 1719 (skip-chars-forward |
1720 (if (stringp fortran-comment-indent-char) | 1720 (if (stringp fortran-comment-indent-char) |
1721 fortran-comment-indent-char | 1721 fortran-comment-indent-char |
1722 (char-to-string fortran-comment-indent-char)))) | 1722 (char-to-string fortran-comment-indent-char)))) |
1723 ((or (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")) | 1723 ((or (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")) |
1724 (goto-char (match-end 0))) | 1724 (goto-char (match-end 0))) |
1725 (t | 1725 (t |
1726 ;; Move past line number. | 1726 ;; Move past line number. |
1727 (skip-chars-forward "[ \t0-9]"))) | 1727 (skip-chars-forward "[ \t0-9]"))) |
1728 ;; Move past whitespace. | 1728 ;; Move past whitespace. |
1729 (skip-chars-forward " \t") | 1729 (skip-chars-forward " \t") |
1730 (current-column))) | 1730 (current-column))) |
1731 | 1731 |
1732 (defun fortran-indent-to-column (col) | 1732 (defun fortran-indent-to-column (col) |
1739 non-whitespace character is a numbered line. | 1739 non-whitespace character is a numbered line. |
1740 4) A TAB followed by a digit indicates a continuation line." | 1740 4) A TAB followed by a digit indicates a continuation line." |
1741 (save-excursion | 1741 (save-excursion |
1742 (beginning-of-line) | 1742 (beginning-of-line) |
1743 (if (looking-at fortran-comment-line-start-skip) | 1743 (if (looking-at fortran-comment-line-start-skip) |
1744 (if fortran-comment-indent-style | 1744 (if fortran-comment-indent-style |
1745 (let* ((char (if (stringp fortran-comment-indent-char) | 1745 (let* ((char (if (stringp fortran-comment-indent-char) |
1746 (aref fortran-comment-indent-char 0) | 1746 (aref fortran-comment-indent-char 0) |
1747 fortran-comment-indent-char)) | 1747 fortran-comment-indent-char)) |
1748 (chars (string ?\s ?\t char))) | 1748 (chars (string ?\s ?\t char))) |
1749 (goto-char (match-end 0)) | 1749 (goto-char (match-end 0)) |
1750 (skip-chars-backward chars) | 1750 (skip-chars-backward chars) |
1751 (delete-region (point) (progn (skip-chars-forward chars) | 1751 (delete-region (point) (progn (skip-chars-forward chars) |
1752 (point))) | 1752 (point))) |
1753 (insert-char char (- col (current-column))))) | 1753 (insert-char char (- col (current-column))))) |
1754 (if (looking-at "\t[1-9]") | 1754 (if (looking-at "\t[1-9]") |
1755 (if indent-tabs-mode | 1755 (if indent-tabs-mode |
1756 (goto-char (match-end 0)) | 1756 (goto-char (match-end 0)) |
1757 (delete-char 2) | 1757 (delete-char 2) |
1758 (insert-char ?\s 5) | 1758 (insert-char ?\s 5) |
1759 (insert fortran-continuation-string)) | 1759 (insert fortran-continuation-string)) |
1760 (if (looking-at " \\{5\\}[^ 0\n]") | 1760 (if (looking-at " \\{5\\}[^ 0\n]") |
1761 (if indent-tabs-mode | 1761 (if indent-tabs-mode |
1762 (progn (delete-char 6) | 1762 (progn (delete-char 6) |
1763 (insert ?\t (fortran-numerical-continuation-char) 1)) | 1763 (insert ?\t (fortran-numerical-continuation-char) 1)) |
1764 (forward-char 6)) | 1764 (forward-char 6)) |
1765 (delete-horizontal-space) | 1765 (delete-horizontal-space) |
1766 ;; Put line number in columns 0-4, or | 1766 ;; Put line number in columns 0-4, or |
1767 ;; continuation character in column 5. | 1767 ;; continuation character in column 5. |
1768 (cond ((eobp)) | 1768 (cond ((eobp)) |
1769 ((looking-at (regexp-quote fortran-continuation-string)) | 1769 ((looking-at (regexp-quote fortran-continuation-string)) |
1770 (if indent-tabs-mode | 1770 (if indent-tabs-mode |
1771 (progn | 1771 (progn |
1772 (indent-to | 1772 (indent-to |
1773 (if indent-tabs-mode | 1773 (if indent-tabs-mode |
1774 fortran-minimum-statement-indent-tab | 1774 fortran-minimum-statement-indent-tab |
1775 fortran-minimum-statement-indent-fixed)) | 1775 fortran-minimum-statement-indent-fixed)) |
1776 (delete-char 1) | 1776 (delete-char 1) |
1777 (insert-char (fortran-numerical-continuation-char) 1)) | 1777 (insert-char (fortran-numerical-continuation-char) 1)) |
1778 (indent-to 5) | 1778 (indent-to 5) |
1779 (forward-char 1))) | 1779 (forward-char 1))) |
1780 ((looking-at "[0-9]+") | 1780 ((looking-at "[0-9]+") |
1781 (let ((extra-space (- 5 (- (match-end 0) (point))))) | 1781 (let ((extra-space (- 5 (- (match-end 0) (point))))) |
1782 (if (< extra-space 0) | 1782 (if (< extra-space 0) |
1783 (message "Warning: line number exceeds 5-digit limit.") | 1783 (message "Warning: line number exceeds 5-digit limit.") |
1784 (indent-to (min fortran-line-number-indent extra-space)))) | 1784 (indent-to (min fortran-line-number-indent extra-space)))) |
1785 (skip-chars-forward "0-9"))))) | 1785 (skip-chars-forward "0-9"))))) |
1786 ;; Point is now after any continuation character or line number. | 1786 ;; Point is now after any continuation character or line number. |
1787 ;; Put body of statement where specified. | 1787 ;; Put body of statement where specified. |
1788 (delete-horizontal-space) | 1788 (delete-horizontal-space) |
1789 (indent-to col) | 1789 (indent-to col) |
1790 ;; Indent any comment following code on the same line. | 1790 ;; Indent any comment following code on the same line. |
1799 Do not call if there is no line number." | 1799 Do not call if there is no line number." |
1800 (save-excursion | 1800 (save-excursion |
1801 (beginning-of-line) | 1801 (beginning-of-line) |
1802 (skip-chars-forward " \t") | 1802 (skip-chars-forward " \t") |
1803 (and (<= (current-column) fortran-line-number-indent) | 1803 (and (<= (current-column) fortran-line-number-indent) |
1804 (or (= (current-column) fortran-line-number-indent) | 1804 (or (= (current-column) fortran-line-number-indent) |
1805 (progn (skip-chars-forward "0-9") | 1805 (progn (skip-chars-forward "0-9") |
1806 (= (current-column) 5)))))) | 1806 (= (current-column) 5)))))) |
1807 | 1807 |
1808 (defun fortran-check-for-matching-do () | 1808 (defun fortran-check-for-matching-do () |
1809 "When called from a numbered statement, return t if matching DO is found. | 1809 "When called from a numbered statement, return t if matching DO is found. |
1810 Otherwise return nil." | 1810 Otherwise return nil." |
1811 (let ((case-fold-search t) | 1811 (let ((case-fold-search t) |
1812 charnum) | 1812 charnum) |
1813 (save-excursion | 1813 (save-excursion |
1814 (beginning-of-line) | 1814 (beginning-of-line) |
1815 (when (looking-at "[ \t]*[0-9]+") | 1815 (when (looking-at "[ \t]*[0-9]+") |
1816 (skip-chars-forward " \t") | 1816 (skip-chars-forward " \t") |
1817 (skip-chars-forward "0") ; skip past leading zeros | 1817 (skip-chars-forward "0") ; skip past leading zeros |
1818 (setq charnum | 1818 (setq charnum |
1819 (buffer-substring (point) (progn | 1819 (buffer-substring (point) (progn |
1820 (skip-chars-forward "0-9") | 1820 (skip-chars-forward "0-9") |
1821 (point)))) | 1821 (point)))) |
1822 (beginning-of-line) | 1822 (beginning-of-line) |
1839 If ALL is nil, only match comments that start in column > 0." | 1839 If ALL is nil, only match comments that start in column > 0." |
1840 ;; Hopefully at some point we can just use the line below! -stef | 1840 ;; Hopefully at some point we can just use the line below! -stef |
1841 ;; (comment-search-forward (line-end-position) t)) | 1841 ;; (comment-search-forward (line-end-position) t)) |
1842 (when (or all comment-start-skip) | 1842 (when (or all comment-start-skip) |
1843 (let ((pos (point)) | 1843 (let ((pos (point)) |
1844 (css (if comment-start-skip | 1844 (css (if comment-start-skip |
1845 (concat fortran-comment-line-start-skip | 1845 (concat fortran-comment-line-start-skip |
1846 "\\|" comment-start-skip) | 1846 "\\|" comment-start-skip) |
1847 fortran-comment-line-start-skip))) | 1847 fortran-comment-line-start-skip))) |
1848 (when (re-search-forward css (line-end-position) t) | 1848 (when (re-search-forward css (line-end-position) t) |
1849 (if (and (or all (> (match-beginning 0) (line-beginning-position))) | 1849 (if (and (or all (> (match-beginning 0) (line-beginning-position))) |
1850 (or (save-match-data | 1850 (or (save-match-data |
1851 (not (fortran-is-in-string-p (match-beginning 0)))) | 1851 (not (fortran-is-in-string-p (match-beginning 0)))) |
1852 ;; Recurse for rest of line. | 1852 ;; Recurse for rest of line. |
1853 (fortran-find-comment-start-skip all))) | 1853 (fortran-find-comment-start-skip all))) |
1854 (point) | 1854 (point) |
1855 (goto-char pos) | 1855 (goto-char pos) |
1856 nil))))) | 1856 nil))))) |
1857 | 1857 |
1858 ;; From: ralf@up3aud1.gwdg.de (Ralf Fassel) | 1858 ;; From: ralf@up3aud1.gwdg.de (Ralf Fassel) |
1859 ;; Test if TAB format continuation lines work. | 1859 ;; Test if TAB format continuation lines work. |
1860 (defun fortran-is-in-string-p (where) | 1860 (defun fortran-is-in-string-p (where) |
1861 "Return non-nil if WHERE (a buffer position) is inside a Fortran string." | 1861 "Return non-nil if WHERE (a buffer position) is inside a Fortran string." |
1862 (save-excursion | 1862 (save-excursion |
1863 (goto-char where) | 1863 (goto-char where) |
1864 (cond | 1864 (cond |
1865 ((bolp) nil) ; bol is never inside a string | 1865 ((bolp) nil) ; bol is never inside a string |
1866 ((save-excursion ; comment lines too | 1866 ((save-excursion ; comment lines too |
1867 (beginning-of-line) | 1867 (beginning-of-line) |
1868 (looking-at fortran-comment-line-start-skip)) nil) | 1868 (looking-at fortran-comment-line-start-skip)) nil) |
1869 (t (let ((parse-state '(0 nil nil nil nil nil 0)) | 1869 (t (let ((parse-state '(0 nil nil nil nil nil 0)) |
1870 (quoted-comment-start (if comment-start | 1870 (quoted-comment-start (if comment-start |
1871 (regexp-quote comment-start))) | 1871 (regexp-quote comment-start))) |
1872 (not-done t) | 1872 (not-done t) |
1873 parse-limit end-of-line) | 1873 parse-limit end-of-line) |
1874 ;; Move to start of current statement. | 1874 ;; Move to start of current statement. |
1875 (fortran-next-statement) | 1875 (fortran-next-statement) |
1876 (fortran-previous-statement) | 1876 (fortran-previous-statement) |
1877 ;; Now parse up to WHERE. | 1877 ;; Now parse up to WHERE. |
1878 (while not-done | 1878 (while not-done |
1879 (if (or ;; Skip to next line if: | 1879 (if (or ;; Skip to next line if: |
1880 ;; - comment line? | 1880 ;; - comment line? |
1881 (looking-at fortran-comment-line-start-skip) | 1881 (looking-at fortran-comment-line-start-skip) |
1882 ;; - at end of line? | 1882 ;; - at end of line? |
1883 (eolp) | 1883 (eolp) |
1884 ;; - not in a string and after comment-start? | 1884 ;; - not in a string and after comment-start? |
1885 (and (not (nth 3 parse-state)) | 1885 (and (not (nth 3 parse-state)) |
1886 comment-start | 1886 comment-start |
1887 (equal comment-start | 1887 (equal comment-start |
1888 (char-to-string (preceding-char))))) | 1888 (char-to-string (preceding-char))))) |
1889 (if (> (forward-line) 0) | 1889 (if (> (forward-line) 0) |
1890 (setq not-done nil)) | 1890 (setq not-done nil)) |
1891 ;; else: | 1891 ;; else: |
1892 ;; If we are at beginning of code line, skip any | 1892 ;; If we are at beginning of code line, skip any |
1893 ;; whitespace, labels and tab continuation markers. | 1893 ;; whitespace, labels and tab continuation markers. |
1894 (if (bolp) (skip-chars-forward " \t0-9")) | 1894 (if (bolp) (skip-chars-forward " \t0-9")) |
1895 ;; If we are in column <= 5 now, check for continuation char. | 1895 ;; If we are in column <= 5 now, check for continuation char. |
1896 (cond ((= 5 (current-column)) (forward-char 1)) | 1896 (cond ((= 5 (current-column)) (forward-char 1)) |
1897 ((and (< (current-column) 5) | 1897 ((and (< (current-column) 5) |
1898 (equal fortran-continuation-string | 1898 (equal fortran-continuation-string |
1899 (char-to-string (following-char))) | 1899 (char-to-string (following-char))) |
1900 (forward-char 1)))) | 1900 (forward-char 1)))) |
1901 ;; Find out parse-limit from here. | 1901 ;; Find out parse-limit from here. |
1902 (setq end-of-line (line-end-position)) | 1902 (setq end-of-line (line-end-position)) |
1903 (setq parse-limit (min where end-of-line)) | 1903 (setq parse-limit (min where end-of-line)) |
1904 ;; Parse max up to comment-start, if non-nil and in current line. | 1904 ;; Parse max up to comment-start, if non-nil and in current line. |
1905 (if comment-start | 1905 (if comment-start |
1906 (save-excursion | 1906 (save-excursion |
1907 (if (re-search-forward quoted-comment-start end-of-line t) | 1907 (if (re-search-forward quoted-comment-start end-of-line t) |
1908 (setq parse-limit (min (point) parse-limit))))) | 1908 (setq parse-limit (min (point) parse-limit))))) |
1909 ;; Now parse if still in limits. | 1909 ;; Now parse if still in limits. |
1910 (if (< (point) where) | 1910 (if (< (point) where) |
1911 (setq parse-state (parse-partial-sexp | 1911 (setq parse-state (parse-partial-sexp |
1912 (point) parse-limit nil nil parse-state)) | 1912 (point) parse-limit nil nil parse-state)) |
1913 (setq not-done nil)))) | 1913 (setq not-done nil)))) |
1914 ;; Result. | 1914 ;; Result. |
1915 (nth 3 parse-state)))))) | 1915 (nth 3 parse-state)))))) |
1916 | 1916 |
1917 ;; From old version. | 1917 ;; From old version. |
1918 (defalias 'fortran-auto-fill-mode 'auto-fill-mode) | 1918 (defalias 'fortran-auto-fill-mode 'auto-fill-mode) |
1919 | 1919 |
1920 (defun fortran-fill () | 1920 (defun fortran-fill () |
1921 "Fill the current line at an appropriate point(s)." | 1921 "Fill the current line at an appropriate point(s)." |
1922 (let* ((auto-fill-function #'fortran-auto-fill) | 1922 (let* ((auto-fill-function #'fortran-auto-fill) |
1923 (opoint (point)) | 1923 (opoint (point)) |
1924 (bol (line-beginning-position)) | 1924 (bol (line-beginning-position)) |
1925 (eol (line-end-position)) | 1925 (eol (line-end-position)) |
1926 (bos (min eol (+ bol (fortran-current-line-indentation)))) | 1926 (bos (min eol (+ bol (fortran-current-line-indentation)))) |
1927 ;; If in a string at fill-column, break it either before the | 1927 ;; If in a string at fill-column, break it either before the |
1928 ;; initial quote, or at fill-col (if string is too long). | 1928 ;; initial quote, or at fill-col (if string is too long). |
1929 (quote | 1929 (quote |
1930 (save-excursion | 1930 (save-excursion |
1931 (goto-char bol) | 1931 (goto-char bol) |
1932 ;; OK to break quotes on comment lines. | 1932 ;; OK to break quotes on comment lines. |
1933 (unless (looking-at fortran-comment-line-start-skip) | 1933 (unless (looking-at fortran-comment-line-start-skip) |
1934 (let (fcpoint start) | 1934 (let (fcpoint start) |
1935 (move-to-column fill-column) | 1935 (move-to-column fill-column) |
1936 (when (fortran-is-in-string-p (setq fcpoint (point))) | 1936 (when (fortran-is-in-string-p (setq fcpoint (point))) |
1937 (save-excursion | 1937 (save-excursion |
1938 (re-search-backward "\\S\"\\s\"\\S\"?" bol t) | 1938 (re-search-backward "\\S\"\\s\"\\S\"?" bol t) |
1947 ;; infinite loop). | 1947 ;; infinite loop). |
1948 (if (> (- (point) start) | 1948 (if (> (- (point) start) |
1949 (- fill-column 6 fortran-continuation-indent)) | 1949 (- fill-column 6 fortran-continuation-indent)) |
1950 fcpoint | 1950 fcpoint |
1951 start)))))) | 1951 start)))))) |
1952 ;; Decide where to split the line. If a position for a quoted | 1952 ;; Decide where to split the line. If a position for a quoted |
1953 ;; string was found above then use that, else break the line | 1953 ;; string was found above then use that, else break the line |
1954 ;; before/after the last delimiter. | 1954 ;; before/after the last delimiter. |
1955 (fill-point | 1955 (fill-point |
1956 (or quote | 1956 (or quote |
1957 (save-excursion | 1957 (save-excursion |
1958 ;; If f-b-b-d is t, have an extra column to play with, | 1958 ;; If f-b-b-d is t, have an extra column to play with, |
1959 ;; since delimiter gets shifted to new line. | 1959 ;; since delimiter gets shifted to new line. |
1960 (move-to-column (if fortran-break-before-delimiters | 1960 (move-to-column (if fortran-break-before-delimiters |
1961 (1+ fill-column) | 1961 (1+ fill-column) |
1962 fill-column)) | 1962 fill-column)) |
1976 (forward-char 1)) | 1976 (forward-char 1)) |
1977 (backward-char) | 1977 (backward-char) |
1978 (or (looking-at fortran-no-break-re) | 1978 (or (looking-at fortran-no-break-re) |
1979 (forward-char))))) | 1979 (forward-char))))) |
1980 ;; Line indented beyond fill-column? | 1980 ;; Line indented beyond fill-column? |
1981 (when (<= (point) bos) | 1981 (when (<= (point) bos) |
1982 (move-to-column (1+ fill-column)) | 1982 (move-to-column (1+ fill-column)) |
1983 ;; What is this doing??? | 1983 ;; What is this doing??? |
1984 (or (re-search-forward "[\t\n,'+-/*)=]" eol t) | 1984 (or (re-search-forward "[\t\n,'+-/*)=]" eol t) |
1985 (goto-char bol))) | 1985 (goto-char bol))) |
1986 (if (bolp) | 1986 (if (bolp) |
1987 (re-search-forward "[ \t]" opoint t)) | 1987 (re-search-forward "[ \t]" opoint t)) |
1988 (point))))) | 1988 (point))))) |
1989 ;; If we are in an in-line comment, don't break unless the | 1989 ;; If we are in an in-line comment, don't break unless the |
1990 ;; line of code is longer than it should be. Otherwise | 1990 ;; line of code is longer than it should be. Otherwise |
1991 ;; break the line at the column computed above. | 1991 ;; break the line at the column computed above. |
1992 ;; | 1992 ;; |
1993 ;; Need to use fortran-find-comment-start-skip to make sure that | 1993 ;; Need to use fortran-find-comment-start-skip to make sure that |
1994 ;; quoted !'s don't prevent a break. | 1994 ;; quoted !'s don't prevent a break. |
1995 (when (and (save-excursion | 1995 (when (and (save-excursion |
1996 (beginning-of-line) | 1996 (beginning-of-line) |
1997 (if (not (fortran-find-comment-start-skip)) | 1997 (if (not (fortran-find-comment-start-skip)) |
1998 t | 1998 t |
1999 (goto-char (match-beginning 0)) | 1999 (goto-char (match-beginning 0)) |
2000 (>= (point) fill-point))) | 2000 (>= (point) fill-point))) |
2001 (save-excursion | 2001 (save-excursion |
2002 (goto-char fill-point) | 2002 (goto-char fill-point) |
2003 (not (bolp))) | 2003 (not (bolp))) |
2004 (> (save-excursion | 2004 (> (save-excursion |
2005 (goto-char opoint) | 2005 (goto-char opoint) |
2006 (current-column)) | 2006 (current-column)) |
2007 (min (1+ fill-column) | 2007 (min (1+ fill-column) |
2008 (+ (fortran-calculate-indent) | 2008 (+ (fortran-calculate-indent) |
2009 fortran-continuation-indent)))) | 2009 fortran-continuation-indent)))) |
2010 (goto-char fill-point) | 2010 (goto-char fill-point) |
2011 (fortran-break-line) | 2011 (fortran-break-line) |
2012 (end-of-line)))) | 2012 (end-of-line)))) |
2013 | 2013 |
2014 (defun fortran-break-line () | 2014 (defun fortran-break-line () |
2015 "Call `fortran-split-line'. Joins continuation lines first, then refills." | 2015 "Call `fortran-split-line'. Joins continuation lines first, then refills." |
2016 (let ((bol (line-beginning-position)) | 2016 (let ((bol (line-beginning-position)) |
2017 (comment-string | 2017 (comment-string |
2018 (save-excursion | 2018 (save-excursion |
2019 (if (fortran-find-comment-start-skip) | 2019 (if (fortran-find-comment-start-skip) |
2020 (delete-and-extract-region | 2020 (delete-and-extract-region |
2021 (match-beginning 0) (line-end-position)))))) | 2021 (match-beginning 0) (line-end-position)))))) |
2022 ;; Forward line 1 really needs to go to next non white line. | 2022 ;; Forward line 1 really needs to go to next non white line. |
2023 (if (save-excursion (forward-line) | 2023 (if (save-excursion (forward-line) |
2024 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")) | 2024 (looking-at " \\{5\\}[^ 0\n]\\|\t[1-9]")) |
2025 (progn | 2025 (progn |
2026 (end-of-line) | 2026 (end-of-line) |
2027 (delete-region (point) (match-end 0)) | 2027 (delete-region (point) (match-end 0)) |
2028 (delete-horizontal-space) | 2028 (delete-horizontal-space) |
2029 (fortran-fill)) | 2029 (fortran-fill)) |
2030 (fortran-split-line)) | 2030 (fortran-split-line)) |
2031 (if comment-string | 2031 (if comment-string |
2032 (save-excursion | 2032 (save-excursion |
2033 (goto-char bol) | 2033 (goto-char bol) |
2034 (end-of-line) | 2034 (end-of-line) |
2035 (delete-horizontal-space) | 2035 (delete-horizontal-space) |
2036 (indent-to (fortran-comment-indent)) | 2036 (indent-to (fortran-comment-indent)) |
2037 (insert comment-string))))) | 2037 (insert comment-string))))) |
2038 | 2038 |
2039 (defun fortran-analyze-file-format () | 2039 (defun fortran-analyze-file-format () |
2040 "Return nil if fixed format is used, t if TAB formatting is used. | 2040 "Return nil if fixed format is used, t if TAB formatting is used. |
2041 Use `fortran-tab-mode-default' if no non-comment statements are found | 2041 Use `fortran-tab-mode-default' if no non-comment statements are found |
2042 before the end or in the first `fortran-analyze-depth' lines." | 2042 before the end or in the first `fortran-analyze-depth' lines." |
2043 (let ((i 0)) | 2043 (let ((i 0)) |
2044 (save-excursion | 2044 (save-excursion |
2045 (goto-char (point-min)) | 2045 (goto-char (point-min)) |
2046 (while (not (or | 2046 (while (not (or |
2047 (eobp) | 2047 (eobp) |
2048 (eq (char-after) ?\t) | 2048 (eq (char-after) ?\t) |
2049 (looking-at " \\{6\\}") | 2049 (looking-at " \\{6\\}") |
2050 (> i fortran-analyze-depth))) | 2050 (> i fortran-analyze-depth))) |
2051 (forward-line) | 2051 (forward-line) |
2052 (setq i (1+ i))) | 2052 (setq i (1+ i))) |
2053 (cond | 2053 (cond |
2054 ((eq (char-after) ?\t) t) | 2054 ((eq (char-after) ?\t) t) |
2055 ((looking-at " \\{6\\}") nil) | 2055 ((looking-at " \\{6\\}") nil) |
2056 (t fortran-tab-mode-default))))) | 2056 (t fortran-tab-mode-default))))) |
2057 | 2057 |
2108 (defun fortran-current-defun () | 2108 (defun fortran-current-defun () |
2109 "Function to use for `add-log-current-defun-function' in Fortran mode." | 2109 "Function to use for `add-log-current-defun-function' in Fortran mode." |
2110 (save-excursion | 2110 (save-excursion |
2111 ;; We must be inside function body for this to work. | 2111 ;; We must be inside function body for this to work. |
2112 (fortran-beginning-of-subprogram) | 2112 (fortran-beginning-of-subprogram) |
2113 (let ((case-fold-search t)) ; case-insensitive | 2113 (let ((case-fold-search t)) ; case-insensitive |
2114 ;; Search for fortran subprogram start. | 2114 ;; Search for fortran subprogram start. |
2115 (if (re-search-forward | 2115 (if (re-search-forward |
2116 (concat "^[ \t]*\\(program\\|subroutine\\|function" | 2116 (concat "^[ \t]*\\(program\\|subroutine\\|function" |
2117 "\\|[ \ta-z0-9*()]*[ \t]+function\\|" | 2117 "\\|[ \ta-z0-9*()]*[ \t]+function\\|" |
2118 "\\(block[ \t]*data\\)\\)") | 2118 "\\(block[ \t]*data\\)\\)") |