

Vim Plugins You Should Know About, Part I: surround.vim - pkrumins
http://www.catonmat.net/blog/vim-plugins-surround-vim/

======
thomasmallen

      <!-- Ugh. Surround is OK, but sucks for wrapping in HTML tags. If I select the line: -->
    
      Hello!
    
      <!-- And use stp (surround selection with <p/>) I get: -->
    
      <p>
          Hello!
      </p>
    
      <!-- Instead of -->
      
      <p>Hello!</p>
    
      <!-- The workaround? ^v$ which is tedious. I recommend mapping this for those times when you want to wrap the current line quickly in XML tags. 
    
      function! TagWrapper()
          let a:tag = input("Tag: ")
          normal `>
          exe "normal a</" . a:tag . ">"
          normal `<
          exe "normal i<" . a:tag . ">"
      endfunction
      -->

~~~
pkrumins
This plugin does not define 'stp'. You must be using some other plugin that
has this mapping.

The plugin I wrote about wraps HTML around perfectly. Try:

    
    
        ysiWt<p>
    

Or if you knew the tag you were going to wrap your "Hello!" in, then in
_insert mode_ you could have pressed:

    
    
        <CTRL+s>t<p>.

~~~
thomasmallen
No, the plugin _does_ define stp.

    
    
      :help Surround
    

The pattern you have there ("ysiWtp", < is unnecessary, as is >) is actually
not thoroughly tested (as mentioned in the docs) and is used when not in a
visual selection. In a visual selection, you use "s" followed by what you want
to surround with, e.g. s"

~~~
pkrumins
You must have a different surround.vim script. Perhaps someone else wrote a
script and called "surround.vim" as well.

The one I am talking about does not define stp and requires < > between tags.

What does your 'stp' do?

Edit: I see what you did there. You were in visual mode!

~~~
thomasmallen
Of course. surround.vim couldn't get away with clobbering "s" in normal mode.

~~~
pkrumins
this works for me:

    
    
      viwstp>
    

turns

    
    
      foo
    

into

    
    
      <p>foo</p>
    

Edit: (30 mins later) Now I understood fully what was happening. ;)

------
pmarin
My favorite vim plugin is to not use any plugin: use the filter command "!",
the unix way.

~~~
orib
Sure, but some things (eg, surround.vim) can't be emulated with that.

~~~
pmarin
give me an example of something that i can't filter in a sed/grep/ed/awk/perl
script.

------
kilowatt
I just made a plugin recently for on the fly Python checking with squiggly
underlines, like a "real" IDE: pyflakes.vim
<http://www.vim.org/scripts/script.php?script_id=2441>

(Make sure you grab a Python 2.5/gvim--required ATM--build from the link on
that page as well.)

------
thamer
I tried this plugin a few days ago, but it seemed to break the s (substitute)
command, so I removed it. Does someone know how to make it work?

The problem is the following: Write a line of text, select part of it using v,
then press s to remove the selection and enter insert mode to start replacing
it. This doesn't work anymore when surround.vim is loaded. Too bad, it sure
looks great…

~~~
pkrumins
Try 'R' instead of 's' that you were used to.

    
    
      OR
    

Edit surround.vim and comment out the 's' mappings in visual mode. Like this:

    
    
        "    if !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

~~~
thamer
'R' replaces the whole line, so that won't do. I commented the script as you
suggested and it works. Thank you!

------
tumult
oh my god, thank you. i love you.

------
tdavis
I've been looking for a plugin that does precisely this. Thank you Peteris,
you've got another subscriber ;)

~~~
pkrumins
Thank you! :)

