From: Masatake YAMATO <yamato@redhat.com>
To: 11711@debbugs.gnu.org
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) [thread overview]
Message-ID: <20120615.041527.616439723447762585.yamato@redhat.com> (raw)
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))))
+
\f
next reply other threads:[~2012-06-14 19:15 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-14 19:15 Masatake YAMATO [this message]
2012-06-15 1:46 ` bug#11711: 24.0.95; [PATCH] added imenu and which-func support to rst.el Stefan Monnier
2012-06-16 22:33 ` Masatake YAMATO
2012-06-18 1:59 ` Stefan Monnier
2012-06-18 9:28 ` Stefan Merten
2012-06-18 9:44 ` Stefan Merten
2012-06-18 19:25 ` Stefan Monnier
2012-06-18 9:57 ` Stefan Merten
2012-06-19 3:33 ` Masatake YAMATO
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120615.041527.616439723447762585.yamato@redhat.com \
--to=yamato@redhat.com \
--cc=11711@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).