From f40a013dec1551bfbad0caedbea189677ae74fc3 Mon Sep 17 00:00:00 2001 From: capitaomorte Date: Sat, 25 Jul 2009 11:14:22 +0000 Subject: [PATCH] Last commit before releasing 0.6.0 --- Rakefile | 2 +- doc/changelog.html | 318 ++++++++++ doc/changelog.rst | 2 +- doc/define_snippet.html | 900 +++++++++++++++++++++++++++++ doc/define_snippet.rst | 51 +- doc/faq.html | 110 ++++ doc/images/customization-group.png | Bin 0 -> 54785 bytes doc/images/idrop-menu.png | Bin 0 -> 10294 bytes doc/index.html | 151 +++++ doc/index.rst | 21 +- snippets/text-mode/ruby-mode/cls | 8 +- yasnippet.el | 5 +- 12 files changed, 1553 insertions(+), 15 deletions(-) create mode 100644 doc/changelog.html create mode 100644 doc/define_snippet.html create mode 100644 doc/faq.html create mode 100644 doc/images/customization-group.png create mode 100644 doc/images/idrop-menu.png create mode 100644 doc/index.html diff --git a/Rakefile b/Rakefile index 7d22c43..04cb216 100644 --- a/Rakefile +++ b/Rakefile @@ -3,7 +3,7 @@ require 'fileutils' def find_version - File.read("yasnippet.el") =~ /;; Version: *([0-9.]+[a-z]?) *$/ + File.read("yasnippet.el") =~ /;; Package-version: *([0-9.]+[a-z]?) *$/ $version = $1 end find_version diff --git a/doc/changelog.html b/doc/changelog.html new file mode 100644 index 0000000..8dec07f --- /dev/null +++ b/doc/changelog.html @@ -0,0 +1,318 @@ + + + + + + +ChangeLog + + + + + +
+
+
+
+ +
+
+
+
+
+

0.6.0b / 2009-07-2x

+
    +
  • Nested placeholders of the type <div${1: id="${2:someid}"}> $0.
  • +
  • More robust undo/redo support.
  • +
  • Stacked snippet expansion (snippet in snippet).
  • +
  • Transformation on a primary field with syntax ${1:default$(transform)}
  • +
  • Validations on field exit through the yas/verify-value +primary field transformation.
  • +
  • Wrapping the region in the exit marker $0 of the snippet. Use +yas/wrap-around-region.
  • +
  • Auto-indentation. Use yas/indent-line set to 'auto
  • +
  • Easier definition of snippets. Use yas/find-snippets or +yas/visit-snippet-file. In the new snippet-mode use +yas/load-snippet-buffer and yas/tryout-snippet.
  • +
  • Customization group yasnippet.
  • +
  • Overriding customization variables in snippets. Use the env: +let-form template keyword.
  • +
  • Fixed Issue 60
  • +
  • Fixed Issue 65
  • +
  • Fixed Issue 56
  • +
+
+
+

0.5.10 / 2009-02-11

+
    +
  • Added grouping support so that the snippets in the menu can be +groupped together.
  • +
  • Make the bundle ELPA +compatible.
  • +
+
+
+

0.5.9 / 2009-01-21

+
    +
  • Fixed the bug of disabling the auto-indenting of cc-mode.
  • +
+
+
+

0.5.8 / 2009-01-15

+
    +
  • Added a key property in snippet definition for snippet names +that are not valid path name.
  • +
  • Fixed some bugs of indenting (Issue 44, Issue +46).
  • +
  • Fixed Issue 45 by +providing a proper default value for yas/buffer-local-condition.
  • +
  • Added helper function yas/substr for convenient mirror +transformation.
  • +
  • Make variable yas/registered-snippet properly initialized.
  • +
  • Fixed the overlay error when overlay becomes empty (Issue 49 and +Issue 48). This +bug has occurred and been fixed earlier, and should not have +happened if we have proper regression test.
  • +
  • Added a workaround for c-electric- serial commands (Issue 27).
  • +
+
+
+

0.5.7 / 2008-12-03

+
    +
  • Fixed Issue 28 of +properly clean up snippet (by joaotavora).
  • +
  • Added a new section "Field-level undo functionality" to correct +Issue 33 +(by joaotavora).
  • +
  • Added some snippets from users for sql, erlang, scala, html, xml, latex, etc.
  • +
  • Fixed Issue 16 by adding +$> support. Here's the doc for $> indenting.
  • +
+
+
+

0.5.6 / 2008-08-07

+
    +
  • Added a buffer local variable yas/dont-activate to turn off +yas/minor-mode in some major modes. See Issue 29.
  • +
  • Make the environment of elisp evaluation more friendly to +(current-column).
  • +
  • Fixed the regular expression bug in python-mode snippets.
  • +
  • Use filename or full key extension for snippet name if no name +property is defined.
  • +
+
+
+

0.5.5 / 2008-05-29

+
    +
  • Tweak yas/extra-mode-hooks so that it can be more easily +customized.
  • +
  • Add an entry in FAQ about why TAB key doesn't work in some +modes.
  • +
+
+
+

0.5.4 / 2008-05-15

+
    +
  • Added ox-mode-hook and python-mode-hook to +yas/extra-mode-hooks to fix the problem YASnippet is not enabled +in those modes.
  • +
+
+
+

0.5.3 / 2008-05-07

+
    +
  • Fix indent of python-mode snippets.
  • +
  • Fix a bug of dropdown-list: conflicts with color-theme (Issue 23). Thanks +Mike.
  • +
  • Fix a bug of condition system.
  • +
+
+
+

0.5.2 / 2008-04-20

+
    +
  • Fix a bug for comparing string to symbol using string= (which +will fire an error).
  • +
+
+
+

0.5.1 / 2008-04-14

+
    +
  • Use a beautiful css style in the document.
  • +
+
+
+

0.5.0 / 2008-04-10

+
    +
  • Integrate with hippie-expand. Just add yas/hippie-try-expand to +hippie-expand-try-functions-list.
  • +
  • If you set yas/fall-back-behavior to 'return-nil, YASnippet +will return nil when it can't find a snippet to expand.
  • +
  • Defect fix: the condition of a snippet was evaluated twice in +earlier version.
  • +
  • Deleting snippet (using C-w or C-k) won't cause serious +problem now.
  • +
  • Several complex snippet for python-mode from Yasser included in the +distribution.
  • +
+
+
+

0.4.5 / 2008-04-07

+
    +
  • Merge the latest dropdown-list.el.
  • +
  • Add snippets for f90-mode from Li Zhu.
  • +
  • Bug fix: l-safe-expr-p: Lisp nesting exceeds max-lisp-eval-depth +error when several (more than two) snippets overlaps. Thanks +sunwaybupt@newsmth for reporting this bug.
  • +
+
+
+

0.4.4 / 2008-03-24

+
    +
  • Bug fix: dropdown-list.el doesn't recognize [return] properly.
  • +
+
+
+

0.4.3 / 2008-03-23

+
    +
  • Bug fix: failed to recognize user customized yas/trigger-key.
  • +
+
+
+

0.4.2 / 2008-03-22

+
    +
  • Make a separate document package for release. Also make document +available online.
  • +
+
+
+

0.4.1 / 2008-03-21

+
    +
  • Make sure yas/minor-mode's key bindings always take priority to +other minor modes.
  • +
+
+
+

0.4.0 / 2008-03-20

+
    +
  • Document refinement and released with YASnippet. Most of the Online +wiki document will be deprecated soon.
  • +
  • Powerful condition system added to yasnippet!
  • +
  • Incorporate dropdown-list.el and make it default way for +selecting multiple candidates. Thanks to Jaeyoun Chung.
  • +
  • yas/before-expand-snippet-hook
  • +
+
+
+

0.3.2 / 2008-03-19

+
    +
  • Enhancement: A better way to define minor-mode. Thanks to Kentaro +Kuribayashi. See this thread +for more details.
  • +
+
+
+

0.3.1 / 2008-03-17

+
    +
  • Bug fix: Emacs get confused when a field is deleted. See issue 10.
  • +
+
+
+

0.3.0 / 2008-03-16

+
    +
  • Add a yas/after-exit-snippet-hook so that you can do something like +indent-region or fill-region after finish the snippet.
  • +
  • Use minor-mode instead of global-set-key to bind the trigger +key. Now the trigger key and fall-back behavior can be more +flexible. Not constrained to <tab>. Thanks to Trey Jackson. See +this thread +for more details.
  • +
  • Now user can customize the popup function for selecting multiple +candidate for the same snippet key.
  • +
  • Support dropdown-list.el to be a better way to select multiple +candidate when in text mode.
  • +
+
+
+

0.2.3 / 2008-03-15

+
    +
  • Bug in non-window (-nw) mode when there's multiple candidate to +expand. See issue 7.
  • +
  • Allow expanding another snippet as long as not currently inside a +field.
  • +
+
+
+

0.2.2 / 2008-03-13

+
    +
  • Added customized face for fields and mirrors. Better in dark +background. And users can customize it.
  • +
+
+
+

0.2.1 / 2008-03-10

+
    +
  • Fix the insert-behind problem under both Emacs 22 and Emacs 23.
  • +
+
+
+

0.2.0 / 2008-03-10

+
    +
  • Use big keymap overlay to detect insert-behind event manually to +avoid sometimes missed hook calls. See issue 3 for more +details.
  • +
  • Support parent snippet table. Now you can set (for example) +cc-mode as common mode for c++-mode, c-mode and +java-mode. They'll share snippets defined for cc-mode.
  • +
+
+
+

0.1.1 / 2008-03-08

+
    +
  • Add a rake task to upload to google code.
  • +
  • Use elisp compile-bundle function instead of python scrip
  • +
+
+
+

0.1.0 / 2008-03-07

+
    +
  • Embedded elisp support.
  • +
  • Fields navigation support.
  • +
  • Mirror of fields support.
  • +
  • Menu-bar support.
  • +
  • Multiple snippets with same name support.
  • +
  • Popup menu for multiple snippet with same name support.
  • +
  • Transformation of fields support.
  • +
  • Load directory support.
  • +
  • Compile bundle support.
  • +
+
+
+
+
+
+
+
+
+ + diff --git a/doc/changelog.rst b/doc/changelog.rst index 58a627b..5a762a3 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -7,7 +7,7 @@ ChangeLog :Date: 2008-03-22 -0.6.0b / 2009-07-2x +0.6.0b / 2009-07-25 =================== * Nested placeholders of the type `` $0``. diff --git a/doc/define_snippet.html b/doc/define_snippet.html new file mode 100644 index 0000000..d4fa347 --- /dev/null +++ b/doc/define_snippet.html @@ -0,0 +1,900 @@ + + + + + + +How to define a snippet ? + + + + + +
+
+
+
+ +
+
+
+
+ +

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.

+
+

Define snippets in files

+
+

Directory hierarchy

+

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.

+
+
+

File content

+

A file defining a snippet may just contain the template for the +snippet. Optionally it can also contains some meta data for the +snippet as well as comments.

+

Generally speaking, if the file contains a line of # --, then all +contents above that line are considered as meta data and comments; +below are template. Or else the whole file content is considered as +the template.

+

Here's a typical example:

+
#contributor : pluskid <pluskid@gmail.com>
+#name : __...__
+# --
+__${init}__
+
+

Meta data are specified in the syntax of

+
#data-name : data value
+
+

Any other text above # -- is considered as comment and +ignored. Here's a list of currently supported meta data:

+images/group.png +
    +
  • name: The name of the snippet. This is a one-line description of +the snippet. It will be displayed in the menu. So it's a good idea +to select a descriptive name fo a snippet -- especially +distinguishable among similar snippets.
  • +
  • contributor: The contributor of the snippet.
  • +
  • condition: The condition of the snippet. This is a piece of +elisp code. If a snippet has a condition, then it will only be +expanded when the condition code evaluate to some non-nil value.
  • +
  • key: The key to expand the snippet. Sometimes the key of a +snippet is non-ASCII or not valid filename (e.g. contains +/). One can then define the key property which will +overwrite the filename as the key to expand the snippet.
  • +
  • group: The snippets for a mode can be grouped. Grouped snippets +will be grouped in sub-menu. This is useful if one has too many +snippets for a mode which will make the menu too long. group +property only affect menu construction (See The Menu). Refer to +the snippets for ruby-mode for examples. Group can also be +nested, e.g. control structure.loops tells that the snippet is +under the loops group which is under the control structure +group.
  • +
+
+
+

Quickly finding/defining snippets

+

From version 0.6 upwards there are two ways you can quickly find a +snippet file. Once you find this file it will be set to +snippet-mode (see ahead)

+
    +
  • M-x yas/find-snippets

    +

    Lets you find the snippet file in the directory the snippet was +loaded from (if it exists) like find-file-other-window.

    +
  • +
  • M-x yas/visit-snippet-file

    +

    Prompts you for possible snippet expansions like +yas/insert-snippet, but instead of expanding it, takes you +directly to the snippet definition's file, if it exists.

    +
  • +
+
+
+

Using the snippet-mode major mode

+

From version 0.6 upwards there is a major mode snippet-mode to +edit snippets. You can set the buffer to this mode with M-x +snippet-mode. It provides reasonably useful syntax highlighting.

+

Two commands are defined in this mode:

+
    +
  • M-x yas/load-snippet-buffer

    +
    +

    When editing a snippet, this loads the snippet into the correct +mode and menu. Bound to C-c C-c by default while in +snippet-mode.

    +
    +
  • +
  • M-x yas/tryout-snippet

    +
    +

    When editing a snippet, this opens a new empty buffer, sets it to +the appropriate major mode and inserts the snippet there, so you +can see what it looks like. This is bound to C-c C-t while in +snippet-mode.

    +
    +
  • +
+

There are also snippets for making snippets: vars, field and +mirror.

+
+
+

Define snippets using elisp code

+

As I mentioned above, you can define snippets directly by writing +elisp code.

+
+

yas/define-snippets

+

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.

+
+
+

yas/compile-bundle

+

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.

+

The basic syntax of yas/compile-bundle is

+
(yas/compile-bundle &optional yasnippet yasnippet-bundle snippet-roots code dropdown)
+
+

As you can see, all the parameters are optional. The default values +for those parameters are convenient for me to produce the default +release bundle:

+
(yas/compile-bundle "yasnippet.el"
+                    "./yasnippet-bundle.el"
+                    '("snippets")
+                    "(yas/initialize)"
+                    "dropdown-list.el")
+
+

The snippet-roots can be a list of root directories. This is +useful when you have multiple snippet directories (maybe from other +users). The code parameter can be used to specify your own +customization code instead of the default (yas/initialize). For +example, you can set yas/trigger-key to (kbd "SPC") here if +you like.

+

From release 0.6 you have to specify the dropdown-list.el file if +you want it to be a part of the generated bundle.

+
+
+

yas/define

+

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)))
+
+
+
+
+
+

The strategy to select a snippet

+

When user press the yas/trigger-key, YASnippet try to find a +proper snippet to expand. The strategy to find such a snippet is +explained here.

+
+

Finding the key

+

YASnippet search from current point backward trying to find the +snippet to be expanded. The default searching strategy is quite +powerful. For example, in c-mode, "bar", "foo_bar", +"#foo_bar" can all be recognized as a template key. Further more, +the searching is in that order. In other words, if "bar" is found +to be a key to some valid snippet, then "foo_bar" and +"#foobar" won't be searched.

+

However, this strategy can also be customized easily from the +yas/key-syntaxes variable. It is a list of syntax rules, the +default value is ("w" "w_" "w_." "^ "). Which means search the +following thing until found one:

+
    +
  • a word.
  • +
  • a symbol. In lisp, - and ? can all be part of a symbol.
  • +
  • a sequence of characters of either word, symbol or punctuation.
  • +
  • a sequence of characters of non-whitespace characters.
  • +
+

But you'd better keep the default value unless you understand what +Emacs's syntax rule mean.

+
+
+

The condition system

+

I write forked snippet.el to make the smart-snippet.el. I call it +smart-snippet because a condition can be attached to a snippet. This +is really a good idea. However, writing condition for a snippet +usually needs good elisp and Emacs knowledge, so it is strange to many +user.

+

Later I write YASnippet and persuade people to use it instead of +smart-snippet.el. However, some user still love smart-snippet because +it is smart. So I make YASnippet smart. Even smarter than +smart-snippet.el. :p

+

Consider this scenario: you are an old Emacs hacker. You like the +abbrev-way and set yas/trigger-key to (kbd "SPC"). However, +you don't want if to be expanded as a snippet when you are typing +in a comment block or a string (e.g. in python-mode).

+

It's OK, just specify the condition for if to be (not +(python-in-string/comment)). But how about while, for, +etc. ? Writing the same condition for all the snippets is just +boring. So YASnippet introduce a buffer local variable +yas/buffer-local-condition. You can set this variable to (not +(python-in-string/comment)) in python-mode-hook. There's no way +to do this in smart-snippet.el!

+

Then, what if you really want some snippet even in comment? This is +also possible! But let's stop telling the story and look at the rules:

+
    +
  • If yas/buffer-local-condition evaluate to nil, snippet won't be +expanded.
  • +
  • If it evaluate to the a cons cell where the car is the symbol +require-snippet-condition and the cdr is a symbol (let's +call it requirement):
      +
    • If the snippet has no condition, then it won't be expanded.
    • +
    • If the snippet has a condition but evaluate to nil or error +occured during evaluation, it won't be expanded.
    • +
    • If the snippet has a condition that evaluate to non-nil (let's +call it result):
        +
      • If requirement is t, the snippet is ready to be +expanded.
      • +
      • If requirement is eq to result, the snippet is ready +to be expanded.
      • +
      • Otherwise the snippet won't be expanded.
      • +
      +
    • +
    +
  • +
  • If it evaluate to other non-nil value:
      +
    • If the snippet has no condition, or has a condition that evaluate +to non-nil, it is ready to be expanded.
    • +
    • Otherwise, it won't be expanded.
    • +
    +
  • +
+

So set yas/buffer-local-condition like this

+
(add-hook 'python-mode-hook
+          '(lambda ()
+             (setq yas/buffer-local-condition
+                   '(if (python-in-string/comment)
+                        '(require-snippet-condition . force-in-comment)
+                      t))))
+
+

And specify the condition for a snippet that you're going to expand in +comment to be evaluated to the symbol force-in-comment. Then it +can be expanded as you expected, while other snippets like if +still can't expanded in comment.

+
+
+

Multiple snippet with the same key

+

There can be multiple snippet bind to the same key. If you define a +snippet with a key that is already used, you'll overwrite the original +snippet definition. However, you can add a different postfix to the +key.

+

In general, the extension (consider a file name) is ignored when +defining a snippet. So def, def.1 and def.mine will all be +valid candidates when the key is def.

+

When there are multiple candidates, YASnippet will let you select +one. The UI for selecting multiple candidate can be +customized. There're two variable related:

+

From version 0.6 of YASnippet this has changed significantly. A +customization variable, called yas/prompt-functions defines your +preferred method of being prompted for snippets.

+

You can customize it with M-x customize-variable RET +yas/prompt-functions RET. Alternatively you can put in your +emacs-file:

+
(setq yas/prompt-functions '(yas/x-prompt yas/dropdown-prompt))
+
+

Currently there are some alternatives solution with YASnippet.

+images/popup-menu.png +
+

Use the X window system

+

The function yas/x-prompt can be used to show a popup menu for you +to select. This menu will be part of you native window system widget, +which means:

+
    +
  • It usually looks beautiful. E.g. when you compile Emacs with gtk +support, this menu will be rendered with your gtk theme.
  • +
  • Emacs have little control over it. E.g. you can't use C-n, +C-p to navigate.
  • +
  • This function can't be used when in a terminal.
  • +
+
+
+

Use built-in Emacs selection methods

+

You can use functions yas/completing-prompt for the classic emacs +completion method or yas/ido-prompt for a much nicer looking +method. The best way is to try it. This works in a terminal.

+
images/idrop-menu.png
+
+
+

Use dropdown-menu.el

+

The function yas/dropdown-prompt can also be placed in the +yas/prompt-functions list.

+images/dropdown-menu.png +

Originally, only the above two function is available in +YASnippet. They are difficult to use -- especially in a +terminal. Until later Jaeyoun Chung show me his dropdown-menu.el, +I say wow! It's wonderful!

+
    +
  • It works in both window system and terminal.
  • +
  • It is customizable, you can use C-n, C-p to navigate, q +to quite and even press 6 as a shortcut to select the 6th +candidate.
  • +
+

So I added yas/dropdown-list-popup-for-template to support +dropdown-list.el. And upload dropdown-list.el to YASnippet +hompage for an optional download (since Jaeyoun didn't provide a URL).

+

Then finally, in 0.4.0, I included a copy of the content of +dropdown-list.el [1] in yasnippet.el and made it the default +way for selecting multiple candidates.

+

However, the original functions are still there, you can still use this

+
(setq yas/window-system-popup-function
+      'yas/x-popup-menu-for-template)
+
+

if you prefer a modern UI. :)

+
+
+
+

The Trigger Key

+

YASnippet is implemented as a minor-mode (yas/minor-mode). The +trigger key yas/trigger-key is defined in yas/minor-mode-map +to call yas/expand to try to expand a snippet.

+
+

The Minor Mode

+images/minor-mode-indicator.png +

When yas/minor-mode is enabled, the trigger key will take +effect. The default key is (kbd "TAB"), however, you can freely +set it to some other key.

+

In version 0.5, YASnippet add a hook to +after-change-major-mode-hook to enable yas/minor-mode [2] in +every buffer. This works fine for most modes, however, some mode +doesn't follow the Emacs convention and doens't call this hook. You +can either explicitly hook for those mode or just add it to +yas/extra-mode-hooks to let YASnippet do it for you:

+
(require 'yasnippet)
+(add-to-list 'yas/extra-mode-hooks
+             'ruby-mode-hook)
+(yas/initialize)
+
+

Note that should be put after (require 'yasnippet) and before +(yas/initialize). Further more, you may report it to me, I'll add +that to the default value.

+

In version 0.6, just use yas/global-mode to enable YASnippet in +all major modes. Or put yas/minor-mode-on in that modes hook. See +the FAQ.

+
+
+

The Fallback

+

If yas/expand failed to find any suitable snippet to expand, it +will disable the minor mode temporarily and find if there's any other +command bind the yas/trigger-key. If found, the command will be +called. Usually this works very well -- when there's a snippet, expand +it, otherwise, call whatever command originally bind to the trigger +key.

+

However, you can change this behavior by customizing the +yas/fallback-behavior variable. If you set this variable to +'return-nil, it will return nil instead of trying to call the +original command when no snippet is found. This is useful when you +would like YASnippet to work with other extensions, +e.g. hippie-expand. I'm also glad to tell you that integration +with hippie-expand is already included in YASnippet.

+
+
+

Integration with hippie-expand

+

To integrate with hippie-expand, just put +yas/hippie-try-expand in +hippie-expand-try-functions-list. Personally I would like to put +in front of the list, but it can be put anywhere you prefer.

+
+
+
+

Other way to select a snippet

+

When you use the trigger key (so yas/expand) to expand a snippet, +the key for the snippet is deleted before the template for the snippet +is inserted.

+

However, there're other ways to insert a snippet.

+
+

yas/insert-snippet

+

The command M-x yas/insert-snippet lets you insert snippets at +point for you current major mode. It prompts you for the snippet +key first, and then for a snippet template if more than one template +exists for the same key.

+

The list presented contains the snippets that can be inserted at +point, according to the condition system. If you want to see all +applicable snippets for the major mode, prefix this command with +C-u.

+

The prompting methods used are again controlled by +yas/prompt-functions.

+
+
+

The Menu

+

YASnippet will setup a menu just after the Buffers Menu in the +menubar. The snippets for all real modes are listed there under the +menu. You can select a snippet from the menu to expand it. Since you +select manually from the menu, you can expand any snippet. For +example, you can expand a snippet defined for python-mode in a +c-mode buffer by selecting it from the menu:

+images/menubar.png +
    +
  • Condition system is ignored since you select to expand it +explicitly.
  • +
  • There will be no muliple candidates since they are listed in the +menu as different items.
  • +
+

This can be convenient sometimes. However, if you don't like the +menubar of Emacs and never use it. You can tell YASnippet don't boring +to build a menu by setting yas/use-menu to nil.

+

Another thing to note is that only real modes are listed under the +menu. As you know, common snippets can be shared by making up a +virtual parent mode. It's too bad if the menu is floored by those +virtual modes. So YASnippet only show menus for those real +modes. But the snippets fo the virtual modes can still be accessed +through the parent submenu of some real mode.

+

YASnippet use a simple way to check whether a mode is real or +virtual: (fboundp mode). For example, the symbol c-mode is +bound to a function while cc-mode is not. But this is not enough, +some modes aren't part of Emacs, and maybe when initializing +YASnippet, those modes haven't been initialized. So YASnippet also +maintain a list of known modes (yas/known-modes). You can add item +to that list if you need.

+
+
+

Expanding From Elisp Code

+

Sometimes you might want to expand a snippet directly by calling a +functin from elisp code. You should call yas/expand-snippet +instead of yas/expand in this case.

+

As with expanding from the menubar, condition system and multiple +candidates won't exists here. In fact, expanding from menubar has the +same effect of evaluating the follow code:

+
(yas/expand-snippet (point) (point) template)
+
+

Where template is the template of a snippet. It is never required +to belong to any snippet -- you can even make up it on the fly. The +1st and 2nd parameter defines the region to be deleted after YASnippet +inserted the template. It is used by yas/expand to indicate the +region of the key. There's usually no need to delete any region when +we are expanding a snippet from elisp code, so passing two (point) +is fine. Note only (point) will be fine because the 1st parameter +also indicate where to insert and expand the template.

+
+
+
+
+

The Syntax of the Template

+

The syntax of the snippet template is simple but powerful, very +similar to TextMate's.

+
+

Plain Text

+

Arbitrary text can be included as the content of a template. They are +usually interpreted as plain text, except $ and `. You need to +use \ to escape them: \$ and \`. The \ itself may also +needed to be escaped as \\ sometimes.

+
+
+

Embedded elisp code

+

Elisp code can be embedded inside the template. They are written +inside back-quotes (`):

+

They are evaluated when the snippet is being expanded. The evaluation +is done in the same buffer as the snippet being expanded. Here's an +example for c-mode to calculate the header file guard dynamically:

+
#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_}
+#define $1
+
+$0
+
+#endif /* $1 */
+
+

From version 0.6.0, snippets expansions are run with some special +emacs-lisp variables bound. One of this is yas/selected-text. You +can therefore define a snippet like:

+
for ($1;$2;$3) {
+  `yas/selected-text`$0
+}
+
+

to "wrap" the selected region inside your recently inserted +snippet. Alternatively, you can also customize the variable +yas/wrap-around-region to t which will do this automatically.

+
+
+

Tab stop fields

+

Tab stops are fields that you can navigate back and forth by TAB +and S-TAB [3]. They are written by $ followed with a +number. $0 has the special meaning of the exit point of a +snippet. That is the last place to go when you've traveled all the +fields. Here's a typical example:

+
<div$1>
+    $0
+</div>
+
+
+
+

Placeholder fields

+

Tab stops can have default values -- a.k.a placeholders. The syntax is +like this:

+
${N:default value}
+
+

They acts as the default value for a tab stop. But when you firstly +type at a tab stop, the default value will be replaced by your +typing. The number can be omitted if you don't want to create +mirrors or transformations for this field.

+
+
+

Mirrors

+

We refer the tab stops with placeholders as a field. A field can have +mirrors. Its mirrors will get updated when you change the text of a +field. Here's an example:

+
\begin{${1:enumerate}}
+    $0
+\end{$1}
+
+

When you type "document" at ${1:enumerate}, the word +"document" will also be inserted at \end{$1}. The best +explanation is to see the screencast(YouTube or avi video).

+

The tab stops with the same number to the field act as its mirrors. If +none of the tab stops has an initial value, the first one is selected +as the field and others mirrors.

+
+
+

Mirrors with transformations

+

If the default value of a field starts with $, then it is interpreted +as the transformation code instead of default value. A transformation +is some arbitrary elisp code that will get evaluated in an environment +when the variable text is bind to the inputted text of the +field. Here's an example for Objective-C:

+
- (${1:id})${2:foo}
+{
+    return $2;
+}
+
+- (void)set${2:$(capitalize text)}:($1)aValue
+{
+    [$2 autorelease];
+    $2 = [aValue retain];
+}
+$0
+
+

Look at ${2:$(capitalize text)}, it is a transformation instead of +a placeholder. The actual placeholder is at the first line: +${2:foo}. When you type text in ${2:foo}, the transformation +will be evaluated and the result will be placed there as the +transformated text. So in this example, if you type baz in the field, +the transformed text will be Baz. This example is also available in +the screencast.

+

Another example is for rst-mode. In reStructuredText, the document +title can be some text surrounded by "===" below and above. The "===" +should be at least as long as the text. So

+
=====
+Title
+=====
+
+

is a valid title but

+
===
+Title
+===
+
+

is not. Here's an snippet for rst title:

+
${1:$(make-string (string-width text) ?\=)}
+${1:Title}
+${1:$(make-string (string-width text) ?\=)}
+
+$0
+
+ + + + + +
[1]With some minor change, mainly for fixing some trivial bugs.
+ + + + + +
[2]This is done when you call yas/initialize.
+ + + + + +
[3]Of course, this can be customized.
+
+
+

Fields with transformations

+

From version 0.6 on, you can also have lisp transformation inside +fields. These work mostly mirror transformations but are evaluated +when you first enter the field, after each change you make to the +field and also just before you exit the field.

+

The syntax is also a tiny bit different, so that the parser can +distinguish between fields and mirrors. In the following example

+
#define "${1:mydefine$(upcase yas/text)}"
+
+

mydefine gets automatically upcased to MYDEFINE once you enter +the field. As you type text, it gets filtered through the +transformation every time.

+

Note that this is differentiated from a mirror with a transformation +by the existance of extra text between the : and the +transformation's $. If you don't want this extra-text, you can use +two $'s instead.

+
#define "${1:$$(upcase yas/text)}"
+
+

Please note that as soon as a transformation takes place, it changes +the value of the field and sets it its internal modification state to +true. As a consequence, the auto-deletion behaviour of normal +fields does not take place. This is by design.

+
+
+

Choosing fields value from a list

+

As mentioned, the field transformation is invoked just after you enter +the field, and with some useful variables bound, notably +yas/field-modified-p and yas/moving-away-p. Because of this +feature you can place a transformation in the primary field that lets +you select default values for it.

+

The yas/choose-value does this work for you. For example:

+
<div align="${2:$$(yas/choose-value '("right" "center" "left"))}">
+  $0
+</div>
+
+

See the definition of yas/choose-value to see how it was written +using the two variables. Also check out yas/verify-value for +another neat trick.

+
+
+

Nested placeholder fields

+

From version 0.6 on, you can also have nested placeholders of the type:

+
<div${1: id="${2:some_id}"}>$0</div>
+
+

This allows you to choose if you want to give this div an id +attribute. If you tab forward after expanding it will let you change +"some_id" to whatever you like. Alternatively, you can just press +C-d (which executes yas/skip-and-clear-or-delete-char) and go +straight to the exit marker.

+

By the way, C-d will only clear the field if you cursor is at the +beginning of the field and it hasn't been changed yet. Otherwise, it +performs the normal Emacs delete-char command.

+
+
+

Indenting

+

Many people miss the indenting feature of smart-snippet: when you +place a $> in your snippet, an (indent-according-to-mode) will +be executed there to indent the line. So you'll not need to hard-code +the indenting in the snippet template, and it will be very convenient +when you need to work with several different project where coding +styles are different.

+

The reason why this feature wasn't added to YASnippet until after +0.5.6 is that it doesn't work well for all modes. In some cases +(e.g. python-mode), calling indent-according-to-mode will break +the overlays created by YASnippet.

+

However, since many people asked for this feature, I finally added +this to YASnippet. Here's an example of the usage:

+
for (${int i = 0}; ${i < 10}; ${++i})
+{$>
+$0$>
+}$>
+
+

In 0.6.0 You should not need to use this feature although it's +supported for backward compatibility. Just set yas/indent-line to +'auto.

+
+
+
+
+
+
+
+
+
+ + diff --git a/doc/define_snippet.rst b/doc/define_snippet.rst index 58d31f0..049995a 100644 --- a/doc/define_snippet.rst +++ b/doc/define_snippet.rst @@ -202,6 +202,25 @@ ignored. Here's a list of currently supported meta data: under the ``loops`` group which is under the ``control structure`` group. +Quickly finding/defining snippets +--------------------------------- + +From version 0.6 upwards there are two ways you can quickly find a +snippet file. Once you find this file it will be set to +``snippet-mode`` (see ahead) + +* ``M-x yas/find-snippets`` + + Lets you find the snippet file in the directory the snippet was + loaded from (if it exists) like ``find-file-other-window``. + +* ``M-x yas/visit-snippet-file`` + + Prompts you for possible snippet expansions like + ``yas/insert-snippet``, but instead of expanding it, takes you + directly to the snippet definition's file, if it exists. + + Using the ``snippet-mode`` major mode ------------------------------------- @@ -446,7 +465,7 @@ When there are multiple candidates, YASnippet will let you select one. The UI for selecting multiple candidate can be customized. There're two variable related: -From version 0.6 of YASnippet this has changed significantly. A +From version 0.6 of YASnippet this has changed significantly. A new customization variable, called ``yas/prompt-functions`` defines your preferred method of being prompted for snippets. @@ -455,7 +474,8 @@ yas/prompt-functions RET``. Alternatively you can put in your emacs-file: .. sourcecode:: common-lisp - (setq yas/prompt-functions '(yas/x-prompt yas/dropdown-prompt)) + + (setq yas/prompt-functions '(yas/x-prompt yas/dropdown-prompt)) Currently there are some alternatives solution with YASnippet. @@ -482,6 +502,9 @@ You can use functions ``yas/completing-prompt`` for the classic emacs completion method or ``yas/ido-prompt`` for a much nicer looking method. The best way is to try it. This works in a terminal. +.. image:: images/idrop-menu.png + :align: center + Use ``dropdown-menu.el`` ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -592,6 +615,22 @@ is inserted. However, there're other ways to insert a snippet. +``yas/insert-snippet`` +~~~~~~~~~~~~~~~~~~~~~~ + +The command ``M-x yas/insert-snippet`` lets you insert snippets at +point *for you current major mode*. It prompts you for the snippet +key first, and then for a snippet template if more than one template +exists for the same key. + +The list presented contains the snippets that can be inserted at +point, according to the condition system. If you want to see all +applicable snippets for the major mode, prefix this command with +``C-u``. + +The prompting methods used are again controlled by +``yas/prompt-functions``. + The Menu ~~~~~~~~ @@ -700,8 +739,8 @@ to "wrap" the selected region inside your recently inserted snippet. Alternatively, you can also customize the variable ``yas/wrap-around-region`` to ``t`` which will do this automatically. -Fields of type "Tab Stop" -------------------------- +Tab stop fields +--------------- Tab stops are fields that you can navigate back and forth by ``TAB`` and ``S-TAB`` [3]_. They are written by ``$`` followed with a @@ -715,8 +754,8 @@ fields. Here's a typical example: $0 -Fields of type "Placeholder" ----------------------------- +Placeholder fields +------------------ Tab stops can have default values -- a.k.a placeholders. The syntax is like this: diff --git a/doc/faq.html b/doc/faq.html new file mode 100644 index 0000000..2a40684 --- /dev/null +++ b/doc/faq.html @@ -0,0 +1,110 @@ + + + + + + +How to define a snippet ? + + + + + +
+
+
+
+ +
+
+
+
+
+

Why there's an extra newline?

+

If you have a newline at the end of the snippet definition file, then +YASnippet will add a newline when you expanding a snippet. Please +don't add a newline at the end if you don't want it when you saving +the snippet file.

+

Note some editors will automatically add a newline for you. In Emacs, +if you set require-final-newline to t, it will add the final +newline for you automatically.

+
+
+

Why TAB key doesn't expand a snippet?

+

First check the mode line to see if there's yas. If no, then try +M-x yas/minor-mode-on to manually turn on yas/minor-mode and +try to expand the snippet again. If it works, then, you can add the +following code to your .emacs before loading YASnippet:

+
(add-hook 'the-major-mode-hook 'yas/minor-mode-on)
+
+

where the-major-mode is the major mode in which yas/minor-mode +isn't enabled by default.

+

From YASnippet 0.6 you can also use the command M-x +yas/global-mode to turn on YASnippet automatically for all major +modes.

+

If yas/minor-mode is on but the snippet still not expanded. Then +try to see what command is bound to the TAB key: press C-h k +and then press TAB. Emacs will show you the result.

+

You'll see a buffer prompted by Emacs saying that TAB runs the +command .... Alternatively, you might see <tab> runs the command +..., note the difference between TAB and <tab> where the +latter has priority. If you see <tab> bound to a command other +than yas/expand, (e.g. in org-mode) you can try the following +code to work around:

+
(add-hook 'org-mode-hook
+          '(lambda ()
+             (make-variable-buffer-local 'yas/trigger-key)
+             (setq yas/trigger-key [tab])))
+
+

replace org-mode-hook with the major mode hook you are dealing +with (C-h m to see what major mode you are in).

+

If it says TAB but YASnippet still doesn't work, check your +configuration and you may also ask for help on the discussion group. Don't forget to +attach the information on what command is bound to TAB as well as the +mode information (Can be obtained by C-h m).

+
+
+

How to define snippets with named by characters not supported by the filesystem?

+

For example, you want to define a snippet by the key < which is not a +valid character for filename on Windows. In this case, you may use +yas/define to define the snippet. If you want to enjoy defining +snippets in a file, you can use the key property to specify the key of +the defined snippet explicitly.

+

Just name your snippet with an arbitrary valid filename, lt for +example. and specify < for the key property:

+
#key: <
+#name: <...></...>
+# --
+<${1:div}>$0</$1>
+
+
+
+
+
+
+
+
+
+ + diff --git a/doc/images/customization-group.png b/doc/images/customization-group.png new file mode 100644 index 0000000000000000000000000000000000000000..d98f7a0bb8ceff7331af576a0d9aacb10efd74ac GIT binary patch literal 54785 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 literal 0 HcmV?d00001 diff --git a/doc/images/idrop-menu.png b/doc/images/idrop-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a021733a98d6a1efdd464dfa299b69b3ef591e GIT binary patch literal 10294 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 literal 0 HcmV?d00001 diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..69e6a33 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,151 @@ + + + + + + +Yet Another Snippet extension + + + + + +
+
+
+
+ +
+
+
+
+ +

Yasnippet is a template system for emacs. It allows you to type a +abbrevation and automatically expand the abbreviation into function +templates.

+

Bundled language templates includes: C, C++, C#, Perl, Python, Ruby, +SQL, LaTeX, HTML, CSS and more.

+

Yasnippet system is inspired from TextMate's template system. You can +use a tool +to import any TextMate template you have to Yasnippet. It is a +re-design and re-write of my original extension smart-snippet. It +is much cleaner and more powerful than smart-snippet.

+
+

Video Demo

+

Watch the demo at YouTube (download a higher +resolution version: yasnippet.avi).

+
+
+

Brief Install Instruction

+

There are two archives of YASnippet. One is a single file compiled +“bundle”, and the other is normal. If all you need is to use the +builtin templates, download the bundle one. If you want to add your +own templates, download the normal one.

+
+

Bundle Install

+
    +
  1. Download the latest yasnippet-bundle-x.y.z.el.tgz and unpack it.
  2. +
  3. You'll get a file named yasnippet-bundle.el, put it under +~/.emacs.d/plugins/ (create the directory if not exists).
  4. +
  5. Open the file in Emacs, and type Alt+x eval-buffer.
  6. +
+

That's it. Now open any one of your language file, you'll see a menu +YASnippet. you can pull the menu to insert a template. Or, you can +type the pre-defined abbrev and press TAB to expand it.

+

To have emacs load YASnippet automatically when it starts, put the +following in your ~/.emacs file:

+
+
(add-to-list 'load-path
+              "~/.emacs.d/plugins")
+(require 'yasnippet-bundle)
+
+
+
+
+

Normal Install

+

For full install of the normal archive, just download and unpack the +latest yasnippet-x.y.z.tar.bz2. You'll get a directory named +yasnippet, put it in your ~/.emacs.d/plugins and add the +following in your .emacs file:

+
+
(add-to-list 'load-path
+              "~/.emacs.d/plugins")
+(require 'yasnippet) ;; not yasnippet-bundle
+(yas/initialize)
+(yas/load-directory "~/.emacs.d/plugins/yasnippet/snippets")
+
+
+

Please refer to the documentation for full customization, or use the +customization group.

+images/customization-group.png +
+
+
+

Customization group

+

From version 0.6 onwards, there is a customization group that you can +access with:

+

M-x customize-group RET yasnippet RET

+

Each customization variable affects how some part of YASnippet works, +for example automatic snippet indentation, what prompting method to +use, whether to expand snippets inside snippets, etc...

+

Inside the customization group, each variable is reasonably documented +to explain what it does.

+
+
+

Bugs, Contribution and Support

+ +

Thank you very much for using YASnippet!

+
+
+
+
+
+
+
+
+ + diff --git a/doc/index.rst b/doc/index.rst index fa01873..3eb8391 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -78,7 +78,26 @@ following in your ``.emacs`` file: (yas/initialize) (yas/load-directory "~/.emacs.d/plugins/yasnippet/snippets") -Please refer to the documentation for full customization. +Please refer to the documentation for full customization, or use the +customization group. + +.. image:: images/customization-group.png + :align: right + +Customization group +=================== + +From version 0.6 onwards, there is a customization group that you can +access with: + +``M-x customize-group RET yasnippet RET`` + +Each customization variable affects how some part of YASnippet works, +for example automatic snippet indentation, what prompting method to +use, whether to expand snippets inside snippets, etc... + +Inside the customization group, each variable is reasonably documented +to explain what it does. Bugs, Contribution and Support ============================== diff --git a/snippets/text-mode/ruby-mode/cls b/snippets/text-mode/ruby-mode/cls index c86cbfe..da28fb7 100644 --- a/snippets/text-mode/ruby-mode/cls +++ b/snippets/text-mode/ruby-mode/cls @@ -2,12 +2,12 @@ #contributor : hitesh #group : definitions # -- -class ${1:$$ - (let ((fn (capitalize (file-name-nondirectory +class ${1:`(let ((fn (capitalize (file-name-nondirectory (file-name-sans-extension - (buffer-file-name)))))) + (or (buffer-file-name) + (buffer-name (current-buffer)))))))) (cond ((string-match "_" fn) (replace-match "" nil nil fn)) - (t fn)))} + (t fn)))`} $0 end diff --git a/yasnippet.el b/yasnippet.el index cdf2d5d..084d2c1 100644 --- a/yasnippet.el +++ b/yasnippet.el @@ -3,7 +3,8 @@ ;; Copyright 2008 pluskid ;; Authors: pluskid , joaotavora -;; Version: 0.6.0b +;; Version: 0.6.0 +;; Package-version: 0.6.0b ;; X-URL: http://code.google.com/p/yasnippet/ ;; Keywords: snippet, textmate ;; URL: http://code.google.com/p/yasnippet/ @@ -2367,7 +2368,7 @@ With optional string TEXT do it in string instead" "Replace all the \"`(lisp-expression)`\"-style expression with their evaluated value" (while (re-search-forward yas/backquote-lisp-expression-regexp nil t) - (let ((transformed (yas/eval-string (match-string 1)))) + (let ((transformed (yas/eval-string (yas/restore-escapes (match-string 1))))) (goto-char (match-end 0)) (when transformed (insert transformed)) (delete-region (match-beginning 0) (match-end 0)))))