home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / gnu / emacs-18.59-bin.lha / lib / emacs / 18.59 / lisp / c-mode.el < prev    next >
Lisp/Scheme  |  1992-09-23  |  24KB  |  663 lines

  1. ;; C code editing commands for Emacs
  2. ;; Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
  3.  
  4. ;; This file is part of GNU Emacs.
  5.  
  6. ;; GNU Emacs is free software; you can redistribute it and/or modify
  7. ;; it under the terms of the GNU General Public License as published by
  8. ;; the Free Software Foundation; either version 1, or (at your option)
  9. ;; any later version.
  10.  
  11. ;; GNU Emacs is distributed in the hope that it will be useful,
  12. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;; GNU General Public License for more details.
  15.  
  16. ;; You should have received a copy of the GNU General Public License
  17. ;; along with GNU Emacs; see the file COPYING.  If not, write to
  18. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.  
  21. (defvar c-mode-abbrev-table nil
  22.   "Abbrev table in use in C-mode buffers.")
  23. (define-abbrev-table 'c-mode-abbrev-table ())
  24.  
  25. (defvar c-mode-map ()
  26.   "Keymap used in C mode.")
  27. (if c-mode-map
  28.     ()
  29.   (setq c-mode-map (make-sparse-keymap))
  30.   (define-key c-mode-map "{" 'electric-c-brace)
  31.   (define-key c-mode-map "}" 'electric-c-brace)
  32.   (define-key c-mode-map ";" 'electric-c-semi)
  33.   (define-key c-mode-map ":" 'electric-c-terminator)
  34.   (define-key c-mode-map "\e\C-h" 'mark-c-function)
  35.   (define-key c-mode-map "\e\C-q" 'indent-c-exp)
  36.   (define-key c-mode-map "\177" 'backward-delete-char-untabify)
  37.   (define-key c-mode-map "\t" 'c-indent-command))
  38.  
  39. (autoload 'c-macro-expand "cmacexp"
  40.   "Display the result of expanding all C macros occurring in the region.
  41. The expansion is entirely correct because it uses the C preprocessor."
  42.   t)
  43.  
  44. (defvar c-mode-syntax-table nil
  45.   "Syntax table in use in C-mode buffers.")
  46.  
  47. (if c-mode-syntax-table
  48.     ()
  49.   (setq c-mode-syntax-table (make-syntax-table))
  50.   (modify-syntax-entry ?\\ "\\" c-mode-syntax-table)
  51.   (modify-syntax-entry ?/ ". 14" c-mode-syntax-table)
  52.   (modify-syntax-entry ?* ". 23" c-mode-syntax-table)
  53.   (modify-syntax-entry ?+ "." c-mode-syntax-table)
  54.   (modify-syntax-entry ?- "." c-mode-syntax-table)
  55.   (modify-syntax-entry ?= "." c-mode-syntax-table)
  56.   (modify-syntax-entry ?% "." c-mode-syntax-table)
  57.   (modify-syntax-entry ?< "." c-mode-syntax-table)
  58.   (modify-syntax-entry ?> "." c-mode-syntax-table)
  59.   (modify-syntax-entry ?& "." c-mode-syntax-table)
  60.   (modify-syntax-entry ?| "." c-mode-syntax-table)
  61.   (modify-syntax-entry ?\' "\"" c-mode-syntax-table))
  62.  
  63. (defconst c-indent-level 2
  64.   "*Indentation of C statements with respect to containing block.")
  65. (defconst c-brace-imaginary-offset 0
  66.   "*Imagined indentation of a C open brace that actually follows a statement.")
  67. (defconst c-brace-offset 0
  68.   "*Extra indentation for braces, compared with other text in same context.")
  69. (defconst c-argdecl-indent 5
  70.   "*Indentation level of declarations of C function arguments.")
  71. (defconst c-label-offset -2
  72.   "*Offset of C label lines and case statements relative to usual indentation.")
  73. (defconst c-continued-statement-offset 2
  74.   "*Extra indent for lines not starting new statements.")
  75. (defconst c-continued-brace-offset 0
  76.   "*Extra indent for substatements that start with open-braces.
  77. This is in addition to c-continued-statement-offset.")
  78.  
  79. (defconst c-auto-newline nil
  80.   "*Non-nil means automatically newline before and after braces,
  81. and after colons and semicolons, inserted in C code.")
  82.  
  83. (defconst c-tab-always-indent t
  84.   "*Non-nil means TAB in C mode should always reindent the current line,
  85. regardless of where in the line point is when the TAB command is used.")
  86.  
  87. (defun c-mode ()
  88.   "Major mode for editing C code.
  89. Expression and list commands understand all C brackets.
  90. Tab indents for C code.
  91. Comments are delimited with /* ... */.
  92. Paragraphs are separated by blank lines only.
  93. Delete converts tabs to spaces as it moves back.
  94. \\{c-mode-map}
  95. Variables controlling indentation style:
  96.  c-tab-always-indent
  97.     Non-nil means TAB in C mode should always reindent the current line,
  98.     regardless of where in the line point is when the TAB command is used.
  99.  c-auto-newline
  100.     Non-nil means automatically newline before and after braces,
  101.     and after colons and semicolons, inserted in C code.
  102.  c-indent-level
  103.     Indentation of C statements within surrounding block.
  104.     The surrounding block's indentation is the indentation
  105.     of the line on which the open-brace appears.
  106.  c-continued-statement-offset
  107.     Extra indentation given to a substatement, such as the
  108.     then-clause of an if or body of a while.
  109.  c-continued-brace-offset
  110.     Extra indentation given to a brace that starts a substatement.
  111.     This is in addition to c-continued-statement-offset.
  112.  c-brace-offset
  113.     Extra indentation for line if it starts with an open brace.
  114.  c-brace-imaginary-offset
  115.     An open brace following other text is treated as if it were
  116.     this far to the right of the start of its line.
  117.  c-argdecl-indent
  118.     Indentation level of declarations of C function arguments.
  119.  c-label-offset
  120.     Extra indentation for line that is a label, or case or default.
  121.  
  122. Settings for K&R and BSD indentation styles are
  123.   c-indent-level                5    8
  124.   c-continued-statement-offset  5    8
  125.   c-brace-offset               -5   -8
  126.   c-argdecl-indent              0    8
  127.   c-label-offset               -5   -8
  128.  
  129. Turning on C mode calls the value of the variable c-mode-hook with no args,
  130. if that value is non-nil."
  131.   (interactive)
  132.   (kill-all-local-variables)
  133.   (use-local-map c-mode-map)
  134.   (setq major-mode 'c-mode)
  135.   (setq mode-name "C")
  136.   (setq local-abbrev-table c-mode-abbrev-table)
  137.   (set-syntax-table c-mode-syntax-table)
  138.   (make-local-variable 'paragraph-start)
  139.   (setq paragraph-start (concat "^$\\|" page-delimiter))
  140.   (make-local-variable 'paragraph-separate)
  141.   (setq paragraph-separate paragraph-start)
  142.   (make-local-variable 'paragraph-ignore-fill-prefix)
  143.   (setq paragraph-ignore-fill-prefix t)
  144.   (make-local-variable 'indent-line-function)
  145.   (setq indent-line-function 'c-indent-line)
  146.   (make-local-variable 'require-final-newline)
  147.   (setq require-final-newline t)
  148.   (make-local-variable 'comment-start)
  149.   (setq comment-start "/* ")
  150.   (make-local-variable 'comment-end)
  151.   (setq comment-end " */")
  152.   (make-local-variable 'comment-column)
  153.   (setq comment-column 32)
  154.   (make-local-variable 'comment-start-skip)
  155.   (setq comment-start-skip "/\\*+ *")
  156.   (make-local-variable 'comment-indent-hook)
  157.   (setq comment-indent-hook 'c-comment-indent)
  158.   (make-local-variable 'parse-sexp-ignore-comments)
  159.   (setq parse-sexp-ignore-comments t)
  160.   (run-hooks 'c-mode-hook))
  161.  
  162. ;; This is used by indent-for-comment
  163. ;; to decide how much to indent a comment in C code
  164. ;; based on its context.
  165. (defun c-comment-indent ()
  166.   (if (looking-at "^/\\*")
  167.       0                ;Existing comment at bol stays there.
  168.     (save-excursion
  169.       (skip-chars-backward " \t")
  170.       (max (1+ (current-column))    ;Else indent at comment column
  171.        comment-column))))    ; except leave at least one space.
  172.  
  173. (defun electric-c-brace (arg)
  174.   "Insert character and correct line's indentation."
  175.   (interactive "P")
  176.   (let (insertpos)
  177.     (if (and (not arg)
  178.          (eolp)
  179.          (or (save-excursion
  180.            (skip-chars-backward " \t")
  181.            (bolp))
  182.          (if c-auto-newline (progn (c-indent-line) (newline) t) nil)))
  183.     (progn
  184.       (insert last-command-char)
  185.       (c-indent-line)
  186.       (if c-auto-newline
  187.           (progn
  188.         (newline)
  189.         ;; (newline) may have done auto-fill
  190.         (setq insertpos (- (point) 2))
  191.         (c-indent-line)))
  192.       (save-excursion
  193.         (if insertpos (goto-char (1+ insertpos)))
  194.         (delete-char -1))))
  195.     (if insertpos
  196.     (save-excursion
  197.       (goto-char insertpos)
  198.       (self-insert-command (prefix-numeric-value arg)))
  199.       (self-insert-command (prefix-numeric-value arg)))))
  200.  
  201. (defun electric-c-semi (arg)
  202.   "Insert character and correct line's indentation."
  203.   (interactive "P")
  204.   (if c-auto-newline
  205.       (electric-c-terminator arg)
  206.     (self-insert-command (prefix-numeric-value arg))))
  207.  
  208. (defun electric-c-terminator (arg)
  209.   "Insert character and correct line's indentation."
  210.   (interactive "P")
  211.   (let (insertpos (end (point)))
  212.     (if (and (not arg) (eolp)
  213.          (not (save-excursion
  214.             (beginning-of-line)
  215.             (skip-chars-forward " \t")
  216.             (or (= (following-char) ?#)
  217.