This article will describe using doxymacs package which provides template of doxygen comment with key bindings.
Table of Contents
1 Install doxymacs package
Download archive from Doxymacs page. Download patch from NetBSD page for compiling with Clang.
$ tar zxf doxymacs-1.8.0.tar.gz
$ cd doxymacs-1.8.0
$ DOXYMACS=http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/devel/doxymacs
$ wget ${DOXYMACS}/patches/patch-c_Makefile.in
$ wget ${DOXYMACS}/patches/patch-c_doxymacs__parser.c
$ patch -p0 < patch-c_Makefile.in
$ patch -p0 < patch-c_doxymacs__parser.c
$ ./configure --prefix=${HOME}
$ make all install
The following files are installed.
${HOME}/bin/doxymacs_parser
${HOME}/share/emacs/site-lisp/xml-parse.el
${HOME}/share/emacs/site-lisp/xml-parse.elc
${HOME}/share/emacs/site-lisp/doxymacs.el
${HOME}/share/emacs/site-lisp/doxymacs.elc
Move doxymacs_parser to PATH location. Move *.el and *.elc to your location of emacs load-path.
2 ${HOME}/.emacs
Load doxymacs with require. Add doxymacs-mode to your major mode. This article adds it to c-mode-common-hook which is common major mode of C and C++.
;; doxymacs (require 'doxymacs) (add-hook 'c-mode-common-hook 'doxymacs-mode)
doxymacs-doxygen-style is variable for doxygen style. This article will set "JavaDoc" to doxymacs-doxygen-style.
(setq doxymacs-doxygen-style "JavaDoc")
| "JavaDoc" | /** |
| * JavaDoc. | |
| */ | |
| "Qt" | //! |
| /*! | |
| Qt. | |
| */ | |
| "C++" | / |
| / C++. | |
| / |
3 key bindings
I am using the following key bindings.
| C-c d i | File header comment |
| C-c d f | Function comment |
| C-c d m | Multiple line comment |
| C-c d s | Single line comment |
| C-c d ; | Member fileds comment |
3.1 File header comment
File header comment is generated by C-c d i.
/** * @file comment.cc * @author username <mail@address> * @date Wed Sep 2 18:46:39 2015 * * @brief * * */
Cursor will be moved to @brief. @auther are set variables of user-full-name and user-mail-address. These variables can be set in ${HOME}/.emacs.
(custom-set-variables '(user-full-name "username") '(user-mail-address "mail@address") )
3.2 Function comment
Function comment is generated by C-c d f.
/** * * * @param string */ void foo::set(const std::string &string)
Cursor will be moved to second line.
3.3 Multiple line comment
Multiple line comment is generated by C-c d m.
/** * * */
Cursor will be moved to second line.
3.4 Single line comment
Single line comment is generated by C-c d s.
///
Cursor will be moved to after /.
3.5 Member field comment
Member field comment is generated by C-c d ;.
std::string mString; /**< */
Cursor will be moved to inside of comment.
4 Custom template comment
Custom template comment by below variable in ${HOME}/.emacs.
| doxymacs-file-comment-template | File header comment |
| doxymacs-function-comment-template | Function comment |
| doxymacs-blank-multiline-comment-template | Multiple line comment |
| doxymacs-blank-singleline-comment-template | Single line comment |
| doxymacs-member-comment-start | Start of member field comment |
| doxymacs-member-comment-end | End of member field comment |
This article changes single line comment from "/" to "/**". The n means new line and the p means cursor position.
(defconst doxymacs-my-blank-singleline-comment-template
'("/** " p " */" >)
"Default my-style template for a blank singleline doxygen comment.")
(custom-set-variables '(doxymacs-blank-singleline-comment-template doxymacs-my-blank-singleline-comment-template) )
This comment is created from JavaDoc template comment. JavaDoc template comment is defined in doxymacs.el.
doxymacs-JavaDoc-file-comment-template doxymacs-JavaDoc-function-comment-template doxymacs-JavaDoc-blank-multiline-comment-template doxymacs-JavaDoc-blank-singleline-comment-template
4.1 My custom template comment
I am using below custom template comment which is set in ${HOME}/.emacs.
(defconst doxymacs-my-file-comment-template
'("/**" > n
" * " (doxymacs-doxygen-command-char) "file "
(if (buffer-file-name)
(file-name-nondirectory (buffer-file-name))
"") > n
" * " (doxymacs-doxygen-command-char) "author "
(user-full-name) (doxymacs-user-mail-address) > n
" * " (doxymacs-doxygen-command-char) "copyright "
"(c) 2015 " (user-full-name) ". All right reserved." > n
" *" > n
" * " (doxymacs-doxygen-command-char) "brief "
(p "Brief description of this file: ") > n
" */" >)
"Default my template for file documentation.")
(defconst doxymacs-my-function-comment-template
'((let ((next-func (doxymacs-find-next-func)))
(if next-func
(list
'l
"/**" '> 'n
" * " 'p '> 'n
(doxymacs-parm-tempo-element (cdr (assoc 'args next-func)))
(unless (string-match
(regexp-quote (cdr (assoc 'return next-func)))
doxymacs-void-types)
'(l " * " (doxymacs-doxygen-command-char)
"return " (p "Returns: ") > n))
" */" '>)
(progn
(error "Can't find next function declaration.")
nil))))
"Default my-style template for function documentation.")
(defconst doxymacs-my-blank-multiline-comment-template
'("/**" > n "* " p > n "*/" >)
"Default my-style template for a blank multiline doxygen comment.")
(defconst doxymacs-my-blank-singleline-comment-template
'("/** " p " */" >)
"Default my-style template for a blank singleline doxygen comment.")
(custom-set-variables
'(doxymacs-file-comment-template doxymacs-my-file-comment-template)
'(doxymacs-function-comment-template
doxymacs-my-function-comment-template)
'(doxymacs-blank-multiline-comment-template
doxymacs-my-blank-multiline-comment-template)
'(doxymacs-blank-singleline-comment-template
doxymacs-my-blank-singleline-comment-template)
)