Skip to content
Browse files

Updated surround.vim

  • Loading branch information...
1 parent 44fc5e6 commit 74b0492655134c6a5abebb89a665965feb95c5eb @arthurzapparoli arthurzapparoli committed with Jan 17, 2012
Showing with 48 additions and 120 deletions.
  1. +11 −22 doc/surround.txt
  2. +37 −98 plugin/surround.vim
View
33 doc/surround.txt
@@ -1,6 +1,6 @@
*surround.txt* Plugin for deleting, changing, and adding "surroundings"
-Author: Tim Pope <vimNOSPAM@tpope.info> *surround-author*
+Author: Tim Pope <http://tpo.pe/>
License: Same terms as Vim itself (see |license|)
This plugin is only available if 'compatible' is not set.
@@ -20,7 +20,7 @@ examples. An asterisk (*) is used to denote the cursor position.
[123+4*56]/2 cs]) (123+456)/2
"Look ma, I'm *HTML!" cs"<q> <q>Look ma, I'm HTML!</q>
if *x>3 { ysW( if ( x>3 ) {
- my $str = *whee!; vlllls' my $str = 'whee!';
+ my $str = *whee!; vllllS' my $str = 'whee!';
While a few features of this plugin will work in older versions of Vim,
Vim 7 is recommended for full functionality.
@@ -50,8 +50,8 @@ below in |surround-replacements|. Once again, examples are in order.
<div>Yo!*</div> cst<p> <p>Yo!</p>
*ys* takes a valid Vim motion or text object as the first object, and wraps
-it using the second argument as with |cs|. (Unfortunately there's no good
-mnemonic for "ys".)
+it using the second argument as with |cs|. (It's a stretch, but a good
+mnemonic for "ys" is "you surround".)
Old text Command New text ~
Hello w*orld! ysiw) Hello (world)!
@@ -65,28 +65,19 @@ whitespace.
There is also *yS* and *ySS* which indent the surrounded text and place it
on a line of its own.
-In visual mode, a simple "s" with an argument wraps the selection. This is
+In visual mode, a simple "S" with an argument wraps the selection. This is
referred to as the *vS* mapping, although ordinarily there will be
-additional keystrokes between the v and s. In linewise visual mode, the
+additional keystrokes between the v and S. In linewise visual mode, the
surroundings are placed on separate lines and indented. In blockwise visual
mode, each line is surrounded.
A "gS" in visual mode, known as *vgS* , behaves similarly. In linewise visual
-mode, the automatic indenting is surpressed. In blockwise visual mode, this
-enables surrounding past the end of the like with 'virtualedit' set (there
+mode, the automatic indenting is suppressed. In blockwise visual mode, this
+enables surrounding past the end of the line with 'virtualedit' set (there
seems to be no way in Vim Script to differentiate between a jagged end of line
selection and a virtual block selected past the end of the line, so two maps
were needed).
-Additionally, there is a legacy "s" or *vs* mapping which is basically the
-same as |vS|. Due to popular demand of wanting to use "s" as Vim does to mean
-replacing the selection (also available as "c"), this mapping is going away.
-If you were one of these people and would like to disable "s" with the current
-release, indicate this to surround.vim by assigning the "s" mapping to
-something else.
->
- xmap <Leader>s <Plug>Vsurround
-<
*i_CTRL-G_s* *i_CTRL-G_S*
Finally, there is an experimental insert mode mapping on <C-G>s and <C-S>.
Beware that the latter won't work on terminals with flow control (if you
@@ -100,13 +91,11 @@ TARGETS *surround-targets*
The |ds| and |cs| commands both take a target as their first argument. The
possible targets are based closely on the |text-objects| provided by Vim.
-In order for a target to work, the corresponding text object must be
-supported in the version of Vim used (Vim 7 adds several text objects, and
-thus is highly recommended). All targets are currently just one character.
+All targets are currently just one character.
Eight punctuation marks, (, ), {, }, [, ], <, and >, represent themselves
and their counterparts. If the opening mark is used, contained whitespace is
-also trimmed. The targets b, B, r, and a are aliases for ), }, ], and >
+also trimmed. The targets b, B, r, and a are aliases for ), }, ], and >
(the first two mirror Vim; the second two are completely arbitrary and
subject to change).
@@ -128,7 +117,7 @@ however, newlines are sometimes added and/or removed.
REPLACEMENTS *surround-replacements*
A replacement argument is a single character, and is required by |cs|, |ys|,
-and |vs|. Undefined replacement characters (with the exception of alphabetic
+and |vS|. Undefined replacement characters (with the exception of alphabetic
characters) default to placing themselves at the beginning and end of the
destination, which can be useful for characters like / and |.
View
135 plugin/surround.vim
@@ -1,28 +1,13 @@
" surround.vim - Surroundings
-" Author: Tim Pope <vimNOSPAM@tpope.org>
+" Author: Tim Pope <http://tpo.pe/>
" Version: 1.90
" GetLatestVimScripts: 1697 1 :AutoInstall: surround.vim
-"
-" See surround.txt for help. This can be accessed by doing
-"
-" :helptags ~/.vim/doc
-" :help surround
-"
-" Licensed under the same terms as Vim itself.
-" ============================================================================
-
-" Exit quickly when:
-" - this plugin was already loaded or disabled
-" - when 'compatible' is set
-if (exists("g:loaded_surround") && g:loaded_surround) || &cp
+if exists("g:loaded_surround") || &cp || v:version < 700
finish
endif
let g:loaded_surround = 1
-let s:cpo_save = &cpo
-set cpo&vim
-
" Input functions {{{1
function! s:getchar()
@@ -36,10 +21,10 @@ endfunction
function! s:inputtarget()
let c = s:getchar()
while c =~ '^\d\+$'
- let c = c . s:getchar()
+ let c .= s:getchar()
endwhile
if c == " "
- let c = c . s:getchar()
+ let c .= s:getchar()
endif
if c =~ "\<Esc>\|\<C-C>\|\0"
return ""
@@ -49,10 +34,9 @@ function! s:inputtarget()
endfunction
function! s:inputreplacement()
- "echo '-- SURROUND --'
let c = s:getchar()
if c == " "
- let c = c . s:getchar()
+ let c .= s:getchar()
endif
if c =~ "\<Esc>" || c =~ "\<C-C>"
return ""
@@ -91,19 +75,9 @@ function! s:extractafter(str)
endif
endfunction
-function! s:repeat(str,count)
- let cnt = a:count
- let str = ""
- while cnt > 0
- let str = str . a:str
- let cnt = cnt - 1
- endwhile
- return str
-endfunction
-
function! s:fixindent(str,spc)
- let str = substitute(a:str,'\t',s:repeat(' ',&sw),'g')
- let spc = substitute(a:spc,'\t',s:repeat(' ',&sw),'g')
+ let str = substitute(a:str,'\t',repeat(' ',&sw),'g')
+ let spc = substitute(a:spc,'\t',repeat(' ',&sw),'g')
let str = substitute(str,'\(\n\|\%^\).\@=','\1'.spc,'g')
if ! &et
let str = substitute(str,'\s\{'.&ts.'\}',"\t",'g')
@@ -113,23 +87,22 @@ endfunction
function! s:process(string)
let i = 0
- while i < 7
- let i = i + 1
+ for i in range(7)
let repl_{i} = ''
let m = matchstr(a:string,nr2char(i).'.\{-\}\ze'.nr2char(i))
if m != ''
let m = substitute(strpart(m,1),'\r.*','','')
let repl_{i} = input(substitute(m,':\s*$','','').': ')
endif
- endwhile
+ endfor
let s = ""
let i = 0
while i < strlen(a:string)
let char = strpart(a:string,i,1)
if char2nr(char) < 8
let next = stridx(a:string,char,i+1)
if next == -1
- let s = s . char
+ let s .= char
else
let insertion = repl_{char2nr(char)}
let subs = strpart(a:string,i+1,next-i-1)
@@ -140,13 +113,13 @@ function! s:process(string)
let r = stridx(sub,"\r")
let insertion = substitute(insertion,strpart(sub,0,r),strpart(sub,r+1),'')
endwhile
- let s = s . insertion
+ let s .= insertion
let i = next
endif
else
- let s = s . char
+ let s .= char
endif
- let i = i + 1
+ let i += 1
endwhile
return s
endfunction
@@ -164,7 +137,6 @@ function! s:wrap(string,char,type,...)
else
let initspaces = matchstr(getline('.'),'\%^\s*')
endif
- " Duplicate b's are just placeholders (removed)
let pairs = "b()B{}r[]a<>"
let extraspace = ""
if newchar =~ '^ '
@@ -190,7 +162,7 @@ function! s:wrap(string,char,type,...)
let dounmapp = 0
let dounmapb = 0
if !maparg(">","c")
- let dounmapb= 1
+ let dounmapb = 1
" Hide from AsNeeded
exe "cn"."oremap > <CR>"
endif
@@ -216,7 +188,7 @@ function! s:wrap(string,char,type,...)
endif
if newchar == "\<C-T>" || newchar == ","
if type ==# "v" || type ==# "V"
- let before = before . "\n\t"
+ let before .= "\n\t"
endif
if type ==# "v"
let after = "\n". after
@@ -227,26 +199,20 @@ function! s:wrap(string,char,type,...)
" LaTeX
let env = input('\begin{')
let env = '{' . env
- let env = env . s:closematch(env)
+ let env .= s:closematch(env)
echo '\begin'.env
if env != ""
let before = '\begin'.env
let after = '\end'.matchstr(env,'[^}]*').'}'
endif
- "if type ==# 'v' || type ==# 'V'
- "let before = before ."\n\t"
- "endif
- "if type ==# 'v'
- "let after = "\n".initspaces.after
- "endif
elseif newchar ==# 'f' || newchar ==# 'F'
let fnc = input('function: ')
if fnc != ""
let before = substitute(fnc,'($','','').'('
let after = ')'
if newchar ==# 'F'
- let before = before . ' '
- let after = ' ' . after
+ let before .= ' '
+ let after = ' ' . after
endif
endif
elseif idx >= 0
@@ -264,24 +230,22 @@ function! s:wrap(string,char,type,...)
let before = ''
let after = ''
endif
- "let before = substitute(before,'\n','\n'.initspaces,'g')
let after = substitute(after ,'\n','\n'.initspaces,'g')
- "let after = substitute(after,"\n\\s*\<C-U>\\s*",'\n','g')
if type ==# 'V' || (special && type ==# "v")
let before = substitute(before,' \+$','','')
let after = substitute(after ,'^ \+','','')
if after !~ '^\n'
let after = initspaces.after
endif
if keeper !~ '\n$' && after !~ '^\n'
- let keeper = keeper . "\n"
+ let keeper .= "\n"
elseif keeper =~ '\n$' && after =~ '^\n'
let after = strpart(after,1)
endif
if before !~ '\n\s*$'
- let before = before . "\n"
+ let before .= "\n"
if special
- let before = before . "\t"
+ let before .= "\t"
endif
endif
endif
@@ -321,21 +285,18 @@ endfunction
function! s:insert(...) " {{{1
" Optional argument causes the result to appear on 3 lines, not 1
- "call inputsave()
let linemode = a:0 ? a:1 : 0
let char = s:inputreplacement()
while char == "\<CR>" || char == "\<C-S>"
" TODO: use total count for additional blank lines
- let linemode = linemode + 1
+ let linemode += 1
let char = s:inputreplacement()
endwhile
- "call inputrestore()
if char == ""
return ""
endif
- "call inputsave()
let cb_save = &clipboard
- set clipboard-=unnamed
+ set clipboard-=unnamed clipboard-=unnamedplus
let reg_save = @@
call setreg('"',"\r",'v')
call s:wrapreg('"',char,linemode)
@@ -350,9 +311,6 @@ function! s:insert(...) " {{{1
if exists("g:surround_insert_tail")
call setreg('"',g:surround_insert_tail,"a".getregtype('"'))
endif
- "if linemode
- "call setreg('"',substitute(getreg('"'),'^\s\+','',''),'c')
- "endif
if col('.') >= col('$')
norm! ""p
else
@@ -400,7 +358,7 @@ function! s:dosurround(...) " {{{1
endif
endif
let cb_save = &clipboard
- set clipboard-=unnamed
+ set clipboard-=unnamed clipboard-=unnamedplus
let append = ""
let original = getreg('"')
let otype = getregtype('"')
@@ -499,10 +457,9 @@ function! s:opfunc(type,...) " {{{1
let sel_save = &selection
let &selection = "inclusive"
let cb_save = &clipboard
- set clipboard-=unnamed
+ set clipboard-=unnamed clipboard-=unnamedplus
let reg_save = getreg(reg)
let reg_type = getregtype(reg)
- "call setreg(reg,"\n","c")
let type = a:type
if a:type == "char"
silent exe 'norm! v`[o`]"'.reg.'y'
@@ -511,6 +468,7 @@ function! s:opfunc(type,...) " {{{1
silent exe 'norm! `[V`]"'.reg.'y'
let type = 'V'
elseif a:type ==# "v" || a:type ==# "V" || a:type ==# "\<C-V>"
+ let &selection = sel_save
let ve = &virtualedit
if !(a:0 && a:1)
set virtualedit=
@@ -578,48 +536,29 @@ nnoremap <silent> <Plug>YSsurround :<C-U>call <SID>opfunc2(v:count1)<CR>
" <C-U> discards the numerical argument but there's not much we can do with it
nnoremap <silent> <Plug>Ysurround :<C-U>set opfunc=<SID>opfunc<CR>g@
nnoremap <silent> <Plug>YSurround :<C-U>set opfunc=<SID>opfunc2<CR>g@
-vnoremap <silent> <Plug>Vsurround :<C-U>call <SID>opfunc(visualmode())<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>
inoremap <silent> <Plug>Isurround <C-R>=<SID>insert()<CR>
inoremap <silent> <Plug>ISurround <C-R>=<SID>insert(1)<CR>
if !exists("g:surround_no_mappings") || ! g:surround_no_mappings
- nmap ds <Plug>Dsurround
- nmap cs <Plug>Csurround
- nmap ys <Plug>Ysurround
- nmap yS <Plug>YSurround
- nmap yss <Plug>Yssurround
- nmap ySs <Plug>YSsurround
- nmap ySS <Plug>YSsurround
- if !hasmapto("<Plug>Vsurround","v") && !hasmapto("<Plug>VSurround","v")
- if exists(":xmap")
- xmap s <Plug>Vsurround
- else
- vmap s <Plug>Vsurround
- endif
- endif
- if !hasmapto("<Plug>VSurround","v")
- if exists(":xmap")
- xmap S <Plug>VSurround
- else
- vmap S <Plug>VSurround
- endif
- endif
- if exists(":xmap")
- xmap gS <Plug>VgSurround
- else
- vmap gS <Plug>VgSurround
+ nmap ds <Plug>Dsurround
+ nmap cs <Plug>Csurround
+ nmap ys <Plug>Ysurround
+ nmap yS <Plug>YSurround
+ nmap yss <Plug>Yssurround
+ nmap ySs <Plug>YSsurround
+ nmap ySS <Plug>YSsurround
+ xmap S <Plug>VSurround
+ xmap gS <Plug>VgSurround
+ if maparg('s', 'x') ==# ''
+ xnoremap <silent> s :<C-U>echoerr 'surround.vim: Visual mode s has been removed in favor of S'<CR>
endif
if !hasmapto("<Plug>Isurround","i") && "" == mapcheck("<C-S>","i")
imap <C-S> <Plug>Isurround
endif
imap <C-G>s <Plug>Isurround
imap <C-G>S <Plug>ISurround
- "Implemented internally instead
- "imap <C-S><C-S> <Plug>ISurround
endif
-let &cpo = s:cpo_save
-
" vim:set ft=vim sw=2 sts=2 et:

0 comments on commit 74b0492

Please sign in to comment.
Something went wrong with that request. Please try again.