Often one wants to surround one or more words in an existing text with a certain character. For example, to put something in quotes (yes
to "yes"
), make it italic in Markdown (italics
to *italics*
) or bold (bold
to **bold**
).
This is very tedious to do manually, as it involves moving the cursor to the beginning of the text to surround, inserting the character(s), moving the cursor to the end of the text to surround, and inserting the same character(s) again.
The surround.vim plugin targets exactly this use case. It allows to surround a piece of text with a single command.
Usage
Adding Surroundings
- First of all, the commands of surround.vim are relative to the cursor position, thus, on must first move the cursor onto the piece of text to surround.
- The command prefix to add surroundings is
ys
. ys
must be followed by a specification of the piece of text to surround (relative to the current cursor position).- For example,
ysw
specifies the text from the current cursor position to the end of the word under the cursor. - More useful is
ysiw
, which specifies the entire word under the cursor, no matter whether the cursor is at the beginning of the word or in the middle of it - To specify multiple words, use
ysXaw
, whereX
is the number of words to surround. For example,ys3aw
specifies three words, starting with the word under the cursor. - To specify the entire line, use
yss
- For example,
- As soon as the above specification has been typed, the cursor disappears from the text, and the Vim command line prompts for an input. Now you have to enter the character with which to surround the specified text.
- For example,
*
surrounds the specified text with*
(so the entire command might beysiw*
) - For parentheses, use
)
,]
,}
, this inserts left and right parentheses appropriately - It is possible to specify HTML/XML tags. To surround the specified text with the
<em>
tag, just type<em>
, and the opening and closing tags<em>
and</em>
are inserted appropriately. For example, to enclose three words in an<em>
tag, the entire command isys3aw<em>
. To wrap an entire line in a<p>
tag, the command isyss<p>
.
- For example,
Deleting Surroundings
- To delete the surroundings of a text area, simply move the cursor anywhere inside this text area, and type
ds
followed by the surrounding character- For example,
ds*
deletes the innermost*
surroundings (if any) of the text under the cursor - For deleting HTML/XML tags, simply use
t
. No need to type the exact tag to delete. So,dst
deletes the innermost HTML/XML tag pair of the text under the cursor, no matter what the type of this tag pair is.
- For example,
Changing Surroundings
- To change existing surroundings, move the cursor anywhere inside the surrounded text, type
cs
followed by the existing type of surrounding, followed by the desired new type of surrounding- For example,
cs*_
changes the innermost*
surroundings (if any) of the text under the cursor to_
surroundings - For specifying an HTML/XML tag as the existing type of surrounding, use
t
(as in Deleting Surroundings) - For specifying an HTML/XML tag as the new type of surrounding, type the entire tag (as in Adding Surroundings)
- For example,
cst*
changes the innermost HTML/XML tag pair to a simple*
surrounding,cs*<p>
changes the simple*
surrounding to a<p>
tag pair, andcst<div>
changes the innermost HTML/XML tag (whatever type of tag it is) to a<div>
tag.
- For example,
Notes
- Except for HTML/XML tags, it is only possible to specify a single character as the surrounding. For example, to surround a word with
**
(e.g. to make it bold in Markdown), it is not possible to typeysiw**
, because the plugin terminates listening for input after the first*
. A way around this specific case is to first executeysiw*
, and then repeat this command with the Vim.
operator. - Another way to specify the text to surround is to select it in visual mode, and then typing
S
(instead of directly typingys
in normal mode as in the method described above). Everything else works the same with this method.- For example,
viw
selects the word under the cursor in visual mode, and then typingS*
surrounds it with*
. The effect ofviwS*
is same asysiw*
.
- For example,
For Emacs
There exists a port of the surround.vim plugin to Emacs’s Evil mode as an Emacs package called evil-surround. The usage is the same as in the original Vim plugin.
It can be installed in Emas with M-x package-install RET evil-surround
.