Oleh Krehel [Thu, 5 Nov 2015 13:42:36 +0000 (14:42 +0100)]
Add a better ivy-occur pulse to swiper and counsel-git-grep
* ivy.el (ivy-occur-press): Bind `ivy-exit' to 'done, so that
`swiper--add-overlays' called by ACTION don't do anything.
Call another `swiper--add-overlays' for swiper and counsel-git-grep,
limited to the current line. Call `swiper--cleanup' with a delay of 1
second.
Oleh Krehel [Wed, 4 Nov 2015 18:10:09 +0000 (19:10 +0100)]
ivy.el (ivy-occur-press): Extend with-ivy-window
ivy-occur-action should be called in (ivy--get-window ivy-last).
This means, for purposes of e.g. `counsel-find-symbol' or
`lispy--action-jump` that if *ivy-occur* is the only window, it will be
re-used.
But if the user wants *ivy-occur* not to get buried, then having at
least 2 windows solves that problem.
mike [Wed, 4 Nov 2015 15:08:51 +0000 (10:08 -0500)]
fix 1-too-far scrolling issue
Functions `ivy-scroll-up-command' and `ivy-scroll-down-command' would
scroll 1 unit too far. So one item in the list would be skipped
and never seen for each scroll.
Oleh Krehel [Wed, 4 Nov 2015 11:51:04 +0000 (12:51 +0100)]
Pulse after ivy-occur-press
* ivy.el (ivy-state): New field TEXT.
(ivy-occur): Add `ivy-text' to the name of the buffer. Also store
`ivy-text' in `ivy-occur-last'. Might be needed in the future for a more
specific pulse.
(ivy-occur-press): Pulse the selected line.
Oleh Krehel [Tue, 3 Nov 2015 15:12:06 +0000 (16:12 +0100)]
Make ivy work with enable-recursive-minibuffers
* ivy.el (ivy-read): Fix the doc of DYNAMIC-COLLECTION. Store the old
`ivy-last' in case `ivy-read' is called while inside the minibuffer.
Restore it after `ivy-call'.
Oleh Krehel [Tue, 3 Nov 2015 10:43:47 +0000 (11:43 +0100)]
ivy.el (ivy-occur): Add and bind to "C-c o"
* ivy.el (ivy-minibuffer-map): Update.
(ivy-occur-action):
(ivy-occur-last):
(ivy-occur-map): New defvar.
(ivy-occur): New command.
(ivy-occur-click): New command bound to mouse click.
(ivy-occur-press): New command bound to "RET" press.
`ivy-occur' allows to store the current completion session for further
use. An unlimited amount of these sessions can be used, each in its own
buffer.
Oleh Krehel [Mon, 2 Nov 2015 14:12:26 +0000 (15:12 +0100)]
Highlight modified file buffers with 'ivy-modified-buffer face
* ivy.el (ivy-modified-buffer): New face, blank by default.
(ivy--format): When the collection is 'internal-complete-buffer,
highlight unsaved file visiting buffers with 'ivy-modified-buffer.
Oleh Krehel [Sat, 31 Oct 2015 12:11:23 +0000 (13:11 +0100)]
counsel.el (counsel-git-grep-query-replace): Add and bind to "M-q"
* counsel.el (counsel-git-grep-map): Bind "M-q" to
`counsel-git-grep-query-replace'.
(counsel-git-grep-query-replace): New command. Perform `query-replace'
on all matches of git-grep in all buffers.
Oleh Krehel [Fri, 30 Oct 2015 14:00:30 +0000 (15:00 +0100)]
"C-x C-f M-n" can call ffap-url-fetcher when at URL
* ivy.el (ivy--cd-maybe): Check if the input is a valid URL.
If so, exit immediately by calling (funcall ffap-url-fetcher url).
Otherwise, do the usual `ivy--cd' thing.
Oleh Krehel [Fri, 30 Oct 2015 13:50:05 +0000 (14:50 +0100)]
counsel.el (counsel--find-symbol): Resolve name clash better
* counsel.el (counsel--find-symbol): When the symbol is both bound and
fbound, prefer the fbound one, unless the :caller is
`counsel-describe-variable'.
(counsel-describe-variable): Declare :caller.
(counsel-describe-function): Declare :caller.
One example is going to the definition of `isearch-forward' (also with
`counsel-M-x').
Oleh Krehel [Thu, 22 Oct 2015 10:27:37 +0000 (12:27 +0200)]
"C-j" should not stop completion for a pasted file path
* ivy.el (ivy-alt-done): If you paste a file path, it won't match
anything in the current directory. Previously, "C-j" would open dired
for that path. Now, "C-j" will switch to the pasted directory and
continue completion.
Oleh Krehel [Thu, 15 Oct 2015 13:28:38 +0000 (15:28 +0200)]
Add feedback for long-running async processes
* counsel.el (counsel--async-time): New defvar.
(counsel--async-filter): New defun.
(counsel--async-command): Use `counsel--async-filter'.
Each time 0.5s pass after the last input, if the external process hasn't
finished yet, update minibuffer with the amount of candidates collected
so far. This is useful to see that long running commands like
`counsel-locate' or `counsel-ag' (when in a very large directory) aren't
stuck.
Oleh Krehel [Wed, 14 Oct 2015 16:35:03 +0000 (18:35 +0200)]
Adjust the swiper regexp builder for the display change
* swiper.el (swiper--re-builder): Update. The old re-builder was for
when the line numbers were part of the candidates. Now the line
numbers are the text properties of the candidates.
Oleh Krehel [Wed, 14 Oct 2015 12:55:02 +0000 (14:55 +0200)]
Fix "C-x h" selection and "C-b" bug
* ivy.el (ivy--exhibit): Add another `constrain-to-field'.
This ensures that the point doesn't cross into the prompt text.
Previously, there was a bug that pressing "C-b" once more when already
at the start of the input set `ivy-text' to "", i.e. ignoring the
minibuffer input.
Oleh Krehel [Sat, 10 Oct 2015 11:09:24 +0000 (13:09 +0200)]
ivy.el (ivy-case-fold-search): New defvar
* ivy.el (ivy--reset-state): Set `ivy-case-fold-search' to 'auto.
(ivy-toggle-case-fold): New command.
(ivy--filter): Use `ivy-case-fold-search' to determine `case-fold-search'.
* ivy-hydra.el (hydra-ivy): Bind "C" to `ivy-toggle-case-fold'.
Oleh Krehel [Thu, 8 Oct 2015 12:31:37 +0000 (14:31 +0200)]
Move setq ivy--index to ivy--recompute-index
* ivy.el (ivy--recompute-index): Move the setq statement here, so that
the customization functions have less internal variables to deal with.
(ivy-recompute-index-swiper): Update.
(ivy-recompute-index-zero): Update.
Oleh Krehel [Thu, 8 Oct 2015 12:13:32 +0000 (14:13 +0200)]
ivy.el (ivy-index-functions-alist): New variable
* ivy.el (ivy-state): Add `caller' field.
(ivy-read): Add `caller' keyword arg; update docstring. Use
`ivy--recompute-index'.
(ivy--recompute-index): New defun, dispatch according to `caller' and
`ivy-index-functions-alist'.
(ivy-recompute-index-swiper): New defun.
(ivy-recompute-index-zero): New defun.
Oleh Krehel [Wed, 7 Oct 2015 12:14:35 +0000 (14:14 +0200)]
Fix ivy-state-preselect for file name completion
* ivy.el (ivy--preselect-index): Add a check for null preselect.
(ivy--filter): Use `ivy--preselect-index' instead of `cl-position'. The
reason is that the collection contains e.g "foo/" while the preselect is "foo".
Oleh Krehel [Wed, 7 Oct 2015 11:31:13 +0000 (13:31 +0200)]
Adjust ivy-state-preselect for file name completion
* ivy.el (ivy--reset-state): Since `ivy--index' is now recomputed more,
`ivy-state-preselect' needs to be in the collection properly, so that
`ivy--index' is set to preselect whenever the input is empty.
Oleh Krehel [Tue, 6 Oct 2015 13:29:27 +0000 (15:29 +0200)]
ivy.el (ivy--insert-prompt): Use newlines instead of truncation
When the prompt string is longer than window-width, insert newlines
appropriately so that the whole prompt fits in the window without
scrolling. Finally, when prompt+entered text would be larger than
window-width, reformat the prompt so that entered text starts on a
newline. When completing file names, move the whole path to a new line
in that case.
Oleh Krehel [Sat, 3 Oct 2015 07:59:39 +0000 (09:59 +0200)]
Customize ivy-avy and fix compile warnings
* ivy.el (ivy-avy): Require avy. Allow the user to customize `avy-keys',
`avy-background' and `avy-style' (but prefer 'pre to 'at-full, since
it doesn't obscure any letters). Don't issue an extra `ivy-call'.
Oleh Krehel [Fri, 2 Oct 2015 13:33:07 +0000 (15:33 +0200)]
Use forward-line instead of line-move if possible
* swiper.el (swiper--candidates):
(swiper--update-input-ivy):
(swiper--action): `line-move' is much slower than `forward-line'. Use it
only if `visual-line-mode' is on.
Oleh Krehel [Fri, 2 Oct 2015 12:02:16 +0000 (14:02 +0200)]
Make swiper compatible with visual-line-mode
* swiper.el (swiper--candidates): Use `end-of-visual-line' and
`line-move' appropriately.
(swiper--update-input-ivy):
(swiper--action): Use `line-move' instead of `forward-line'.
(swiper--add-overlays): Update.
Oleh Krehel [Fri, 2 Oct 2015 09:40:15 +0000 (11:40 +0200)]
Specify shell command for counsel-git-grep with prefix arg
* counsel.el (counsel-git-grep-cmd): New defvar.
(counsel-git-grep-function): Use `counsel-git-grep-cmd'.
(counsel-git-grep-cmd-history): New defvar.
(counsel-git-grep): Update signature. When called with a prefix arg,
prompt for a command reading from and recording to
`counsel-git-grep-cmd-history'.
Remember to use "M-i" to insert the current candidate into the
minibuffer.
Oleh Krehel [Wed, 30 Sep 2015 13:26:41 +0000 (15:26 +0200)]
Add flx sorting
* ivy.el (ivy--flx-cache): New defvar.
(ivy--filter): Since flx is costly, move the caching to an earlier
point. This means immediate return for when the input hasn't changed,
i.e. for "C-n" or "C-p". When flx is installed, and
(eq ivy--regex-function 'ivy--regex-fuzzy) for current function (through
`ivy-re-builders-alist'), then sort the final candidates with
`ivy--flx-sort'.
(ivy--flx-sort): New defun. In the worst case when some error pops up return
the same list. In the best case sort the `cands' that all match `name'
by closeness to `name'.
How to use:
1. Have flx installed - (require 'flx) should succeed.
2. Configure `ivy-re-builders-alist' appropriately to use `ivy--regex-fuzzy', for example:
Oleh Krehel [Wed, 30 Sep 2015 13:22:39 +0000 (15:22 +0200)]
ivy.el (ivy-call): "C-M-n" should not leave the minibuffer
Make sure that the minibuffer window remains selected as long as the
completion hasn't finished.
For example, "<f1> f" to call `counsel-describe-function' input
"forward" and spam "C-M-n" to read the doc for each function that starts
with "forward". The *Help* window popup would move the window focus, but
this change moves it back to the minibuffer.