SiteMap Search ElispArea HowTo Glossary RecentChanges News Problems Suggestions

wuxch-imenu.el

Last major edit (later minor edits)

Summary: ;;; imenu config file, also for ecb (add-to-list 'load-path (concat emacs-site-lisp-dir "tree-widget")) (require 'imenu-tree) ;; . . .

No diff available.

Download

;;; imenu config file, also for ecb
(add-to-list 'load-path (concat emacs-site-lisp-dir "tree-widget"))

(require 'imenu-tree)

;; (global-set-key [(f3)]  'wuxch-imenu-tree-open)
;; (global-set-key [(meta f3)]  'wuxch-imenu-tree-kill)

(defconst imenu-timer-interval 1)
(defvar imenu-timer-id nil)

(defun wuxch-imenu-tree-open (arg)
  "wuxch-imenu-tree-open:"
  (interactive "P")
  (if (eq imenu-tree-buffer nil)
      (progn
        (let ((buf (current-buffer)))
          (imenu-tree arg)
          (select-window (get-buffer-window buf))
          (open-node-by-function-name)
          (setq imenu-timer-id
                (run-with-idle-timer imenu-timer-interval t
                                     'open-node-by-function-name))
          (make-local-variable 'imenu-timer-id)
          )
        )
    (if (get-buffer-window imenu-tree-buffer)
        (progn
          (message "imenu-tree is already opened")
          )
      (let ((buf (current-buffer)))
        (imenu-tree arg)
        (select-window (get-buffer-window buf))
        (open-node-by-function-name)
        (setq imenu-timer-id
              (run-with-idle-timer imenu-timer-interval t
                                   'open-node-by-function-name))
        (make-local-variable 'imenu-timer-id)
        )
      )
    )
  )

(defun wuxch-imenu-tree-kill ()
  "wuxch-imenu-tree-kill:"
  (interactive)
  (imenu-tree-kill)
  (delete-other-windows)
  (when (timerp imenu-timer-id)
    (cancel-timer imenu-timer-id)
    (setq imenu-timer-id nil)
    (make-local-variable 'imenu-timer-id)
    )
  )

;; (custom-set-variables
;;  '(imenu-tree-auto-update t)
;;  '(imenu-tree-update-interval 1)    ;; second
;;  )

(require 'which-func)
(defun open-node-by-function-name ()
  "open-node-by-function-name:"
  (let ((function-name (car (which-function)))
        (current-win (get-buffer-window))
        (imenu-win (get-buffer-window imenu-tree-buffer))
        )
    (when (and function-name imenu-win)
      (with-selected-window imenu-win
        (let ((root (tree-mode-tree-ap))
              (previous-line-number (line-number-at-pos))
              (ov)(beg)(end))
          (when root
            (goto-char (widget-get root :from))
            )
          (when (re-search-forward (concat "[ ]\\(" function-name "\\)" "$") nil t)
            (setq beg (match-beginning 1))
            (setq end (match-end 1))
            (wuxch-gothrough-the-whole-buffer-and-check-overlay 'font-lock-warning-face)
            (goto-char beg)
            (setq ov (make-overlay beg end
                                   imenu-tree-buffer))
            (overlay-put ov 'face 'font-lock-warning-face)
            ;; (if (not (eq previous-line-number (line-number-at-pos beg)))
            ;;     (recenter-top-bottom)
            ;;   )
            )
          )
        )
      )
    )
  )

(defun imenu-tree-update-timer ()
  "Update and show the tree if needed."
  (imenu-tree-show)
  (when (and imenu-tree
             ;; the tree is visible
             (get-buffer-window imenu-tree-buffer)
             imenu-tree-need-update
             ;; the buffer is not too large
             (not (> (buffer-size) imenu-auto-rescan-maxout)))
    (setq imenu--index-alist nil)
    (imenu--make-index-alist t)
    (let ((tree imenu-tree))
      (with-current-buffer imenu-tree-buffer
        (goto-char (widget-get tree :from))
        (tree-mode-reflesh)))
    (setq imenu-tree-need-update nil))

  (open-node-by-function-name)

  )

(provide 'wuxch-imenu)