dumb-jump 20170725.1803(in MELPA)
jump to definition for multiple languages without configuration.

概要

<2016-08-12 Fri>C言語、C++に対応しました

<2016-08-07 Sun>更新
以前のバージョンでは動的言語によるDSLで
定義された関数・変数定義にジャンプできませんでしたが、
現在のバージョンからはジャンプできるようになりました!!
これで
安心してお手軽タグジャンプツールとして使える
ようになりました。

dumb-jump.elは複数のプログラミング言語に対応した
関数・変数定義にジャンプするパッケージです。
タグファイルなどは使わずag(the_silver_searcher)を使うのが特徴です。

タグファイルがあると確かに高速にジャンプできますが、
メンテナンスの手間がかかります。

最近のコンピュータは高性能なので小中規模のコードは
agによって腕づくで検索してしまった方が手軽です。

もっとも、大規模な開発においてはタグファイルがあれば高速です。

agがインストールされていない場合はgrepを使いますが、
速度面などの観点から是非ともagをインストールしておいた方がいいです。

このパッケージの特徴は、TAGSファイルなどを使わずに
カレントバッファのメジャーモードや拡張子に応じてプログラミング言語を判別し、
ag(grep)に渡す正規表現を決定し、定義と思われる場所にジャンプします。

一般的にプログラミング言語では関数・変数定義の構文が決まっているので、
それに基づいてカーソル位置のシンボルの定義の正規表現を決定します。
<2016-08-07 Sun>からはそれで見付からない場合はカーソル位置のシンボルを検索します(fallback)。

もし、一箇所に決定できない場合はポップアップメニューで選択肢が出てきます。

動的言語によるDSLまでは対応していませんが、
普通の関数定義・変数定義にはジャンプできる程度の精度はあります。
たとえばelispでいえばdefine-minor-modeなどで定義された関数にはジャンプできません。
<2016-08-07 Sun>からDSLによる定義でもジャンプ可能になりました。

elispでは素直にファイルをロードして find-function などでジャンプする方が確実です。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.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/")))

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

M-x package-install dumb-jump

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

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

対応言語

  • JavaScript
  • Emacs Lisp
  • Python
  • Go
  • PHP
  • Ruby
  • Scala
  • Clojure
  • Faust
  • R
  • Lua
  • Rust
  • CoffeeScript
  • Perl <2016-08-11 Thu>追加
  • C言語 <2016-08-12 Fri>追加
  • C++ <2016-08-12 Fri>追加

使えるコマンド

マイナーモード M-x dumb-jump-mode を有効にしたら、()内のキーバインドが使えます。

dumb-jump-go (C-M-g)
定義にジャンプする
dumb-jump-back (C-M-p)
ジャンプ前の場所に戻る
dumb-jump-quick-look (C-M-q)
定義位置をエコーエリアに表示する

Rubyでの使用例

以下のRubyスクリプトを例にします。

class A
  def sub1                      # (1)
    1
  end

  def sub2                      # (2.2)
    2
  end
end

class B < A
  def sub2                      # (2.1)
    22
  end

  def main
    sub1                        # *1
    sub2                        # *2
  end

end

「*1」のsub1でC-M-gを押したら(1)の行にジャンプします。
「*2」のsub2でC-M-gを押したら(2.1)の行にジャンプし、再度実行したら(2.2)の行にジャンプします。

elispでの例

dumb-jump.elと同じディレクトリにelファイルを作成します。

(defun a ()
  (interactive)
  (dumb-jump-mode)
  (dumb-jump-go))

dumb-jump-modeはdefine-minor-modeによる定義なのでジャンプできませんが、
<2016-08-07 Sun>からはdumb-jump-modeの定義にもジャンプできます。

dumb-jump-goはpopup.elによる選択肢が現れます。
C-p/C-nで選択してRETで決定します。

20160718173803.png
Fig1: 複数の候補が出てきたらpopupされる

.dumbjumpで検索先を増やす

プロジェクトルートディレクトリに .dumbjump ファイルを置いておくと、
定義の検索先を増やしたり減らしたりできます。

たとえば「+」に絶対パス(~は未対応)を指定すれば、使用ライブラリも定義検索の対象になります。
対して「-」を指定すれば検索対象外にできます。

.dumbjumpファイルなしでは「-filter」などの定義はジャンプできないですが、
作成することでジャンプできるようになります。

たとえばquelpa を使っていてf/s/dash/popupのライブラリが以下のディレクトリにある場合は.dumbjumpの内容を以下のようにします。

+/home/rubikitch/.emacs.d/quelpa/build/f/
+/home/rubikitch/.emacs.d/quelpa/build/s/
+/home/rubikitch/.emacs.d/quelpa/build/dash/
+/home/rubikitch/.emacs.d/quelpa/build/popup/

対応言語を増やすには

各プログラミング言語ごとの正規表現設定は dumb-jump-find-rules 変数に、
拡張子と言語名とagのファイルタイプは dumb-jump-language-file-exts に、
コンテキスト情報は dumb-jump-language-contexts に定義されています。

とくに dumb-jump-find-rules は複雑ですが、
なんとか読み解けば対応言語を増やせるでしょう。
なお、:regex内のJJJは現在のシンボル、「\\j」は単語の境界を表しています。

増やしたらpull-requestを送ってあげてください。

本サイト内の関連パッケージ


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