Function: srecode-texi-add-menu
srecode-texi-add-menu is an interactive and byte-compiled function
defined in texi.el.gz.
Signature
(srecode-texi-add-menu NEWNODE)
Documentation
Add an item into the current menu. Add @node statements as well.
Argument NEWNODE is the name of the new node.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/cedet/srecode/texi.el.gz
;;; Code:
(defun srecode-texi-add-menu (newnode)
"Add an item into the current menu. Add @node statements as well.
Argument NEWNODE is the name of the new node."
(interactive "sName of new node: ")
(srecode-load-tables-for-mode major-mode)
(semantic-fetch-tags)
(let ((currnode (reverse (semantic-find-tag-by-overlay)))
(nodebounds nil))
(when (not currnode)
(error "Cannot find node to put menu item into"))
(setq currnode (car currnode))
(setq nodebounds (semantic-tag-texi-section-text-bounds currnode))
;; Step 1:
;; Limit search within this node.
;; Step 2:
;; Find the menu. If there isn't one, add one to the end.
;; Step 3:
;; Add new item to end of menu list.
;; Step 4:
;; Find correct node new item should show up after, and stick
;; the new node there.
(if (string= (semantic-texi-current-environment) "menu")
;; We are already in a menu, so insert the new item right here.
(beginning-of-line)
;; Else, try to find a menu item to append to.
(goto-char (car nodebounds))
(if (not (re-search-forward "^@menu" (car (cdr nodebounds)) t))
(progn
(goto-char (car (cdr nodebounds)))
(if (not (y-or-n-p "Add menu here? "))
(error "Abort"))
(srecode-insert "declaration:menu"))
;; Else, find the end
(re-search-forward "@end menu")
(beginning-of-line)))
;; At this point, we are in a menu... or not.
;; If we are, do stuff, else error.
(when (string= (semantic-texi-current-environment) "menu")
(let ((menuname newnode)
(returnpoint nil))
(srecode-insert "declaration:menuitem" "NAME" menuname)
(set-mark (point))
(setq returnpoint (make-marker))
;; Update the bound since we added text
(setq nodebounds (semantic-tag-texi-section-text-bounds currnode))
(beginning-of-line)
(forward-char -1)
(beginning-of-line)
(let ((end nil))
(if (not (looking-at "\\* \\([^:]+\\):"))
(setq end (car (cdr nodebounds)))
(let* ((nname (match-string 1))
(tag
(semantic-deep-find-tags-by-name nname (current-buffer))))
(when tag
(setq end (semantic-tag-end (car tag))))
))
(when (not end)
(goto-char returnpoint)
(error "Could not find location for new node" ))
(when end
(goto-char end)
(when (bolp) (forward-char -1))
(insert "\n")
(if (eq (semantic-current-tag) currnode)
(srecode-insert "declaration:subnode" "NAME" menuname)
(srecode-insert "declaration:node" "NAME" menuname))
)
)))
))