1 #+TITLE: Yet another snippet extension
5 #+SETUPFILE: org-setup.inc
9 *YASnippet* is a template system for Emacs. It allows you to type an
10 abbreviation and automatically expand it into function templates. Bundled
11 language templates includes: C, C++, C#, Perl, Python, Ruby, SQL, LaTeX, HTML,
12 CSS and more. The snippet syntax is inspired from TextMate's syntax, you can
13 even [[#import-textmate][import most TextMate snippets]]
15 YASnippet is an original creation of [[http://pluskid.lifegoo.org][pluskid]] who also wrote its predecessor
16 [[http://code.google.com/p/smart-snippet][smart-snippet]].
20 On [[http://www.youtube.com/watch?v=ZCGmZK4V7Sg][youtube]].
24 Clone this repository somewhere
27 $ cd ~/.emacs.d/plugins
28 $ git clone https://github.com/capitaomorte/yasnippet
31 Add the following in your =.emacs= file:
33 #+begin_src emacs-lisp :exports code
34 (add-to-list 'load-path
35 "~/.emacs.d/plugins/yasnippet")
40 Add your own snippets to =~/.emacs.d/snippets= by placing files there or
41 invoking [[sym:yas-new-snippet][=yas-new-snippet=]].
43 ** Import textmate snippets (rails example)
45 :CUSTOM_ID: import-textmate
48 YASnippet lets you use TextMate bundles directly:
51 $ cd ~/.emacs.d/plugins
52 $ git clone https://github.com/capitaomorte/yasnippet
55 $ git submodule update
56 $ gem install plist trollop
57 $ rake convert_bundles # will convert ruby, rails and html bundles from drnic
60 Then, in your =.emacs= file
63 (add-to-list 'load-path
64 "~/.emacs.d/plugins/yasnippet")
66 (setq yas-snippet-dirs '("~/.emacs.d/snippets" "~/.emacs.d/extras/imported"))
70 Open some rails file (model, app, etc) and start using the textmate
71 snippets. Consider that this is a work-in-progress and many snippets/commands
72 might not work. Patches welcome!
74 ** Contributing snippets
76 Please *do not ask me* to add snippets to the default collection under
77 =/snippets=. This collection is considered frozen. By customizing
78 [[sym:yas-snippet-dirs][=yas-snippet-dirs=]] you can point yasnippet to good
79 snippet collections out there.
81 The =extras/textmate-import.rb= tool can import many actual Textmate
82 snippets. I'm focusing on developing it and the accompanying =yas-setup.el=
83 files that guide it with more difficult importations. The idea is to deprecate
84 =/snippets= and replace it with =extras/imported=.
88 The documentation has been split into separate parts:
90 1. [[file:snippet-organization.org][Organizing Snippets]]
92 Describes ways to organize your snippets in the hard disk.
95 2. [[file:snippet-expansion.org][Expanding Snippets]]
97 Describes how YASnippet chooses snippets for expansion at point.
99 Maybe, you'll want some snippets to be expanded in a particular mode,
100 or only under certain conditions, or be prompted using =ido=, etc...
103 3. [[file:snippet-development.org][Writing Snippets]]
105 Describes the YASnippet definition syntax, which is very close (but
106 not equivalent) to Textmate's. Includes a section about converting
110 4. [[file:snippet-menu.org][The YASnippet menu]]
112 Explains how to use the YASnippet menu to explore, learn and modify
116 5. [[file:snippet-reference.org][YASnippet Symbol Reference]]
118 An automatically generated listing of all YASnippet commands,
119 (customization) variables, and functions.
122 ** Bugs, discussion, contributions, etc
124 If you think you've found a bug, please report it on [[https://github.com/capitaomorte/yasnippet/issues][the GitHub issue tracker]]
125 (please **do not** submit new issues to the old [[http://code.google.com/p/yasnippet/issues/list][googlecode tracker]]).
127 If you run into problems using YASnippet, or have snippets to contribute,
128 post to the [[http://groups.google.com/group/smart-snippet][yasnippet forum]]. Thank you very much for using YASnippet!
130 * Organizing snippets
134 Snippet collections can be stored in plain text files. They are arranged by
135 sub-directories naming *snippet tables*. These mostly name Emacs major names.
148 The collections are loaded into *snippet tables* which the triggering
149 mechanism (see [[#expand-snippets][Expanding snippets]]) looks up and
150 (hopefully) cause the right snippet to be expanded for you.
152 ** Setting up =yas-snippet-dirs=
154 The emacs variable [[sym:yas-snippet-dirs][=yas-snippet-dirs=]] tells YASnippet
155 which collections to consider. It's used when you activate
156 [[sym:yas-global-mode][=yas-global-mode=]] or call
157 [[sym:yas-reload-all][=yas-reload-all=]] interactively.
159 The default considers:
161 - a personal collection that lives in =~/.emacs.d/snippets=
162 - the bundled collection, taken as a relative path to =yasnippet.el= localtion
164 When you come across other snippet collections, do the following to try them
167 #+begin_src emacs-lisp :exports code
168 ;; Develop in ~/emacs.d/mysnippets, but also
169 ;; try out snippets in ~/Downloads/interesting-snippets
170 (setq yas-snippet-dirs '("~/emacs.d/mysnippets"
171 "~/Downloads/interesting-snippets"))
173 ;; OR, keeping yasnippet's defaults try out ~/Downloads/interesting-snippets
174 (setq yas-snippet-dirs (append yas-snippet-dirs
175 '("~/Downloads/interesting-snippets")))
178 Collections appearing earlier in the list shadow snippets with same names
179 appearing in collections later in the list. [[sym:yas-new-snippet][=yas-new-snippet=]] always stores
180 snippets in the first collection.
182 ** The =.yas-parents= file
184 It's very useful to have certain modes share snippets between themselves. To do
185 this, choose a mode subdirectory and place a =.yas-parents= containing a
186 whitespace-separated list of other mode names. When you reload those modes
187 become parents of the original mode.
192 | |-- .yas-parents # contains "cc-mode text-mode"
198 | |-- .yas-parents # contains "cc-mode text-mode"
205 ** TODO The =.yas-make-groups= file
207 If you place an empty plain text file =.yas-make-groups= inside one of the
208 mode directories, the names of these sub-directories are considered groups of
209 snippets and [[snippet-menu][the menu]] is organized much more cleanly:
213 Another alternative way to achieve this is to place a =# group:= directive
214 inside the snippet definition. See [[#writing-snippets][Writing Snippets]]
223 |-- control structure
232 Yet another way to create a nice snippet menu is to write into
233 =.yas-make-groups= a menu definition. TODO
235 ** TODO The =.yas-setup.el= file
239 ** TODO The =.yas-compiled-snippet.el= file
243 ** The =.yas-skip= file
248 :CUSTOM_ID: expand-snippets
251 This section describes how YASnippet chooses snippets for expansion at point.
253 Maybe, you'll want some snippets to be expanded in a particular
254 mode, or only under certain conditions, or be prompted using
256 ** Triggering expansion
258 To make a snippet expand after the cursor:
260 * Type the snippet's *trigger key* then calling [[sym:yas-expand][=yas-expand=]]. It's bound to
261 =TAB= and =<tab>= by default, to change it use
263 #+begin_src emacs-lisp :exports code
264 (define-key yas-minor-mode-map (kbd "<tab>") nil)
265 (define-key yas-minor-mode-map (kbd "TAB") nil)
266 (define-key yas-minor-mode-map (kbd "<the new key>") 'yas-expand)
269 * Use the snippet's *keybinding*.
271 * Call [[sym:yas-insert-snippet][=yas-insert-snippet=]] (use =M-x
272 yas-insert-snippet== or its keybinding =C-c & C-s=).
274 * By expanding directly from the "YASnippet" menu in the menu-bar
276 * Using hippie-expand
278 * Use m2m's excellent auto-complete