;;my-test-mode
;; マイナーモードの定義
(easy-mmode-define-minor-mode
 test-mode
 ;; ドキュメント
 "This is Test Mode."
 ;; 初期値
 nil
 ;; on の時のモード行への表示
 " TestMode"
 ;; マイナーモード用キーマップの初期値
 '(
   ("\C-o" . test-function)
   ("\r" . test-mode)
   ))

(add-hook 'test-mode-on-hook 'test-mode-init)
(add-hook 'test-mode-off-hook 'test-mode-finish)

(defun my-bounds-list()
  (sort
   (mapcar 'assoc 
   (cons (my-bounds-of-defun)
	 (mapcar 'bounds-of-thing-at-point '(line word symbol sentence sexp)))
   '(lambda(a b) (> (car a) (car b)))
   )
  )

(defun test-mode-init()
  (setq my-hoge-bounds-list (my-bounds-list))
  (if my-hoge-bounds-list
      (progn
	(message "%s" my-hoge-bounds-list)
	(setq test-mode-count 0)
	(setq my-overlay-list
	      (mapcar '(lambda(bounds)
			 (make-overlay (car bounds) (1+ (car bounds))))
		      my-hoge-bounds-list))
	(mapcar '(lambda(my-ov)
		   (overlay-put my-ov 'face 'region))my-overlay-list)
	)))

(defun test-mode-finish()
  (mapcar '(lambda(my-ov)
	     (delete-overlay my-ov))my-overlay-list))

(defvar test-mode-count 0)
(defvar my-hoge-bounds-list nil)
(defvar my-overlay-list nil)

(defun test-function ()
  (interactive)
  (goto-char 
   (car (nth (mod test-mode-count 
		  (length my-hoge-bounds-list))
	     my-hoge-bounds-list)))
  (setq test-mode-count (1+ test-mode-count))
  )

(global-set-key (kbd "C-o") 'test-mode)
(defun my-bounds-of-defun()
  (cons 
   (save-excursion (beginning-of-defun)
		   (point))
   (save-excursion (end-of-defun)
		   (point))
   ))

(defun test-function ()
  (interactive)
  (goto-char 
   (car (nth (mod test-mode-count 
		  (length my-hoge-bounds-list))
	     my-hoge-bounds-list)))
  (setq test-mode-count (1+ test-mode-count))
  )