39 Commits

Author SHA1 Message Date
Tim Pope 3d188ed211 Call out opening bracket behavior in FAQ
Apparently mentioning in the both the README intro and the help file
isn't enough.  I give up.

Resolves: https://github.com/tpope/vim-surround/issues/366
Resolves: https://github.com/tpope/vim-surround/issues/363
Resolves: https://github.com/tpope/vim-surround/issues/314
Resolves: https://github.com/tpope/vim-surround/issues/303
Resolves: https://github.com/tpope/vim-surround/issues/240
Resolves: https://github.com/tpope/vim-surround/issues/205
Resolves: https://github.com/tpope/vim-surround/issues/108
Resolves: https://github.com/tpope/vim-surround/issues/27
2022-10-25 16:41:16 -04:00
Tim Pope bf3480dc9a Remove issues section from help file
I haven't even looked at this in over a decade.
2022-04-22 19:25:12 -04:00
Tim Pope 81fc0ec460 Fix insert mode maps after "\r" change
Resolves: https://github.com/tpope/vim-surround/issues/349
2022-04-09 22:21:13 -04:00
Tim Pope 427f80f254 Avoid "\r" as a cursor stand-in
This confuses Neovim's LSP.  I'd be surprised if there are LSPs it
*doesn't* confuse.

References: https://github.com/neovim/neovim/issues/15532
2022-04-09 16:04:28 -04:00
Enrico Maria De Angelis 9857a87463 Save, set, and restore startofline
Consider this code:
```javascript
_.map(
  (
    mapObjOnK
  )
);
```
If the cursor is on the 3rd line and you press <kbd>d</kbd><kbd>s</kbd><kbd>b</kbd>, the code will become
```javascript
_.map(
);
mapObjOnK
```

The problem occurs if `startofline` is off.

With this change, I set it before processing the the call to
`dosurround`, and then, after the call, I'm unsetting it if
it was unset.
2022-03-25 16:13:16 -04:00
Tim Pope baf89ad264 Only reindent when enabled by Vim option
References: https://github.com/tpope/vim-markdown/pull/187
2022-01-29 21:05:37 -05:00
Tim Pope aeb933272e surround.vim 2.2
* Keep HTML attributes when changing tags.
* Support <Space><Space> as space replacement.
* Bug fixes.
2021-10-12 12:15:51 -04:00
agguser f51a26d371 Fix bug when closing delimiter is at line end (#284) (#285) 2019-11-28 01:29:20 -05:00
Tim Pope e4c4cc0f81 Add sponsor button 2019-11-12 18:33:40 -05:00
Viacheslav Lotsmanov fab8621670 Fix for "all" and "insert" "virtualedit" in Insert mode 2019-07-22 16:30:45 -04:00
Chris AtLee ca58a2d886 Documentation for function name replacements (fixes #222) 2019-03-26 17:22:34 -04:00
matsuhav 597068870b Fix blank lines issue
In #254, probably because the tag is followed by <CR>, cstta<CR> sets
regtype 'V'(linewise) though its keeper doesn't end with <CR>.  And
setreg() adds extra <CR> at @".  Remove this extra <CR> and fix adding
<CR> method.
2018-07-23 14:52:25 -04:00
Tim Pope aa1f120ad3 Fix yss in middle of line
Closes https://github.com/tpope/vim-surround/issues/256
2018-06-15 15:17:44 -04:00
Tim Pope 643a42454b Fix yss adding newlines 2018-05-29 19:08:56 -04:00
Tim Pope 4e7d573c14 Make ys maps atomic
Closes https://github.com/tpope/vim-surround/issues/253
2018-05-29 17:37:25 -04:00
Tim Pope e8dca61597 Modernize README 2018-05-29 17:35:44 -04:00
Adriaan Zonnenberg e49d6c2459 Only add colon if prompt ends with word (#204)
Lets you use your own ending characters, instead of always adding ': '.

Closes #203
2016-06-01 18:06:04 -04:00
Tim Pope 2d05440ad2 Merge pull request #175 from yuex/ds__
support ds<space><space>
2015-08-07 23:37:10 -04:00
Tim Pope c492390126 Merge pull request #167 from sunaku/issue-159
GH-159: don't use comma as alias for HTML/XML tags
2015-08-07 23:22:40 -04:00
Yue Xin e38dea3972 support ds<space><space> 2015-08-08 01:28:26 +08:00
Suraj N. Kurapati 5c6a64f333 GH-159: don't use comma as alias for HTML/XML tags
This change allows us to surround text with commas.
2015-04-30 10:36:59 -07:00
Tim Pope 772ab9587b Merge pull request #163 from kiryph/feature-repeat-late
Add repeat.vim support to surround with LaTeX environment 'ys<>l'
2015-03-15 13:32:12 -05:00
kiryph 605c12d7d2 Add repeat.vim support to surround with LaTeX environment 'ys<>l' 2015-02-25 21:28:28 +01:00
Tim Pope ec579a5047 Merge pull request #131 from shanesmith/master
Keep HTML attributes when changing tags
2015-02-22 12:37:25 -06:00
Shane Smith 5d6b91ce80 Keep HTML attributes when changing tags
By default keep the HTML attributes of the previous surrounding tag.

Option to remove attributes if the new tag prompt is ended with '>'.

Fixes #95.
2015-02-22 11:50:33 -05:00
Tim Pope fd75eb2cb2 surround.vim 2.1
* Handle arbitrary punctuation delimiters with cs and ds.
* Default to automatic indenting.
* Provide cS to force surroundings on separate lines.
* Support for disabling mappings only for insert mode.
* Add repeat.vim support to surround with function.
* Work around 'nomagic'.
2015-02-08 14:06:19 -05:00
Tim Pope 6afb2d90e3 Merge pull request #158 from itspriddle/patch-1
Fix typo in `repeat#set` call
2015-02-04 16:50:48 -06:00
Joshua Priddle 7e8f414b8c Fix typo in repeat#set call 2015-02-04 17:49:38 -05:00
Tim Pope 6e0a168a97 Merge pull request #96 from jwhitley/john/cS
Add support for 'cS' per issue 48
2015-02-03 12:39:09 -06:00
John Whitley 5211890344 Update documentation for 'cS' 2015-02-03 10:14:41 -08:00
John Whitley 86f6aca956 Add support for 'cS' per issue 48
This adds support for a cS command that puts the contents of the wrapped
region on their own line, analogous to yS.  This change includes repeat
support.
2015-02-03 10:14:41 -08:00
Tim Pope fa433e0b73 Work around 'nomagic'
Documentation explicitly advises against setting this option, but this
particular problem is easy enough to work around.

Closes #90.
2014-07-26 12:42:47 -04:00
Tim Pope f85cb4e788 Merge pull request #125 from tommcdo/master
Add repeat.vim support to surround with function
2014-06-05 19:24:23 -04:00
Tom McDonald 4e73eeb01d Add repeat.vim support to surround with function
Closes #106.
2014-04-11 15:55:50 -04:00
Tim Pope 42e9b46e7a Fix quote support 2013-09-23 14:05:37 -04:00
Tim Pope 9bf527af3a Merge pull request #107 from DanielleSucher/support-arbitrary-delimiters
Handle arbitrary delimiters with cs and ds
2013-09-09 15:37:09 -07:00
Danielle Sucher 7def4c0772 Handle any punctuation delimiters with cs and ds 2013-09-06 11:31:14 -07:00
Takatoshi Matsumoto 02199ea008 Support to disable mappings only for insert mode
If disable mappings only in normal mode.
let g:surround_no_insert_mappings = 1
2013-01-23 12:26:25 +09:00
Tim Pope 2cc734fd99 Default to automatic indenting
Only one way to find out if this is actually a good idea.
2013-01-18 18:39:59 -05:00
4 changed files with 143 additions and 87 deletions
+2
View File
@@ -0,0 +1,2 @@
github: tpope
custom: ["https://www.paypal.me/vimpope"]
+23 -22
View File
@@ -1,5 +1,4 @@
surround.vim # surround.vim
============
Surround.vim is all about "surroundings": parentheses, brackets, quotes, Surround.vim is all about "surroundings": parentheses, brackets, quotes,
XML tags, and more. The plugin provides mappings to easily delete, XML tags, and more. The plugin provides mappings to easily delete,
@@ -61,37 +60,39 @@ and removing pairs of tags simultaneously is a breeze.
The `.` command will work with `ds`, `cs`, and `yss` if you install The `.` command will work with `ds`, `cs`, and `yss` if you install
[repeat.vim](https://github.com/tpope/vim-repeat). [repeat.vim](https://github.com/tpope/vim-repeat).
Installation ## Installation
------------
If you don't have a preferred installation method, I recommend Install using your favorite package manager, or use Vim's built-in package
installing [pathogen.vim](https://github.com/tpope/vim-pathogen), and support:
then simply copy and paste:
cd ~/.vim/bundle mkdir -p ~/.vim/pack/tpope/start
git clone git://github.com/tpope/vim-surround.git cd ~/.vim/pack/tpope/start
git clone https://tpope.io/vim/surround.git
vim -u NONE -c "helptags surround/doc" -c q
Once help tags have been generated, you can view the manual with ## FAQ
`:help surround`.
Contributing > How do I surround without adding a space?
------------
Only the opening brackets—`[`, `{`, and `(`—add a space. Use a closing
bracket, or the `b` (`(`) and `B` (`{`) aliases.
## Contributing
See the contribution guidelines for See the contribution guidelines for
[pathogen.vim](https://github.com/tpope/vim-pathogen#readme). [pathogen.vim](https://github.com/tpope/vim-pathogen#readme).
Self-Promotion ## Self-Promotion
--------------
Like surround.vim? Follow the repository on Like surround.vim? Star the repository on
[GitHub](https://github.com/tpope/vim-surround) and vote for it on [GitHub](https://github.com/tpope/vim-surround) and vote for it on
[vim.org](http://www.vim.org/scripts/script.php?script_id=1697). And if [vim.org](https://www.vim.org/scripts/script.php?script_id=1697).
you're feeling especially charitable, follow [tpope](http://tpo.pe/) on
[Twitter](http://twitter.com/tpope) and
[GitHub](https://github.com/tpope).
License Love surround.vim? Follow [tpope](http://tpo.pe/) on
------- [GitHub](https://github.com/tpope) and
[Twitter](http://twitter.com/tpope).
## License
Copyright (c) Tim Pope. Distributed under the same terms as Vim itself. Copyright (c) Tim Pope. Distributed under the same terms as Vim itself.
See `:help license`. See `:help license`.
+17 -17
View File
@@ -39,8 +39,9 @@ easiest to understand with some examples:
<div>Yo!*</div> dst Yo! <div>Yo!*</div> dst Yo!
Change surroundings is *cs* . It takes two arguments, a target like with Change surroundings is *cs* . It takes two arguments, a target like with
|ds|, and a replacement. Details about the second argument can be found |ds|, and a replacement. *cS* changes surroundings, placing the surrounded
below in |surround-replacements|. Once again, examples are in order. text on its own line(s) like |yS|. Details about the second argument can be
found below in |surround-replacements|. Once again, examples are in order.
Old text Command New text ~ Old text Command New text ~
"Hello *world!" cs"' 'Hello world!' "Hello *world!" cs"' 'Hello world!'
@@ -129,9 +130,20 @@ code blocks in C-style languages, <C-}> (which is really <C-]>) adds braces on
lines separate from the content. lines separate from the content.
If t or < is used, Vim prompts for an HTML/XML tag to insert. You may specify If t or < is used, Vim prompts for an HTML/XML tag to insert. You may specify
attributes here and they will be stripped from the closing tag. End your attributes here and they will be stripped from the closing tag. If replacing a
input by pressing <CR> or >. If <C-T> is used, the tags will appear on lines tag, its attributes are kept in the new tag. End your input with > to discard
by themselves. the those attributes. If <C-T> is used, the tags will appear on lines by
themselves.
If f, F, or <C-F> is used, Vim prompts for a function name to insert. The target
text will be wrapped in a function call. If f is used, the text is wrapped with
() parentheses; F adds additional spaces inside the parentheses. <C-F> inserts the
function name inside the parentheses.
Old text Command New text ~
"hello" ysWfprint<cr> print("hello")
"hello" ysWFprint<cr> print( "hello" )
"hello" ysW<C-f>print<cr> (print "hello")
If s is used, a leading but not trailing space is added. This is useful for If s is used, a leading but not trailing space is added. This is useful for
removing parentheses from a function call with csbs. removing parentheses from a function call with csbs.
@@ -190,16 +202,4 @@ that allow you to jump to such markings.
> >
let g:surround_insert_tail = "<++>" let g:surround_insert_tail = "<++>"
< <
ISSUES *surround-issues*
Vim could potentially get confused when deleting/changing occurs at the very
end of the line. Please report any repeatable instances of this.
Do we need to use |inputsave()|/|inputrestore()| with the tag replacement?
Indenting is handled haphazardly. Need to decide the most appropriate
behavior and implement it. Right now one can do :let b:surround_indent = 1
(or the global equivalent) to enable automatic re-indenting by Vim via |=|;
should this be the default?
vim:tw=78:ts=8:ft=help:norl: vim:tw=78:ts=8:ft=help:norl:
+95 -42
View File
@@ -1,6 +1,6 @@
" surround.vim - Surroundings " surround.vim - Surroundings
" Author: Tim Pope <http://tpo.pe/> " Author: Tim Pope <http://tpo.pe/>
" Version: 2.0 " Version: 2.2
" GetLatestVimScripts: 1697 1 :AutoInstall: surround.vim " GetLatestVimScripts: 1697 1 :AutoInstall: surround.vim
if exists("g:loaded_surround") || &cp || v:version < 700 if exists("g:loaded_surround") || &cp || v:version < 700
@@ -92,7 +92,7 @@ function! s:process(string)
let m = matchstr(a:string,nr2char(i).'.\{-\}\ze'.nr2char(i)) let m = matchstr(a:string,nr2char(i).'.\{-\}\ze'.nr2char(i))
if m != '' if m != ''
let m = substitute(strpart(m,1),'\r.*','','') let m = substitute(strpart(m,1),'\r.*','','')
let repl_{i} = input(substitute(m,':\s*$','','').': ') let repl_{i} = input(match(m,'\w\+$') >= 0 ? m.': ' : m)
endif endif
endfor endfor
let s = "" let s = ""
@@ -124,13 +124,12 @@ function! s:process(string)
return s return s
endfunction endfunction
function! s:wrap(string,char,type,...) function! s:wrap(string,char,type,removed,special)
let keeper = a:string let keeper = a:string
let newchar = a:char let newchar = a:char
let s:tag = "" let s:input = ""
let type = a:type let type = a:type
let linemode = type ==# 'V' ? 1 : 0 let linemode = type ==# 'V' ? 1 : 0
let special = a:0 ? a:1 : 0
let before = "" let before = ""
let after = "" let after = ""
if type ==# "V" if type ==# "V"
@@ -165,13 +164,13 @@ function! s:wrap(string,char,type,...)
elseif newchar ==# ':' elseif newchar ==# ':'
let before = ':' let before = ':'
let after = '' let after = ''
elseif newchar =~# "[tT\<C-T><,]" elseif newchar =~# "[tT\<C-T><]"
let dounmapp = 0 let dounmapp = 0
let dounmapb = 0 let dounmapb = 0
if !maparg(">","c") if !maparg(">","c")
let dounmapb = 1 let dounmapb = 1
" Hide from AsNeeded " Hide from AsNeeded
exe "cn"."oremap > <CR>" exe "cn"."oremap > ><CR>"
endif endif
let default = "" let default = ""
if newchar ==# "T" if newchar ==# "T"
@@ -181,21 +180,27 @@ function! s:wrap(string,char,type,...)
let default = matchstr(s:lastdel,'<\zs.\{-\}\ze>') let default = matchstr(s:lastdel,'<\zs.\{-\}\ze>')
endif endif
let tag = input("<",default) let tag = input("<",default)
echo "<".substitute(tag,'>*$','>','')
if dounmapb if dounmapb
silent! cunmap > silent! cunmap >
endif endif
let s:tag = tag let s:input = tag
if tag != "" if tag != ""
let keepAttributes = ( match(tag, ">$") == -1 )
let tag = substitute(tag,'>*$','','') let tag = substitute(tag,'>*$','','')
let s:tag = tag . '>' let attributes = ""
let before = '<'.tag.'>' if keepAttributes
let attributes = matchstr(a:removed, '<[^ \t\n]\+\zs\_.\{-\}\ze>')
endif
let s:input = tag . '>'
if tag =~ '/$' if tag =~ '/$'
let tag = substitute(tag, '/$', '', '')
let before = '<'.tag.attributes.' />'
let after = '' let after = ''
else else
let before = '<'.tag.attributes.'>'
let after = '</'.substitute(tag,' .*','','').'>' let after = '</'.substitute(tag,' .*','','').'>'
endif endif
if newchar == "\<C-T>" || newchar == "," if newchar == "\<C-T>"
if type ==# "v" || type ==# "V" if type ==# "v" || type ==# "V"
let before .= "\n\t" let before .= "\n\t"
endif endif
@@ -207,16 +212,18 @@ function! s:wrap(string,char,type,...)
elseif newchar ==# 'l' || newchar == '\' elseif newchar ==# 'l' || newchar == '\'
" LaTeX " LaTeX
let env = input('\begin{') let env = input('\begin{')
if env != ""
let s:input = env."\<CR>"
let env = '{' . env let env = '{' . env
let env .= s:closematch(env) let env .= s:closematch(env)
echo '\begin'.env echo '\begin'.env
if env != ""
let before = '\begin'.env let before = '\begin'.env
let after = '\end'.matchstr(env,'[^}]*').'}' let after = '\end'.matchstr(env,'[^}]*').'}'
endif endif
elseif newchar ==# 'f' || newchar ==# 'F' elseif newchar ==# 'f' || newchar ==# 'F'
let fnc = input('function: ') let fnc = input('function: ')
if fnc != "" if fnc != ""
let s:input = fnc."\<CR>"
let before = substitute(fnc,'($','','').'(' let before = substitute(fnc,'($','','').'('
let after = ')' let after = ')'
if newchar ==# 'F' if newchar ==# 'F'
@@ -226,6 +233,7 @@ function! s:wrap(string,char,type,...)
endif endif
elseif newchar ==# "\<C-F>" elseif newchar ==# "\<C-F>"
let fnc = input('function: ') let fnc = input('function: ')
let s:input = fnc."\<CR>"
let before = '('.fnc.' ' let before = '('.fnc.' '
let after = ')' let after = ')'
elseif idx >= 0 elseif idx >= 0
@@ -244,7 +252,7 @@ function! s:wrap(string,char,type,...)
let after = '' let after = ''
endif endif
let after = substitute(after ,'\n','\n'.initspaces,'g') let after = substitute(after ,'\n','\n'.initspaces,'g')
if type ==# 'V' || (special && type ==# "v") if type ==# 'V' || (a:special && type ==# "v")
let before = substitute(before,' \+$','','') let before = substitute(before,' \+$','','')
let after = substitute(after ,'^ \+','','') let after = substitute(after ,'^ \+','','')
if after !~ '^\n' if after !~ '^\n'
@@ -255,11 +263,16 @@ function! s:wrap(string,char,type,...)
elseif keeper =~ '\n$' && after =~ '^\n' elseif keeper =~ '\n$' && after =~ '^\n'
let after = strpart(after,1) let after = strpart(after,1)
endif endif
if before !~ '\n\s*$' if keeper !~ '^\n' && before !~ '\n\s*$'
let before .= "\n" let before .= "\n"
if special if a:special
let before .= "\t" let before .= "\t"
endif endif
elseif keeper =~ '^\n' && before =~ '\n\s*$'
let keeper = strcharpart(keeper,1)
endif
if type ==# 'V' && keeper =~ '\n\s*\n$'
let keeper = strcharpart(keeper,0,strchars(keeper) - 1)
endif endif
endif endif
if type ==# 'V' if type ==# 'V'
@@ -287,11 +300,10 @@ function! s:wrap(string,char,type,...)
return keeper return keeper
endfunction endfunction
function! s:wrapreg(reg,char,...) function! s:wrapreg(reg,char,removed,special)
let orig = getreg(a:reg) let orig = getreg(a:reg)
let type = substitute(getregtype(a:reg),'\d\+$','','') let type = substitute(getregtype(a:reg),'\d\+$','','')
let special = a:0 ? a:1 : 0 let new = s:wrap(orig,a:char,type,a:removed,a:special)
let new = s:wrap(orig,a:char,type,special)
call setreg(a:reg,new,type) call setreg(a:reg,new,type)
endfunction endfunction
" }}}1 " }}}1
@@ -311,8 +323,8 @@ function! s:insert(...) " {{{1
let cb_save = &clipboard let cb_save = &clipboard
set clipboard-=unnamed clipboard-=unnamedplus set clipboard-=unnamed clipboard-=unnamedplus
let reg_save = @@ let reg_save = @@
call setreg('"',"\r",'v') call setreg('"',"\032",'v')
call s:wrapreg('"',char,linemode) call s:wrapreg('"',char,"",linemode)
" If line mode is used and the surrounding consists solely of a suffix, " If line mode is used and the surrounding consists solely of a suffix,
" remove the initial newline. This fits a use case of mine but is a " remove the initial newline. This fits a use case of mine but is a
" little inconsistent. Is there anyone that would prefer the simpler " little inconsistent. Is there anyone that would prefer the simpler
@@ -324,7 +336,16 @@ function! s:insert(...) " {{{1
if exists("g:surround_insert_tail") if exists("g:surround_insert_tail")
call setreg('"',g:surround_insert_tail,"a".getregtype('"')) call setreg('"',g:surround_insert_tail,"a".getregtype('"'))
endif endif
if col('.') >= col('$') if &ve != 'all' && col('.') >= col('$')
if &ve == 'insert'
let extra_cols = virtcol('.') - virtcol('$')
if extra_cols > 0
let [regval,regtype] = [getreg('"',1,1),getregtype('"')]
call setreg('"',join(map(range(extra_cols),'" "'),''),'v')
norm! ""p
call setreg('"',regval,regtype)
endif
endif
norm! ""p norm! ""p
else else
norm! ""P norm! ""P
@@ -333,19 +354,21 @@ function! s:insert(...) " {{{1
call s:reindent() call s:reindent()
endif endif
norm! `] norm! `]
call search('\r','bW') call search("\032",'bW')
let @@ = reg_save let @@ = reg_save
let &clipboard = cb_save let &clipboard = cb_save
return "\<Del>" return "\<Del>"
endfunction " }}}1 endfunction " }}}1
function! s:reindent() " {{{1 function! s:reindent() abort " {{{1
if exists("b:surround_indent") ? b:surround_indent : (exists("g:surround_indent") && g:surround_indent) if get(b:, 'surround_indent', get(g:, 'surround_indent', 1)) && (!empty(&equalprg) || !empty(&indentexpr) || &cindent || &smartindent || &lisp)
silent norm! '[='] silent norm! '[=']
endif endif
endfunction " }}}1 endfunction " }}}1
function! s:dosurround(...) " {{{1 function! s:dosurround(...) " {{{1
let sol_save = &startofline
set startofline
let scount = v:count1 let scount = v:count1
let char = (a:0 ? a:1 : s:inputtarget()) let char = (a:0 ? a:1 : s:inputtarget())
let spc = "" let spc = ""
@@ -367,6 +390,9 @@ function! s:dosurround(...) " {{{1
if a:0 > 1 if a:0 > 1
let newchar = a:2 let newchar = a:2
if newchar == "\<Esc>" || newchar == "\<C-C>" || newchar == "" if newchar == "\<Esc>" || newchar == "\<C-C>" || newchar == ""
if !sol_save
set nostartofline
endif
return s:beep() return s:beep()
endif endif
endif endif
@@ -379,6 +405,12 @@ function! s:dosurround(...) " {{{1
let strcount = (scount == 1 ? "" : scount) let strcount = (scount == 1 ? "" : scount)
if char == '/' if char == '/'
exe 'norm! '.strcount.'[/d'.strcount.']/' exe 'norm! '.strcount.'[/d'.strcount.']/'
elseif char =~# '[[:punct:][:space:]]' && char !~# '[][(){}<>"''`]'
exe 'norm! T'.char
if getline('.')[col('.')-1] == char
exe 'norm! l'
endif
exe 'norm! dt'.char
else else
exe 'norm! d'.strcount.'i'.char exe 'norm! d'.strcount.'i'.char
endif endif
@@ -387,6 +419,9 @@ function! s:dosurround(...) " {{{1
if keeper == "" if keeper == ""
call setreg('"',original,otype) call setreg('"',original,otype)
let &clipboard = cb_save let &clipboard = cb_save
if !sol_save
set nostartofline
endif
return "" return ""
endif endif
let oldline = getline('.') let oldline = getline('.')
@@ -403,9 +438,12 @@ function! s:dosurround(...) " {{{1
norm! "_x norm! "_x
call setreg('"','/**/',"c") call setreg('"','/**/',"c")
let keeper = substitute(substitute(keeper,'^/\*\s\=','',''),'\s\=\*$','','') let keeper = substitute(substitute(keeper,'^/\*\s\=','',''),'\s\=\*$','','')
elseif char =~# '[[:punct:][:space:]]' && char !~# '[][(){}<>]'
exe 'norm! F'.char
exe 'norm! df'.char
else else
" One character backwards " One character backwards
call search('.','bW') call search('\m.', 'bW')
exe "norm! da".char exe "norm! da".char
endif endif
let removed = getreg('"') let removed = getreg('"')
@@ -417,7 +455,7 @@ function! s:dosurround(...) " {{{1
let keeper = substitute(keeper,'^\s\+','','') let keeper = substitute(keeper,'^\s\+','','')
let keeper = substitute(keeper,'\s\+$','','') let keeper = substitute(keeper,'\s\+$','','')
endif endif
if col("']") == col("$") && col('.') + 1 == col('$') if col("']") == col("$") && virtcol('.') + 1 == virtcol('$')
if oldhead =~# '^\s*$' && a:0 < 2 if oldhead =~# '^\s*$' && a:0 < 2
let keeper = substitute(keeper,'\%^\n'.oldhead.'\(\s*.\{-\}\)\n\s*\%$','\1','') let keeper = substitute(keeper,'\%^\n'.oldhead.'\(\s*.\{-\}\)\n\s*\%$','\1','')
endif endif
@@ -430,7 +468,8 @@ function! s:dosurround(...) " {{{1
endif endif
call setreg('"',keeper,regtype) call setreg('"',keeper,regtype)
if newchar != "" if newchar != ""
call s:wrapreg('"',newchar) let special = a:0 > 2 ? a:3 : 0
call s:wrapreg('"',newchar,removed,special)
endif endif
silent exe 'norm! ""'.pcmd.'`[' silent exe 'norm! ""'.pcmd.'`['
if removed =~ '\n' || okeeper =~ '\n' || getreg('"') =~ '\n' if removed =~ '\n' || okeeper =~ '\n' || getreg('"') =~ '\n'
@@ -445,11 +484,14 @@ function! s:dosurround(...) " {{{1
if newchar == "" if newchar == ""
silent! call repeat#set("\<Plug>Dsurround".char,scount) silent! call repeat#set("\<Plug>Dsurround".char,scount)
else else
silent! call repeat#set("\<Plug>Csurround".char.newchar.s:tag,scount) silent! call repeat#set("\<Plug>C".(a:0 > 2 && a:3 ? "S" : "s")."urround".char.newchar.s:input,scount)
endif
if !sol_save
set nostartofline
endif endif
endfunction " }}}1 endfunction " }}}1
function! s:changesurround() " {{{1 function! s:changesurround(...) " {{{1
let a = s:inputtarget() let a = s:inputtarget()
if a == "" if a == ""
return s:beep() return s:beep()
@@ -458,10 +500,14 @@ function! s:changesurround() " {{{1
if b == "" if b == ""
return s:beep() return s:beep()
endif endif
call s:dosurround(a,b) call s:dosurround(a,b,a:0 && a:1)
endfunction " }}}1 endfunction " }}}1
function! s:opfunc(type,...) " {{{1 function! s:opfunc(type, ...) abort " {{{1
if a:type ==# 'setup'
let &opfunc = matchstr(expand('<sfile>'), '<SNR>\w\+$')
return 'g@'
endif
let char = s:inputreplacement() let char = s:inputreplacement()
if char == "" if char == ""
return s:beep() return s:beep()
@@ -506,7 +552,7 @@ function! s:opfunc(type,...) " {{{1
let keeper = substitute(keeper,'\_s\@<!\s*$','','') let keeper = substitute(keeper,'\_s\@<!\s*$','','')
endif endif
call setreg(reg,keeper,type) call setreg(reg,keeper,type)
call s:wrapreg(reg,char,a:0 && a:1) call s:wrapreg(reg,char,"",a:0 && a:1)
if type ==# "v" && a:type !=# "v" && append != "" if type ==# "v" && a:type !=# "v" && append != ""
call setreg(reg,append,"ac") call setreg(reg,append,"ac")
endif endif
@@ -518,14 +564,18 @@ function! s:opfunc(type,...) " {{{1
let &selection = sel_save let &selection = sel_save
let &clipboard = cb_save let &clipboard = cb_save
if a:type =~ '^\d\+$' if a:type =~ '^\d\+$'
silent! call repeat#set("\<Plug>Y".(a:0 && a:1 ? "S" : "s")."surround".char.s:tag,a:type) silent! call repeat#set("\<Plug>Y".(a:0 && a:1 ? "S" : "s")."surround".char.s:input,a:type)
else else
silent! call repeat#set("\<Plug>SurroundRepeat".char.s:tag) silent! call repeat#set("\<Plug>SurroundRepeat".char.s:input)
endif endif
endfunction endfunction
function! s:opfunc2(arg) function! s:opfunc2(...) abort
call s:opfunc(a:arg,1) if !a:0 || a:1 ==# 'setup'
let &opfunc = matchstr(expand('<sfile>'), '<SNR>\w\+$')
return 'g@'
endif
call s:opfunc(a:1, 1)
endfunction " }}}1 endfunction " }}}1
function! s:closematch(str) " {{{1 function! s:closematch(str) " {{{1
@@ -547,11 +597,11 @@ endfunction " }}}1
nnoremap <silent> <Plug>SurroundRepeat . nnoremap <silent> <Plug>SurroundRepeat .
nnoremap <silent> <Plug>Dsurround :<C-U>call <SID>dosurround(<SID>inputtarget())<CR> nnoremap <silent> <Plug>Dsurround :<C-U>call <SID>dosurround(<SID>inputtarget())<CR>
nnoremap <silent> <Plug>Csurround :<C-U>call <SID>changesurround()<CR> nnoremap <silent> <Plug>Csurround :<C-U>call <SID>changesurround()<CR>
nnoremap <silent> <Plug>Yssurround :<C-U>call <SID>opfunc(v:count1)<CR> nnoremap <silent> <Plug>CSurround :<C-U>call <SID>changesurround(1)<CR>
nnoremap <silent> <Plug>YSsurround :<C-U>call <SID>opfunc2(v:count1)<CR> nnoremap <expr> <Plug>Yssurround '^'.v:count1.<SID>opfunc('setup').'g_'
" <C-U> discards the numerical argument but there's not much we can do with it nnoremap <expr> <Plug>YSsurround <SID>opfunc2('setup').'_'
nnoremap <silent> <Plug>Ysurround :<C-U>set opfunc=<SID>opfunc<CR>g@ nnoremap <expr> <Plug>Ysurround <SID>opfunc('setup')
nnoremap <silent> <Plug>YSurround :<C-U>set opfunc=<SID>opfunc2<CR>g@ nnoremap <expr> <Plug>YSurround <SID>opfunc2('setup')
vnoremap <silent> <Plug>VSurround :<C-U>call <SID>opfunc(visualmode(),visualmode() ==# 'V' ? 1 : 0)<CR> vnoremap <silent> <Plug>VSurround :<C-U>call <SID>opfunc(visualmode(),visualmode() ==# 'V' ? 1 : 0)<CR>
vnoremap <silent> <Plug>VgSurround :<C-U>call <SID>opfunc(visualmode(),visualmode() ==# 'V' ? 0 : 1)<CR> vnoremap <silent> <Plug>VgSurround :<C-U>call <SID>opfunc(visualmode(),visualmode() ==# 'V' ? 0 : 1)<CR>
inoremap <silent> <Plug>Isurround <C-R>=<SID>insert()<CR> inoremap <silent> <Plug>Isurround <C-R>=<SID>insert()<CR>
@@ -560,6 +610,7 @@ inoremap <silent> <Plug>ISurround <C-R>=<SID>insert(1)<CR>
if !exists("g:surround_no_mappings") || ! g:surround_no_mappings if !exists("g:surround_no_mappings") || ! g:surround_no_mappings
nmap ds <Plug>Dsurround nmap ds <Plug>Dsurround
nmap cs <Plug>Csurround nmap cs <Plug>Csurround
nmap cS <Plug>CSurround
nmap ys <Plug>Ysurround nmap ys <Plug>Ysurround
nmap yS <Plug>YSurround nmap yS <Plug>YSurround
nmap yss <Plug>Yssurround nmap yss <Plug>Yssurround
@@ -567,11 +618,13 @@ if !exists("g:surround_no_mappings") || ! g:surround_no_mappings
nmap ySS <Plug>YSsurround nmap ySS <Plug>YSsurround
xmap S <Plug>VSurround xmap S <Plug>VSurround
xmap gS <Plug>VgSurround xmap gS <Plug>VgSurround
if !exists("g:surround_no_insert_mappings") || ! g:surround_no_insert_mappings
if !hasmapto("<Plug>Isurround","i") && "" == mapcheck("<C-S>","i") if !hasmapto("<Plug>Isurround","i") && "" == mapcheck("<C-S>","i")
imap <C-S> <Plug>Isurround imap <C-S> <Plug>Isurround
endif endif
imap <C-G>s <Plug>Isurround imap <C-G>s <Plug>Isurround
imap <C-G>S <Plug>ISurround imap <C-G>S <Plug>ISurround
endif
endif endif
" vim:set ft=vim sw=2 sts=2 et: " vim:set ft=vim sw=2 sts=2 et: