Skip to content

Commit f15d450

Browse files
committed
Support backslash escaped characters (Fixes #164)
Support for surrounding, changing and deleting backslash escapes. Example: ysiw\"
1 parent e49d6c2 commit f15d450

File tree

1 file changed

+44
-9
lines changed

1 file changed

+44
-9
lines changed

plugin/surround.vim

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3636
function! 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
355365
function! 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

Comments
 (0)