diff options
Diffstat (limited to 'lisp/progmodes/cc-langs.el')
-rw-r--r-- | lisp/progmodes/cc-langs.el | 114 |
1 files changed, 92 insertions, 22 deletions
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el index 96fdf35948e..912e36446bb 100644 --- a/lisp/progmodes/cc-langs.el +++ b/lisp/progmodes/cc-langs.el @@ -2,10 +2,11 @@ ;; Copyright (C) 1985,87,92,93,94,95,96,97,98 Free Software Foundation, Inc. -;; Authors: 1992-1997 Barry A. Warsaw +;; Authors: 1998 Barry A. Warsaw and Martin Stjernholm +;; 1992-1997 Barry A. Warsaw ;; 1987 Dave Detlefs and Stewart Clamen ;; 1985 Richard M. Stallman -;; Maintainer: cc-mode-help@python.org +;; Maintainer: bug-cc-mode@gnu.org ;; Created: 22-Apr-1997 (split from cc-mode.el) ;; Version: See cc-mode.el ;; Keywords: c languages oop @@ -29,7 +30,8 @@ -(require 'cc-defs) +(eval-when-compile + (require 'cc-defs)) ;; Regular expressions and other values which must be parameterized on ;; a per-language basis. @@ -54,8 +56,10 @@ ;; keywords introducing class definitions. language specific (defconst c-C-class-key "\\(struct\\|union\\)") (defconst c-C++-class-key "\\(class\\|struct\\|union\\)") -(defconst c-C-extra-toplevel-key "\\(extern\\)[^_]") -(defconst c-C++-extra-toplevel-key "\\(extern\\|namespace\\)[^_]") +(defconst c-IDL-class-key "\\(class\\|struct\\|union\\|interface\\)") +(defconst c-C-extra-toplevel-key "\\(extern\\)") +(defconst c-C++-extra-toplevel-key "\\(extern\\|namespace\\)") +(defconst c-IDL-extra-toplevel-key "\\(module\\)") (defconst c-ObjC-class-key (concat @@ -70,10 +74,12 @@ "\\(" c-protection-key "\\s +\\)?" "\\(interface\\|class\\)\\s +" c-symbol-key ;name of the class - "\\(\\s *extends\\s *" c-symbol-key "\\)?" ;maybe followed by superclass + "\\(\\s *extends\\s *" c-symbol-key "\\)?" ;maybe followed by superclass ;;"\\(\\s *implements *[^{]+{\\)?" ;maybe the adopted protocols list )) +(defconst c-Pike-class-key "class") + (defvar c-class-key c-C-class-key) (make-variable-buffer-local 'c-class-key) @@ -87,12 +93,14 @@ (defconst c-C++-access-key (concat c-protection-key "[ \t]*:")) (defconst c-ObjC-access-key (concat "@" c-protection-key)) (defconst c-Java-access-key nil) +(defconst c-Pike-access-key nil) ;; keywords introducing conditional blocks (defconst c-C-conditional-key nil) (defconst c-C++-conditional-key nil) (defconst c-Java-conditional-key nil) +(defconst c-Pike-conditional-key nil) (let ((all-kws "for\\|if\\|do\\|else\\|while\\|switch") (exc-kws "\\|try\\|catch") @@ -101,7 +109,8 @@ (back "\\)\\b[^_]")) (setq c-C-conditional-key (concat front all-kws back) c-C++-conditional-key (concat front all-kws exc-kws back) - c-Java-conditional-key (concat front all-kws exc-kws thr-kws back))) + c-Java-conditional-key (concat front all-kws exc-kws thr-kws back) + c-Pike-conditional-key (concat front all-kws "\\|foreach" back))) (defvar c-conditional-key c-C-conditional-key) (make-variable-buffer-local 'c-conditional-key) @@ -166,6 +175,30 @@ (defconst c-Java-javadoc-paragraph-start "@\\(author\\|exception\\|param\\|return\\|see\\|version\\)") +;; Regexp that starts lambda constructs. +(defvar c-lambda-key nil) +(make-variable-buffer-local 'c-lambda-key) +(defconst c-Pike-lambda-key "\\<lambda\\>") + +;; Regexp that are followed by a statement block in expressions. +(defvar c-inexpr-block-key nil) +(make-variable-buffer-local 'c-inexpr-block-key) +(defconst c-Pike-inexpr-block-key "\\<\\(catch\\|gauge\\)\\>") + +;; Regexp that may be followed by an anonymous class in expressions. +(defvar c-inexpr-class-key nil) +(make-variable-buffer-local 'c-inexpr-class-key) +(defconst c-Java-inexpr-class-key "\\<new\\>") + +;; List of open- and close-chars that makes up a pike-style brace +;; list, ie for a `([ ])' list there should be a cons (?\[ . ?\]) in +;; this list. +(defvar c-special-brace-lists nil) +(make-variable-buffer-local 'c-special-brace-lists) +(defconst c-Pike-special-brace-lists '((?{ . ?}) + (?\[ . ?\]) + (?< . ?>))) + ;; internal state variables @@ -188,11 +221,6 @@ -(defun c-use-java-style () - "Institutes `java' indentation style. -For use with the variable `java-mode-hook'." - (c-set-style "java")) - (defun c-common-init () ;; Common initializations for all modes. ;; these variables should always be buffer local; they do not affect @@ -212,6 +240,7 @@ For use with the variable `java-mode-hook'." (make-local-variable 'outline-regexp) (make-local-variable 'outline-level) (make-local-variable 'adaptive-fill-regexp) + (make-local-variable 'adaptive-fill-mode) (make-local-variable 'imenu-generic-expression) ;set in the mode functions ;; X/Emacs 20 only (and (boundp 'comment-line-break-function) @@ -235,7 +264,8 @@ For use with the variable `java-mode-hook'." comment-start-skip "/\\*+ *\\|// *" comment-multi-line nil comment-line-break-function 'c-comment-line-break-function - adaptive-fill-regexp nil) + adaptive-fill-regexp nil + adaptive-fill-mode nil) ;; we have to do something special for c-offsets-alist so that the ;; buffer local value has its own alist structure. (setq c-offsets-alist (copy-alist c-offsets-alist)) @@ -249,7 +279,17 @@ For use with the variable `java-mode-hook'." (or (assq 'c-auto-hungry-string minor-mode-alist) (setq minor-mode-alist (cons '(c-auto-hungry-string c-auto-hungry-string) - minor-mode-alist)))) + minor-mode-alist))) + ;; now set the mode style based on c-default-style + (c-set-style (if (stringp c-default-style) + (if (c-major-mode-is 'java-mode) + "java" + c-default-style) + (or (cdr (assq major-mode c-default-style)) + (cdr (assq 'other c-default-style)) + "gnu"))) + ) + (defun c-postprocess-file-styles () "Function that post processes relevant file local variables. @@ -277,6 +317,9 @@ Note that the style variables are always made local to the buffer." (add-hook 'hack-local-variables-hook 'c-postprocess-file-styles) +(defvar c-mode-base-map () + "Keymap shared by all CC Mode related modes.") + ;; Common routines (defun c-make-inherited-keymap () (let ((map (make-sparse-keymap))) @@ -325,9 +368,6 @@ Note that the style variables are always made local to the buffer." (modify-syntax-entry ?\^m "> b" table)) -(defvar c-mode-base-map () - "Keymap shared by all CC Mode related modes.") - (if c-mode-base-map nil ;; TBD: should we even worry about naming this keymap. My vote: no, @@ -340,6 +380,8 @@ Note that the style variables are always made local to the buffer." (define-key c-mode-base-map ";" 'c-electric-semi&comma) (define-key c-mode-base-map "#" 'c-electric-pound) (define-key c-mode-base-map ":" 'c-electric-colon) + (define-key c-mode-base-map "(" 'c-electric-paren) + (define-key c-mode-base-map ")" 'c-electric-paren) ;; Separate M-BS from C-M-h. The former should remain ;; backward-kill-word. (define-key c-mode-base-map [(control meta h)] 'c-mark-function) @@ -396,26 +438,27 @@ Note that the style variables are always made local to the buffer." (defvar c-c++-menu nil) (defvar c-objc-menu nil) (defvar c-java-menu nil) +(defvar c-pike-menu nil) (defun c-mode-menu (modestr) (let ((m - '(["Comment Out Region" comment-region (mark t)] + '(["Comment Out Region" comment-region (c-region-is-active-p)] ["Uncomment Region" (comment-region (region-beginning) (region-end) '(4)) - (mark t)] + (c-region-is-active-p)] ["Fill Comment Paragraph" c-fill-paragraph t] "---" ["Indent Expression" c-indent-exp (memq (char-after) '(?\( ?\[ ?\{))] - ["Indent Line" c-indent-command t] + ["Indent Line or Region" c-indent-line-or-region t] ["Up Conditional" c-up-conditional t] ["Backward Conditional" c-backward-conditional t] ["Forward Conditional" c-forward-conditional t] ["Backward Statement" c-beginning-of-statement t] ["Forward Statement" c-end-of-statement t] "---" - ["Macro Expand Region" c-macro-expand (mark t)] - ["Backslashify" c-backslash-region (mark t)] + ["Macro Expand Region" c-macro-expand (c-region-is-active-p)] + ["Backslashify" c-backslash-region (c-region-is-active-p)] ))) (cons modestr m))) @@ -564,6 +607,33 @@ Note that the style variables are always made local to the buffer." (easy-menu-define c-idl-menu idl-mode-map "IDL Mode Commands" (c-mode-menu "IDL")) + +;; Support for Pike + +(defvar pike-mode-abbrev-table nil + "Abbreviation table used in pike-mode buffers.") +(define-abbrev-table 'pike-mode-abbrev-table ()) + +(defvar pike-mode-map () + "Keymap used in pike-mode buffers.") +(if pike-mode-map + nil + (setq pike-mode-map (c-make-inherited-keymap)) + ;; additional bindings + (define-key pike-mode-map "\C-c\C-e" 'c-macro-expand)) + +;;;###autoload +(defvar pike-mode-syntax-table nil + "Syntax table used in pike-mode buffers.") +(if pike-mode-syntax-table + () + (setq pike-mode-syntax-table (make-syntax-table)) + (c-populate-syntax-table pike-mode-syntax-table) + (modify-syntax-entry ?@ "." pike-mode-syntax-table)) + +(easy-menu-define c-pike-menu pike-mode-map "Pike Mode Commands" + (c-mode-menu "Pike")) + (provide 'cc-langs) |