doomemacs/modules/completion/ivy
Henrik Lissner 4daa9271a0
Introduce general.el & rewrite map!
+ Now uses an overriding keymap for leader keys, so that it is always
  available, even outside of normal/visual states. In insert/emacs
  states, or in sessions where evil is absent, an alternative prefix is
  used for leader/localleader keys. See these variables:
  + doom-leader-prefix
  + doom-leader-alt-prefix
  + doom-localleader-prefix
  + doom-localleader-alt-prefix
+ Keybinds now support alternative prefixes through the new :alt-prefix
  property. This is useful for non-evil users and non-normal evil
  states. By default, this is M-SPC (leader) and M-SPC m (localleader).
+ Removed +evil-commands flag from config/default (moved to
  feature/evil/+commands.el).
+ config/default/+bindings.el has been split into
  config/default/+{evil,emacs}-bindings.el, which one is loaded depends
  on whether evil is present or not. The latter is blank, but will soon
  be populated with a keybinding scheme for non-evil users (perhaps
  inspired by #641).
+ The define-key! macro has been replaced; it is now an alias for
  general-def.
+ Added unmap! as an alias for general-unbind.
+ The following modifier key conventions are now enforced for
  consistency, across all OSes:
    alt/option      = meta
    windows/command = super
  It used to be
    alt/option      = alt
    windows/command = meta
  Many of the default keybinds have been updated to reflect this switch,
  but it is likely to affect personal meta/super keybinds!

The map! macro has also been rewritten to use general-define-key. Here
is what has been changed:

+ map! no longer works with characters, e.g. (map! ?x #'do-something) is
  no longer supported. Keys must be kbd-able strings like "C-c x" or
  vectors like [?C-c ?x].
+ The :map and :map* properties are now the same thing. If specified
  keymaps aren't defined when binding keys, it is automatically
  deferred.
+ The way you bind local keybinds has changed:

    ;; Don't do this
    (map! :l "a" #'func-a
          :l "b" #'func-b)
    ;; Do this
    (map! :map 'local "a" #'func-a
                      "b" #'func-b)

+ map! now supports the following new blocks:
  + (:if COND THEN-FORM ELSE-FORM...)
  + (:alt-prefix PREFIX KEYS...) -- this prefix will be used for
    non-normal evil states. Equivalent to :non-normal-prefix in general.
+ The way you declare a which-key label for a prefix key has changed:

    ;; before
    (map! :desc "label" :prefix "a" ...)
    ;; now
    (map! :prefix ("a" . "label") ...)

+ It used to be that map! supported binding a key to a key sequence,
  like so:

    (map! "a" [?x])  ; pressing a is like pressing x

  This functionality was removed *temporarily* while I figure out the
  implementation.

Addresses: #448, #814, #860
Mentioned in: #940
2018-12-22 04:14:43 -05:00
..
autoload completion/{helm,ivy}: fix stringp error 2018-12-11 18:59:30 -05:00
config.el Introduce general.el & rewrite map! 2018-12-22 04:14:43 -05:00
doctor.el completion/ivy: fix header vars in doctor.el 2018-05-09 10:22:03 +02:00
packages.el completion/ivy: bring back flx 2018-08-04 13:47:19 +02:00
README.org Fix typo in ivy/README.org 2018-08-27 22:49:57 -07: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-workspace-buffer SPC b b Jump to buffer in current workspace
ivy-switch-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)