Contents
There are three ways to keep your snippets:
Blabla
The most convenient way to define snippets for YASnippet is to put them in a directory arranged by the mode and use yas/load-directory to load them.
However, this might slow down the Emacs startup speed if you have many snippets. You can use yas/define-snippets to define a bunch of snippets for a perticular mode. But this is hard to maintain! So, there's a better way: define your snippets in directory and use yas/compile-bundle to compile it into a bundle file when you modified your snippets.
The release bundle of YASnippet is produced by yas/compile-bundle. The bundle use yas/define-snippets to define snippets. This avoid the IO and parsing overhead when loading snippets.
Finally, you can use yas/define to define a single snippet at your convenience. I ofthen use this to do some testing.
Here's the directory hierarchy of the snippets directory comes with YASnippet:
snippets
`-- text-mode/
|-- cc-mode/
| |-- c++-mode/
| | |-- beginend
| | |-- class
| | `-- using
| |-- c-mode/
| | `-- fopen
| |-- do
| |-- for
| |-- if
| |-- inc
| |-- inc.1
| |-- main
| |-- once
| `-- struct
|-- css-mode/
| |-- background
| |-- background.1
| `-- border
|-- email
|-- html-mode/
| |-- div
| |-- doctype
| |-- doctype.xhml1
| |-- doctype.xhtml1_1
| |-- doctype.xhtml1_strict
| `-- doctype.xhtml1_transitional
|-- objc-mode/
| `-- prop
|-- perl-mode/
| |-- cperl-mode/
| |-- eval
| |-- for
| |-- fore
| |-- if
| |-- ife
| |-- ifee
| |-- sub
| |-- unless
| |-- while
| |-- xfore
| |-- xif
| |-- xunless
| `-- xwhile
|-- python-mode/
| |-- __
| |-- class
| |-- def
| |-- for
| |-- ifmain
| `-- while
|-- rst-mode/
| |-- chapter
| |-- section
| `-- title
|-- ruby-mode/
| |-- #
| |-- =b
| |-- Comp
| |-- all
| |-- am
| |-- any
| |-- app
| |-- bm
| |-- case
| |-- cla
| |-- classify
| |-- cls
| |-- collect
| |-- dee
| |-- deli
| |-- det
| |-- ea
| |-- eac
| |-- eai
| |-- eav
| |-- eawi
| |-- forin
| |-- if
| |-- ife
| |-- inject
| |-- mm
| |-- r
| |-- rb
| |-- reject
| |-- req
| |-- rreq
| |-- rw
| |-- select
| |-- w
| |-- y
| `-- zip
`-- time
Snippet definitions are put in plain text files. They are arranged by subdirectories. For example, snippets for c-mode are put in the c-mode directory.
The parent directory acts as the parent mode. This is the way of YASnippet to share snippet definitions among different modes. As you can see above, c-mode and c++-mode share the same parents cc-mode, while all modes are derived from text-mode. This can be also used to as an alias -- cperl-mode is an empty directory whose parent is perl-mode.
File names act as the snippet trigger key. Note files starting with a dot (.) are ignored.
As I mentioned above, you can define snippets directly by writing elisp code.
The basic syntax of yas/define-snippets is
(yas/define-snippets MODE SNIPPETS &optional PARENT)
The parameters are self-descriptive. If you specify a PARENT, then the snippets of the parents may be shared by MODE. Note if you use this function several times, the later specified PARENT will overwrite the original one. However, not specifying a PARENT won't erase the original parent.
The SNIPPETS parameter is a list of snippet definitions. Each element should have the following form:
(KEY TEMPLATE NAME CONDITION GROUP)
The NAME, CONDITION and GROUP can be omitted if you don't want to provide one. Here's an example:
(yas/define-snippets 'c++-mode
'(
("using" "using namespace ${std};
$0" "using namespace ... " nil)
("class" "class ${1:Name}
{
public:
$1($2);
virtual ~$1();
};" "class ... { ... }" nil)
("beginend" "${1:v}.begin(), $1.end" "v.begin(), v.end()" nil)
)
'cc-mode)
The example above is auto-generated code by yas/compile-bundle.
The basic syntax for yas/define is
(yas/define mode key template &optional name condition group)
This is only a syntax sugar for
(yas/define-snippets mode
(list (list key template name condition group)))
yas/compile-bundle can be used to parse the snippets from a directory hierarchy and translate them into the elisp form. The translated code is faster to load. Further more, the generated bundle is a stand-alone file not depending on yasnippet.el. The released bundles of YASnippet are all generated this way.