The cursor has to be anywhere before the opening brace {. Given this example from PulseAudio:
int pa_cmdline_parse(pa_daemon_conf *conf, int argc, char *const argv [], int *d) { pa_strbuf *buf = NULL; int c; int b; pa_assert(conf); pa_assert(argc > 0); pa_assert(argv); /* yada yada... */ }You get this, with the cursor placed on the function description (right of the -):
/** * pa_cmdline_parse - * @conf: * @argc: * @argv: * @d: * * */ int pa_cmdline_parse(pa_daemon_conf *conf, int argc, char *const argv [], int *d) { pa_strbuf *buf = NULL; int c; int b; pa_assert(conf); pa_assert(argc > 0); pa_assert(argv); /* yada yada... */ }Pretty cool huh? Here's the shitty C parser and doc generator:
(defun my-c-parse-function () (interactive) (require 'cl) (let ((beg (point)) end text fname args) (save-excursion (when (search-forward "{" nil t) (setq end (point) text (buffer-substring-no-properties beg end)) (setq text (replace-regexp-in-string (rx (+ space)) " " text)) (setq text (replace-regexp-in-string (rx (+ space)) " " text)) (when (string-match (rx (group (+? (not space))) (* space) "(" (group (* any)) ")") text) (setq fname (match-string 1 text) args (match-string 2 text)) (setq args (split-string args (rx (? space) "," (? space)) t)) (setq args (mapcar (lambda (arg) (setq arg (replace-regexp-in-string (rx bos (+ space)) "" arg)) (setq arg (replace-regexp-in-string (rx (+ space) eos) "" arg)) (setq arg (replace-regexp-in-string (rx "[" (* (not (any "]"))) "]") "" arg)) (if (string= arg "void") arg (let ((words (split-string arg (rx (any "*" space)) t))) (nth (1- (length words)) words)))) args)) (message "fname = <%s>" fname) (dolist (a args) (message "arg<%s>" a)) (append (list fname) (remove-if (lambda (x) (string= x "void")) args)) ))))) (defun my-c-doc-function () (interactive) (let* ((res (my-c-parse-function)) (fname (car res)) (args (cdr res)) p) (insert "/**\n * " fname " - ") (setq p (point)) (insert "\n") (dolist (a args) (insert " * @" a ": \n")) (insert " *\n *\n */") (goto-char p)))
Aucun commentaire:
Enregistrer un commentaire