Oleh Krehel [Sun, 29 Nov 2015 16:01:35 +0000 (17:01 +0100)]
Fix due to visual-line-mode weirdness
* swiper.el (swiper--candidates): Under a specific random condition,
(line-move 1) from the beginning of line doesn't move to the beginning
of the next visual line.
This change fixes it, but will result in an even slower startup when
`visual-line-mode' is active.
Oleh Krehel [Sun, 29 Nov 2015 10:15:17 +0000 (11:15 +0100)]
Fix ivy-resume issue caused by the recursive calls change
* ivy.el (ivy-read): recursive-ivy-last is only set if there's an active
minibuffer window. If this check isn't made, it causes the previous
`ivy-last' to be reset after the current one, so `ivy-resume' would
resume not the last command.
Oleh Krehel [Sun, 29 Nov 2015 10:13:45 +0000 (11:13 +0100)]
Fix the preselect for (swiper "one") again
* ivy.el (ivy--reset-state): Take into account :preselect being integer.
This means that it's void once the candidates are filtered over
:initial-input.
Oleh Krehel [Thu, 26 Nov 2015 11:52:34 +0000 (12:52 +0100)]
Ease production of functions like ivy-format-function-default
* ivy.el (ivy--format-function-generic): New defun.
(ivy-format-function-default):
(ivy-format-function-arrow):
(ivy-format-function-line): Use `ivy--format-function-generic'.
* counsel.el (counsel--M-x-transformer): Add an extra space to simplify
the logic.
Stephen Whipple [Thu, 26 Nov 2015 07:07:16 +0000 (00:07 -0700)]
Convert ivy formatting functions to dotted pairs.
`ivy-format-function' now expects to operate on dotted pairs
representing (stub . extra), where `stub' is the original
candidate and `extra' is any extra information that has been
added by counsel or other libraries.
The format function can differentiate between the original stub
and extra information and choose how to display the result to
the user.
Oleh Krehel [Wed, 25 Nov 2015 14:24:58 +0000 (15:24 +0100)]
Add counsel-grep
* ivy.el (ivy--reset-state): Don't push preselect onto collection for
:dynamic-collection.
(ivy-recompute-index-swiper-async): New defun. It's useful for
re-anchoring on collections produced async processes. The major
difference from `ivy-recompute-index-swiper' is using `equal' instead of `eq'.
* counsel.el (counsel--async-sentinel): Add index recomputing logic.
When `ivy--old-cands' are null, recompute the index according to
:preselect, otherwise try `ivy--recompute-index'.
(counsel-grep): New command. Very similar to `swiper', except calls an
external process for each key update. Should be much faster for very
large files, both for startup and for matching. For smaller files, it's
less convenient.
(counsel-grep-function): New defun.
(counsel-grep-action): New defun.
Oleh Krehel [Tue, 24 Nov 2015 11:09:37 +0000 (12:09 +0100)]
Fix broken candidate index in ivy-resume
* ivy.el (ivy--reset-state): When given initial-input, call
`ivy--preselect-index' on candidates filtered by initial-input. This
is important for `ivy-resume'.
Oleh Krehel [Sun, 22 Nov 2015 12:59:27 +0000 (13:59 +0100)]
Perform string-match in the original buffer
* ivy.el (ivy--exhibit): Wrap in `with-current-buffer'
`ivy-state-buffer'.
(ivy-recompute-index-swiper): Reset to the candidate at the current line
number, in case the previous regex resulted in 0 candidates.
Oleh Krehel [Fri, 20 Nov 2015 12:13:40 +0000 (13:13 +0100)]
Fix the preselect for (swiper "one")
* ivy.el (ivy--reset-state): Ignore INITIAL-INPUT on the first
step. Then all `ivy--filter' on the second step.
(ivy--preselect-index): Change arglist. No longer takes INITIAL-INPUT.
(ivy--recompute-index): Update the call to `ivy--preselect-index'.
Oleh Krehel [Wed, 18 Nov 2015 10:55:45 +0000 (11:55 +0100)]
Switch to using ivy-exit-with-action
* ivy.el (ivy-exit-with-action): Add a missing quote.
(ivy--cd-maybe): Use `ivy-exit-with-action'.
* counsel.el (counsel-find-symbol):
(counsel--info-lookup-symbol):
(counsel-git-grep-query-replace): Use `ivy-exit-with-action'.
* swiper.el (swiper-query-replace):
(swiper-mc): Use `ivy-exit-with-action'.
The previous approach was overwriting the action list, so when
`ivy-resume' was called, only a single action was present. The new
approach doesn't have this bug.
So now it's possible to e.g. `counsel-describe-function' -> "M-o d" ->
`ivy-resume' -> "M-o o" -> `ivy-resume' -> "M-o i".
Oleh Krehel [Tue, 17 Nov 2015 07:27:39 +0000 (08:27 +0100)]
swiper.el: Modify the behavior with org-mode and visual-line-mode
* swiper.el (swiper--candidates): Set `swiper-use-visual-line' even for
`org-mode'. In that case, reveal all text to prevent `line-move'
weirdness.
(swiper--ivy): Use `swiper-use-visual-line'.
Oleh Krehel [Mon, 16 Nov 2015 11:50:42 +0000 (12:50 +0100)]
Intermediate fix for :preselect with visual-line-mode
* swiper.el (swiper--ivy): Use `beginning-of-visual-line' and
`end-of-visual-line'. This should fix the preselect problem for
non-duplicate buffer lines.
For duplicate buffer lines, a `visual-line-number-at-pos' function is
necessary. I don't currently know how to implement such a function in an
efficient way. The naive implementation could be pretty inefficient,
comparable to doubling `swiper' startup time with `visual-line-mode'.
Oleh Krehel [Sat, 14 Nov 2015 15:27:41 +0000 (16:27 +0100)]
swiper.el (swiper-all): New command to swiper all file buffers
* swiper.el (swiper--candidates): Add NUMBERS-WIDTH arg. It could be
done better by calculating the line count of each buffer and then
getting the max of that, but this way is faster, since the collections
are traversed only once.
(swiper-multi): Update.
(swiper-all): New command. This is like `swiper-multi' where the buffer
list is pre-selected to be all file visiting buffers.
(swiper--multi-candidates): New defun.
(swiper-multi-action-1): Use `swiper--multi-candidates'.
(swiper-multi-action-2): Update - the line number is in the 'display
property of the first char.
Oleh Krehel [Fri, 13 Nov 2015 14:37:15 +0000 (15:37 +0100)]
Allow user-specified matched candidate sorting
* ivy.el (ivy-prefix-sort): Remove defcustom.
(ivy--filter): Forward sorting of matched candidates to `ivy--sort'.
(ivy-sort-matches-functions-alist): New defcustom.
(ivy--sort): New defun.
Oleh Krehel [Fri, 13 Nov 2015 14:04:56 +0000 (15:04 +0100)]
ivy.el (ivy-prefix-sort): New defcustom, off by default for now
* ivy.el (ivy--filter): When `ivy-prefix-sort' is non-nil, additionally
sort the matching candidates with `ivy--prefix-sort'.
(ivy--prefix-sort): New defun.
Oleh Krehel [Wed, 11 Nov 2015 14:47:02 +0000 (15:47 +0100)]
Allow counsel-git-grep -> ivy-occur -> wgrep
* ivy.el (ivy-exit-with-action): New defun.
(ivy-occur-action): Remove defvar. It's part of `ivy-occur-last' now.
(ivy-occur-last): Update doc.
(ivy-occur-map): Rename to `ivy-occur-mode-map'.
(ivy-occur-mode): New major mode.
(ivy-occur): When the caller is `counsel-git-grep', enter `grep-mode';
otherwise enter the new `ivy-occur-mode'.
For `wgrep' to work, two things are changed: candidates need to start on
the 5th line, and candidates need to be prefixed with "./".
(ivy-occur-read-action): New command, bound to "a".
(ivy-occur-dispatch): New command, bound to "o".
(ivy-occur-press): Update to work with `grep-mode'.
(ivy-occur-grep-mode-map): New defvar.
(ivy-occur-grep-mode): New major mode. Basically, it's grep-mode with
"C-x C-q" bound to `wgrep-change-to-wgrep-mode'.
Oleh Krehel [Wed, 11 Nov 2015 11:01:43 +0000 (12:01 +0100)]
swiper.el (swiper-toggle-face-matching): Add and bind to "C-c C-f"
* swiper.el (swiper-map): Bind `swiper-toggle-face-matching' to
"C-c C-f".
(swiper-invocation-face): New defvar.
(swiper--ivy): Set `swiper-invocation-face'.
(swiper-toggle-face-matching): Toggle `ivy-state-matcher' between
nil (the initial value) and 'swiper--face-matcher.
(swiper--face-matcher): New defun. In addition to filtering CANDIDATES
by having them match REGEXP, also ensure that every match has
`swiper-invocation-face'.
Example of usage:
1. Move point to a variable with e.g. `font-lock-keyword-face' and "C-s"
<input>.
2. Use "C-c C-f" to filter the candidates further by selecting only the
ones that have `font-lock-keyword-face'.
Note that "M-q" (`swiper-query-replace') is also affected by the filtering.
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.