doomemacs/modules/completion/ivy
Henrik Lissner 1e81a35461
Minimize dependence on map!
This is in preparation for general.el integration coming in 2.1.1. It is
very likely that map! will change (and even more, be split into several
macros). Not much, but change none-the-less. Specifically, the state
keywords (e.g. :nvi, :n, :i) will be removed in favor of a :state
property that takes a list, e.g. (normal visual insert).

In any case, both map! and general are also relatively expensive
compared to define-key and evil-define-key* (and the new define-key!
macro), so use that when we can.

This also means changes to either API won't affect Doom's modules in the
long term.
2018-06-03 15:46:00 +02:00
..
autoload fixup! Refactor ivy project-search functionality 2018-06-02 20:31:50 +02:00
config.el Minimize dependence on map! 2018-06-03 15:46:00 +02:00
doctor.el completion/ivy: fix header vars in doctor.el 2018-05-09 10:22:03 +02:00
packages.el completion/ivy: add +fuzzy flag 2018-05-30 16:05:21 +02:00
README.org Update & reformat module readmes for v2.0.9 2018-01-01 13:21:53 -05:00

:completion ivy

This module adds Ivy, a completion backend.

I prefer ivy over ido for its flexibility. I prefer ivy over helm because it's lighter.

  • Project-wide search & replace powered by rg or ag
  • Project jump-to navigation ala Command-T, Sublime Text's Jump-to-anywhere or Vim's CtrlP plugin.
  • Ivy integration for M-x, imenu, recentf and others.
  • A powerful, interactive in-buffer search using swiper.
  • Ivy-powered TODO/FIXME navigation

Install

This module optionally depends on ripgrep and the_silver_searcher.

rg is faster, but its results aren't deterministic, neither does it support multiline search or full PCRE (at the time of writing), that's where ag is useful.

MacOS

brew install ripgrep the_silver_searcher

Arch Linux

sudo pacman --needed --noconfirm -S ripgrep the_silver_searcher

Usage

Here is some insight into how I use this module.

Project search & replace

There are four Ex interfaces for the silver searcher and ripgrep. They are:

  • :ag[!]
  • :agcwd[!]
  • :rg[!]
  • :rgcwd[!]

The optional BANG tells ag/rg to include ignored files in the search. And the \*cwd variant of each command will only search in the current directory (non-recursively).

/screenshots/modules/completion/ivy/ivy-search.gif

Now, how do we do text replacements? With the ivy popup open you can press S+Tab to create an wgrep buffer out of the results.

/screenshots/modules/completion/ivy/ivy-search-replace.gif

Make your modifications and press C-c C-c to commit them, or C-c C-k to abort.

Jump-to-file project navigation

Inspired by Sublime Text's jump-to-anywhere, Vim's CtrlP/Unite plugins, and Textmate's Command-T, a marriage of projectile and ivy makes this available in Emacs.

Invoke it with SPC f /, SPC SPC or M-x counsel-projectile-find-file.

/screenshots/modules/completion/ivy/ivy-projectile.gif

In-buffer searching

I use evil-search (invoked by pressing / in normal mode) when jumping small/moderate (or predictable) distances. However, there are occasions where I need more feedback, so I turn to swiper (available directly with M-x swiper RET, or via :sw[iper]).

/screenshots/modules/completion/ivy/ivy-swiper.gif

Task lookup

I sprinkle my projects with TODO's & FIXME's. You can navigate to and peruse them via M-x +ivy/tasks or :todo[!] (ex command).

/screenshots/modules/completion/ivy/ivy-todo.gif

Appendix

Commands

Here is a list of my commonly used commands, their default keybinds (defined in private/default/+bindings.el), and their corresponding ex command (defined in private/default/+evil-commands.el).

command key / ex command description
counsel-M-x M-x Smarter, smex-powered M-x
counsel-bookmark SPC RET Find bookmark
counsel-find-file SPC f . or SPC . Browse from current directory
counsel-projectile-find-file SPC f / or SPC SPC Find file in project
counsel-projectile-switch-project SPC p p Open another project
counsel-recentf SPC f r Find recently opened file
ivy-switch-buffer SPC b b Jump to buffer in current workspace
+ivy/switch-workspace-buffer SPC b B Jump to buffer across workspaces
+ivy:ag :ag[!] [QUERY] Search project (BANG = ignore gitignore)
+ivy:ag-cwd :agcwd[!] [QUERY] Search this directory (BANG = don't recurse into subdirectories)
+ivy:rg :rg[!] [QUERY] Search project (if BANG, ignore gitignore)
+ivy:rg-cwd :rgcwd[!] [QUERY] Search this directory (BANG = don't recurse into subdirectories)
+ivy:swiper :sw[iper] [QUERY] Search current buffer
+ivy:todo :todo[!] List all TODO/FIXMEs in project (or current file if BANG)

While in a search (e.g. invoked from +ivy:ag or +ivy:rg), these new keybindings are available to you:

key description
<backtab> Perform search/replace on the search results (open occur buffer in wgrep mode)
C-SPC Preview the current candidate
M-RET Open the selected candidate in other-window

Hacks

  • Functions with ivy/counsel equivalents have been globally remapped (like find-file => counsel-find-file). So a keybinding to find-file will invoke counsel-find-file instead.
  • counsel-[arp]g's 3-character limit was reduced to 1 (mainly for the ex command)