1
0
mirror of https://github.com/gryf/snipmate.vim.git synced 2025-12-23 22:52:27 +01:00
Files
snipmate.vim/doc/snipMate.txt

270 lines
12 KiB
Plaintext

*snipMate.txt* Plugin for using TextMate-style snippets in Vim.
Snippets *snippet* *snippets* *snipMate*
Last Change: February 28, 2009
|snipMate-description| Description
|snipMate-usage| Usage
|snipMate-syntax| Snippet syntax
|snipMate-features| Features
|snipMate-disadvantages| Disadvantages to TextMate
|snipMate-contact| Contact
For Vim version 7.0 or later.
This plugin only works if 'compatible' is not set.
{Vi does not have any of these features}
==============================================================================
DESCRIPTION *snipMate-description*
snipMate.vim implements some of TextMate's snippets features in
Vim. A snippet is a piece of often-typed text that you can
insert into your document using a trigger word followed by a <tab>.
For instance, in a C file using the default installation of
snipMate.vim, if you type "for<tab>" in insert mode,
it will expand a typical for loop in C: >
for (i = 0; i < count; i++) {
}
To go to the next item in the loop, simply <tab>
over to it; if there is repeated code, such as the "i" variable
in this example, you can simply start typing once it's
highlighted and all the matches specified in the snippet will
be updated.
==============================================================================
USAGE *snipMate-usage*
There are two ways to make snippets: file-based and command-based. File-based
snippets are simply *.snippet files named after the trigger of the snippet
and placed in the directory of the filetype (<filetype>/<trigger>.snippet);
command-based snippets are snippets defined using the |Snipp| and |GlobalSnip|
commands. File-based snippets have the advantage of being easier to read, but
do not support some special characters in snippet triggers, while
command-based snippets are obviously convenient for short snippets but can
quickly get unreadable.
*file-snippets* *'snippets'* *g:snippets_dir*
File-based snippets by default are looked for in the 'snippets' directory
inside your home '.vim' directory, typically located in
'~/.vim/snippets/<filetype>' on *nix or '$HOME\vimfiles\snippets\<filetype>'
on Windows. To change that location or add another one, change the
g:snippets_dir variable in your |.vimrc| to your preferred directory, or use
the |ExtractSnips()|function. NOTE: g:snippets_dir must end in a backslash or
forward slash.
ExtractSnips({directory}, {filetype}) *ExtractSnips()*
ExtractSnips() extracts *.snippet files from the specified directory and
defines them as snippets for the given filetype; to define a global snippet,
use '_' for the {filetype} argument.
*ResetSnips()*
The ResetSnips() function removes all snippets from memory. This is useful to
put at the top of a snippet setup file if you would like to :source it
multiple times.
*command-snippets*
Command-based should be installed in the 'after' directory, usually located in
'~/.vim/after'. Filetype specific snippets should be installed in
'after/ftplugin', such as 'after/ftplugin/<filetype>_snips.vim'.
See |ftplugins|. Global snippets should be installed in 'after/plugin'.
To ensure user snippets are not lost when upgrading the plugin, name them
using an ending other than "snips" such as "<filetype>_mysnips.vim"
*Snipp* *GlobalSnip*
Snipp and GlobalSnip Commands~
Snippets are added via the "Snipp" and "GlobalSnip" commands. The syntax for
these are "Snipp <trigger> <text>"; e.g.: >
exe "Snipp trigger The cursor will be placed here."
exe "GlobalSnip another_trigger foo"
"Snipp" creates snippets local to the buffer, while "GlobalSnip" creates
global snippets. "Snipp" is used instead of "Snip" to avoid conflicts with the
imaps.vim script that uses that command name.
These commands are conveniently bound to snippets themselves; "snip" and
"gsnip", respectively. So to expand a Snipp command with double quotes,
type snip<tab>. Single quote Snipp and GlobalSnip commands are bound
to the snippets "snipp" and "gsnipp". See |literal-string| for the
difference between single and double quotes.
*multi_snip* *Snipp!* *GlobalSnip!*
To specify that a snippet can have multiple matches, use the Snipp or
GlobalSnip command followed by a bang (!). The syntax for these are
'Snipp! <trigger> "<name>" <text>'. (Note that the name must be
enclosed in double quotes). E.g.: >
exe 'Snip! trigger "Snippet name #1" expand_this_text'
exe 'Snip! trigger "Snippet name #2" expand_THIS_text!'
In this example, when "trigger<tab>" is typed, a numbered menu containing all
of the names for the "trigger" will be shown; when the user presses the
corresponding number, that snippet will then be expanded.
To create a create a snippet with multiple matches using file-based snippets,
simply place all the snippets in a subdirectory with the trigger name, i.e.
'snippets/<filetype>/<trigger>/<name>.snippet'.
To ensure snipMate.vim is loaded and 'compatible' is not set, make sure
to add: >
if !exists('g:loaded_snips')
fini
en
to the top of your snippets files.
*snipMate-expandtab* *snipMate-indenting*
If you would like your snippets to use spaces instead of tabs, just enable
'expandtab' and set 'softtabstop' to your preferred amount of spaces. If
'softtabstop' is not set, 'shiftwidth' is used instead.
==============================================================================
SYNTAX *snipMate-syntax* *snipMate-${#}*
Tab stops ~
By default, the cursor is placed at the end of a snippet. To specify where the
cursor is to be placed next, use "${#}", where the # is the number of the tab
stop. E.g., to place the cursor first on the id of a <div> tag, and then allow
the user to <tab> to the middle of it:
>
exe "Snipp div <div id=\"${1}\">\n\t${2}\n</div>"
<
*snipMate-placeholders* *snipMate-${#:}* *snipMate-$#*
Placeholders ~
Placeholder text can be supplied using "${#:text}", where # is the number of
the tab stop. This text then can be copied throughout the snippet using "$#",
given # is the same number as used before. So, to make a C for loop: >
exe "Snipp for for (${2:i}; $2 < ${1:count}; $1++) {\n\t${4}\n}"
This will cause "count" to first be selected and change if the user starts
typing. When <tab> is pressed, the "i" in ${2}'s position will be selected;
all $2 variables will default to "i" and automatically be updated if the user
starts typing.
NOTE: "$#" syntax is used only for variables, not for tab stops as in TextMate.
Variables within variables are also possible. For instance: >
exe 'Snipp opt <option value="${1:option}">${2:$1}</option>'
Will, as usual, cause "option" to first be selected and update all the $1
variables if the user starts typing. Since one of these variables is inside of
${2}, this text will then be used as a placeholder for the next tab stop,
allowing the user to change it if he wishes.
To copy a value throughout a snippet without supplying default text, simply
use the "${#:}" construct without the text; e.g.: >
exe 'Snipp foo${1:}bar$1'
< *snipMate-commands*
Interpolated Vim Script ~
Snippets can also contain Vim script commands that are executed (via |eval()|)
when the snippet is inserted. Commands are given inside backticks (`...`); for
TextMates's functionality, use the |system()| function. E.g.: >
exe 'Snipp date `system("date +%Y-%m-%d")`'
will insert the current date, assuming you are on a Unix system. Note you can
also (and should) use |strftime()| for this example.
Filename([{expr}, {defaultText}]) *snipMate-filename* *Filename()*
Since the current filename is used often in snippets, a default function
has been defined for it in snipMate.vim, appropriately called Filename().
With no arguments, the default filename without an extension is returned;
the first argument specifies what to place before or after the filename,
and the second argument supplies the default text to be used if the file
has not been named. "$1" in the first argument is replaced with the filename;
if you only want the filename to be returned, the first argument can be left
blank. Examples: >
exe 'Snipp filename `Filename()`'
exe 'Snipp filename_with_default `Filename("", "name")`'
exe 'Snipp filename_foo `Filename("$1_foo")`'
The first example returns the filename if it the file has been named, and an
empty string if it hasn't. The second returns the filename if it's been named,
and "name" if it hasn't. The third returns the filename followed by "_foo" if
it has been named, and an empty string if it hasn't.
*snipMate-settings* *g:snips_author*
The g:snips_author string (similar to $TM_FULLNAME in TextMate) should be set
to your name; it can then be used in snippets to automatically add it. E.g.: >
let g:snips_author = 'Hubert Farnsworth'
exe 'Snipp name `g:snips_author`'
<
*snipMate-remap*
snipMate does not come with a setting to customize the trigger key, but you
can remap it easily in the two lines it's defined in
'~/.vim/after/plugin/snipMate.vim'. For instance, to change the trigger key
to shift-tab, just change this: >
ino <tab> <c-r>=ExpandSnippet()<cr>
snor <tab> <esc>i<right><c-r>=ExpandSnippet()<cr>
to this: >
ino <s-tab> <c-r>=ExpandSnippet()<cr>
snor <s-tab> <esc>i<right><c-r>=ExpandSnippet()<cr>
==============================================================================
FEATURES *snipMate-features*
snipMate.vim has the following features among others:
- The syntax of snippets is very similar to TextMate's, allowing
easy conversion.
- The position of the snippet is kept transparently (i.e. it does not use
markers/placeholders written to the buffer), which allows you to escape
out of an incomplete snippet, something particularly useful in Vim.
- Variables in snippets are updated as-you-type.
- Snippets can have multiple matches.
- Snippets can be out of order. For instance, in a do...while loop, the
condition can be added before the code.
- (New) File-based snippets are supported.
- (New) Triggers after non-word delimiters are expanded, e.g. "foo"
in "bar.foo".
- (New) Nested snippets are possible.
==============================================================================
DISADVANTAGES *snipMate-disadvantages*
snipMate.vim currently has the following disadvantages to TextMate's snippets:
- There is no way to go back a tab stop, like shift-tab in TextMate.
- There is no $0; the order of tab stops must be explicitly stated.
- Placeholders within placeholders are not possible. E.g.: >
'<div${1: id="${2:some_id}}">${3}</div>'
<
In TextMate this would first highlight ' id="some_id"', and if
you hit delete it would automatically skip ${2} and go to ${3}
on the next <tab>, but if you didn't delete it it would highlight
"some_id" first. You cannot do this in snipMate.vim.
- Regex cannot be performed on variables, such as "${1/.*/\U&}"
- Placeholders cannot span multiple lines.
- Activating snippets in different scopes of the same file is
not possible.
Perhaps some of these features will be added in a later release.
==============================================================================
CONTACT *snipMate-contact* *snipMate-author*
To contact the author (Michael Sanders), please email:
msanders42+snipmate <at> gmail <dot> com
I greatly appreciate any suggestions or improvements offered for the script.
vim:tw=78:ts=8:ft=help:norl: