yasnippet/doc/manual.org
Joao Tavora c13abb7520 doc/yas-doc-helper.el: write documentation for "exported" symbols from docstrings
doc/manual.org: some tweaks, use new yas--document-symbols
2012-08-01 21:48:58 +01:00

267 lines
8.3 KiB
Org Mode

#+TITLE: Yet another snippet extension
#+OPTIONS: toc:1
#+STARTUP: showall
#+STYLE: <link rel="stylesheet" type="text/css" href="stylesheets/styles.css" />
# External links
#
#+LINK: smart-snippet http://code.google.com/p/smart-snippet
#+LINK: pluskid http://pluskid.lifegoo.org
#+LINK: screencast http://www.youtube.com/watch?v=ZCGmZK4V7Sg
#+LINK: docs http://capitaomorte.github.com/yasnippet
#+LINK: issues https://github.com/capitaomorte/yasnippet/issues
#+LINK: googlecode-tracker http://code.google.com/p/yasnippet/issues/list
#+LINK: forum http://groups.google.com/group/smart-snippet
* Quick start
*YASnippet* is a template system for Emacs. It allows you to type an
abbreviation and automatically expand it into function templates. Bundled
language templates includes: C, C++, C#, Perl, Python, Ruby, SQL, LaTeX, HTML,
CSS and more. The snippet syntax is inspired from TextMate's syntax, you can
even [[#import-textmate][import most TextMate snippets]]
YASnippet is an original creation of [[pluskid]] who also wrote its predecessor
[[smart-snippet]].
** Watch a demo
[[youtube]]
** Installation
Clone this repository somewhere
#+begin_example
$ cd ~/.emacs.d/plugins
$ git clone https://github.com/capitaomorte/yasnippet
#+end_example
Add the following in your =.emacs= file:
#+begin_src emacs-lisp :exports code
(add-to-list 'load-path
"~/.emacs.d/plugins/yasnippet")
(require 'yasnippet)
(yas/global-mode 1)
#+end_src
Add your own snippets to =~/.emacs.d/snippets= by placing files there or
invoking [[#yas-new-snippet][=yas-new-snippet=]].
** Import textmate snippets (rails example)
:PROPERTIES:
:CUSTOM_ID: import-textmate
:END:
YASnippet lets you use TextMate bundles directly:
#+begin_example
$ cd ~/.emacs.d/plugins
$ git clone https://github.com/capitaomorte/yasnippet
$ cd yasnippet
$ git submodule init
$ git submodule update
$ gem install plist trollop
$ rake convert_bundles # will convert ruby, rails and html bundles from drnic
#+end_example
Then, in your =.emacs= file
#+begin_example
(add-to-list 'load-path
"~/.emacs.d/plugins/yasnippet")
(require 'yasnippet)
(setq yas/snippet-dirs '("~/.emacs.d/snippets" "~/.emacs.d/extras/imported"))
(yas/global-mode 1)
#+end_example
Open some rails file (model, app, etc) and start using the textmate
snippets. Consider that this is a work-in-progress and many snippets/commands
might not work. Patches welcome!
** Contributing snippets
Please *do not ask me* to add snippets to the default collection under
=/snippets=. This collection is considered frozen. By customizing
[[#yas-snippet-dirs][=yas-snippet-dirs=]] you can point yasnippet to good
snippet collections out there.
The =extras/textmate-import.rb= tool can import many actual Textmate
snippets. I'm focusing on developing it and the accompanying =yas-setup.el=
files that guide it with more difficult importations. The idea is to deprecate
=/snippets= and replace it with =extras/imported=.
** Documentation, issues, etc
Please refer to the comprehensive [[docs][documentation]] for full
customization and support. If you think you've found a bug, please report it
on [[issues][the GitHub issue tracker]]. (please **do not** submit new
issues to the old [[googlecode-tracker][googlecode tracker]])
If you run into problems using YASnippet, or have snippets to contribute,
post to the [[forum][yasnippet forum]]. Thank you very much for using
YASnippet!
* Organizing snippets
** Basic structure
Snippet collections can be stored in plain text files. They are arranged by
sub-directories naming *snippet tables*. These mostly name Emacs major names.
#+begin_example
.
|-- c-mode
| `-- printf
|-- java-mode
| `-- println
`-- text-mode
|-- email
`-- time
#+end_example
The collections are loaded into *snippet tables* which the triggering
mechanism (see [[#expand-snippets][Expanding snippets]]) looks up and
(hopefully) cause the right snippet to be expanded for you.
** Setting up =yas-snippet-dirs=
The emacs variable [[#yas-snippet-dirs][=yas-snippet-dirs=]] tells YASnippet
which collections to consider. It's used when you activate
[[#yas-global-mode][=yas-global-mode=]] or call
[[#yas-reload-all][=yas-reload-all=]] interactively.
The default considers:
- a personal collection that lives in =~/.emacs.d/snippets=
- the bundled collection, taken as a relative path to =yasnippet.el= localtion
When you come across other snippet collections, do the following to try them
out:
#+begin_src emacs-lisp :exports code
;; Develop in ~/emacs.d/mysnippets, but also
;; try out snippets in ~/Downloads/interesting-snippets
(setq yas/snippet-dirs '("~/emacs.d/mysnippets"
"~/Downloads/interesting-snippets"))
;; OR, keeping yasnippet's defaults try out ~/Downloads/interesting-snippets
(setq yas/snippet-dirs (append yas/snippet-dirs
'("~/Downloads/interesting-snippets")))
#+end_src
Collections appearing earlier in the list shadow snippets with same names
appearing in collections later in the list. [[#yas-new-snippet][=yas-new-snippet=]] always stores
snippets in the first collection.
** The =.yas.parents= file
It's very useful to have certain modes share snippets between themselves. To do
this, choose a mode subdirectory and place a =.yas-parents= containing a
whitespace-separated list of other mode names. When you reload those modes
become parents of the original mode.
#+begin_example
.
|-- c-mode
| |-- .yas-parents # contains "cc-mode text-mode"
| `-- printf
|-- cc-mode
| |-- for
| `-- while
|-- java-mode
| |-- .yas-parents # contains "cc-mode text-mode"
| `-- println
`-- text-mode
|-- email
`-- time
#+end_example
** TODO The =.yas-make-groups= file
If you place an empty plain text file =.yas-make-groups= inside one of the
mode directories, the names of these sub-directories are considered groups of
snippets and [[snippet-menu][the menu]] is organized much more cleanly:
(TODO image)
Another alternative way to achieve this is to place a =# group:= directive
inside the snippet definition. See [[#writing-snippets][Writing Snippets]]
#+begin_example
$ tree ruby-mode/
ruby-mode/
|-- .yas-make-groups
|-- collections
| |-- each
| `-- ...
|-- control structure
| |-- forin
| `-- ...
|-- definitions
| `-- ...
`-- general
`-- ...
#+end_example
Yet another way to create a nice snippet menu is to write into
=.yas-make-groups= a menu definition. TODO
** TODO The =.yas-setup.el= file
*** TODO
** TODO The =.yas-compiled-snippet.el= file
*** TODO
** The =.yas-skip= file
* Expanding Snippets
:PROPERTIES:
:CUSTOM_ID: expand-snippets
:END:
This section describes how YASnippet chooses snippets for expansion at point.
Maybe, you'll want some snippets to be expanded in a particular
mode, or only under certain conditions, or be prompted using
** Triggering expansion
To make a snippet expand after the cursor:
* Type an the snippet's *trigger key* then press the key defined in
[[#yas-trigger-key][=yas-trigger-key=]] (usually to "TAB").
* Use the snippet's *keybinding*.
* Call [[#yas-insert-snippet][=yas-insert-snippet=]] (use =M-x
yas-insert-snippet== or its keybinding =C-c & C-s=).
* By expanding directly from the "YASnippet" menu in the menu-bar
* Using hippie-expand
* Use m2m's excellent auto-complete
* Reference
#+BEGIN_SRC emacs-lisp :exports results :results value raw
(yas--document-symbols 2 `("Interactive functions" . ,#'interactive-form)
`("Customization variables" . ,#'(lambda (sym)
(and (boundp sym)
(get sym 'standard-value))))
`("Useful functions" . ,#'fboundp)
`("Useful variables" . ,#'boundp))
#+END_SRC
# Local Variables:
# mode: org
# fill-column: 80
# coding: utf-8
# End: