evil
evil copied to clipboard
Selection behind persistent search highlight (doesn't match Vim)
Issue type
- Bug report
Environment
| Evil version: | 6fde982d731e2cc4e5f6bded6f8955ab2daee3b7 |
| Emacs version: | GNU Emacs 26.1 (build 1, x86_64-w64-mingw32) of 2018-05-30 |
| Operating System: | Windows 10 Version 1803 |
| Evil installation type: | MELPA |
| Graphical/Terminal: | Graphical |
Tested in a make emacs session (see CONTRIBUTING.md): |
Yes, (Clean Emacs setup, only Evil installed) |
Reproduction steps
- Enable persistent search highlighting by adding the following to
init.el:
;; This needs to be set before the evil package is loaded
(setq evil-search-module 'evil-search)
before the lines that load the evil package:
(require 'evil)
(evil-mode 1)
-
Re/Start Emacs
-
Open a new buffer:
C-x btest<return> -
Type or copy and paste this line into the new buffer:
pre-selected-post
-
Search for it:
/pre-selected-post<return> -
Move the cursor to the "s" in "selected"
-
Press:
vto start a char selection -
Press:
eto move the cursor to the end of the word "selected".
Expected behavior
The selection should appear in front of the search highlight, like it does in Vim:

That would make it easier to select part of a search highlighted phrase.
In Vim a block selection C-v from a line above, to a line below looks like this.

Actual behavior
The selection appears behind the search highlight.

A block selection makes it clear that the selection appears behind the search highlight in Emacs.

Further notes
Possible Cause
The selections overlay priority is 100, but the search highlights overlay priority is 1000.
The overlay priority of both the selection and the search highlight can be seen by following the steps above, then:
- Move the cursor to the beginning of the visual char selected word "selected" by pressing
o.
{} = search highlight
() = selection
[] = cursor
{pre-([s]elected)-post}
- Then describe the character under the cursor:
M-xdescribe-charRET
The bottom of the help window shows:
There are 2 overlays here:
From 1 to 18
evil-ex-hl evil-ex-search
face evil-ex-lazy-highlight
priority 1000
From 5 to 13
face region
priority (nil . 100)
window #<window 3 on test>
This might be the commit where the search overlay priority was introduced and set to 1000:
search: add basic highlighting framework
A possible reason for it being set to 1000, might have been to match the Emacs search highlight.
Because when the automatic Emacs C-s search highlight is turned off:
(setq lazy-highlight-cleanup nil)
and the steps above are followed but one searches with C-s instead of /, then the describe char output becomes:
There are 2 overlays here:
From 1 to 18
face lazy-highlight
priority 1000
window #<window 3 on *scratch*>
From 5 to 13
face region
priority (nil . 100)
window #<window 3 on *scratch*>
Possible solutions
If lowering the search highlights priority or raising the selection priority causes other issues, then maybe either of these suggestions could work:
-
The search highlights overlay priority could be lowered below the selection priority, if both the search highlight and a visual selection are active.
-
A new overlay with another color could be shown where the search highlight and the selection overlap.
My temporary solution:
(define-advice evil-ex-hl-match-hook (:around (fn hl) add-priority-reset-hook)
(or (funcall fn hl)
(lambda (_ ov)
(overlay-put ov 'priority 0))))
Confirmed, the workaround works for me as well:


Thanks
Evil version 1.14.0 GNU Emacs 26.3 (build 1, x86_64-w64-mingw32) of 2019-08-29 Windows 1903
Is there a reason why the visual selection overlay has a lower priority than the search highlight ones? A PR to fix this would be trivial but I don't like to change behavior without knowing the reasons behind the original decision first.