1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-03 08:30:09 +00:00

(fortran-break-before-delimiters): Doc fix.

(fortran-break-delimiters-re, fortran-no-break-re): New defconsts.
(fortran-fill): When filling a string, adjust re-search-backward
argument for special case of string just on fill-column.
When filling non-string, allow one extra char if
fortran-break-before-delimiters is non-nil.  Suggested by
Michael Hagemann <michael.hagemann@unibas.ch>.
Use fortran-break-delimiters-re and fortran-no-break-re to
correctly handle cases such as "**".
This commit is contained in:
Glenn Morris 2004-01-25 23:59:57 +00:00
parent 6f43f690c6
commit 337c50a52f
2 changed files with 78 additions and 36 deletions

View File

@ -1,3 +1,18 @@
2004-01-25 Glenn Morris <gmorris@ast.cam.ac.uk>
* progmodes/fortran.el (fortran-break-before-delimiters): Doc fix.
(fortran-break-delimiters-re, fortran-no-break-re): New defconsts.
(fortran-fill): When filling a string, adjust re-search-backward
argument for special case of string just on fill-column.
When filling non-string, allow one extra char if
fortran-break-before-delimiters is non-nil. Suggested by
Michael Hagemann <michael.hagemann@unibas.ch>.
Use fortran-break-delimiters-re and fortran-no-break-re to
correctly handle cases such as "**".
* progmodes/f90.el (f90-break-delimiters): Doc fix.
(f90-no-break-re): Add some extra tokens. Doc fix.
2004-01-24 Thien-Thi Nguyen <ttn@gnu.org>
* mail/rmail-spam-filter.el:

View File

@ -1,6 +1,6 @@
;;; fortran.el --- Fortran mode for GNU Emacs
;; Copyright (c) 1986, 93, 94, 95, 97, 98, 99, 2000, 01, 2003
;; Copyright (c) 1986, 93, 94, 95, 97, 98, 99, 2000, 01, 03, 04
;; Free Software Foundation, Inc.
;; Author: Michael D. Prange <prange@erl.mit.edu>
@ -237,10 +237,25 @@ See the variable `fortran-column-ruler-fixed' for fixed format mode."
(defcustom fortran-break-before-delimiters t
"*Non-nil causes filling to break lines before delimiters.
Delimiters are whitespace, commas, quotes, and operators."
Delimiters are characters matching the regexp `fortran-break-delimiters-re'."
:type 'boolean
:group 'fortran)
(defconst fortran-break-delimiters-re "[-+*/><=, \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 `fortran-no-break-re'.")
;; The ">=", etc F77 extensions are supported by g77.
(defconst fortran-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 `fortran-break-delimiters-re' that should
not be split by filling. Each element is assumed to be two
characters long.")
(defcustom fortran-mode-hook nil
"Hook run when entering Fortran mode."
:type 'hook
@ -1646,56 +1661,68 @@ If ALL is nil, only match comments that start in column > 0."
(bol (line-beginning-position))
(eol (line-end-position))
(bos (min eol (+ bol (fortran-current-line-indentation))))
;; If in a string at fill-column, break it either before the
;; initial quote, or at fill-col (if string is too long).
(quote
(save-excursion
(goto-char bol)
;; OK to break quotes on comment lines.
(unless (looking-at fortran-comment-line-start-skip)
(let (fcpoint start)
(move-to-column fill-column)
(when (fortran-is-in-string-p (setq fcpoint (point)))
(save-excursion
(re-search-backward "\\S\"\\s\"\\S\"" bol t)
(setq start
(if fortran-break-before-delimiters
(point)
(1+ (point)))))
(if (re-search-forward "\\S\"\\s\"\\S\"" eol t)
(backward-char 2))
;; If the current string is longer than 72 - 6 chars,
;; break it at the fill column (else infinite loop).
(if (> (- (point) start)
(- fill-column 6 fortran-continuation-indent))
fcpoint
start))))))
(move-to-column fill-column)
(when (fortran-is-in-string-p (setq fcpoint (point)))
(save-excursion
(re-search-backward "\\S\"\\s\"\\S\"?" bol t)
(setq start
(if fortran-break-before-delimiters
(point)
(1+ (point)))))
(if (re-search-forward "\\S\"\\s\"\\S\"" eol t)
(backward-char 2))
;; If the current string is longer than 72 - 6 chars,
;; break it at the fill column (else infinite loop).
(if (> (- (point) start)
(- fill-column 6 fortran-continuation-indent))
fcpoint
start))))))
;; Decide where to split the line. If a position for a quoted
;; string was found above then use that, else break the line
;; before the last delimiter.
;; Delimiters are whitespace, commas, and operators.
;; Will break before a pair of *'s.
;; before/after the last delimiter.
(fill-point
(or quote
(save-excursion
(move-to-column (1+ fill-column))
;; GM Make this a defcustom as in f90-mode? Add ", (?
(skip-chars-backward "^ \t\n,'+-/*=)"
;;; (if fortran-break-before-delimiters
;;; "^ \t\n,'+-/*=" "^ \t\n,'+-/*=)")
)
(when (<= (point) (1+ bos))
;; If f-b-b-d is t, have an extra column to play with,
;; since delimiter gets shifted to new line.
(move-to-column (if fortran-break-before-delimiters
(1+ fill-column)
fill-column))
(let ((repeat t))
(while repeat
(setq repeat nil)
;; Adapted from f90-find-breakpoint.
(re-search-backward fortran-break-delimiters-re
(line-beginning-position))
(if (not fortran-break-before-delimiters)
(if (looking-at fortran-no-break-re)
;; Deal with cases such as "**" split over
;; fill-col. Simpler alternative would be
;; to start from (1- fill-column) above.
(if (> (+ 2 (current-column)) fill-column)
(setq repeat t)
(forward-char 2))
(forward-char 1))
(backward-char)
(or (looking-at fortran-no-break-re)
(forward-char)))))
;; Line indented beyond fill-column?
(when (<= (point) bos)
(move-to-column (1+ fill-column))
;; What is this doing???
(or (re-search-forward "[\t\n,'+-/*)=]" eol t)
(goto-char bol)))
(if (bolp)
(re-search-forward "[ \t]" opoint t)
(backward-char)
(if (looking-at "\\s\"")
(forward-char)
(skip-chars-backward " \t\*")))
(if fortran-break-before-delimiters
(point)
(1+ (point)))))))
(re-search-forward "[ \t]" opoint t))
(point)))))
;; If we are in an in-line comment, don't break unless the
;; line of code is longer than it should be. Otherwise
;; break the line at the column computed above.