mirror of
https://github.com/joaotavora/yasnippet.git
synced 2025-10-13 05:03:04 +00:00
Cleaning up before release commit...
This commit is contained in:
parent
102424118e
commit
2f21c06622
@ -10,16 +10,30 @@ 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, the syntax being
|
||||
* Validation on field exit
|
||||
* Wrapping the region in the exit marker $0 of the snippet
|
||||
* Auto-indentation
|
||||
* Easier definition of snippets
|
||||
* Customization group
|
||||
* Overriding customization variables in snippets
|
||||
* 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
|
||||
<http://code.google.com/p/yasnippet/issues/detail?id=60>`_
|
||||
|
@ -2,9 +2,9 @@
|
||||
How to define a snippet ?
|
||||
=========================
|
||||
|
||||
:Author: pluskid
|
||||
:Author: pluskid, joaotavora
|
||||
:Contact: pluskid@gmail.com
|
||||
:Date: 2008-03-20
|
||||
:Date: 2009-07-24
|
||||
|
||||
.. contents::
|
||||
|
||||
@ -202,7 +202,30 @@ ignored. Here's a list of currently supported meta data:
|
||||
under the ``loops`` group which is under the ``control structure``
|
||||
group.
|
||||
|
||||
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
|
||||
--------------------------------
|
||||
@ -266,7 +289,7 @@ The basic syntax of ``yas/compile-bundle`` is
|
||||
|
||||
.. sourcecode:: common-lisp
|
||||
|
||||
(yas/compile-bundle &optional yasnippet yasnippet-bundle snippet-roots code)
|
||||
(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
|
||||
@ -277,7 +300,8 @@ release bundle:
|
||||
(yas/compile-bundle "yasnippet.el"
|
||||
"./yasnippet-bundle.el"
|
||||
'("snippets")
|
||||
"(yas/initialize)")
|
||||
"(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
|
||||
@ -286,6 +310,9 @@ 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
|
||||
~~~~~~~~~~
|
||||
|
||||
@ -419,22 +446,28 @@ 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:
|
||||
|
||||
* ``yas/window-system-popup-function``: the function used when you
|
||||
have a window system.
|
||||
* ``yas/text-popup-function``: the function used when you don't have a
|
||||
window system, i.e. when you are working in a terminal.
|
||||
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.
|
||||
|
||||
Currently there're three solution come with YASnippet.
|
||||
You can customize it with ``M-x customize-variable RET
|
||||
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))
|
||||
|
||||
Currently there are some alternatives solution with YASnippet.
|
||||
|
||||
.. image:: images/popup-menu.png
|
||||
:align: right
|
||||
|
||||
Popup Menu
|
||||
~~~~~~~~~~
|
||||
Use the X window system
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The function ``yas/x-popup-menu-for-template`` 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:
|
||||
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.
|
||||
@ -442,15 +475,18 @@ window system widget, which means:
|
||||
``C-p`` to navigate.
|
||||
* This function can't be used when in a terminal.
|
||||
|
||||
Just select the first one
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Use built-in Emacs selection methods
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This one is originally used in terminal mode. It doesn't let you to
|
||||
choose anything, it just select the first one on behalf of you. So I
|
||||
bet you never want to use this. :p
|
||||
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.
|
||||
|
||||
Use a dropdown-menu.el
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
Use ``dropdown-menu.el``
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The function ``yas/dropdown-prompt`` can also be placed in the
|
||||
``yas/prompt-functions`` list.
|
||||
|
||||
.. image:: images/dropdown-menu.png
|
||||
:align: right
|
||||
@ -497,7 +533,9 @@ The Minor Mode
|
||||
|
||||
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. By default, YASnippet add a hook to
|
||||
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
|
||||
@ -515,6 +553,10 @@ 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 <faq.html>`_.
|
||||
|
||||
The Fallback
|
||||
~~~~~~~~~~~~
|
||||
|
||||
@ -644,8 +686,22 @@ example for ``c-mode`` to calculate the header file guard dynamically:
|
||||
|
||||
#endif /* $1 */
|
||||
|
||||
Tab Stops
|
||||
---------
|
||||
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:
|
||||
|
||||
.. sourcecode:: text
|
||||
|
||||
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.
|
||||
|
||||
Fields of type "Tab Stop"
|
||||
-------------------------
|
||||
|
||||
Tab stops are fields that you can navigate back and forth by ``TAB``
|
||||
and ``S-TAB`` [3]_. They are written by ``$`` followed with a
|
||||
@ -659,8 +715,8 @@ fields. Here's a typical example:
|
||||
$0
|
||||
</div>
|
||||
|
||||
Placeholders
|
||||
------------
|
||||
Fields of type "Placeholder"
|
||||
----------------------------
|
||||
|
||||
Tab stops can have default values -- a.k.a placeholders. The syntax is
|
||||
like this:
|
||||
@ -701,8 +757,8 @@ as the field and others mirrors.
|
||||
|
||||
.. _transformations:
|
||||
|
||||
Transformations
|
||||
---------------
|
||||
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
|
||||
@ -764,6 +820,79 @@ is not. Here's an snippet for rst title:
|
||||
.. [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
|
||||
|
||||
.. sourcecode:: text
|
||||
|
||||
#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.
|
||||
|
||||
.. sourcecode:: text
|
||||
|
||||
#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:
|
||||
|
||||
.. sourcecode:: text
|
||||
|
||||
<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:
|
||||
|
||||
.. sourcecode:: text
|
||||
|
||||
<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
|
||||
---------
|
||||
|
||||
@ -789,3 +918,7 @@ this to YASnippet. Here's an example of the usage:
|
||||
$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``.
|
||||
|
||||
|
@ -28,11 +28,15 @@ following code to your ``.emacs`` *before* loading YASnippet:
|
||||
|
||||
.. sourcecode:: lisp
|
||||
|
||||
(setq yas/extra-mode-hooks '(the-major-mode))
|
||||
(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.
|
||||
|
161
yasnippet.el
161
yasnippet.el
@ -33,7 +33,7 @@
|
||||
;; (require 'yasnippet)
|
||||
;; 2. Place the `snippets' directory somewhere. E.g: ~/.emacs.d/snippets
|
||||
;; 3. In your .emacs file
|
||||
;; (setq yas/root-directory "~/.emacs/snippets")
|
||||
;; (setq yas/root-directory "~/.emacs/snippets")
|
||||
;; (yas/load-directory yas/root-directory)
|
||||
;; 4. To enable the YASnippet menu and tab-trigger expansion
|
||||
;; M-x yas/minor-mode
|
||||
@ -48,7 +48,7 @@
|
||||
;;
|
||||
;; M-x yas/expand
|
||||
;;
|
||||
;; Try to expand snippets before point. In `yas/minor-mode',
|
||||
;; Try to expand snippets before point. In `yas/minor-mode',
|
||||
;; this is bound to `yas/trigger-key' which you can customize.
|
||||
;;
|
||||
;; M-x yas/load-directory
|
||||
@ -59,7 +59,7 @@
|
||||
;;
|
||||
;; Prompts you for possible snippet expansion if that is
|
||||
;; possible according to buffer-local and snippet-local
|
||||
;; expansion conditions. With prefix argument, ignore these
|
||||
;; expansion conditions. With prefix argument, ignore these
|
||||
;; conditions.
|
||||
;;
|
||||
;; M-x yas/find-snippets
|
||||
@ -68,7 +68,7 @@
|
||||
;; snippet was loaded from (if it exists) like
|
||||
;; `find-file-other-window'.
|
||||
;;
|
||||
;; M-x yas/find-snippet-file
|
||||
;; M-x yas/visit-snippet-file
|
||||
;;
|
||||
;; Prompts you for possible snippet expasions like
|
||||
;; `yas/insert-snippet', but instead of expanding it, takes
|
||||
@ -77,10 +77,17 @@
|
||||
;;
|
||||
;; M-x yas/load-snippet-buffer
|
||||
;;
|
||||
;; When editing a snippet, this loads the snippet. This is
|
||||
;; When editing a snippet, this loads the snippet. This is
|
||||
;; bound to "C-c C-c" while in the `snippet-mode' editing
|
||||
;; 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'.
|
||||
;;
|
||||
;; The `dropdown-list.el' extension is bundled with YASnippet, you
|
||||
;; can optionally use it the preferred "prompting method", puting in
|
||||
;; your .emacs file, for example:
|
||||
@ -92,9 +99,9 @@
|
||||
;;
|
||||
;; Also check out the customization group
|
||||
;;
|
||||
;; M-x customize-group RET yasnippet RET
|
||||
;; M-x customize-group RET yasnippet RET
|
||||
;;
|
||||
;; For more information and detailed usage, refer to the project page:
|
||||
;; For more information and detailed usage, refer to the project page:
|
||||
;; http://code.google.com/p/yasnippet/
|
||||
|
||||
;;; Code:
|
||||
@ -111,18 +118,18 @@
|
||||
:group 'editing)
|
||||
|
||||
(defcustom yas/root-directory nil
|
||||
"The (list of) root directory that stores the snippets for each
|
||||
major mode."
|
||||
"Root directory that stores the snippets for each major mode.
|
||||
|
||||
Can also be a list of strings, for multiple root directories."
|
||||
:type '(string)
|
||||
:group 'yasnippet)
|
||||
|
||||
(defcustom yas/prompt-functions '(yas/x-prompt
|
||||
yas/ido-prompt
|
||||
yas/dropdown-prompt
|
||||
yas/completing-prompt
|
||||
yas/ido-prompt
|
||||
yas/no-prompt)
|
||||
"List of functions to prompt the user for keys, templates and
|
||||
other values interactively."
|
||||
"Functions to prompt for keys, templates, etc interactively."
|
||||
:type 'list
|
||||
:group 'yasnippet)
|
||||
|
||||
@ -144,17 +151,15 @@ applies)."
|
||||
:group 'yasnippet)
|
||||
|
||||
(defcustom yas/snippet-revival t
|
||||
"Non-nil means re-activate snippet fields after an when undoing
|
||||
an exit from an active snippet or redoing a snippet expansion"
|
||||
"Non-nil means re-activate snippet fields after undo/redo."
|
||||
:type 'boolean
|
||||
:group 'yasnippet)
|
||||
|
||||
(defcustom yas/trigger-key "TAB"
|
||||
"The key to bind as a trigger of snippet when `yas/minor-mode'
|
||||
is active.
|
||||
"The key bound to `yas/expand' when function `yas/minor-mode' is active.
|
||||
|
||||
Value is a string that is converted to the internal Emacs key
|
||||
representation using `read-kbd-macro'. "
|
||||
representation using `read-kbd-macro'."
|
||||
:type 'string
|
||||
:group 'yasnippet)
|
||||
|
||||
@ -162,7 +167,7 @@ representation using `read-kbd-macro'. "
|
||||
"The key to navigate to next field when a snippet is active.
|
||||
|
||||
Value is a string that is converted to the internal Emacs key
|
||||
representation using `read-kbd-macro'. "
|
||||
representation using `read-kbd-macro'."
|
||||
:type 'string
|
||||
:group 'yasnippet)
|
||||
|
||||
@ -172,7 +177,7 @@ representation using `read-kbd-macro'. "
|
||||
Can also be a list of keys.
|
||||
|
||||
Value is a string that is converted to the internal Emacs key
|
||||
representation using `read-kbd-macro'. "
|
||||
representation using `read-kbd-macro'."
|
||||
:type 'string
|
||||
:group 'yasnippet)
|
||||
|
||||
@ -180,15 +185,15 @@ representation using `read-kbd-macro'. "
|
||||
"The key to clear the currently active field.
|
||||
|
||||
Value is a string that is converted to the internal Emacs key
|
||||
representation using `read-kbd-macro'. "
|
||||
representation using `read-kbd-macro'."
|
||||
:type 'string
|
||||
:group 'yasnippet)
|
||||
|
||||
(defcustom yas/triggers-in-field t
|
||||
"If non-nil, allow `yas/next-field-key' to trigger a stacked
|
||||
snippet expansion.
|
||||
(defcustom yas/triggers-in-field nil
|
||||
"If non-nil, `yas/next-field-key' can trigger stacked expansions.
|
||||
|
||||
Otherwise, `yas/next-field-key' just tries to move on to the next field"
|
||||
Otherwise, `yas/next-field-key' just tries to move on to the next
|
||||
field"
|
||||
:type 'boolean
|
||||
:group 'yasnippet)
|
||||
|
||||
@ -217,7 +222,7 @@ templates and inserts the selected one."
|
||||
(defcustom yas/use-menu t
|
||||
"Display a YASnippet menu in the menu bar.
|
||||
|
||||
If this is set to `t', all snippet template of the current
|
||||
If this is set to t, all snippet template of the current
|
||||
mode will be listed under the menu \"yasnippet\"."
|
||||
:type 'boolean
|
||||
:group 'yasnippet)
|
||||
@ -230,11 +235,11 @@ mode will be listed under the menu \"yasnippet\"."
|
||||
(defcustom yas/show-all-modes-in-menu nil
|
||||
"Display \"artificial\" major modes in menu bar as well.
|
||||
|
||||
Currently, YASnippet only all \"real modes\" to menubar. For
|
||||
Currently, YASnippet only all \"real modes\" to menubar. For
|
||||
example, you define snippets for \"cc-mode\" and make it the
|
||||
parent of `c-mode', `c++-mode' and `java-mode'. There's really
|
||||
no such mode like \"cc-mode\". So we don't show it in the yasnippet
|
||||
menu to avoid the menu becoming too big with strange modes. The
|
||||
parent of `c-mode', `c++-mode' and `java-mode'. There's really
|
||||
no such mode like \"cc-mode\". So we don't show it in the yasnippet
|
||||
menu to avoid the menu becoming too big with strange modes. The
|
||||
snippets defined for \"cc-mode\" can still be accessed from
|
||||
menu-bar->c-mode->parent (or c++-mode, java-mode, all are ok).
|
||||
However, if you really like to show all modes in the menu, set
|
||||
@ -242,15 +247,15 @@ this variable to t."
|
||||
:type 'boolean
|
||||
:group 'yasnippet)
|
||||
|
||||
(defcustom yas/wrap-around-region t
|
||||
(defcustom yas/wrap-around-region nil
|
||||
"If non-nil, snippet expansion wraps around selected region.
|
||||
|
||||
The wrapping occurs just before the snippet's exit marker. This
|
||||
The wrapping occurs just before the snippet's exit marker. This
|
||||
can be overriden on a per-snippet basis."
|
||||
:type 'boolean
|
||||
:group 'yasnippet)
|
||||
|
||||
(defcustom yas/good-grace nil
|
||||
(defcustom yas/good-grace t
|
||||
"If non-nil, don't raise errors in inline elisp evaluation.
|
||||
|
||||
An error string \"[yas] error\" is returned instead."
|
||||
@ -278,7 +283,7 @@ An error string \"[yas] error\" is returned instead."
|
||||
"The keymap active while a snippet expansion is in progress.")
|
||||
|
||||
(defun yas/define-some-keys (keys keymap definition)
|
||||
"Bind KEYS to DEFINITION in KEYMAP, read with `read-kbd-macro'"
|
||||
"Bind KEYS to DEFINITION in KEYMAP, read with `read-kbd-macro'."
|
||||
(let ((keys (or (and (listp keys) keys)
|
||||
(list keys))))
|
||||
(dolist (key keys)
|
||||
@ -378,13 +383,13 @@ Here's an example:
|
||||
;; Internal variables
|
||||
;;
|
||||
|
||||
(defvar yas/version "0.6.0-beta")
|
||||
(defvar yas/version "0.6.0b")
|
||||
|
||||
(defvar yas/snippet-tables (make-hash-table)
|
||||
"A hash table of snippet tables corresponding to each major-mode.")
|
||||
"A hash table of snippet tables corresponding to each major mode.")
|
||||
|
||||
(defvar yas/menu-table (make-hash-table)
|
||||
"A hash table of menus of corresponding major-mode.")
|
||||
"A hash table of menus of corresponding major mode.")
|
||||
|
||||
(defvar yas/known-modes
|
||||
'(ruby-mode rst-mode markdown-mode)
|
||||
@ -392,28 +397,27 @@ Here's an example:
|
||||
|
||||
(defvar yas/escaped-characters
|
||||
'(?\\ ?` ?' ?$ ?} )
|
||||
"A list of characters which *might*n need to be escaped in
|
||||
snippet templates")
|
||||
"List of characters which *might* need to be escaped.")
|
||||
|
||||
(defconst yas/field-regexp
|
||||
"${\\([0-9]+:\\)?\\([^}]*\\)}"
|
||||
"A regexp to *almost* recognize a field")
|
||||
"A regexp to *almost* recognize a field.")
|
||||
|
||||
(defconst yas/multi-dollar-lisp-expression-regexp
|
||||
"$+[ \t\n]*\\(([^)]*)\\)"
|
||||
"A regexp to *almost* recognize a \"$(...)\" expression")
|
||||
"A regexp to *almost* recognize a \"$(...)\" expression.")
|
||||
|
||||
(defconst yas/backquote-lisp-expression-regexp
|
||||
"`\\([^`]*\\)`"
|
||||
"A regexp to recognize a \"`lisp-expression`\" expression" )
|
||||
"A regexp to recognize a \"`lisp-expression`\" expression." )
|
||||
|
||||
(defconst yas/transform-mirror-regexp
|
||||
"${\\(?:\\([0-9]+\\):\\)?$\\([^}]*\\)"
|
||||
"A regexp to *almost* recognize a mirror with a transform")
|
||||
"A regexp to *almost* recognize a mirror with a transform.")
|
||||
|
||||
(defconst yas/simple-mirror-regexp
|
||||
"$\\([0-9]+\\)"
|
||||
"A regexp to recognize a simple mirror")
|
||||
"A regexp to recognize a simple mirror.")
|
||||
|
||||
(defvar yas/snippet-id-seed 0
|
||||
"Contains the next id for a snippet.")
|
||||
@ -428,7 +432,7 @@ snippet templates")
|
||||
;;
|
||||
|
||||
(defvar yas/minor-mode-map (make-sparse-keymap)
|
||||
"The keymap used when `yas/minor-mode' is active.")
|
||||
"The keymap used when function `yas/minor-mode' is active.")
|
||||
|
||||
(defun yas/init-keymap-and-menu ()
|
||||
(easy-menu-define yas/minor-mode-menu
|
||||
@ -552,7 +556,7 @@ TEMPLATES is a list of cons (KEY . TEMPLATE) where KEY is a
|
||||
string and TEMPLATE is a `yas/template' structure.
|
||||
|
||||
This function implements the rules described in
|
||||
`yas/buffer-local-condition'. See that variables documentation."
|
||||
`yas/buffer-local-condition'. See that variables documentation."
|
||||
(let ((requirement (yas/require-template-specific-condition-p)))
|
||||
(if (eq requirement 'always)
|
||||
templates
|
||||
@ -563,7 +567,7 @@ This function implements the rules described in
|
||||
(cond ((eq requirement t)
|
||||
result)
|
||||
(t
|
||||
(eq requirement result)))))
|
||||
(eq requirement result)))))
|
||||
templates))))
|
||||
|
||||
(defun yas/snippet-table-fetch (table key)
|
||||
@ -599,7 +603,7 @@ fetch from parent if any."
|
||||
(yas/snippet-table-all-keys (yas/snippet-table-parent table))))))
|
||||
|
||||
(defun yas/snippet-table-store (table full-key key template)
|
||||
"Store a snippet template in the table."
|
||||
"Store a snippet template in the TABLE."
|
||||
(puthash key
|
||||
(yas/modify-alist (gethash key
|
||||
(yas/snippet-table-hash table))
|
||||
@ -913,6 +917,7 @@ TEMPLATES is a list of `yas/template'."
|
||||
|
||||
(defun yas/load-directory (directory)
|
||||
"Load snippet definition from a directory hierarchy.
|
||||
|
||||
Below the top-level directory, each directory is a mode
|
||||
name. And under each subdirectory, each file is a definition
|
||||
of a snippet. The file name is the trigger key and the
|
||||
@ -940,7 +945,7 @@ content of the file is the template."
|
||||
(yas/global-mode -1)
|
||||
(setq restore-global-mode t))
|
||||
|
||||
(when yas/minor-mode
|
||||
(when yas/minor-mode
|
||||
(yas/minor-mode -1)
|
||||
(setq restore-minor-mode t))
|
||||
|
||||
@ -975,7 +980,7 @@ foo\"bar\\! -> \"foo\\\"bar\\\\!\""
|
||||
;;; Yasnipept Bundle
|
||||
|
||||
(defun yas/initialize ()
|
||||
"For backward compatibility, enable `yas/minor-mode' globally"
|
||||
"For backward compatibility, enable `yas/minor-mode' globally"
|
||||
(yas/global-mode 1))
|
||||
|
||||
(defun yas/compile-bundle
|
||||
@ -1148,7 +1153,7 @@ directory to find snippet files.
|
||||
(not (string= "" group)))
|
||||
(dolist (subgroup (mapcar #'make-symbol
|
||||
(split-string group "\\.")))
|
||||
(let ((subgroup-keymap (lookup-key group-keymap
|
||||
(let ((subgroup-keymap (lookup-key group-keymap
|
||||
(vector subgroup))))
|
||||
(when (null subgroup-keymap)
|
||||
(setq subgroup-keymap (make-sparse-keymap))
|
||||
@ -1289,8 +1294,11 @@ by condition."
|
||||
(yas/template-env template))
|
||||
(message "[yas] No snippets can be inserted here!"))))
|
||||
|
||||
(defun yas/find-snippet-file ()
|
||||
"Choose a snippet to edit, selection like `yas/insert-snippet'."
|
||||
(defun yas/visit-snippet-file ()
|
||||
"Choose a snippet to edit, selection like `yas/insert-snippet'.
|
||||
|
||||
Only success if selected snippet was loaded from a file. Put the
|
||||
visited file in `snippet-mode'."
|
||||
(interactive)
|
||||
(let* ((yas/buffer-local-condition 'always)
|
||||
(templates (mapcar #'cdr
|
||||
@ -1317,7 +1325,7 @@ by condition."
|
||||
(message "This snippet was not loaded from a file!")))))))
|
||||
|
||||
(defun yas/guess-snippet-directory ()
|
||||
"Try to guess the suitable yassnippet based on `major-mode'"
|
||||
"Try to guess the suitable yassnippet based on `major-mode'"
|
||||
(let ((loaded-root (or (and (listp yas/root-directory)
|
||||
(first yas/root-directory))
|
||||
yas/root-directory))
|
||||
@ -1336,13 +1344,16 @@ by condition."
|
||||
|
||||
|
||||
(defun yas/find-snippets (&optional same-window)
|
||||
"Find a snippet file in a suitable directory."
|
||||
"Looks for snippets file in the current mode's directory.
|
||||
|
||||
This can be used to create new snippets for the currently active
|
||||
major mode."
|
||||
(interactive "P")
|
||||
(let* ((current-table (yas/current-snippet-table major-mode 'dont-search-parents))
|
||||
(parents-table (yas/current-snippet-table major-mode))
|
||||
(parents-directory (and parents-table
|
||||
(yas/snippet-table-default-directory parents-table)))
|
||||
(guessed-directory (or (and current-table
|
||||
(guessed-directory (or (and current-table
|
||||
(yas/snippet-table-default-directory current-table))
|
||||
(yas/guess-snippet-directory)
|
||||
default-directory))
|
||||
@ -1392,7 +1403,7 @@ by condition."
|
||||
(message "Save the buffer as a file first!")))
|
||||
|
||||
(defun yas/tryout-snippet (&optional debug)
|
||||
"Parse and load current buffer's snippet definition."
|
||||
"Test current buffers's snippet template in other buffer."
|
||||
(interactive "P")
|
||||
(let* ((major-mode-and-parent (or (and buffer-file-name
|
||||
(yas/compute-major-mode-and-parent buffer-file-name))
|
||||
@ -1525,10 +1536,10 @@ for this field, apply it. Otherwise, returned nil."
|
||||
(text yas/text)
|
||||
(yas/modified-p (yas/field-modified-p field))
|
||||
(yas/moving-away-p nil)
|
||||
(transform (if (yas/mirror-p field-or-mirror)
|
||||
(transform (if (yas/mirror-p field-or-mirror)
|
||||
(yas/mirror-transform field-or-mirror)
|
||||
(yas/field-transform field-or-mirror)))
|
||||
(start-point (if (yas/mirror-p field-or-mirror)
|
||||
(start-point (if (yas/mirror-p field-or-mirror)
|
||||
(yas/mirror-start field-or-mirror)
|
||||
(yas/field-start field-or-mirror)))
|
||||
(transformed (and transform
|
||||
@ -1543,7 +1554,7 @@ for this field, apply it. Otherwise, returned nil."
|
||||
(while (search-forward from nil t)
|
||||
(replace-match to t t)))
|
||||
|
||||
(defun yas/snippet-find-field (snippet number)
|
||||
(defun yas/snippet-find-field (snippet number)
|
||||
(find-if #'(lambda (field)
|
||||
(eq number (yas/field-number field)))
|
||||
(yas/snippet-fields snippet)))
|
||||
@ -1564,7 +1575,7 @@ have, compare through the field's start point"
|
||||
(yas/field-start field2))))))
|
||||
|
||||
(defun yas/field-probably-deleted-p (field)
|
||||
"Guess if FIELD was deleted because of his parent-field"
|
||||
"Guess if FIELD was deleted because of his parent-field"
|
||||
(and (zerop (- (yas/field-start field) (yas/field-end field)))
|
||||
(yas/field-parent-field field)))
|
||||
|
||||
@ -1637,7 +1648,7 @@ Also create some protection overlays"
|
||||
(setf (yas/snippet-active-field snippet) field)
|
||||
(yas/place-overlays snippet field)
|
||||
(overlay-put yas/active-field-overlay 'yas/field field)
|
||||
;;; primary field transform: first call to snippet transform
|
||||
;;; primary field transform: first call to snippet transform
|
||||
(unless (yas/field-modified-p field)
|
||||
(if (yas/field-update-display field snippet)
|
||||
(let ((inhibit-modification-hooks t))
|
||||
@ -1741,7 +1752,7 @@ NO-HOOKS means don't run the `yas/after-exit-snippet-hook' hooks."
|
||||
(when (and yas/snippet-end previous-field)
|
||||
(yas/advance-field-end-marker previous-field yas/snippet-end)))
|
||||
|
||||
;; Convert all markers to points,
|
||||
;; Convert all markers to points,
|
||||
;;
|
||||
(yas/markers-to-points snippet)
|
||||
|
||||
@ -1770,7 +1781,7 @@ snippet, if so cleans up the whole snippet up."
|
||||
(let* ((snippets (yas/snippets-at-point 'all-snippets))
|
||||
(snippets-left snippets))
|
||||
(dolist (snippet snippets)
|
||||
(let ((active-field (yas/snippet-active-field snippet)))
|
||||
(let ((active-field (yas/snippet-active-field snippet)))
|
||||
(cond ((or (prog1 (yas/snippet-force-exit snippet)
|
||||
(setf (yas/snippet-force-exit snippet) nil))
|
||||
(not (and active-field (yas/field-contains-point-p active-field))))
|
||||
@ -1820,7 +1831,7 @@ snippet, if so cleans up the whole snippet up."
|
||||
(when target-field
|
||||
(yas/move-to-field snippet target-field))))
|
||||
((not (yas/undo-in-progress))
|
||||
;; When not in an undo, check if we must commit the snippet (use exited it).
|
||||
;; When not in an undo, check if we must commit the snippet (use exited it).
|
||||
(yas/check-commit-snippet))))
|
||||
|
||||
(defun yas/field-text-for-display (field)
|
||||
@ -1839,7 +1850,7 @@ holds the keymap."
|
||||
(let ((overlay (make-overlay start
|
||||
end
|
||||
nil
|
||||
nil
|
||||
nil
|
||||
t)))
|
||||
(overlay-put overlay 'keymap yas/keymap)
|
||||
(overlay-put overlay 'yas/snippet snippet)
|
||||
@ -1847,8 +1858,9 @@ holds the keymap."
|
||||
overlay))
|
||||
|
||||
(defun yas/skip-and-clear-or-delete-char (&optional field)
|
||||
"Clears an unmodified field if at field start, otherwise
|
||||
deletes a character normally."
|
||||
"Clears unmodified field if at field start, skips to next tab.
|
||||
|
||||
Otherwise deletes a character normally by calling `delete-char'."
|
||||
(interactive)
|
||||
(let ((field (or field
|
||||
(and yas/active-field-overlay
|
||||
@ -1863,7 +1875,7 @@ deletes a character normally."
|
||||
(call-interactively 'delete-char)))))
|
||||
|
||||
(defun yas/skip-and-clear (field)
|
||||
"Deletes the region of FIELD and sets it modified state to t"
|
||||
"Deletes the region of FIELD and sets it modified state to t"
|
||||
(setf (yas/field-modified-p field) t)
|
||||
(delete-region (yas/field-start field) (yas/field-end field)))
|
||||
|
||||
@ -2137,7 +2149,7 @@ After revival, push the `yas/take-care-of-redo' in the
|
||||
(defun yas/snippet-create (begin end)
|
||||
"Creates a snippet from an template inserted between BEGIN and END.
|
||||
|
||||
Returns the newly created snippet."
|
||||
Returns the newly created snippet."
|
||||
(let ((snippet (yas/make-snippet)))
|
||||
(goto-char begin)
|
||||
(yas/snippet-parse-create snippet)
|
||||
@ -2206,7 +2218,7 @@ Meant to be called in a narrowed buffer, does various passes"
|
||||
;;
|
||||
(goto-char parse-start)
|
||||
(yas/protect-escapes)
|
||||
;; parse fields with {}
|
||||
;; parse fields with {}
|
||||
;;
|
||||
(goto-char parse-start)
|
||||
(yas/field-parse-create snippet)
|
||||
@ -2234,7 +2246,7 @@ Meant to be called in a narrowed buffer, does various passes"
|
||||
(save-excursion
|
||||
(while (re-search-forward "$>" nil t)
|
||||
(delete-region (match-beginning 0) (match-end 0))
|
||||
(when (not (eq yas/indent-line 'auto))
|
||||
(when (not (eq yas/indent-line 'auto))
|
||||
(indent-according-to-mode))))
|
||||
(save-excursion
|
||||
(cond ((eq yas/indent-line 'fixed)
|
||||
@ -2380,7 +2392,7 @@ When multiple expressions are found, only the last one counts."
|
||||
(while (re-search-forward yas/multi-dollar-lisp-expression-regexp nil t)
|
||||
(let* ((real-match-end-1 (yas/scan-sexps (match-beginning 1) 1)))
|
||||
(when real-match-end-1
|
||||
(let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1) real-match-end-1)))
|
||||
(let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1) real-match-end-1)))
|
||||
(setf (yas/field-transform parent-field) lisp-expression-string))
|
||||
(delete-region (match-beginning 0) real-match-end-1)))))))
|
||||
|
||||
@ -2393,7 +2405,7 @@ When multiple expressions are found, only the last one counts."
|
||||
(not (zerop number))
|
||||
(yas/snippet-find-field snippet number))))
|
||||
(when (and real-match-end-0
|
||||
field)
|
||||
field)
|
||||
(push (yas/make-mirror (yas/make-marker (match-beginning 0))
|
||||
(yas/make-marker (match-beginning 0))
|
||||
(buffer-substring-no-properties (match-beginning 2)
|
||||
@ -2440,7 +2452,7 @@ When multiple expressions are found, only the last one counts."
|
||||
(let ((inhibit-modification-hooks t))
|
||||
(yas/mirror-update-display mirror field)
|
||||
;; Take care of the fields adjacent to this mirror's back
|
||||
;; TODO: Known bug
|
||||
;; TODO: Known bug
|
||||
|
||||
;; `yas/place-overlays' is needed if the active field and
|
||||
;; protected overlays have been changed because of insertions
|
||||
@ -2482,6 +2494,7 @@ When multiple expressions are found, only the last one counts."
|
||||
;;
|
||||
|
||||
(defun yas/debug-some-vars ()
|
||||
"Debug snippets, fields, mirrors and the `buffer-undo-list'."
|
||||
(interactive)
|
||||
(with-output-to-temp-buffer "*YASnippet trace*"
|
||||
(princ "Interesting YASnippet vars: \n\n")
|
||||
|
Loading…
x
Reference in New Issue
Block a user