Ivy 0.8.0 is out
26 Apr 2016Intro
Ivy is a completion method that's
similar to Ido
, but with emphasis on simplicity and customizability.
New package names
Changes on MELPA
Due to multiple requests, in an attempt to simplify things a new
package ivy
has been released on MELPA. The old package swiper
,
which used to provide most of the ivy
features, now only provides
swiper.el
and depends on ivy
. The third package counsel
, which
provides most of the goodies using ivy
hasn't been changed and is
still on MELPA. All three packages have the version 0.8.0
currently.
To reiterate the dependencies:
ivy
depends on Emacs version larger than 24.1, preferably at least 24.3 (the most common one bundled currently with Linux distributions).swiper
depends onivy
and provides basically 3 commands:swiper
,swiper-multi
andswiper-all
.counsel
depends onswiper
and provides around 50 commands for all kinds of stuff. My favorites arecounsel-M-x
,counsel-git-grep
,counsel-rhythmbox
andcounsel-grep-or-swiper
.
Changes on GNU ELPA
On GNU ELPA, a single package
ivy-0.8.0
has replaced the previous stable version swiper-0.7.0
.
This package provides all the files combined of the three separate
MELPA packages.
Release summary
The release consists of 282 commits over 5 months by 15 authors. The detailed Changelog is available here, thanks to the ever useful Org mode export. The raw Org file is in doc/Changelog.org in the main repository.
The detailed documentation is available as an (ivy)
Info node and
also in HTML form here. If anyone wants
to document something that's missing there, I'd appreciate the help:
simply edit
doc/ivy.org
and send me a PR.
Release highlights
Below, I'll highlight some of the new features.
Allow to compose collections
For example, to stack the top 10 elements of recentf
on top of counsel-locate
, use this code:
(defun small-test ()
(cl-subseq recentf-list 0 10))
(ivy-set-sources
'counsel-locate
'((small-test)
(original-source)))
Here, (original-source)
represents the async candidates of
counsel-locate. All extra sources are static - each function is called
once to generate a list of strings, which will be filtered later.
See #373 for more info.
Improved documentation
If you're not yet familiar with Ivy, you can get a quick reference card by pressing C-h m during any completion session. It will pop up an Org-mode buffer that describes most of the minibuffer key bindings.
Additionally, C-o (hydra-ivy/body
), which serves a quick
reference as well, received a small restructuring and a new
binding. Press D to go to the definition of this
hydra. This is useful to see what each key does, you might even want
to customize some of it.
Completion in region
From now on, ivy-mode
will also set
completion-in-region-function
. This means that functions like:
- C-M-i
complete-symbol
in many major modes, - TAB while in the M-: (
eval-expression
) minibuffer, - TAB in a
shell
buffer,
will use ivy
for completion.
Many improvements to ivy-occur-mode
You can "permanently" save any completion session by pressing C-c
C-o (ivy-occur
). This will generate a new buffer in
ivy-occur-mode
with all your current candidates inserted there.
Clicking or pressing f on any of the candidates in that
buffer will result in the appropriate action being called with that
candidate.
The *ivy-occur ...*
buffers can actually be customized per
collection type. Specifically for swiper
, counsel-git-grep
,
counsel-grep
and counsel-ag
, the customizations are already in
place that allow you to:
- Edit the buffer with
wgrep
by pressing C-x C-q (ivy-wgrep-change-to-wgrep-mode
). - Refresh the buffer due to the original files being changed by pressing g (
ivy-occur-revert-buffer
).
The second feature is often useful to me when I want to somehow change
a symbol throughout the project. First I make a list of all
occurrences via e.g. swiper
and ivy-occur
. After I went through
some of the occurrences, I can press g to refresh the
search for the same symbol and see how many I still have left.
Yet another cool feature is to press c
(ivy-occur-toggle-calling
) to toggle calling the action after each
line movement and cycle through candidates by holding either
j (ivy-occur-next-line
) or k
(ivy-occur-previous-line
).
ivy-set-action
can work on all commands
Here's the code I'm using currently in my config:
(defun ivy-insert-action (x)
(with-ivy-window
(insert x)))
(ivy-set-actions
t
'(("I" ivy-insert-action "insert")))
This allows me to press M-o I to insert the current
candidate into the buffer. For instance, if I want to quote an Emacs
command, I can M-x (counsel-M-x
), select the command I
want and press M-o I to insert it instead of calling it.
Virtual views in ivy-switch-buffer
Here, "virtual" buffer means something that's close to a buffer but
not an actual buffer. If you were using the setting
ivy-use-virtual-buffers
, you'd have your bookmarks and recentf
items available to you as virtual buffers.
The new feature allows to select a whole window configuration with
many buffers inside nested horizontal and vertical splits from
ivy-switch-buffer
.
To use it, set ivy-views
, since it's nil by default. For instance,
here's what I have in my config:
(setq ivy-views
'(("dutch + notes {}"
(vert
(file "dutch.org")
(buffer "notes")))
("ivy {}"
(horz
(file "ivy.el")
(buffer "*scratch*")))))
For a more elaborate and detailed use, see this post by Manuel Uberti.
Magic slash in file name completion
From now on, if you want to enter a directory, simply select a
candidate which is a directory and press /. You can still
use the old binding C-j (ivy-alt-done
), but /
is shorter and easier to get used to if you're switching from Ido.
Note that this does not prevent the use of old functionality like:
- // to enter the root directory,
/ssh:
RET to connect via TRAMP.
A better way to search with counsel-grep-or-swiper
If you've ever been annoyed with the long start-up time of swiper
in
huge buffers, switch to this setting:
(global-set-key "\C-s" 'counsel-grep-or-swiper)
This command will use swiper
for small buffers, and counsel-grep
for large buffers.
Something very similar to this command was highlighted in this post by Karl Voit.
Just to give you an idea of how fast counsel-grep
is:
- It has 0s start-up time, since it's async.
- For a two million line file weighing 50MB produced by copying
org.el
a few times, it takes 0.2s to find the 17,664 occurrences of the wordhook
. It still takes 7.5s to search fororg
in that file, simply because there are 500,000 candidates and it takes time for Emacs to simply receive that input.
A list of all new commands
The new commands since 0.7.0
are: counsel-tmm
, counsel-imenu
,
counsel-decbinds
, counsel-list-processes
,
ivy-switch-buffer-other-window
, counsel-git-stash
,
counsel-git-log
, counsel-pt
, counsel-linux-app
,
counsel-ace-link
, counsel-esh-history
, counsel-shell-history
,
counsel-grep-or-swiper
.
If any of those sound interesting, go ahead and try them out.
Outro
Thanks to all the contributors. Happy hacking!