- dumb-jump 20170725.1803(in MELPA)
- jump to definition for multiple languages without configuration.
概要
以前のバージョンでは動的言語によるDSLで
定義された関数・変数定義にジャンプできませんでしたが、
現在のバージョンからはジャンプできるようになりました!!
これで
安心してお手軽タグジャンプツールとして使える
ようになりました。
dumb-jump.elは複数のプログラミング言語に対応した
関数・変数定義にジャンプするパッケージです。
タグファイルなどは使わずag(the_silver_searcher)を使うのが特徴です。
タグファイルがあると確かに高速にジャンプできますが、
メンテナンスの手間がかかります。
最近のコンピュータは高性能なので小中規模のコードは
agによって腕づくで検索してしまった方が手軽です。
もっとも、大規模な開発においてはタグファイルがあれば高速です。
agがインストールされていない場合はgrepを使いますが、
速度面などの観点から是非ともagをインストールしておいた方がいいです。
このパッケージの特徴は、TAGSファイルなどを使わずに
カレントバッファのメジャーモードや拡張子に応じてプログラミング言語を判別し、
ag(grep)に渡す正規表現を決定し、定義と思われる場所にジャンプします。
一般的にプログラミング言語では関数・変数定義の構文が決まっているので、
それに基づいてカーソル位置のシンボルの定義の正規表現を決定します。
からはそれで見付からない場合はカーソル位置のシンボルを検索します(fallback)。
もし、一箇所に決定できない場合はポップアップメニューで選択肢が出てきます。
動的言語によるDSLまでは対応していませんが、
普通の関数定義・変数定義にはジャンプできる程度の精度はあります。
たとえばelispでいえばdefine-minor-modeなどで定義された関数にはジャンプできません。
から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
追加 - C言語
追加 - C++
追加
使えるコマンド
マイナーモード 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による定義なのでジャンプできませんが、
からはdumb-jump-modeの定義にもジャンプできます。
dumb-jump-goはpopup.elによる選択肢が現れます。
C-p/C-nで選択してRETで決定します。
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を送ってあげてください。
本サイト内の関連パッケージ
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。