Code Monkey home page Code Monkey logo

dumb-jump's Introduction

dumb-jump

Join the chat at https://gitter.im/jacktasia/dumb-jump Build Status Coverage Status MELPA MELPA Stable

Dumb Jump GIF

About

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.

How it works

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.

Success Rate

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).

Supported Languages

There is currently basic support for the following languages:

  • Bash
  • C/C++
  • C#
  • Clojure
  • CoffeeScript
  • Coq
  • Elixir
  • Emacs Lisp
  • Erlang
  • Faust
  • Fortran
  • Go
  • Haskell
  • Java
  • JavaScript
  • Julia
  • Lua
  • Objective-C
  • OCaml
  • Perl
  • PHP
  • Python
  • R
  • Ruby
  • Rust
  • Scala
  • Swift

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.

Installing

The recommended way to install Dumb Jump is via package.el. It's available on MELPA: M-x package-install dumb-jump

Spacemacs

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.

Installing ag or rg

Dumb Jump performs best with The Silver Searcher ag (ag install instructions) or ripgrep rg (rg install instructions) installed on your system.

Usage

Basic

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 point
  • dumb-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 like dumb-jump-go but shows tooltip with file, line, and context
  • dumb-jump-go-other-window exactly like dumb-jump-go but uses find-file-other-window instead of find-file
  • dumb-jump-go-prefer-external like dumb-jump-go but will prefer definitions not in the current buffer
  • dumb-jump-go-prefer-external-other-window expected combination of dumb-jump-go-prefer-external and dumb-jump-go-other-window
  • dumb-jump-go-prompt exactly like dumb-jump-go but prompts user for function to jump to instead of using symbol at point

Configuration

Excluding project directories

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.

Project root directory denoters: .dumbjump .projectile .git .hg .fslckout .bzr _darcs .svn Makefile PkgInfo -pkg.el.

If you want to stop a directory from registering as the project root (and have Dumb Jump keep looking) add an empty .dumbjumpignore file in that directory.

Example .dumbjump
-tests
-node_modules
-build
-images
+../some-lib/src
+/usr/lib/src

NOTE When adding paths outside of the project (using +) ensure you use dumb-jump-force-searcher of either 'ag or 'rg (see below). This is required because the default searcher (git-grep) won't be able to search outside of the project root. This edge case will be fixed in a future release. That is, git-grep will NOT be set as the default searcher if a .dumpjump is present with a + path outside of the repo.

.emacs options
  • (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 customize dumb-jump-find-rules variable.
  • (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.
  • (setq dumb-jump-selector 'helm) to use helm instead of the default popup for multiple options.
  • (setq dumb-jump-force-searcher 'rg) to force the search program Dumb Jump should use. It will always use this searcher. If not set (nil) Dumb Jump will use git-grep if it's a git project and if not will try searchers in the following order ag, rg, grep (first installed wins). This is necessary if you want full control over the searcher Dumb Jump uses.
  • (setq dumb-jump-aggressive nil) to only automatically jump if there's only one match and otherwise present you with a list. This defaults to t, which means it will try its best to guess where you want to jump and only if it can't then give you a list of matches.
  • (setq dumb-jump-use-visible-window nil) if t (the default) when you're using multiple windows/panes and the file to jump to is already open in one of those windows then dump jump will focus that window and jump there instead of within your current window.
  • (setq dumb-jump-prefer-searcher 'rg) to let Dumb Jump know your searcher preference. If set this will still use git-grep if it's a git project (because it's the fastest), but will you use whatever you set here in any other situation. If not set Dumb Jump will follow the same order as mentioned in the dumb-jump-force-searcher description. At this time setting this value is only necessary if you prefer rg but have ag installed too.

If your project has multi-line method signatures you should use ag.

To learn more about how Dumb Jump picks a searcher see this issue and this pull request.

use-package example configuration.

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)
         ("M-g i" . dumb-jump-go-prompt)
         ("M-g x" . dumb-jump-go-prefer-external)
         ("M-g z" . dumb-jump-go-prefer-external-other-window))
  :config (setq dumb-jump-selector 'ivy) ;; (setq dumb-jump-selector 'helm)
  :ensure)

Why?

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).

Contributing

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.

Running Tests

Requires Cask.

cd /path/to/dumb-jump
cask
make test

Alternatives

Here is a list of potential alternative packages for emacs:

Most of these were sourced from this emacs StackExchange answer.

dumb-jump's People

Contributors

abend avatar adrieankhisbe avatar ashedko avatar cweiske avatar genehack avatar gitter-badger avatar ibrahima avatar jacktasia avatar jonboiser avatar jordonbiondo avatar jschwab avatar jtamagnan avatar knu avatar liangzan avatar magnetophon avatar meqif avatar netromdk avatar olivia5k avatar p-baleine avatar purcell avatar rahiel avatar rgrinberg avatar rockwood avatar tarsius avatar tsloughter avatar vic8722 avatar vzvu3k6k avatar wamaral avatar wbolster avatar wjlroe avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.