;;; -*- Mode: Emacs-Lisp -*- ;*********************************************************** ;* Emacs Lisp code to set up Appelles C/C++ coding ;* conventions. ;*********************************************************** ;;;; C++ mode specializations (setq c-indent-level 4) (setq c-continued-statement-offset 4) (setq c-continued-brace-offset -2) (setq c-brace-offset -2) (setq c-argdecl-indent 4) (setq c-auto-newline nil) (setq c-label-offset -2) (setq c++-member-init-indent 0) (defconst appel-c-style '((c-basic-offset . 4) (c-offsets-alist . ((statement-block-intro . +) (knr-argdecl-intro . +) (block-open . 0) (statement-cont . +) (substatement-open . 0) (label . *) (member-init-intro . 0) (case-label . *) (statement-case-open . *) (statement-case-intro . *) (access-label . /) (inline-open . 0) ))) "Appelles C++ Programming Style") ;; Customizations for all of c-mode, c++-mode, and objc-mode (defun appel-c-mode-common-hook () ;; add my personal style and set it for the current buffer (c-add-style "Appelles" appel-c-style t) ;; keybindings for C, C++, and Objective-C. We can put these in ;; c-mode-map because c++-mode-map and objc-mode-map inherit it (define-key c-mode-map "\C-m" 'newline-and-indent) (define-key c++-mode-map "\C-m" 'newline-and-indent)) (add-hook 'c-mode-common-hook 'appel-c-mode-common-hook) (defun set-abbrev-mode-and-fill-mode-on () (setq abbrev-mode t) (auto-fill-mode 1)) (setq c++-mode-hook '(set-abbrev-mode-and-fill-mode-on)) ;; To automatically insert header into new C++ files. (defvar ifdef-file-name-changer-function 'upcase "The function to be applied to a file name prefix when generating a header file ifdef guard. For instance, when the value is 'upcase then a header file called 'ColorADT.h' will contain '#ifndef _COLORADT_H', while if the value is 'identity, we get '#ifndef _ColorADT_h'.") (defun c++-header-init () "Stuffs a standard header into a newly created C++ code or header file. This includes the file name a reminder to put in a general comment, a string that SourceSafe will expand to include version info a copyright notice, If the file is a '.h' file, then #ifndef/#define guards are put around the code." ;; Cannot use major mode, because it hasn't been set up yet. (interactive) (if (>= (length (file-name-nondirectory (buffer-file-name))) 3) (let* ((file-name (buffer-file-name)) (file-name-nondir (file-name-nondirectory file-name))) (if (>= (length file-name) 4) (let ((header-guard-string (funcall ifdef-file-name-changer-function (concat "_" (substring file-name-nondir 0 -2) "_h")))) (if (or (string-equal (substring file-name -3) ".cc") (string-equal (substring file-name -3) ".hh") (string-equal (substring file-name -2) ".h") (string-equal (substring file-name -4) ".cpp")) (progn (insert "/*******************************************************************************\n") (insert " *\n") (insert " * Copyright (c) 1998 Microsoft Corporation\n") (insert " *\n") (insert " * File: " file-name-nondir "\n") (insert " *\n") (insert " * Abstract:\n") (insert " *\n") (insert " *\n") (insert " *\n") (insert " *******************************************************************************/") (insert "\n") (insert "\n") (insert "\n") (if (string-equal (substring file-name -2) ".h") (progn (insert "#ifndef " header-guard-string "\n#define " header-guard-string "\n\n" "\n\n#endif /* " header-guard-string " */\n") ;; Ansii C doesn't like '-' in a cpp symbol (goto-char (point-min)) (replace-string "-" "_") (goto-char (point-max)) (previous-line 3))) )))))) ;; Returning nil means everything is ok. nil) (setq find-file-not-found-hooks (append '(c++-header-init) find-file-not-found-hooks)) ;; Change tabs to spaces whenever a file is written out. (setq write-file-hooks (append '((lambda () (untabify (point-min) (point-max)))) write-file-hooks)) ;; Recognize .cpp, .c, and .h files as C++ files (setq auto-mode-alist (append '(("\\.cpp$" . c++-mode) ("\\.c$" . c++-mode) ("\\.h$" . c++-mode)) auto-mode-alist))