Insight into something.
I created a new file "tempo.el" in my .emacs.d directory containing:(load-file "~/.emacs.d/tempo.el") (global-set-key [f9] 'tempo-complete-tag)note: there is probably a better way to set the hot-key to work only in the modes as defined, but I just lazily set it globally.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ---------------------------------------------------------------- :Tempo Tags: ;; _____ _____ ;; |_ _|__ _ __ _ __ ___ |_ _|_ _ __ _ ___ ;; | |/ -_) ' \| '_ \/ _ \ | |/ _` / _` (_-< ;; |_|\___|_|_|_| .__/\___/ |_|\__,_\__, /__/ ;; |_| |___/ ;; ----------------------------------------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Usage ;; ;; |----------+-------------------------------------| ;; | key word | Insert a: | ;; |----------+-------------------------------------| ;; | include | #include <> statement | ;; | ifdef | #ifdef #else #endif statement | ;; | ifndef | #ifndef #define #endif statement | ;; |----------+-------------------------------------| ;; | if | C if statement | ;; | else | C else statement | ;; | ifelse | C if else statement | ;; | while | C while statement | ;; | for | C for statement | ;; | fori | C for loop: for(x = 0; x < ..; x++) | ;; | main | C main statement | ;; | ifmalloc | C if (malloc...) statement | ;; | ifcalloc | C if (calloc...) statement | ;; | switch | C switch statement | ;; | case | C case statement | ;; |----------+-------------------------------------| ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Source: http://xenon.stanford.edu/~manku/emacs.html ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; 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) (setq tempo-interactive t) (add-hook 'c-mode-hook '(lambda () (local-set-key [f9] 'tempo-complete-tag))) (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 "}" > n> ) "if" "Insert a C if statement" 'c-tempo-tags) (tempo-define-template "c-else" '(> "else" n> "{" > n> > r n "}" > 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 "}" > n "else" > n "{" > n> > r n "}" > 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 "}" > n> ) "while" "Insert a C while statement" 'c-tempo-tags) (tempo-define-template "c-for" '(> "for (" (p "for-clause: " clause) ")" > n> "{" > n > r n "}" > 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 "}" > n> ) "fori" "Insert a C for loop: for(x = 0; x < ..; x++)" 'c-tempo-tags) (tempo-define-template "c-main" '(> "int main(int argc, char *argv[])" > n> "{" > n> > r n > "return 0 ;" n> > "}" > n> ) "main" "Insert a C main statement" 'c-tempo-tags) (tempo-define-template "c-if-malloc" '(> (p "variable: " var) " = (" (p "type: " type) " *) malloc (sizeof(" (s type) ") * " (p "nitems: " nitems) ") ;" n> > "if (" (s var) " == NULL)" n> > "error_exit (\"" (buffer-name) ": " r ": Failed to malloc() " (s var) " \") ;" n> ) "ifmalloc" "Insert a C if (malloc...) statement" 'c-tempo-tags) (tempo-define-template "c-if-calloc" '(> (p "variable: " var) " = (" (p "type: " type) " *) calloc (sizeof(" (s type) "), " (p "nitems: " nitems) ") ;" n> > "if (" (s var) " == NULL)" n> > "error_exit (\"" (buffer-name) ": " r ": Failed to calloc() " (s var) " \") ;" n> ) "ifcalloc" "Insert a C if (calloc...) 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 "}" > 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)