emacs模版

; code highlight
(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)))


 部分模版文件詳見我的資源。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章