Annotation of 43BSD/contrib/emacs/lisp/fill.el, revision 1.1.1.1

1.1       root        1: ;; Fill commands for Emacs
                      2: ;; Copyright (C) 1985 Richard M. Stallman.
                      3: 
                      4: ;; This file is part of GNU Emacs.
                      5: 
                      6: ;; GNU Emacs is distributed in the hope that it will be useful,
                      7: ;; but WITHOUT ANY WARRANTY.  No author or distributor
                      8: ;; accepts responsibility to anyone for the consequences of using it
                      9: ;; or for whether it serves any particular purpose or works at all,
                     10: ;; unless he says so in writing.  Refer to the GNU Emacs General Public
                     11: ;; License for full details.
                     12: 
                     13: ;; Everyone is granted permission to copy, modify and redistribute
                     14: ;; GNU Emacs, but only under the conditions described in the
                     15: ;; GNU Emacs General Public License.   A copy of this license is
                     16: ;; supposed to have been given to you along with GNU Emacs so you
                     17: ;; can know your rights and responsibilities.  It should be in a
                     18: ;; file named COPYING.  Among other things, the copyright notice
                     19: ;; and this notice must be preserved on all copies.
                     20: 
                     21: 
                     22: (defun set-fill-prefix ()
                     23:   "Set the fill-prefix to the current line up to point.
                     24: Filling expects lines to start with the fill prefix
                     25: and reinserts the fill prefix in each resulting line."
                     26:   (interactive)
                     27:   (setq fill-prefix (buffer-substring
                     28:                     (save-excursion (beginning-of-line) (point))
                     29:                     (point)))
                     30:   (if (equal fill-prefix "")
                     31:       (setq fill-prefix nil))
                     32:   (if fill-prefix
                     33:       (message "fill-prefix: \"%s\"" fill-prefix)
                     34:     (message "fill-prefix cancelled")))
                     35: 
                     36: (defun fill-region-as-paragraph (from to &optional justify-flag)
                     37:   "Fill region as one paragraph: break lines to fit fill-column.
                     38: Prefix arg means justify too.
                     39: From program, pass args FROM, TO and JUSTIFY-FLAG."
                     40:   (interactive "r\nP")
                     41:   (save-restriction
                     42:     (narrow-to-region from to)
                     43:     (goto-char (point-min))
                     44:     (skip-chars-forward "\n")
                     45:     (narrow-to-region (point) (point-max))
                     46:     (let ((fpre (and fill-prefix (not (equal fill-prefix ""))
                     47:                     (regexp-quote fill-prefix))))
                     48:       ;; Delete the fill prefix from every line except the first.
                     49:       ;; The first line may not even have a fill prefix.
                     50:       (and fpre
                     51:           (progn
                     52:             (goto-char (point-min))
                     53:             (forward-line 1)
                     54:             (while (not (eobp))
                     55:               (if (looking-at fpre)
                     56:                   (delete-region (point) (match-end 0)))
                     57:               (forward-line 1))))
                     58:       (goto-char (point-min))
                     59:       (and fpre (looking-at fpre) (forward-char (length fill-prefix))))
                     60:     ;; Make sure sentences ending at end of line get an extra space.
                     61:     (goto-char (point-min))
                     62:     (while (re-search-forward "[.?!][])""']*$" nil t)
                     63:       (insert ? ))
                     64:     ;; The change all newlines to spaces.
                     65:     (subst-char-in-region (point-min) (point-max) ?\n ?\ )
                     66:     ;; Flush excess spaces, except in the paragraph indentation.
                     67:     (goto-char (point-min))
                     68:     (skip-chars-forward " \t")
                     69:     (while (re-search-forward "   *" nil t)
                     70:       (delete-region
                     71:        (+ (match-beginning 0)
                     72:          (if (save-excursion
                     73:               (skip-chars-backward " ])\"'")
                     74:               (memq (preceding-char) '(?. ?? ?!)))
                     75:              2 1))
                     76:        (match-end 0)))
                     77:     (goto-char (point-max))
                     78:     (delete-horizontal-space)
                     79:     (insert "  ")
                     80:     (goto-char (point-min))
                     81:     (let ((fplen (length (or fill-prefix ""))))
                     82:       (while (not (eobp))
                     83:        (move-to-column (1+ fill-column))
                     84:        (if (eobp)
                     85:            nil
                     86:          (skip-chars-backward "^ \n")
                     87:          (if (bolp)
                     88:              (skip-chars-forward "^ \n")
                     89:            (forward-char -1)))
                     90:        (delete-horizontal-space)
                     91:        (insert ?\n)
                     92:        (and (not (eobp)) fill-prefix (not (equal fill-prefix ""))
                     93:             (insert fill-prefix))
                     94:        (and justify-flag (not (eobp))
                     95:             (progn
                     96:               (forward-line -1)
                     97:               (justify-current-line)
                     98:               (forward-line 1)))))))
                     99: 
                    100: (defun fill-paragraph (arg)
                    101:   "Fill paragraph at or after point.
                    102: Prefix arg means justify as well."
                    103:   (interactive "P")
                    104:   (save-excursion
                    105:     (forward-paragraph)
                    106:     (or (bolp) (newline 1))
                    107:     (let ((end (point)))
                    108:       (backward-paragraph)
                    109:       (fill-region-as-paragraph (point) end arg))))
                    110: 
                    111: (defun fill-region (from to &optional justify-flag)
                    112:   "Fill each of the paragraphs in the region.
                    113: Prefix arg (non-nil third arg, if called from program)
                    114: means justify as well."
                    115:   (interactive "r\nP")
                    116:   (save-restriction
                    117:    (narrow-to-region from to)
                    118:    (goto-char (point-min))
                    119:    (while (not (eobp))
                    120:      (let ((initial (point))
                    121:           (end (progn
                    122:                 (forward-paragraph 1) (point))))
                    123:        (forward-paragraph -1)
                    124:        (if (>= (point) initial)
                    125:           (fill-region-as-paragraph (point) end justify-flag)
                    126:         (goto-char end))))))
                    127: 
                    128: (defun justify-current-line ()
                    129:   "Add spaces to line point is in, so it ends at fill-column."
                    130:   (interactive)
                    131:   (save-excursion
                    132:    (save-restriction
                    133:     (let (ncols beg)
                    134:       (beginning-of-line)
                    135:       (skip-chars-forward " \t")
                    136:       (setq beg (point))
                    137:       (end-of-line)
                    138:       (narrow-to-region beg (point))
                    139:       (goto-char beg)
                    140:       (while (re-search-forward "   *" nil t)
                    141:        (delete-region
                    142:         (+ (match-beginning 0)
                    143:            (if (save-excursion
                    144:                 (skip-chars-backward " ])\"'")
                    145:                 (memq (preceding-char) '(?. ?? ?!)))
                    146:                2 1))
                    147:         (match-end 0)))
                    148:       (goto-char beg)
                    149:       (while (re-search-forward "[.?!][])""']*\n" nil t)
                    150:        (forward-char -1)
                    151:        (insert ? ))
                    152:       (goto-char (point-max))
                    153:       (setq ncols (- fill-column (current-column)))
                    154:       (if (scan-buffer (point-min) 1 ? )
                    155:          (while (> ncols 0)
                    156:            (let ((nmove (+ 3 (% (random) 3))))
                    157:              (while (> nmove 0)
                    158:                (or (search-backward " " nil t)
                    159:                    (progn
                    160:                     (goto-char (point-max))
                    161:                     (search-backward " ")))
                    162:                (skip-chars-backward " ")
                    163:                (setq nmove (1- nmove))))
                    164:            (insert " ")
                    165:            (skip-chars-backward " ")
                    166:            (setq ncols (1- ncols))))))))
                    167: 
                    168: (defun fill-individual-paragraphs (min max &optional justifyp mailp)
                    169:   "Fill each paragraph in region according to its individual fill prefix.
                    170: Calling from a program, pass range to fill as first two arguments.
                    171: Optional third and fourth arguments JUSTIFY-FLAG and MAIL-FLAG:
                    172: JUSTIFY-FLAG to justify paragraphs (prefix arg),
                    173: MAIL-FLAG for a mail message, i. e. don't fill header lines."
                    174:   (interactive "r\nP")
                    175:   (let (fill-prefix)
                    176:     (save-restriction
                    177:       (save-excursion
                    178:        (narrow-to-region min max)
                    179:        (goto-char (point-min))
                    180:        (while (progn
                    181:                 (skip-chars-forward " \t\n")
                    182:                 (not (eobp)))
                    183:          (setq fill-prefix (buffer-substring (point) (progn (beginning-of-line) (point))))
                    184:          (let ((fin (save-excursion (forward-paragraph) (point)))
                    185:                (start (point)))
                    186:            (if mailp
                    187:                (while (re-search-forward "[ \t]*[^ \t\n]*:" fin t)
                    188:                  (forward-line 1)))
                    189:            (cond ((= start (point))
                    190:                   (fill-region-as-paragraph (point) fin justifyp)
                    191:                   (goto-char fin)))))))))
                    192: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.