Annotation of 43BSDReno/contrib/emacs-18.55/lisp/c-fill.el, revision 1.1

1.1     ! root        1: ;;; C comment mode - An auto-filled comment mode for gnu c-mode.
        !             2: ;;;
        !             3: ;;; Author:    Robert Mecklenburg
        !             4: ;;;            Computer Science Dept.
        !             5: ;;;            University of Utah
        !             6: ;;; From: [email protected] (Robert Mecklenburg)
        !             7: ;;;   Also [email protected]
        !             8: ;;; (c) 1986, University of Utah
        !             9: ;;;
        !            10: ;;; Everyone is granted permission to copy, modify and redistribute
        !            11: ;;; this file, provided the people they give it to can.
        !            12: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !            13: ;;;
        !            14: ;;; I have written a "global comment" minor-mode which performs auto-fill,
        !            15: ;;; fill-paragraph, and auto-indentation functions.  This function only
        !            16: ;;; works for comments which occupy an entire line (not comments to the
        !            17: ;;; right of code).  The mode has several options set through variables.
        !            18: ;;; If the variable c-comment-starting-blank is non-nil multi-line
        !            19: ;;; comments come out like this:
        !            20: ;;; 
        !            21: ;;;    /*
        !            22: ;;;     * Your favorite 
        !            23: ;;;     * multi-line comment.
        !            24: ;;;     */
        !            25: ;;; 
        !            26: ;;; otherwise they look like this:
        !            27: ;;; 
        !            28: ;;;    /* Your Favorite
        !            29: ;;;     * multi-line comment.
        !            30: ;;;     */
        !            31: ;;; 
        !            32: ;;; If the variable c-comment-hanging-indent is non-nil K&R style comments
        !            33: ;;; are indented automatically like this:
        !            34: ;;; 
        !            35: ;;;    /* my_func - For multi-line comments with hanging indent
        !            36: ;;;     *           the text is lined up after the dash.
        !            37: ;;;     */
        !            38: ;;; 
        !            39: ;;; otherwise the text "the text" (!) is lined up under my_func.  If a
        !            40: ;;; comment fits (as typed) on a single line it remains a single line
        !            41: ;;; comment even if c-comment-starting-blank is set.  If
        !            42: ;;; c-comment-indenting is non-nil hitting carriage return resets the
        !            43: ;;; indentation for the next line to the current line's indentation
        !            44: ;;; (within the comment) like this:
        !            45: ;;; 
        !            46: ;;;    /* Typing along merrily....
        !            47: ;;;     *     Now I indent with spaces, when I hit return
        !            48: ;;;     *     the indentation is automatically set to 
        !            49: ;;;     *     ^ here.
        !            50: ;;;     */
        !            51: ;;; 
        !            52: ;;; Due to my lack of understanding of keymaps this permanently resets M-q
        !            53: ;;; to my own fill function.  I would like to have the comment mode
        !            54: ;;; bindings only in comment mode but I can't seem to get that to work.
        !            55: ;;; If some gnu guru can clue me in, I'd appreciate it.
        !            56: ;;;
        !            57: (defvar c-comment-starting-blank t
        !            58:   "*Controls whether global comments have an initial blank line.")
        !            59: (defvar c-comment-indenting t
        !            60:   "*If set global comments are indented to the level of the previous line.")
        !            61: (defvar c-comment-hanging-indent t
        !            62:   "*If true, comments will be automatically indented to the dash.")
        !            63: (defvar c-hang-already-done t
        !            64:   "If true we have performed the haning indent already for this comment.")
        !            65: 
        !            66: 
        !            67: ;;;
        !            68: ;;; c-comment-map - This is a sparse keymap for comment mode which
        !            69: ;;;                gets inserted when c-comment is called.
        !            70: ;;; 
        !            71: (defvar c-comment-mode-map ()
        !            72:   "Keymap used in C comment mode.")
        !            73: (if c-comment-mode-map
        !            74:     ()
        !            75:   (setq c-comment-mode-map (copy-keymap c-mode-map))
        !            76:   (define-key c-comment-mode-map "\e\r" 'newline)
        !            77:   (define-key c-comment-mode-map "\eq" 'set-fill-and-fill)
        !            78:   (define-key c-comment-mode-map "\r" 'set-fill-and-return))
        !            79:  
        !            80: ;;;
        !            81: ;;; c-comment - This is a filled comment mode which can format
        !            82: ;;;            indented text, do hanging indents, and symetric
        !            83: ;;;            placement of comment delimiters.
        !            84: ;;; 
        !            85: (defun c-comment ()
        !            86:   "Edit a C comment with filling and indentation.
        !            87: This performs hanging indentation, symmetric placement of delimiters,
        !            88:  and Indented-Text mode style indentation.  Type 'M-x apropos
        !            89: c-comment' for information on options."
        !            90:   (interactive)
        !            91:   (let
        !            92:       ;; Save old state.
        !            93:       ((auto-fill-hook (if c-comment-indenting
        !            94:                           'do-indented-auto-fill 'do-auto-fill))
        !            95: ;       (comment-start nil)
        !            96:        (comment-multi-line t)
        !            97:        (comment-start-skip "/*\\*+[    ]*")
        !            98:        (paragraph-start-ref paragraph-start)
        !            99:        fill-prefix paragraph-start paragraph-separate opoint)
        !           100: 
        !           101:     ;; Determine if we are inside a comment.
        !           102:     (setq in-comment
        !           103:          (save-excursion
        !           104:            (and (re-search-backward "/\\*\\|\\*/" 0 t)
        !           105:                 (string= "/*" (buffer-substring (point) (+ (point) 2))))))
        !           106: 
        !           107:     ;; Indent the comment and set the fill prefix to comment continuation
        !           108:     ;; string.  If we are already in a comment get the indentation on
        !           109:     ;; the current line.
        !           110:     (setq c-hang-already-done nil)
        !           111: 
        !           112:     ;; Set the beginning of the comment and insert the blank line if needed.
        !           113:     (use-local-map c-comment-mode-map)
        !           114:     (if (not in-comment)
        !           115:        (progn (c-indent-line)
        !           116:               (insert "/* ")
        !           117:               (setq fill-prefix (get-current-fill (point)))
        !           118:               (recursive-edit)
        !           119: 
        !           120:               ;; If the comment fits on one line, place the close
        !           121:               ;; comment at the end of the line.  Otherwise, newline.
        !           122:               (setq opoint (point))
        !           123:               (if (and (save-excursion (beginning-of-line)
        !           124:                                        (search-forward "/*" opoint t))
        !           125:                        (<= (+ (current-column) 3) 79))
        !           126:                   (insert " */")
        !           127:                 (insert "\n*/"))
        !           128: 
        !           129:               (c-indent-line))
        !           130:       (progn (setq fill-prefix (get-current-fill (point)))
        !           131:             (recursive-edit)
        !           132:             (search-forward "*/" (buffer-size) t)
        !           133:             (forward-line 1)))
        !           134: 
        !           135:     ;; If starting blank enabled, insert a newline, etc., but only if
        !           136:     ;; this comment requires multiple lines.
        !           137:     (if c-comment-starting-blank
        !           138:        (save-excursion
        !           139:          (setq opoint (point))
        !           140:          (forward-line -1)
        !           141:          (if (or (null (search-forward "/*" opoint t))
        !           142:                  (null (search-forward "*/" opoint t)))
        !           143:              (progn
        !           144:                (search-backward "/*")
        !           145:                (re-search-forward comment-start-skip opoint t)
        !           146:                (setq fill-prefix (get-current-fill (point)))
        !           147:                (if (not (looking-at "\n"))
        !           148:                    (insert ?\n fill-prefix))))))
        !           149: ;                  (indent-new-comment-line))))))
        !           150: 
        !           151:     ;; Move cursor to indentation.
        !           152:     (c-indent-line)
        !           153:     (use-local-map c-mode-map)
        !           154:     )
        !           155:   )
        !           156: 
        !           157: 
        !           158: ;;;
        !           159: ;;; set-fill-and-fill - Get the current fill for this line and fill
        !           160: ;;;                    the paragraph.
        !           161: ;;; 
        !           162: (defun set-fill-and-fill (arg)
        !           163:   "Get the fill-prefix and fill the current paragraph."
        !           164: 
        !           165:   (interactive "P")
        !           166:   (setq fill-prefix (get-current-fill (point)))
        !           167:   (fill-paragraph arg))
        !           168: 
        !           169: ;;;
        !           170: ;;; set-fill-and-return - Set the current fill prefix and
        !           171: ;;;                      indent-new-comment-line.
        !           172: ;;; 
        !           173: (defun set-fill-and-return ()
        !           174:   "Set the current fill prefix and move to the next line."
        !           175: 
        !           176:   (interactive)
        !           177:   (if c-comment-indenting
        !           178:       (setq fill-prefix (get-current-fill (point))))
        !           179:   (insert ?\n fill-prefix))
        !           180: 
        !           181: ;;;
        !           182: ;;; do-indented-auto-fill - Perform the auto-fill function, but get
        !           183: ;;;                        the fill-prefix first.
        !           184: ;;; 
        !           185: (defun do-indented-auto-fill ()
        !           186:   "Perform auto-fill, but get fill-prefix first."
        !           187: 
        !           188:   (let ((opoint (point)))
        !           189:     (save-excursion
        !           190:       (move-to-column (1+ fill-column))
        !           191:       (skip-chars-backward "^ \t\n")
        !           192:       (if (bolp)
        !           193:          (re-search-forward "[ \t]" opoint t))
        !           194:       ;; If there is a space on the line before fill-point,
        !           195:       ;; and nonspaces precede it, break the line there.
        !           196:       (if (save-excursion
        !           197:            (skip-chars-backward " \t")
        !           198:            (not (bolp)))
        !           199: 
        !           200:          ;; If we are wrapping to a new line, figure out the indentation on
        !           201:          ;; the current line first.
        !           202:          (progn
        !           203:            (setq fill-prefix (get-current-fill opoint))
        !           204:            (insert ?\n fill-prefix)))))
        !           205: ;          (indent-new-comment-line)))))
        !           206:   )
        !           207: 
        !           208: 
        !           209: ;;;
        !           210: ;;; get-current-fill - Get the fill-prefix for the current line.  This
        !           211: ;;;                   assumes that the valid fill prefix is between
        !           212: ;;;                   (beginning-of-line) and (point).
        !           213: ;;; 
        !           214: (defun get-current-fill (pnt)
        !           215:   "Get the current fill prefix.
        !           216: A valid fill prefix must be between the beginning of the line and point."
        !           217: 
        !           218:   (let ((opoint pnt) fill last-char)
        !           219:     (save-excursion
        !           220:       (beginning-of-line)
        !           221:       (setq fill
        !           222:            (buffer-substring (point)
        !           223:                              (progn
        !           224:                                (re-search-forward comment-start-skip opoint t)
        !           225:                                (point))))
        !           226: 
        !           227:       ;; Be sure there is trailing white space.
        !           228:       (setq last-char (substring fill (1- (length fill)) (length fill)))
        !           229:       (if (and (not (string= " " last-char))
        !           230:               (not (string= "  " last-char)))
        !           231:          (setq fill (concat fill " ")))
        !           232: 
        !           233:       (setq fill (replace-letter fill "/" " "))
        !           234: 
        !           235:       ;; Get the hanging indentation if we haven't already.
        !           236:       (if (and c-comment-hanging-indent (not c-hang-already-done))
        !           237:          (let ((curr (point))
        !           238:                (opnt (progn (end-of-line) (point))))
        !           239:            (beginning-of-line)
        !           240:            (if (search-forward " - " opnt t)
        !           241:                (progn
        !           242:                  (setq fill (concat fill (make-string (- (point) curr) 32)))
        !           243:                  (setq c-hang-already-done t)))))
        !           244: 
        !           245:       ;; Set the paragraph delimiters.
        !           246:       (setq paragraph-start (concat paragraph-start-ref
        !           247:                                    "\\|^"
        !           248:                                    (regexp-quote
        !           249:                                     (substring fill
        !           250:                                                0 (1- (length fill))))
        !           251:                                    "$"))
        !           252:       (setq paragraph-separate paragraph-start))
        !           253:     fill)
        !           254:   )
        !           255:   
        !           256: 
        !           257: ;;;
        !           258: ;;; replace-letter - Given a string, an old letter and a new letter,
        !           259: ;;;                 perform the substitution.
        !           260: ;;; 
        !           261: (defun replace-letter (str old-letter new-letter)
        !           262:   (let (new-str c
        !           263:        (sp 0)
        !           264:        (size (length str)))
        !           265:     (while (< sp size)
        !           266:       (setq c (substring str sp (1+ sp)))
        !           267:       (setq new-str (concat new-str (if (string= c old-letter) new-letter c)))
        !           268:       (setq sp (1+ sp)))
        !           269:     new-str))

unix.superglobalmegacorp.com

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