@@ -23,7 +23,7 @@ function! s:inputtarget()
2323 while c = ~ ' ^\d\+$'
2424 let c .= s: getchar ()
2525 endwhile
26- if c == " "
26+ if c == " " || c == " \\ "
2727 let c .= s: getchar ()
2828 endif
2929 if c = ~ " \<Esc> \| \<C-C> \| \0 "
@@ -35,7 +35,7 @@ endfunction
3535
3636function ! s: inputreplacement ()
3737 let c = s: getchar ()
38- if c == " "
38+ if c == " " || c == " \\ "
3939 let c .= s: getchar ()
4040 endif
4141 if c = ~ " \<Esc> " || c = ~ " \<C-C> "
@@ -139,9 +139,13 @@ function! s:wrap(string,char,type,removed,special)
139139 endif
140140 let pairs = " b()B{}r[]a<>"
141141 let extraspace = " "
142+ let prepend = " "
142143 if newchar = ~ ' ^ '
143144 let newchar = strpart (newchar,1 )
144145 let extraspace = ' '
146+ elseif newchar = ~ ' ^\\'
147+ let newchar = strpart (newchar,1 )
148+ let prepend = ' \'
145149 endif
146150 let idx = stridx (pairs,newchar)
147151 if newchar == ' '
@@ -209,7 +213,7 @@ function! s:wrap(string,char,type,removed,special)
209213 endif
210214 endif
211215 endif
212- elseif newchar == # ' l' || newchar == ' \ '
216+ elseif newchar == # ' l'
213217 " LaTeX
214218 let env = input (' \begin{' )
215219 if env != " "
@@ -239,11 +243,13 @@ function! s:wrap(string,char,type,removed,special)
239243 elseif idx >= 0
240244 let spc = (idx % 3 ) == 1 ? " " : " "
241245 let idx = idx / 3 * 3
242- let before = strpart (pairs,idx+ 1 ,1 ) . spc
243- let after = spc . strpart (pairs,idx+ 2 ,1 )
246+ let before = prepend . strpart (pairs,idx+ 1 ,1 ) . spc
247+ let after = spc . prepend . strpart (pairs,idx+ 2 ,1 )
248+ let prepend = " "
244249 elseif newchar == " \<C-[> " || newchar == " \<C-]> "
245- let before = " {\n \t "
246- let after = " \n }"
250+ let before = prepend . " {\n \t "
251+ let after = " \n " . prepend . " }"
252+ let prepend = " "
247253 elseif newchar !~ ' \a'
248254 let before = newchar
249255 let after = newchar
@@ -252,6 +258,10 @@ function! s:wrap(string,char,type,removed,special)
252258 let after = ' '
253259 endif
254260 let after = substitute (after ,' \n' ,' \n' .initspaces,' g' )
261+ if prepend != " "
262+ let before = prepend.before
263+ let after = prepend.after
264+ endif
255265 if type == # ' V' || (a: special && type == # " v" )
256266 let before = substitute (before,' \+$' ,' ' ,' ' )
257267 let after = substitute (after ,' ^ \+' ,' ' ,' ' )
@@ -355,11 +365,25 @@ endfunction " }}}1
355365function ! s: dosurround (... ) " {{{1
356366 let scount = v: count1
357367 let char = (a: 0 ? a: 1 : s: inputtarget ())
368+ let leftchar = char
369+ let rightchar = char
358370 let spc = " "
371+ let escape = " "
359372 if char = ~ ' ^\d\+'
360373 let scount = scount * matchstr (char,' ^\d\+' )
361374 let char = substitute (char,' ^\d\+' ,' ' ,' ' )
362375 endif
376+ if char = ~ ' ^\\'
377+ let char = strpart (char,1 )
378+ let escape = 1
379+ let pairs = " b()B{}r[]a<>"
380+ let idx = stridx (pairs, char)
381+ if idx >= 0
382+ let idx = idx / 3 * 3
383+ let leftchar = strpart (pairs, idx+ 1 ,1 )
384+ let rightchar = strpart (pairs, idx+ 2 ,1 )
385+ endif
386+ endif
363387 if char = ~ ' ^ '
364388 let char = strpart (char,1 )
365389 let spc = 1
@@ -384,7 +408,14 @@ function! s:dosurround(...) " {{{1
384408 let otype = getregtype (' "' )
385409 call setreg (' "' ," " )
386410 let strcount = (scount == 1 ? " " : scount)
387- if char == ' /'
411+ if escape
412+ let savecursor = getcurpos ()
413+ if search (' \\' .rightchar, " W" ) && search (' \\' .leftchar, " besW" )
414+ norm! ld `'
415+ else
416+ call setpos (' .' , savecursor)
417+ endif
418+ elseif char == ' /'
388419 exe ' norm! ' .strcount.' [/d' .strcount.' ]/'
389420 elseif char = ~# ' [[:punct:][:space:]]' && char !~# ' [][(){}<>"'' `]'
390421 exe ' norm! T' .char
@@ -404,7 +435,11 @@ function! s:dosurround(...) " {{{1
404435 endif
405436 let oldline = getline (' .' )
406437 let oldlnum = line (' .' )
407- if char == # " p"
438+ if escape
439+ call search (' \\' .leftchar, " bW" )
440+ call search (' \%#\@!\\' .rightchar, " seW" )
441+ norm! v `'d
442+ elseif char == # " p"
408443 call setreg (' "' ,' ' ,' V' )
409444 elseif char == # " s" || char == # " w" || char == # " W"
410445 " Do nothing
0 commit comments