To switch a buffer to C++ mode, just use
M-x c++-mode. The regular emacs mode detection applies, and most common file extensions (eg
‘cxx’, etc) will be opened in c++ mode.
By default files ending in .h are treated as c files rather than c++ files. To change this add the following to your .emacs:
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
Unfortunately many standard c++ header files have no file extension, and so will not typically be identified by emacs as c++ files. The following code is intended to solve this problem.
(require 'cl) (defun file-in-directory-list-p (file dirlist) "Returns true if the file specified is contained within one of the directories in the list. The directories must also exist." (let ((dirs (mapcar 'expand-file-name dirlist)) (filedir (expand-file-name (file-name-directory file)))) (and (file-directory-p filedir) (member-if (lambda (x) ; Check directory prefix matches (string-match (substring x 0 (min(length filedir) (length x))) filedir)) dirs)))) (defun buffer-standard-include-p () "Returns true if the current buffer is contained within one of the directories in the INCLUDE environment variable." (and (getenv "INCLUDE") (file-in-directory-list-p buffer-file-name (split-string (getenv "INCLUDE") path-separator)))) (add-to-list 'magic-fallback-mode-alist '(buffer-standard-include-p . c++-mode))
You can customise how c++ mode looks and feels by adding mode hooks to c++-mode-hook (or c-mode-hook if you want to customise behaviour for all c-mode based modes in one go). For example:
; style I want to use in c++ mode (c-add-style "my-style" '("stroustrup" (indent-tabs-mode . nil) ; use spaces rather than tabs (c-basic-offset . 4) ; indent by four spaces (c-offsets-alist . ((inline-open . 0) ; custom indentation rules (brace-list-open . 0) (statement-case-open . +))))) (defun my-c++-mode-hook () (c-set-style "my-style") ; use my-style defined above (auto-fill-mode) (c-toggle-auto-hungry-state 1)) (add-hook 'c++-mode-hook 'my-c++-mode-hook)
You can customise C++ mode key bindings using entries like:
(define-key c++-mode-map "\C-ct" 'some-function-i-want-to-call)
See the categories below for more information on the multitude things that emacs and C++ mode are capable of.