Emacs
There are a variety of settings that you can put into your .emacs configuration file that will make life easier when working with BRL-CAD sources. Additionally, installing cmake-mode.el into your ~/.emacs.d/ directory will help with editing of build system files.
; indent case statements ala BSD KNF / K&R style regardless of mode (c-set-offset 'case-label '+) (c-set-offset 'statement-case-open '+) (c-set-offset 'innamespace 0) (c-set-offset 'inline-open 0) ;; Support font-locking large files (set-variable 'font-lock-maximum-size 18024000) (global-font-lock-mode t) (transient-mark-mode t) (turn-on-font-lock) ; quell initialization warnings due to Local Variable block bug (setq inhibit-startup-message t) ; Stop at the end of the file, not just add lines (setq next-line-add-newlines nil) ; make sure goto labels can be placed on column 0 (setq c-label-minimum-indentation 0) ; display column numbers in addition to line numbers (set-variable 'column-number-mode t) ; to not read-only lock other people's cvs files (and not go into vc-mode) (set-variable 'vc-handle-cvs nil) ;;;;;;;;;;;;;;;; ; key bindings ; ;;;;;;;;;;;;;;;; ; so that M-TAB inserts a real tab while editing code (global-set-key "� " (quote self-insert-command " ")) ; bind "C-x g" to be M-x goto-line (global-set-key "\C-xg" 'goto-line) ;;;;;;;;;;;;; ; functions ; ;;;;;;;;;;;;; (defun dos-unix () "Convert DOS CR-LF to UNIX NL" (interactive) (save-excursion (goto-char (point-min)) (while (search-forward "\r" nil t) (replace-match "")))) (defun unix-dos () "Convert UNIX NL to DOS CR-LF" (interactive) (save-excursion (goto-char (point-min)) (while (search-forward "\n" nil t) (replace-match "\r\n")))) (defun ws () "Make sure there is a space after every comma" (interactive) (save-excursion (set-variable 'case-fold-search nil) (goto-char (point-min)) (while (re-search-forward "\\([,(]\\)\\([^[:space:]\n,]\\)" nil t) (replace-match "\\1 \\2")) (goto-char (point-min)) (while (re-search-forward "COMMA ', '" nil t) (replace-match "COMMA ','")) (goto-char (point-min)) (while (re-search-forward "([ ]+" nil t) (replace-match "(")) (goto-char (point-min)) (while (re-search-forward "[ ]+)" nil t) (replace-match ")")) (goto-char (point-min)) (while (re-search-forward ")[ ]+\\([a-zA-Z]\\)" nil t) (replace-match ") \\1")) (goto-char (point-min)) (while (re-search-forward "}[ ]*else[ ]*{" nil t) (replace-match "} else {")) (goto-char (point-min)) (while (search-forward "if[ ]*(" nil t) (replace-match "if (")) (goto-char (point-min)) (while (search-forward "for[ ]*(" nil t) (replace-match "for (")) (goto-char (point-min)) (while (search-forward "while[ ]*(" nil t) (replace-match "while (")) (goto-char (point-min)) (while (search-forward ")[ ]*{" nil t) (replace-match ") {")) (goto-char (point-min)) (while (re-search-forward ")[[:space:|:space:]]*{" nil t) (replace-match ") {")) (goto-char (point-min)) (while (re-search-forward " \\(};?\\)[ ]* [ ]+" nil t) (replace-match " \\1 ")) (goto-char (point-min)) (while (re-search-forward " [ ]* [ ]+ " nil t) (replace-match " ")) (c-set-offset 'case-label '+) (c-set-offset 'statement-case-open '+) (c-set-offset 'innamespace 0) (c-set-offset 'inline-open 0) (indent-region (point-min) (point-max) nil) )) (defun ws2 () "Removes embedded white space (particularly tabs)" (interactive) (save-excursion (goto-char (point-min)) (while (query-replace-regexp "\\([[:alnum:]_*(\[{@<>+#!\"'-]\\)[ ]* [ ]*\\([[:alnum:]_*(\[{@<>+#!\"'-][[:alnum:]_*(\[{@<>+#!\"'-]?\\)[ ]+" "\\1 \\2 ")) (goto-char (point-min)) (while (query-replace-regexp "\\([[:alnum:]_*(\[{@<>+#!\"'-]\\)[ ]* [ ]*\\([[:alnum:]_*(\[{@<>+#!\"'-]\\)" "\\1 \\2")) (goto-char (point-min)) (while (query-replace-regexp "\\([[:alnum:]_*(\[{@<>+#!\"'-]\\)[ ]+ +[ ]*\\([[:alnum:]_*(\[{@<>+#!\"'-]\\)" "\\1 \\2")) )) (defun ws3 () "collapses multiple empty lines and ensures two after every global block" (interactive) (save-excursion (goto-char (point-min)) (while (query-replace-regexp " \\(};?\\)[ ]* [ ]+" " \\1 ")) (goto-char (point-min)) (while (query-replace-regexp " [ ]* [ ]+ " " ")) )) (defun embrace () "fix else statements and braces to be K&R style" (interactive) (save-excursion (goto-char (point-min)) (while (query-replace-regexp "}[[:space:|:space:]]* [[:space:|:space:]]+else" "} else")) (goto-char (point-min)) (while (query-replace-regexp "[[:space:|:space:]]* [[:space:|:space:]]+{" " {")) (goto-char (point-min)) (while (query-replace-regexp "[[:space:|:space:]]*\\(/\\*.*\\*/\\)[[:space:|:space:]]*{ \\([[:space:|:space:]]+\\)" " { \\2\\1 \\2")) (goto-char (point-min)) (while (query-replace-regexp "[[:space:|:space:]]*\\(/\\*.*\\*/\\)[[:space:|:space:]]* \\([[:space:|:space:]]+\\){" " { \\2\\1")) (goto-char (point-min)) (while (query-replace-regexp "[[:space:|:space:]]*{[[:space:|:space:]]*\\(/\\*.*\\*/\\)[[:space:|:space:]]* \\([[:space:|:space:]]+\\)" " { \\2\\1 \\2")) )) ; custom bindings to support our style idiosyncrasies (global-set-key "\M-0" 'ws) (global-set-key "\M-9" 'ws2) (global-set-key "\M-8" 'embrace) (global-set-key "\M-7" 'ws3)
If you install the aforementioned cmake-mode, you’ll need these extra lines in your .emacs file in order to enable the mode:
(add-to-list 'load-path "~/.emacs.d") (require 'cmake-mode) (setq auto-mode-alist (append '(("CMakeLists\\.txt\\'" . cmake-mode) ("\\.cmake\\'" . cmake-mode)) auto-mode-alist))