imenus 20170217.47(in MELPA)
Imenu for multiple buffers and without subgroups

概要

これはすごいものを見つけました。

imenus.el は2つのコマンドにより
M-x imenu を超強化するパッケージです。

M-x imenus は通常のimenuと機能的にはほぼ同じですが、
以下の点が強化されています。

  • M-rでimenuの情報を再取得(Rescan)
  • M-oで M-x multi-occur へ移行
  • M-sで isearch へ移行

M-x imenus-mode-buffersimenu-anywhere.el(レビュー) 同様
同一メジャーモードのすべてのバッファまでimenuの範囲を広げます。

つまり、開いている同じプログラミング言語のバッファの
関数定義へ手軽にジャンプできるということです。

multi-occurへ移行できることから、
関数呼び出しへもすぐにジャンプできます。

本設定ではido-occasional.el(レビュー)
ido-vertical-mode.el(レビュー) でimenuを縦ido化しています。

multi-occurといったらhelm-swoop(レビュー) ってことで、
helm-swoop.elとも連携させました。

imenus-mode-buffersをC-M-sに割り当てていて、
なおかつC-M-sで M-x helm-multi-swoop を呼び出すようにしているので、
C-M-s C-M-sで関数呼び出しをhelm-swoopできちゃいます!

正直、今までhelm-multi-swoopは遅すぎて使えないと思っていたのですが
imenusと併用することで評価は180度変わってしまいました。

この快適さは使ってみなければわかりません。

ぜひともインストールしましょう。

imenu-anywhere.elやidomenu.el(レビュー) と機能は同じですが、
occurやhelm-swoopへ移行できるのでこちらの圧勝です!!

20150409061018.png
Fig1: C-M-sを押し、現在のシンボルがデフォルトで選択される

20150409061027.png
Fig2: M-oで関数定義・呼び出しをシンボルoccur

20150409061048.png
Fig3: C-M-sでのimenuのスコープは同一メジャーモード全バッファ

20150409070320.png
Fig4: もう一度C-M-sでhelm-multi-swoop発動!!

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてimenusを使う方は
以下のコマンドを実行します。

M-x package-install imenus

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name imenus

さらに
M-x package-install ido-occasional
M-x package-install ido-vertical-mode
M-x package-install helm-swoop
も実行してido/helm-swoop化してしまえば超絶快適です。

設定 150409051422.imenus.1.el(以下のコードと同一)

(require 'ido-occasional)
(require 'ido-vertical-mode)
(require 'helm-swoop)
(require 'imenus)
(setq ido-enable-flex-matching t)
(ido-vertical-mode 1)
(setq ido-vertical-define-keys 'C-n-and-C-p-only)


;;; エラー対策
(defun imenu-find-default--or-current-symbol (&rest them)
  (condition-case nil
      (apply them)
    (error (thing-at-point 'symbol))))
(advice-add 'imenu-find-default :around 'imenu-find-default--or-current-symbol)
;;; なぜか現在のシンボルを取ってくれないから
(defun imenus-exit-minibuffer ()
  (exit-minibuffer))

;;; ido化: imenus/with-ido imenus-mode-buffers/with-idoを定義
(with-ido-completion imenus)
;; C-M-s C-M-sで現在のシンボルをhelm-multi-swoopできるよ!
(global-set-key (kbd "C-M-s") (with-ido-completion imenus-mode-buffers))


;;; M-oでのmulti-occurをシンボル正規表現にするよう改良
(push '(occur . imenus-ido-multi-occur) imenus-actions)
(defun imenus-ido-multi-occur (buffers input)
  (multi-occur buffers
               (format "\\_<%s\\_>"
                       (regexp-quote (replace-regexp-in-string "^.*|" "" input)))))

;;; C-M-sで関数呼び出しをhelm-multi-swoopできるようにした
(push '(helm-multi-swoop . imenus-helm-multi-swoop) imenus-actions)
(defun imenus-helm-multi-swoop (buffers input)
  (helm-multi-swoop (replace-regexp-in-string "^.*|" "" input)
                    (mapcar 'buffer-name buffers)))
(define-key imenus-minibuffer-map (kbd "C-M-s") 'imenus-exit-to-helm-multi-swoop)
(defun imenus-exit-to-helm-multi-swoop ()
  "Exit from imenu prompt; start `helm-multi-swoop' with the current input."
  (interactive)
  (setq imenus-exit-status 'helm-multi-swoop)
  (imenus-exit-minibuffer))

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。