(global-font-lock-mode t)
(transient-mark-mode t)
; require
(require 'tempo)
(require 'cc-mode)
; set global key
(global-set-key [(f6)] 'match-paren)
(global-set-key [(f11)] 'tempo-complete-tag)
(global-set-key [(control j)] 'goto-line)
;(global-set-key (kbd "C-x C-b") 'ibuffer)
(define-key c++-mode-map [(f10)] 'template-expand-buffer-file-name)
(define-key c-mode-map [(f10)] 'template-expand-buffer-file-name)
(define-key c++-mode-map [(f9)] 'insert-method-under-point)
(define-key c-mode-map [(f9)] 'insert-method-under-point)
(define-key c++-mode-map [(f12)] 'sourcepair)
(define-key c-mode-map [(f12)] 'sourcepair)
; global variable
(setq templates-path (expand-file-name "~/.emacs.d/templates/"))
(setq compile-command "make -k check")
; define abbrev word
(setq abbrev-mode t)
(read-abbrev-file "~/.abbrev_defs")
(setq save-abbrevs t)
; backup policies
(setq make-backup-files t)
(setq version-control t)
(setq kept-old-versions 2)
(setq kept-new-versions 2)
(setq delete-old-versions t)
(setq backup-directory-alist '(("" . "~/.emacs.d/backup")))
; define c-style
(c-add-style "emacs-c-common-style" '((c-basic-offset . 4)
(c-comment-only-line-offset . 0)
(c-tab-alwgays-indent . t)
(indent-tabs-mode . nil)
(c-offsets-alist
(case-label . 4))))
(defun emacs-c-mode-common-hook()
;設置代碼樣式
(c-set-style "emacs-c-common-style")
;設置刪除的飢渴模式
(c-toggle-hungry-state 1)
;顯示當前光標在哪個函數
(which-func-mode 1)
)
(add-hook 'c-mode-common-hook 'emacs-c-mode-common-hook)
; c tempo tags
(defvar c-tempo-tags nil "tempo tags for c mode")
(add-hook 'c-mode-hook '(lambda() (tempo-use-tag-list 'c-tempo-tags)))
(tempo-define-template "main"
'(
"int main(int argc, char* argv[])" > n
"{" > n
"}" n
)
"main"
"insert main function"
'c-tempo-tags
)
; c++ tempo tags
(defvar c++-tempo-tags nil "tempo tags for c++ mode")
(add-hook 'c++-mode-hook '(lambda() (tempo-use-tag-list 'c++-tempo-tags) (tempo-use-tag-list 'c-tempo-tags)))
(tempo-define-template "logerror"
'(
"LOG4CXX_ERROR(logger, boost::str(boost::format(\"%1%\") %1));" >
)
"logerror"
"insert logerror function"
'c++-tempo-tags
)
(tempo-define-template "logwarn"
'(
"LOG4CXX_WARN(logger, boost::str(boost::format(\"%1%\") %1));" >
)
"logwarn"
"insert logwarn function"
'c++-tempo-tags
)
(tempo-define-template "loginfo"
'(
"LOG4CXX_INFO(logger, boost::str(boost::format(\"%1%\") %1));" >
)
"loginfo"
"insert loginfo function"
'c++-tempo-tags
)
(tempo-define-template "logdebug"
'(
"LOG4CXX_DEBUG(logger, boost::str(boost::format(\"%1%\") %1));" >
)
"logdebug"
"insert logdebug function"
'c++-tempo-tags
)
; define function
(defun match-paren()
"Go to the matching parenthesis if on parenthesis otherwise do nothing."
(interactive)
(cond ((looking-at "[\({]") (forward-sexp) (backward-char))
((looking-at "[\)}]") (forward-char) (backward-sexp))))
(defun cpp-project-create()
"create the project in the directory project-root/project-name.
It creates following structure:
./src -- directory for source files
./src/Makefile.am
./src/test -- directory for test files
./src/test/Makefile.am
./config
configure.ac
Makefile.am"
(interactive)
(setq project-name (read-from-minibuffer "Project name: "))
(setq project-root (read-from-minibuffer "Project root: "))
(while (or (= 0 (length project-root)) (equal (file-directory-p (substitute-in-file-name project-root)) nil))
(message "The root directory doesn't exist!")
(setq project-root (read-from-minibuffer "Project root: ")))
(setq project-root (file-name-as-directory project-root))
(setq project-root (expand-file-name project-root))
(setq project-dir (concat project-root project-name))
(make-directory (concat project-dir "/src/test") t)
(make-directory (concat project-dir "/config") nil)
(cd project-dir)
; copy some templates to project-dir
(copy-file (concat templates-path "bootstrap.tpl") "bootstrap")
(copy-file (concat templates-path "configure.ac.tpl") "configure.ac")
(copy-file (concat templates-path "rule.mak.tpl") "rule.mak")
(copy-file (concat templates-path "Makefile.am.tpl") "Makefile.am")
(copy-file (concat templates-path "src.Makefile.am.tpl") "src/Makefile.am")
(copy-file (concat templates-path "fude.m4.tpl") "config/fude.m4")
(copy-file (concat templates-path "testmain.cpp.tpl") "src/test/testmain.cpp")
(copy-file (concat templates-path "test.Makefile.am.tpl") "src/test/test.Makefile.am")
(find-file (concat project-dir "/configure.ac"))
(replace-string "(>>>PROJECT<<<)" (upcase project-name))
(beginning-of-buffer)
(replace-string "(>>>project<<<)" project-name)
(save-buffer)
(kill-this-buffer)
(find-file (concat project-dir "/src/Makefile.am"))
(replace-string "(>>>PROJECT<<<)" (upcase project-name))
(beginning-of-buffer)
(replace-string "(>>>project<<<)" project-name)
(save-buffer)
)
(defun smart-compile()
"compile from current to topdir if have makefile"
(interactive)
(let (
(make-dir (file-name-directory buffer-file-name))
)
(while (not (or (file-exists-p "makefile") (file-exists-p "Makefile")))
(cd "..")
)
(call-interactively 'compile)
(cd make-dir)
))
(defun sourcepair()
"find corresponding cpp/h file"
(interactive)
(setq sourcepair-source-extension '("c" "cpp"))
(setq sourcepair-header-extension '("h" "hpp"))
(setq file-directory (file-name-directory buffer-file-name))
(setq file-nondirectory (file-name-nondirectory buffer-file-name))
(setq file-extension (file-name-extension file-nondirectory))
(cond ((or (string-equal file-extension "h") (string-equal file-extension "hpp")) (setq corresponding-file-name-type "source"))
((or (string-equal file-extension "c") (string-equal file-extension "cpp")) (setq corresponding-file-name-type "header")))
(if (string-equal corresponding-file-name-type "source")
(while sourcepair-source-extension
(setq looking-file (replace-regexp-in-string file-extension (car sourcepair-source-extension) buffer-file-name))
(if (file-exists-p looking-file)
(find-file looking-file))
(setq sourcepair-source-extension (cdr sourcepair-source-extension))))
(if (string-equal corresponding-file-name-type "header")
(while sourcepair-header-extension
(setq looking-file (replace-regexp-in-string file-extension (car sourcepair-header-extension) buffer-file-name))
(if (file-exists-p looking-file)
(find-file looking-file))
(setq sourcepair-header-extension (cdr sourcepair-header-extension)))))
; (debug-on-entry sourcepair)
(defun template-expand-template(template)
"expand TEMPLATE file"
(interactive (list buffer-file-name))
(if (search "." template)
(progn (setq file-extension (file-name-extension template))
(setq file-nondirectory (file-name-nondirectory template))
(setq class-name (substring file-nondirectory 0 (- (string-width file-nondirectory) (string-width file-extension) 1))))
(setq class-name template))
(if (search "TestCase" class-name)
(cond ((string-equal file-extension "h") (insert-file (concat templates-path "TEMPLATE.TestCase.h.tpl")))
((string-equal file-extension "cpp") (insert-file (concat templates-path "TEMPLATE.TestCase.cpp.tpl"))))
(cond ((string-equal file-extension "h") (insert-file (concat templates-path "TEMPLATE.h.tpl")))
((string-equal file-extension "cpp") (insert-file (concat templates-path "TEMPLATE.cpp.tpl")))))
(beginning-of-buffer)
(replace-string "(>>>FILE_SANS<<<)" class-name)
(beginning-of-buffer)
(replace-string "(>>>FILE_UPCASE<<<)" (upcase class-name))
(indent-according-to-mode)
(save-buffer))
(defun template-expand-buffer-file-name()
"template-expand-template buffer-file-name"
(interactive)
(template-expand-template buffer-file-name))
(defun cpp-class-create()
"create class files, XXX.h XXX.cpp XXXTestCase.h XXXTestCase.cpp"
(interactive)
(setq local-class-name (read-from-minibuffer "Class name: "))
(setq class-root (read-from-minibuffer "Class root: "))
(setq create-file-name (concat class-root "/" local-class-name "TestCase.cpp"))
(find-file create-file-name)
(template-expand-template create-file-name)
(setq create-file-name (concat class-root "/" local-class-name "TestCase.h"))
(find-file create-file-name)
(template-expand-template create-file-name)
(setq create-file-name (concat class-root "/" local-class-name ".cpp"))
(find-file create-file-name)
(template-expand-template create-file-name)
(setq create-file-name (concat class-root "/" local-class-name ".h"))
(find-file create-file-name)
(template-expand-template create-file-name))
(defun insert-method-under-point()
"insert method undeer point"
(interactive)
(back-to-indentation)
(re-search-forward "\\([a-zA-Z]+\\)[ ]+\\([a-zA-Z]+[ ]+([ ]+[a-zA-Z]+[ ]+[a-zA-Z]+[ ]+\\(,[ ]+[a-zA-Z]+[ ]+[a-zA-Z]+[ ]+\\))\\)" nil t)
; (message "1 is %s, 2 is %s" (match-string 1) (match-string 2))
(let* ((match-string-one (match-string 1))
(match-string-two (match-string 2))
(file-nondirectory (file-name-nondirectory buffer-file-name))
(class-name (substring file-nondirectory 0 (- (string-width file-nondirectory) (string-width (file-name-extension buffer-file-name)) 1))))
(sourcepair)
(end-of-buffer)
(newline)
(insert-string match-string-one " " class-name "::" match-string-two)
(insert-string "\n{\n\n}")
(newline)))
部分模版文件詳見我的資源。