@@ -27,36 +27,85 @@ function! s:onUpdate()
2727 if empty (cmd)
2828 return
2929 endif
30- let hlsearchSaved = &hlsearch
31- set nohlsearch
30+ let pattern = E2v (cmd[' pattern' ])
31+
32+ if ! exists (' s:hlsearchSaved' )
33+ let s: hlsearchSaved = &hlsearch
34+ endif
3235 if ! exists (' s:patternSaved' )
3336 let s: patternSaved = @/
3437 if ! has (' nvim' )
3538 let s: eregex_incsearch_abort = 1
3639 endif
3740 endif
38- let @/ = E2v (cmd[' pattern' ])
39- if hlsearchSaved
41+ if ! exists (' s:stateSaved' )
42+ let s: stateSaved = winsaveview ()
43+ endif
44+
45+ set nohlsearch
46+
47+ if ! empty (pattern)
48+ let @/ = pattern
49+
50+ let pos = searchpos (pattern, ' cnw' )
51+ if pos[0 ] > 0 && pos[1 ] > 0
52+ if pos[1 ] > 1
53+ let pos[1 ] -= 1
54+ endif
55+ let curpos = getpos (' .' )
56+ let curpos[1 ] = pos[0 ]
57+ let curpos[2 ] = pos[1 ]
58+ call setpos (' .' , curpos)
59+ endif
60+ endif
61+
62+ if s: hlsearchSaved && ! empty (pattern)
4063 set hlsearch
64+ else
65+ set nohlsearch
4166 endif
4267 redraw
4368endfunction
4469
4570function ! s: onLeave ()
46- if ! exists (' s:patternSaved' )
47- return
71+ if exists (' s:hlsearchSaved' )
72+ let hlsearchSaved = s: hlsearchSaved
73+ unlet s: hlsearchSaved
74+ endif
75+ if exists (' s:patternSaved' )
76+ let patternSaved = s: patternSaved
77+ unlet s: patternSaved
78+ endif
79+ if exists (' s:stateSaved' )
80+ let stateSaved = s: stateSaved
81+ unlet s: stateSaved
82+ endif
83+
84+ if exists (' hlsearchSaved' )
85+ if hlsearchSaved
86+ set hlsearch
87+ else
88+ set nohlsearch
89+ endif
4890 endif
49- let patternSaved = s: patternSaved
50- unlet s: patternSaved
91+
5192 if has (' nvim' )
5293 let abort = get (v: event , ' abort' , 0 )
5394 else
5495 let abort = get (s: , ' eregex_incsearch_abort' , 0 )
5596 endif
56- if abort
97+ if ! abort
98+ return
99+ endif
100+
101+ if exists (' patternSaved' )
57102 let @/ = patternSaved
58- redraw !
59103 endif
104+ if exists (' stateSaved' )
105+ call winrestview (stateSaved)
106+ endif
107+
108+ redraw !
60109endfunction
61110
62111" input: M/abc
@@ -72,8 +121,8 @@ endfunction
72121" }
73122function ! s: cmdParse (cmdline)
74123 let token = nr2char (127 )
75- let items = split (substitute (a: cmdline , ' \\/' , token, ' g' ), ' /' )
76- if len (items ) <= 1
124+ let items = split (substitute (a: cmdline , ' \\/' , token, ' g' ), ' /' , 1 )
125+ if len (items ) < 2
77126 return {}
78127 endif
79128 let modes = get (g: , ' eregex_incsearch_modes' , get (b: , ' eregex_incsearch_modes' , ' MSGV' ))
@@ -84,7 +133,7 @@ function! s:cmdParse(cmdline)
84133 endif
85134 return {
86135 \ ' method' : method,
87- \ ' pattern' : substitute (items [ 1 ] , token, ' \\/' , ' g' ),
136+ \ ' pattern' : substitute (get ( items , 1 , ' ' ) , token, ' \\/' , ' g' ),
88137 \ }
89138endfunction
90139
0 commit comments