Dumb Jump is an Emacs "jump to definition" package with support for multiple programming languages that favors "just working". This means minimal -- and ideally zero -- configuration with absolutely no stored indexes (TAGS) or persistent background processes. Dumb Jump requires at least GNU Emacs 24.3
.
Dumb Jump uses The Silver Searcher ag
, ripgrep rg
, or grep
to find potential definitions of a function or variable under point. It uses a set of regular expressions based on the file extension, or major-mode
, of the current buffer. The matches are run through a shared set of heuristic methods to find the best candidate to jump to. If it can't decide it will present the user with a list in a pop-menu.
For the currently supported languages it seems to do a good job of finding what you want. If you find a case where it does not work as expected do not hesitate to open an issue. It can be slow if it needs to use grep
and/or a project is large. Although it can be sped up by installing ag
or installing rg
and/or creating a .dumbjump
file in your project's root directory with paths that should be excluded (see configuration).
There is currently basic support for the following languages:
- Emacs Lisp
- Python
- JavaScript
- PHP
- Ruby
- Java
- C#
- C/C++
- CoffeeScript
- Perl
- Go
- Swift
- Objective-C
- Scala
- Clojure
- Haskell
- Lua
- Rust
- Faust
- R
- Bash
- Fortran
If you have any issues with the existing languages, or you want support for another one, then please open an issue. PRs are also welcome. If you'd like to add a language these PRs for lua and rust are good examples.
The recommended way to install Dumb Jump is via package.el
. It's available on MELPA: M-x package-install dumb-jump
If you're using an up-to-date Spacemacs, then you already have Dumb Jump by default just make sure you install ag
or rg
(see below) to ensure you have the best experience.
Dumb Jump performs best with The Silver Searcher ag
(ag install instructions) or ripgrep rg
(rg install instructions) installed on your system.
Adding (dumb-jump-mode)
to your .emacs
will enable the key bindings for two interactive Dumb Jump functions:
dumb-jump-go
C-M g core functionality. Attempts to jump to the definition for the thing under pointdumb-jump-back
C-M p jumps back to where you were when you jumped. These are chained so if you go down a rabbit hole you can get back out or where you want to be.dumb-jump-quick-look
C-M q likedumb-jump-go
but shows tooltip withfile
,line
, andcontext
dumb-jump-go-other-window
exactly likedumb-jump-go
but usesfind-file-other-window
instead offind-file
Dumb Jump will automatically look for a project root. If it's not finding one then either put a .dumbjump
file in your project root and optionally add excluded directories to make it faster.
-tests
-node_modules
-build
-images
+../some-lib/src
+/usr/lib/src
(setq dumb-jump-default-project "~/code")
to change default project if one is not found (defaults to~
)(setq dumb-jump-quiet t)
if Dumb Jump is too chatty.- To support more languages and/or definition types use
add-to-list
ondumb-jump-find-rules
(see source code). (add-hook 'dumb-jump-after-jump-hook 'some-function)
to execute code after you jump(setq dumb-jump-selector 'ivy)
to use ivy instead of the default popup for multiple options.
I personally no longer use the dumb-jump-mode
keybindings that were inspired by IntelliJ's emacs bindings. I use use-package
like so:
(use-package dumb-jump
:bind (("M-g o" . dumb-jump-go-other-window)
("M-g j" . dumb-jump-go))
:config (setq dumb-jump-selector 'ivy)
:ensure)
I wanted "jump to definition" functionality to "just work" in emacs. I use IntelliJ for Java and this functionality is basically the only thing I miss when I switch back to emacs for work in other languages. There are certainly other packages that offer this type of functionality, but they all require significantly more configuration and are often limited to a particular language. An alternative may be worth setting up if you are in a specific project or language often (see alternatives).
Feedback is very welcome via GitHub issues. I will consider supporting other languages either via issue request or PR. If submitting a PR then please add tests as well.
Requires Cask.
cd /path/to/dumb-jump
cask
make test
Here is a list of potential alternative packages for emacs:
- Tags supports multiple languages
- GNU Global supports multiple languages
- Tern for JavaScript
- elpy for Python
- robe for Ruby
Most of these were sourced from this emacs StackExchange answer.