bbatsov/projectile@bbcf781 -> bbatsov/projectile@46d2010 domtronn/all-the-icons.el@ed8e44d -> domtronn/all-the-icons.el@8c02280 emacsmirror/straight@fc077dd -> emacsmirror/straight@0c7c757 justbur/emacs-which-key@3642c11 -> justbur/emacs-which-key@e48e190 jwiegley/use-package@7d92536 -> jwiegley/use-package@4fb1f9a purcell/ns-auto-titlebar@1efc30d -> purcell/ns-auto-titlebar@60273e7 + :app - :app calendar kidd/org-gcal.el@7445058 -> kidd/org-gcal.el@2cad2d8 - :app irc jorgenschaefer/circe@e5bf5f8 -> jorgenschaefer/circe@89aac22 - :app rss skeeto/elfeed@d0405e6 -> skeeto/elfeed@8fb09ad - :app twitter abo-abo/avy@509471b -> abo-abo/avy@bbf1e73 + :completion - :completion company company-mode/company-mode@5eb7d86 -> company-mode/company-mode@54f60ef sebastiencs/company-box@889d723 -> sebastiencs/company-box@20384f0 - :completion helm emacs-helm/helm@5d224cb -> emacs-helm/helm@e9a1e53 tumashu/posframe@922e4d2 -> tumashu/posframe@7b92a54 - :completion ivy abo-abo/swiper@c6b60d3 -> abo-abo/swiper@9bb6841 raxod502/prescient.el@b11d79b -> raxod502/prescient.el@cc289ba snyball/ivy-posframe@4474956 -> snyball/ivy-posframe@82a63ae + :checkers - :checkers syntax alexmurray/flycheck-posframe@2b3e94c -> alexmurray/flycheck-posframe@c928b5b + :editor - :editor evil emacs-evil/evil@2bc6ca3 -> emacs-evil/evil@1e7aa5b emacs-evil/evil-collection@3e62b6b -> emacs-evil/evil-collection@c136589 - :editor fold seregaxvm/vimish-fold@6368523 -> seregaxvm/vimish-fold@9d12e39 - :editor god emacsorphanage/god-mode@1eb6ef3 -> emacsorphanage/god-mode@ad2e674 - :editor lispy abo-abo/lispy@cdaa9c7 -> abo-abo/lispy@0a9dcfd noctuid/lispyville@25a7012 -> noctuid/lispyville@0f13f26 - :editor objed clemera/objed@e89d8da -> clemera/objed@dea5a64 - :editor snippets joaotavora/yasnippet@5b1217a -> joaotavora/yasnippet@5cbdbf0 hlissner/doom-snippets@21b7c8d -> hlissner/doom-snippets@60c57d6 - :editor word-wrap emacs-straight/adaptive-wrap@1810c0e -> emacs-straight/adaptive-wrap@319db64 + :emacs - :emacs dired purcell/diredfl@83567d0 -> purcell/diredfl@cd052df - :emacs ibuffer purcell/ibuffer-projectile@504b0ed -> purcell/ibuffer-projectile@ecbe482 purcell/ibuffer-vc@1249c1e -> purcell/ibuffer-vc@5fa6aea - :emacs undo emacs-straight/undo-tree@5b6df03 -> emacs-straight/undo-tree@7523823 ideasman42/emacs-undo-fu@46de023 -> ideasman42/emacs-undo-fu@c0806c1 - :emacs vc magit/magit@d459e52 -> magit/magit@321214c pidu/git-timemachine@391eb61 -> pidu/git-timemachine@8d67575 + :email + :email notmuch https://git.notmuchmail.org/git/notmuch@ad9c2e9 -> https://git.notmuchmail.org/git/notmuch@8776faf org-mime/org-mime@9f84446 -> org-mime/org-mime@9bb6351 + :email wanderlust wanderlust/semi@57a948c -> wanderlust/semi@10897f0 + :input - :input japanese skk-dev/ddskk@fe7f82b -> skk-dev/ddskk@275a831 + :lang - :lang agda agda/agda@8eb0d01 -> agda/agda@36738c1 - :lang cc Andersbakken/rtags@080cb0e -> Andersbakken/rtags@b57b360 MaskRay/emacs-ccls@44f1fb3 -> Sarcasm/irony-mode@5f75fc0 emacsmirror/cmake-mode@bfe85bc -> emacsmirror/cmake-mode@e58c411 - :lang common-lisp joaotavora/sly@becf7b7 -> joaotavora/sly@155cb06 - :lang coq ProofGeneral/PG@0f0bb2c -> ProofGeneral/PG@03e427a cpitclaudel/company-coq@7ec8058 -> cpitclaudel/company-coq@b096cb5 - :lang dart emacs-lsp/lsp-dart@a06fc74 -> emacs-lsp/lsp-dart@437c548 - :lang elixir elixir-editors/emacs-elixir@02a3922 -> elixir-editors/emacs-elixir@01b3324 - :lang elm jcollard/elm-mode@7782be0 -> jcollard/elm-mode@363da4b - :lang emacs-lisp clojure-emacs/cider@9e117c2 -> clojure-emacs/cider@a89b694 clojure-emacs/clojure-mode@da9f1ec -> clojure-emacs/clojure-mode@84ed16c jorgenschaefer/emacs-buttercup@e71a40f -> jorgenschaefer/emacs-buttercup@0e5eae0 xuchunyang/elisp-demos@4cd55a3 -> xuchunyang/elisp-demos@8c97481 - :lang erlang erlang/otp@3065fbf -> erlang/otp@d9bc785 - :lang ess emacs-ess/ESS@3c2fb63 -> emacs-ess/ESS@1baf8bf - :lang fuel factor/factor@497d649 -> factor/factor@3fdb032 - :lang fsharp fsharp/emacs-fsharp-mode@8c86e38 -> fsharp/emacs-fsharp-mode@3e41fe1 - :lang fstar FStarLang/fstar-mode.el@aaaf256 -> FStarLang/fstar-mode.el@bd28cb8 - :lang haskell jyp/dante@7411904 -> jyp/dante@c516bc9 - :lang hy hylang/hy-mode@e2d5fec -> hylang/hy-mode@55e84ca - :lang idris idris-hackers/idris-mode@acc8835 -> idris-hackers/idris-mode@b77eadd - :lang java mopemope/meghanada-emacs@e119c7b -> mopemope/meghanada-emacs@1e41f7f - :lang javascript ananthakumaran/tide@13e7af7 -> ananthakumaran/tide@f0b6dac emacs-typescript/typescript.el@0fc7297 -> emacs-typescript/typescript.el@42a60e5 mooz/js2-mode@5049e54 -> mooz/js2-mode@40aab27 - :lang julia JuliaEditorSupport/julia-emacs@1c122f1 -> JuliaEditorSupport/julia-emacs@b5f5983 tpapp/julia-repl@5fa04de -> tpapp/julia-repl@d073acb - :lang kotlin Emacs-Kotlin-Mode-Maintainers/kotlin-mode@ab61099 -> Emacs-Kotlin-Mode-Maintainers/kotlin-mode@8e6dd57 - :lang latex emacs-straight/adaptive-wrap@1810c0e -> emacs-straight/adaptive-wrap@319db64 emacs-straight/auctex@6abf890 -> emacs-straight/auctex@59e251c iyefrat/evil-tex@bb01576 -> iyefrat/evil-tex@06234c9 - :lang lean leanprover/lean-mode@65b55b1 -> leanprover/lean-mode@6b43776 - :lang ledger ledger/ledger-mode@7d78645 -> ledger/ledger-mode@805507f - :lang markdown Fanael/edit-indirect@935ded3 -> Fanael/edit-indirect@bdc8f54 jrblevin/markdown-mode@fa9fa20 -> jrblevin/markdown-mode@ef2cb4d seagle0128/grip-mode@52768a0 -> seagle0128/grip-mode@281ada2 - :lang nix NixOS/nix-mode@a00b3f7 -> NixOS/nix-mode@0cf1ea1 - :lang ocaml ocaml-ppx/ocamlformat@27a49cc -> ocaml-ppx/ocamlformat@cd0eaa8 ocaml/dune@66cfb3a -> ocaml/dune@daea74e - :lang org abo-abo/org-download@768716b -> abo-abo/org-download@67b3c74 bastibe/org-journal@a6378dc -> bastibe/org-journal@a2728e2 dzop/emacs-jupyter@785edbb -> dzop/emacs-jupyter@360cae2 emacs-straight/org-mode@a1e5bee -> emacs-straight/org-mode@220f2b0 hniksic/emacs-htmlize@86f22f2 -> hniksic/emacs-htmlize@4920510 integral-dw/org-superstar-mode@1748185 -> integral-dw/org-superstar-mode@94f35c2 oer/org-re-reveal@c548e23 -> oer/org-re-reveal@7fe39d5 org-roam/company-org-roam@5d7ccd9 -> org-roam/company-org-roam@1132663 org-roam/org-roam@0aa0a7c -> org-roam/org-roam@c33867e - :lang php emacs-php/php-mode@4345dfd -> emacs-php/php-mode@f4c7c69 jwiegley/emacs-async@86aef2c -> jwiegley/emacs-async@36a1015 - :lang plantuml skuro/plantuml-mode@ea45a13 -> skuro/plantuml-mode@5889166 - :lang python cython/cython@0208bf2 -> cython/cython@fcfd16c emacs-lsp/lsp-pyright@3cf2e8f -> emacs-lsp/lsp-pyright@9603dda emacs-lsp/lsp-python-ms@7a502e6 -> emacs-lsp/lsp-python-ms@a884a9a necaris/conda.el@9d02130 -> necaris/conda.el@9f7eea1 wbolster/emacs-python-pytest@6a3b4e5 -> wbolster/emacs-python-pytest@fc056fa - :lang racket greghendershott/racket-mode@29afd25 -> greghendershott/racket-mode@c55fd70 - :lang rest pashky/restclient.el@e8ca809 -> pashky/restclient.el@ac8aad6 - :lang ruby nonsequitur/inf-ruby@f3c927c -> nonsequitur/inf-ruby@9f0f79f - :lang rust brotzeit/rustic@0ec0688 -> brotzeit/rustic@75b9920 - :lang scala emacs-lsp/lsp-metals@3d4d4b7 -> emacs-lsp/lsp-metals@039aa72 hvesalai/emacs-sbt-mode@633a315 -> hvesalai/emacs-sbt-mode@4358ed8 hvesalai/emacs-scala-mode@46bb948 -> hvesalai/emacs-scala-mode@1d08e88 - :lang scheme flatwhatson/flycheck-guile@f37b614 -> flatwhatson/flycheck-guile@2940f16 jaor/geiser@0c86289 -> jaor/geiser@adc5c4a - :lang solidity ethereum/emacs-solidity@022b315 -> ethereum/emacs-solidity@d166a86 - :lang swift emacs-lsp/lsp-sourcekit@04d75b6 -> emacs-lsp/lsp-sourcekit@130f7a8 swift-emacs/swift-mode@2ab9ea1 -> swift-emacs/swift-mode@d266fbd - :lang web fxbois/web-mode@a2badd0 -> fxbois/web-mode@60ffd87 - :lang yaml yoshiki/yaml-mode@cecf4b1 -> yoshiki/yaml-mode@68fecb5 + :term - :term term manateelazycat/multi-term@7307ddd -> manateelazycat/multi-term@017c77c + :tools - :tools ansible yoshiki/yaml-mode@34648f2 -> yoshiki/yaml-mode@68fecb5 - :tools debugger emacs-lsp/dap-mode@85a6163 -> emacs-lsp/dap-mode@4b18543 realgud/realgud@5b0ed08 -> realgud/realgud@332d136 tumashu/posframe@6d604a7 -> tumashu/posframe@7b92a54 - :tools docker Silex/docker.el@d6233bd -> Silex/docker.el@3773112 - :tools editorconfig editorconfig/editorconfig-emacs@9a73ff7 -> editorconfig/editorconfig-emacs@9bc1343 - :tools ein millejoh/emacs-ipython-notebook@ccbed30 -> millejoh/emacs-ipython-notebook@99a4718 - :tools lookup jacktasia/dumb-jump@b815731 -> jacktasia/dumb-jump@0d74b2f - :tools lsp emacs-lsp/helm-lsp@5c960e7 -> emacs-lsp/helm-lsp@4263c96 emacs-lsp/lsp-mode@edb8119 -> emacs-lsp/lsp-mode@4145a70 emacs-lsp/lsp-ui@1f3e970 -> emacs-lsp/lsp-ui@c39ae37 joaotavora/eglot@fb6b17e -> joaotavora/eglot@5f873d2 - :tools magit magit/forge@2c48746 -> magit/forge@feee7e2 magit/magit@798aff5 -> magit/magit@321214c - :tools pass zx2c4/password-store@07b169e -> zx2c4/password-store@06f4999 - :tools rgb emacs-straight/rainbow-mode@f780ddb -> emacs-straight/rainbow-mode@fdff98b + :ui - :ui doom hlissner/emacs-doom-themes@8a5538e -> hlissner/emacs-doom-themes@24023de - :ui fill-column laishulu/hl-fill-column@43cb3c3 -> laishulu/hl-fill-column@5782a91 - :ui hl-todo tarsius/hl-todo@3bba459 -> tarsius/hl-todo@0598b98 - :ui hydra abo-abo/hydra@87873d7 -> abo-abo/hydra@112e689 - :ui indent-guides DarthFennec/highlight-indent-guides@1b12c7b -> DarthFennec/highlight-indent-guides@a4f7714 - :ui modeline seagle0128/doom-modeline@881e099 -> seagle0128/doom-modeline@ffbaaee - :ui tabs ema2159/centaur-tabs@9114ef4 -> ema2159/centaur-tabs@7e0332b - :ui treemacs Alexander-Miller/treemacs@644e940 -> Alexander-Miller/treemacs@027e03b - :ui window-select abo-abo/ace-window@7003c88 -> abo-abo/ace-window@c7cb315
tools/lookup
Table of Contents TOC
Description
This module adds code navigation and documentation lookup tools to help you quickly look up definitions, references, documentation, dictionary definitions or synonyms.
- Jump-to-definition and find-references implementations that just work.
- Powerful xref integration for languages that support it.
- Search online providers like devdocs.io, stackoverflow, google, duckduckgo or youtube (duckduckgo and google have live suggestions).
- Integration with Dash.app docsets.
- Support for online (and offline) dictionaries and thesauruses.
Module Flags
-
+dictionary
Enable word definition and thesaurus lookup functionality.+offline
Install and prefer offline dictionary/thesaurus.
+docsets
Enable integration with Dash.app docsets.
Plugins
- dumb-jump
- ivy-xref or helm-xref
- request
-
+docsets
-
+dictionary
-
if macOS
- osx-dictionary* (on macOS)
-
else
- define-word
- powerthesaurus
-
+offline
-
Prerequisites
This module has several soft dependencies:
ripgrep
as a last-resort fallback for jump-to-definition/find-references.sqlite3
for Dash docset support (if you have+docsets
enabled)wordnet
for offline dictionary and thesaurus support (if you have+dictionary +offline
enabled).
MacOS
brew install ripgrep wordnet
# An older version of sqlite is included in MacOS. If it causes you problems (and
# folks have reported it will), install it through homebrew:
brew install sqlite
# Note that it's keg-only, meaning it isn't symlinked to /usr/local/bin. You'll
# have to add it to PATH yourself (or symlink it into your PATH somewhere). e.g.
export PATH="/usr/local/opt/sqlite/bin:$PATH"
Arch Linux
sudo pacman -S sqlite ripgrep
yay -S wordnet-cli
NixOS
environment.systemPackages = with pkgs; [
ripgrep
sqlite
wordnet
];
Features
Jump to definition
Use +lookup/definition
(bound to gd
in normal mode) to jump to the
definition of the symbol at point
This module provides a goto-definition implementation that will try the following sources before giving up:
- Whatever
:definition
function is registered for the current buffer with the:lookup
setting (see "Configuration" section). - Any available xref backends.
dumb-jump
(a text search with aides to reduce false positives).- An ordinary project-wide text search with ripgrep.
- If
evil-mode
is active, useevil-goto-definition
, which preforms a simple text search within the current buffer.
If there are multiple results, you will be prompted to select one.
Find references
Use +lookup/references
(bound to gD
in normal mode) to see a list of
references for the symbol at point from throughout your project.
Like +lookup/definition
, this tries a number of sources before giving up. It
will try:
- Whatever
:references
function is registered for the current buffer with the:lookup
setting (see "Configuration" section). - Any available xref backends.
- An ordinary project-wide text search with ripgrep.
If there are multiple results, you will be prompted to select one.
Look up documentation
+lookup/documentation
(bound to K
in normal mode) will open documentation
for the symbol at point.
Depending on your configuration, this will try a list of sources:
- Whatever
:documentation
function is registered for the current buffer with the:lookup
setting (see "Configuration" section). - Any Dash.app docsets, if any are installed for the current major mode.
- devdocs.io, if it has a docset for the current mode.
- An online search; using the last engine used (it will prompt you the first
time, or if
current-prefix-arg
is non-nil).
Search a specific documentation backend
You can perform a documentation lookup on any backends directly:
- Dash Docsets:
+lookup/in-docsets
, or:dash QUERY
for evil users. - Online (generic):
+lookup/online
or+lookup/online-select
(bound toSPC / o
), or:lo[okup] QUERY
for evil users.
Dash.app Docset integration
You can install dash docsets with M-x +lookup/install-docset
and search them
offline with M-x +lookup/in-docsets
, or with +lookup/documentation
in modes
that don't have a specialized :documentation lookup handler.
Configuration
Associating lookup handlers with major modes
set-lookup-handlers! MODES &key DEFINITION REFERENCES DOCUMENTATION FILE XREF-BACKEND ASYNC
Use set-lookup-handlers!
to register lookup targets for MODES (a major or
minor mode symbol or list thereof). PLIST accepts the following optional
properties:
-
:definition FN
- Run when jumping to a symbol's definition. Used by
+lookup/definition
. -
:references FN
- Run when looking for usage references of a symbol in the
current project. Used by
+lookup/references
. -
:documentation FN
- Run when looking up documentation for a symbol. Used by
+lookup/documentation
. -
:file FN
- Run when looking up the file for a symbol/string. Typically a
file path. Used by
+lookup/file
. -
:xref-backend FN
- Defines an xref backend, which implicitly provides :definition and :references handlers. If you specify them anyway, they will take precedence over the xref backend, however.
e.g.
;; For python-mode, anaconda-mode offers a backend for all three lookup
;; functions. We can register them like so:
(set-lookup-handlers! 'python-mode
:definition #'anaconda-mode-find-definitions
:references #'anaconda-mode-find-references
:documentation #'anaconda-mode-show-doc)
;; If a language or plugin provides a custom xref backend available for it, use
;; that instead. It will provide the best jump-to-definition and find-references
;; experience. You can specify custom xref backends with:
(set-lookup-handlers! 'js2-mode :xref-backend #'xref-js2-xref-backend)
;; NOTE: xref doesn't provide a :documentation backend.
Associating Dash docsets with major modes
set-docsets! MODES &rest DOCSETS...
Use set-docsets!
to register DOCSETS (one string or list of strings) for MODES
(one major mode symbol or a list of them). It is used by +lookup/in-docsets
and +lookup/documentation
.
e.g.
(set-docsets! 'js2-mode "JavaScript" "JQuery")
;; Add docsets to minor modes by starting DOCSETS with :add
(set-docsets! 'rjsx-mode :add "React")
;; Or remove docsets from minor modes
(set-docsets! 'nodejs-mode :remove "JQuery")
This determines what docsets to implicitly search for when you use
+lookup/documentation
in a mode with no :documentation
handler. Those
docsets must be installed with +lookup/install-docset
.
Open in eww instead of browser
To open results from +lookup/online
or +lookup/in-docsets
in EWW instead
of your system browser, change +lookup-open-url-fn
(default:
#'browse-url
):
(setq +lookup-open-url-fn #'eww)
Open in Xwidget WebKit instead of browser
To open results from +lookup/online
or +lookup/in-docsets
in Xwidget
WebKit instead of your system browser, set +lookup-open-url-fn
to
+lookup-xwidget-webkit-open-url-fn
(needs Emacs with Xwidgets support):
(setq +lookup-open-url-fn #'+lookup-xwidget-webkit-open-url-fn)
Appendix
Commands
+lookup/definition
+lookup/references
+lookup/documentation
+lookup/online
+lookup/online-select
+lookup/in-devdocs
+lookup/in-docsets