Available from http://www.santafe.edu/~nelson/tools/
;; This is a way to hook tempo into cc-mode
(defvar c-tempo-tags nil
"Tempo tags for C mode")
(defvar c++-tempo-tags nil
"Tempo tags for C++ mode")
;;; C-Mode Templates and C++-Mode Templates (uses C-Mode Templates also)
(require 'tempo)
(add-hook 'c-mode-hook '(lambda ()
(tempo-use-tag-list 'c-tempo-tags)
))
(add-hook 'c++-mode-hook '(lambda ()
(tempo-use-tag-list 'c-tempo-tags)
(tempo-use-tag-list 'c++-tempo-tags)
))
;;; Preprocessor Templates (appended to c-tempo-tags)
(tempo-define-template "c-include"
'("#include <" r ".h>" > n
)
"#include"
"Insert a #include <> statement"
'c-tempo-tags)
(tempo-define-template "c-ifdef"
'("#ifdef " (p "ifdef-clause: " clause) > n> p n
"#else /* !(" (s clause) ") */" n> p n
"#endif /* " (s clause)" */" n>
)
"#ifdef"
"Insert a #ifdef #else #endif statement"
'c-tempo-tags)
(tempo-define-template "c-ifndef"
'("#ifndef " (p "ifndef-clause: " clause) > n
"#define " (s clause) n> p n
"#endif /* " (s clause)" */" n>
)
"#ifndef"
"Insert a #ifndef #define #endif statement"
'c-tempo-tags)
;;; C-Mode Templates
(tempo-define-template "c-if"
'(> "if(" (p "if-clause: " clause) ")" n>
"{" > n> r n
"} /* end of if(" (s clause) ") */" > n>
)
"if"
"Insert a C if statement"
'c-tempo-tags)
(tempo-define-template "c-else"
'(> "else" n>
"{" > n> r n
"} /* end of else */" > n>
)
"else"
"Insert a C else statement"
'c-tempo-tags)
(tempo-define-template "c-if-else"
'(> "if(" (p "if-clause: " clause) ")" n>
"{" > n> r n
"} /* end of if(" (s clause) ") */" > n>
> "else" n>
"{" > n> r n
"} /* end of if(" (s clause) ")else */" > n>
)
"ifelse"
"Insert a C if else statement"
'c-tempo-tags)
(tempo-define-template "c-while"
'(> "while(" (p "while-clause: " clause) ")" > n>
"{" > n> r n
"} /* end of while(" (s clause) ") */" > n>
)
"while"
"Insert a C while statement"
'c-tempo-tags)
(tempo-define-template "c-for"
'(> "for(" (p "for-clause: " clause) ")" > n>
"{" > n> r n
"} /* end of for(" (s clause) ") */" > n>
)
"for"
"Insert a C for statement"
'c-tempo-tags)
(tempo-define-template "c-for-i"
'(> "for(" (p "variable: " var) " = 0; " (s var)
" < "(p "upper bound: " ub)"; " (s var) "++)" > n>
"{" > n> r n
"} /* end of for(" (s var) " = 0; "
(s var) " < " (s ub) "; " (s var) "++) */" > n>
)
"fori"
"Insert a C for loop: for(x = 0; x < ..; x++)"
'c-tempo-tags)
(tempo-define-template "c-for"
'(> "for(" (p "for-clause: " clause) ")" > n>
"{" > n> r n
"} /* end of for(" (s clause) ") */" > n>
)
"for"
"Insert a C for statement"
'c-tempo-tags)
(tempo-define-template "c-main"
'(> "main(int argc, char *argv[])" > n>
"{" > n> r n
"} /* end of main() */" > n>
)
"main"
"Insert a C main statement"
'c-tempo-tags)
(tempo-define-template "c-if-malloc"
'(> "if((" (p "variable: " var) " = ("
(p "type: " type) " *) malloc(sizeof(" (s type)
"))) == (" (s type) " *) NULL)" n>
"{" > n> r n
"} /* end of if((" (s var) " = (" (s type)
" *) malloc...) == NULL) */" > n>
)
"ifmalloc"
"Insert a C if(malloc...) statement"
'c-tempo-tags)
(tempo-define-template "c-switch"
'(> "switch(" (p "switch-condition: " clause) ")" > n>
"{" > n
"case " (p "first value: ") ":" > n> p n
"break;" > n> p n
"default:" > n> p n
"break;" > n
"} /* end of switch(" (s clause) ") */" > n>
)
"switch"
"Insert a C switch statement"
'c-tempo-tags)
(tempo-define-template "c-case"
'(n "case " (p "value: ") ":" > n> p n
"break;" > n> p
)
"case"
"Insert a C case statement"
'c-tempo-tags)
;;;C++-Mode Templates
(tempo-define-template "c++-class"
'("class " (p "classname: " class) p n "{" n "public:" n>
(s class) "();"
(indent-for-comment) "the default constructor" n>
(s class)
"(const " (s class) "&rhs);"
(indent-for-comment) "the copy constructor" n>
(s class)
"& operator=(const " (s class) "&rhs);"
(indent-for-comment) "the assignment operator" n>
n> "// the default address-of operators" n>
"// "(s class)
"* operator&() { return this; };" n>
"// const "(s class)
"* operator&() const { return this; };" n
n > "~" (s class) "();"
(indent-for-comment) "the destructor" n n>
p n
"protected:" n> p n
"private:" n> p n
"};\t// end of class " (s class) n>
)
"class"
"Insert a class skeleton"
'c++-tempo-tags)
These are my own templates. It includes a rebinding of the space bar, which is rather experimental. That requires tempo.el version 1.2.1, at least.
(require 'tempo)
(defvar elisp-tempo-tags nil)
(tempo-define-template "defun"
'("defun " p " (" p ")" n> "\"" p "\"" n> r ")")
"defun"
"Insert a defun expression"
'elisp-tempo-tags)
(tempo-define-template "defvar"
'("defvar " p n> "\"" p "\")")
"defvar"
"Insert a defvar expression"
'elisp-tempo-tags)
(tempo-define-template "if"
'("if " p n> r ")")
"if"
"Insert an if expression"
'elisp-tempo-tags)
(tempo-define-template "cond"
'("cond ((" p ") " r "))")
"cond"
"Insert a cond expression"
'elisp-tempo-tags)
(defun elisp-tempo ()
"Set up emacs-lisp mode to use tempo.el"
(local-set-key [M-S-tab] 'tempo-complete-tag)
(local-set-key "\C-c\C-f" 'tempo-forward-mark)
(local-set-key "\C-c\C-b" 'tempo-backward-mark)
(local-set-key " " 'elisp-space)
(setq tempo-match-finder "(\\([^\\b]+\\)\\=")
(tempo-use-tag-list 'elisp-tempo-tags))
(defun elisp-space ()
""
(interactive)
(if (tempo-expand-if-complete)
nil
(insert " ")))
(define-key emacs-lisp-mode-map " " 'elisp-space)