2022-03-28 15:03:21 +02:00
#+title : :tools lookup
#+subtitle : Navigate your labyrinthine code and docs
#+created : January 04, 2018
#+since : 2.0.9
2021-10-16 01:29:27 +02:00
* Description :unfold:
2020-04-25 02:55:06 -04:00
This module adds code navigation and documentation lookup tools to help you
quickly look up definitions, references, documentation, dictionary definitions
or synonyms.
2018-01-04 17:05:37 -05:00
2021-10-16 01:29:27 +02:00
- Jump-to-definition and find-references implementations that just work.
- Powerful xref integration for languages that support it.
- Search online providers like [[https://devdocs.io ][devdocs.io ]], [[https://stackoverflow.com ][stackoverflow ]], [[https://google.com ][google ]], [[https://duckduckgo.com ][duckduckgo ]], or
[[https://youtube.com ][youtube ]] (duckduckgo and google have live suggestions).
- Integration with [[https://github.com/Kapeli/feeds ][Dash.app docsets ]].
- Support for online (and offline) dictionaries and thesauruses.
** Maintainers
- [[doom-user: ][@hlissner ]]
[[doom-contrib-maintainer: ][Become a maintainer? ]]
** Module flags
- +dictionary ::
Enable word definition and thesaurus lookup functionality.
- +docsets ::
Enable integration with Dash.app docsets.
- +offline ::
2022-09-26 02:19:42 +08:00
Install and prefer offline dictionary/thesaurus (with [[doom-module:+dictionary ]]).
2021-10-16 01:29:27 +02:00
** Packages
2022-09-26 02:19:42 +08:00
- [[doom-package:dumb-jump ]]
- [[doom-package:helm-xref ]] if [[doom-module::completion helm ]]
- [[doom-package:ivy-xref ]] if [[doom-module::completion ivy ]]
- [[doom-package:request ]]
- if [[doom-module:+docsets ]]
- [[doom-package:dash-docs ]]
- [[doom-package:counsel-dash ]] if [[doom-module::completion ivy ]]
- [[doom-package:helm-dash ]] if [[doom-module::completion helm ]]
- if [[doom-module:+dictionary ]]
2021-10-16 01:29:27 +02:00
- if macOS
2022-09-26 02:19:42 +08:00
- [[doom-package:osx-dictionary ]]
2021-10-16 01:29:27 +02:00
- else
2022-09-26 02:19:42 +08:00
- [[doom-package:define-word ]]
- [[doom-package:powerthesaurus ]]
- if [[doom-module:+offline ]]
- [[doom-package:wordnut ]]
- [[doom-package:synosaurus ]]
2021-10-16 01:29:27 +02:00
** Hacks
/No hacks documented for this module./
** TODO Changelog
# This section will be machine generated. Don't edit it by hand.
/This module does not have a changelog yet./
* Installation
[[id:01cffea4-3329-45e2-a892-95a384ab2338 ][Enable this module in your ~doom!~ block. ]]
This module has several optional dependencies:
- ~ripgrep~ as a last-resort fallback for jump-to-definition/find-references.
2022-09-26 02:19:42 +08:00
- ~sqlite3~ for Dash docset support (if you have [[doom-module:+docsets ]] enabled)
2021-10-16 01:29:27 +02:00
- ~wordnet~ for offline dictionary and thesaurus support (if you have
2022-09-26 02:19:42 +08:00
[[doom-module:+dictionary ]] and [[doom-module:+offline ]] enabled).
2018-01-04 17:05:37 -05:00
2019-05-03 20:44:23 -04:00
** MacOS
2021-10-16 01:29:27 +02:00
#+begin_src sh
2020-01-25 16:55:04 -05:00
brew install ripgrep wordnet
2018-01-04 17:05:37 -05:00
# An older version of sqlite is included in MacOS. If it causes you problems (and
2019-05-03 20:44:23 -04:00
# folks have reported it will), install it through homebrew:
2018-01-04 17:05:37 -05:00
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"
2021-10-16 01:29:27 +02:00
#+end_src
2018-01-04 17:05:37 -05:00
2019-05-03 20:44:23 -04:00
** Arch Linux
2021-10-16 01:29:27 +02:00
#+begin_src sh
2020-01-13 09:54:22 +01:00
sudo pacman -S sqlite ripgrep
2020-05-10 23:47:44 +00:00
yay -S wordnet-cli
2021-10-16 01:29:27 +02:00
#+end_src
2020-01-25 16:55:04 -05:00
** NixOS
2021-10-16 01:29:27 +02:00
#+begin_src nix
2020-01-25 16:55:04 -05:00
environment.systemPackages = with pkgs; [
ripgrep
sqlite
wordnet
];
2021-10-16 01:29:27 +02:00
#+end_src
2018-01-04 17:05:37 -05:00
2021-10-16 01:29:27 +02:00
* Usage
2018-01-04 17:05:37 -05:00
** Jump to definition
2021-10-16 01:29:27 +02:00
Use ~+lookup/definition~ (bound to [[kbd: ][gd ]] in normal mode) to jump to the definition
of the symbol at point.
2018-01-04 17:05:37 -05:00
This module provides a goto-definition implementation that will try the
following sources before giving up:
1. Whatever ~:definition~ function is registered for the current buffer with the
~:lookup~ setting (see "Configuration" section).
2. Any available xref backends.
2022-09-26 02:19:42 +08:00
3. [[doom-package:dumb-jump ]] (a text search with aides to reduce false positives).
2021-10-16 01:29:27 +02:00
3. An ordinary project-wide text search with =ripgrep= .
2018-01-04 17:05:37 -05:00
5. If ~evil-mode~ is active, use ~evil-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
2021-10-16 01:29:27 +02:00
Use ~+lookup/references~ (bound to [[kbd: ][gD ]] in normal mode) to see a list of
2018-01-04 17:05:37 -05:00
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:
1. Whatever ~:references~ function is registered for the current buffer with the
2021-10-16 01:29:27 +02:00
~:lookup~ setting (see [[*Configuration ][Configuration ]]).
2022-09-26 02:19:42 +08:00
2. Any available [[doom-package:xref ]] backends.
2020-01-13 09:54:22 +01:00
3. An ordinary project-wide text search with ripgrep.
2018-01-04 17:05:37 -05:00
If there are multiple results, you will be prompted to select one.
** Look up documentation
2021-10-16 01:29:27 +02:00
~+lookup/documentation~ (bound to [[kbd: ][K ]] in normal mode) will open documentation for
the symbol at point.
2018-01-04 17:05:37 -05:00
Depending on your configuration, this will try a list of sources:
1. Whatever ~:documentation~ function is registered for the current buffer with
the ~:lookup~ setting (see "Configuration" section).
2. Any Dash.app docsets, if any are installed for the current major mode.
3. devdocs.io, if it has a docset for the current mode.
4. 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.
2021-10-16 01:29:27 +02:00
+ Online (generic): ~+lookup/online~ or ~+lookup/online-select~ (bound to [[kbd:][SPC /
o]]), or ~:lo[okup] QUERY~ for evil users.
2018-01-04 17:05:37 -05:00
2019-05-03 20:44:23 -04:00
** Dash.app Docset integration
2022-01-03 10:36:47 +00:00
You can install dash docsets with ~M-x dash-docs-install-docset~ and search
2021-03-12 22:56:57 -05:00
them offline with ~M-x +lookup/in-docsets~ , or with ~+lookup/documentation~ in
modes that don't have a specialized :documentation lookup handler.
2019-05-03 20:44:23 -04:00
2018-01-04 17:05:37 -05:00
* Configuration
2019-05-03 20:44:23 -04:00
** Associating lookup handlers with major modes
2021-10-16 01:29:27 +02:00
~set-lookup-handlers! MODES &key DEFINITION REFERENCES DOCUMENTATION FILE
XREF-BACKEND ASYNC~
2018-01-04 17:05:37 -05:00
2019-05-03 20:44:23 -04:00
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:
2018-01-04 17:05:37 -05:00
2021-10-16 01:29:27 +02:00
- ~: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~ ::
2022-09-26 02:19:42 +08:00
Defines an [[doom-package:xref ]] backend, which implicitly provides ~:definition~ and
2021-10-16 01:29:27 +02:00
~:references~ handlers. If you specify them anyway, they will take precedence
over the xref backend, however.
E.g.
#+begin_src emacs-lisp
2018-01-04 17:05:37 -05:00
;; For python-mode, anaconda-mode offers a backend for all three lookup
;; functions. We can register them like so:
2019-01-05 17:15:09 -05:00
(set-lookup-handlers! 'python-mode
2018-01-04 17:05:37 -05:00
: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:
2019-01-05 17:15:09 -05:00
(set-lookup-handlers! 'js2-mode :xref-backend #'xref-js2-xref-backend)
2018-01-04 17:05:37 -05:00
;; NOTE: xref doesn't provide a :documentation backend.
2021-10-16 01:29:27 +02:00
#+end_src
2018-01-04 17:05:37 -05:00
2019-05-03 20:44:23 -04:00
** Associating Dash docsets with major modes
~set-docsets! MODES &rest DOCSETS...~
2018-01-04 17:05:37 -05:00
2019-05-03 20:44:23 -04:00
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~ .
2021-10-16 01:29:27 +02:00
E.g.
#+begin_src emacs-lisp
2019-01-05 17:15:09 -05:00
(set-docsets! 'js2-mode "JavaScript" "JQuery")
2018-01-04 17:05:37 -05:00
;; Add docsets to minor modes by starting DOCSETS with :add
2019-01-05 17:15:09 -05:00
(set-docsets! 'rjsx-mode :add "React")
2018-01-04 17:05:37 -05:00
;; Or remove docsets from minor modes
2019-01-05 17:15:09 -05:00
(set-docsets! 'nodejs-mode :remove "JQuery")
2021-10-16 01:29:27 +02:00
#+end_src
2018-01-04 17:05:37 -05:00
2019-05-03 20:44:23 -04:00
This determines what docsets to implicitly search for when you use
~+lookup/documentation~ in a mode with no ~:documentation~ handler. Those
2022-01-03 10:36:47 +00:00
docsets must be installed with ~dash-docs-install-docset~ .
2019-05-03 20:44:23 -04:00
2018-01-04 17:05:37 -05:00
** Open in eww instead of browser
2021-04-13 22:38:17 -04:00
~+lookup/online~ opens the search results with in ~+lookup-open-url-fn~
(default: ~#'browse-url~ ). Here is how to change this to EWW (so it opens inside
Emacs):
2021-10-16 01:29:27 +02:00
#+begin_src emacs-lisp
2019-05-03 20:44:23 -04:00
(setq +lookup-open-url-fn #'eww)
2021-10-16 01:29:27 +02:00
#+end_src
2018-01-04 17:05:37 -05:00
2021-04-13 22:38:17 -04:00
#+begin_quote
2023-09-16 20:19:11 +02:00
~+lookup/in-docsets~ consults ~dash-docs-browser-func~ instead, which is
2021-10-16 01:29:27 +02:00
already set to ~#'eww~ by default.
2021-04-13 22:38:17 -04:00
#+end_quote
2020-06-24 12:27:25 +09:00
** Open in Xwidget WebKit instead of browser
2021-04-13 22:38:17 -04:00
To open results from ~+lookup/online~ or ~+lookup/in-docsets~ in Xwidget WebKit
instead of your system browser, set ~+lookup-open-url-fn~ and/or
~dash-docs-browser-func~ to ~+lookup-xwidget-webkit-open-url-fn~ (needs Emacs
with Xwidgets support):
2021-10-16 01:29:27 +02:00
#+begin_src emacs-lisp
2020-06-24 12:27:25 +09:00
(setq +lookup-open-url-fn #'+lookup-xwidget-webkit-open-url-fn)
2021-04-13 22:38:17 -04:00
(after! dash-docs
(setq dash-docs-browser-func #'+lookup-xwidget-webkit-open-url-fn))
2021-10-16 01:29:27 +02:00
#+end_src
* Troubleshooting
/There are no known problems with this module./ [[doom-report: ][Report one? ]]
* Frequently asked questions
/This module has no FAQs yet./ [[doom-suggest-faq: ][Ask one? ]]
* TODO Appendix
#+begin_quote
2023-09-16 20:19:11 +02:00
/This module's appendix is incomplete./ [[doom-contrib-module: ][Write more? ]]
2021-10-16 01:29:27 +02:00
#+end_quote
2020-06-24 12:27:25 +09:00
2018-01-04 17:05:37 -05:00
** Commands
2021-10-16 01:29:27 +02:00
- ~+lookup/definition~
- ~+lookup/references~
- ~+lookup/documentation~
- ~+lookup/online~
- ~+lookup/online-select~
- ~+lookup/in-devdocs~
- ~+lookup/in-docsets~