[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#11711: 24.0.95; [PATCH] added imenu and which-func support to rst.el
From: |
Masatake YAMATO |
Subject: |
bug#11711: 24.0.95; [PATCH] added imenu and which-func support to rst.el |
Date: |
Fri, 15 Jun 2012 04:15:27 +0900 (JST) |
This is not a bug report. This is a request to merge a patch
to the offcial source tree.
2012-06-13 Masatake YAMATO <yamato@redhat.com>
* textmodes/rst.el (rst-mode, rst-imenu-index): Added
imenu and which-func support.
=== modified file 'lisp/textmodes/rst.el'
--- lisp/textmodes/rst.el 2012-06-07 09:20:41 +0000
+++ lisp/textmodes/rst.el 2012-06-13 17:16:13 +0000
@@ -794,6 +794,13 @@
(set (make-local-variable 'uncomment-region-function)
'rst-uncomment-region)
+ ;; Imenu
+ (set (make-local-variable 'imenu-create-index-function) 'rst-imenu-index)
+
+ ;; Which func
+ (when (and (boundp 'which-func-modes) (listp which-func-modes))
+ (add-to-list 'which-func-modes 'rst-mode))
+
;; Font lock.
(set (make-local-variable 'font-lock-defaults)
'(rst-font-lock-keywords
@@ -4088,6 +4095,63 @@
;; output.
))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Imenu support
+(defun rst-imenu-find-adornments-for-position (adornments p)
+ "Find adornments cell for position P in ADORNMENTS"
+ (let ((a nil))
+ (while adornments
+ (if (and (car adornments)
+ (eq (car (car adornments)) p))
+ (setq a adornments
+ adornments nil)
+ (setq adornments (cdr adornments))))
+ a))
+
+(defun rst-imenu-convert-cell (elt adornments)
+ "Convert adornment cell to imenu index"
+ (let* ((kar (car elt))
+ (kdr (cdr elt))
+ (title (car kar)))
+ (if kar
+ (let* ((p (marker-position (cadr kar)))
+ (adornments (rst-imenu-find-adornment-for-position adornments p))
+ (a (car adornments))
+ (adornments (cdr adornments))
+ (title (format "%s%s%s"
+ (make-string (1+ (nth 3 a)) (nth 1 a))
+ title
+ (if (eq (nth 2 a) 'simple)
+ ""
+ (char-to-string (nth 1 a))))))
+ (cons title
+ (if (null kdr)
+ p
+ (cons
+ ;; A bit ugly but this make which-func happy.
+ (cons title p)
+ (mapcar (lambda (elt0)
+ (rst-imenu-index0 elt0 adornments))
+ kdr)))))
+ nil)))
+
+(defun rst-imenu-index ()
+ "Create index for imenu."
+ (rst-reset-section-caches)
+ (let ((tree (rst-section-tree))
+ ;; Translate line notation to point notion
+ (adornments (save-excursion
+ (mapcar (lambda (a)
+ (cons (progn
+ (goto-char (point-min))
+ (forward-line (1- (car a)))
+ (point))
+ (cdr a)))
+ (rst-find-all-adornments)))))
+ (delete nil (mapcar (lambda (elt)
+ (rst-imenu-convert-cell elt adornments))
+ tree))))
+
- bug#11711: 24.0.95; [PATCH] added imenu and which-func support to rst.el,
Masatake YAMATO <=