Merge commit '88649519d4f1e8df9a9906c4be565f96c95beab8' as 'vim/bundle/ultisnips'
commit
c45beed3dc
@ -0,0 +1,2 @@
|
||||
doc/tags
|
||||
.bzr-repo
|
@ -0,0 +1,3 @@
|
||||
*.pyc
|
||||
*.swp
|
||||
doc/tags
|
@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
@ -0,0 +1,101 @@
|
||||
version 2.2:
|
||||
- Support to silence Python-not-found warnings. *UltiSnips-python-warning*
|
||||
- Matchit support for snippet files.
|
||||
- Improvements to syntax file.
|
||||
- Various smaller bug fixes.
|
||||
- New command to manually add a filetype to the list for the current
|
||||
buffer. *:UltiSnipsAddFiletypes*
|
||||
- New or improved snippets: all, snippets, haskell, bindzone, python, golang,
|
||||
json, html, coffee, coffee_jasmine, javascript_jasmine, ruby, php,
|
||||
markdown.
|
||||
|
||||
version 2.1:
|
||||
- Python interpolation access to text from visual selection via snip.v.
|
||||
- Support for transformations of ${VISUAL} texts.
|
||||
- New or improved snippets: python, tex, texmath, ruby, rails, html, django
|
||||
|
||||
version 2.0:
|
||||
- Backwards incompatible change: Support for normal mode editing. Snippets
|
||||
are no longer exited when leaving insert mode but only by leaving the
|
||||
text span of the snippets. This allows usage of normal mode commands and
|
||||
autoformatting. It also increases compatibility with other plugins.
|
||||
- Backwards incompatible change: Changed glob patterns for snippets to
|
||||
behave more like Vim *UltiSnips-adding-snippets*
|
||||
- Backwards incompatible change: Zero Tabstop is no longer removed in
|
||||
nested snippets
|
||||
- Support for ${VISUAL:default text} placeholder. *UltiSnips-visual-placeholder*
|
||||
- Improved handling of utf-8 characters in files and snippet definitions.
|
||||
- Full support for :py3. UltiSnips now works with python >= 2.6 or >= 3.2.
|
||||
- New or improved snippets: python, all
|
||||
|
||||
version 1.6:
|
||||
- Significant speed improvements and a few bugs fixed.
|
||||
- Better handling of non ASCII chars in snippets by assuming UTF-8 encoding
|
||||
when no other information is available.
|
||||
- Contributions for UltiSnips are now also accepted on GitHub: https://github.com/SirVer/ultisnips/
|
||||
- New or improved snippets: ruby, rails, xhtml
|
||||
|
||||
version 1.5:
|
||||
- Some critical bug fixes for new vim versions.
|
||||
- New or improved snippets: tex, texmath, python, jinja2, go, puppet, xhtml
|
||||
- Configuration of search path for snippets *UltiSnips-snippet-search-path*
|
||||
- New parser implementation: A little faster, more flexible and less bugged.
|
||||
|
||||
version 1.4:
|
||||
- New or improved snippets: php, html, djangohtml, mako, lua
|
||||
- Snippets are now listed alphabetically by their trigger, no longer in
|
||||
order of appearance
|
||||
- Snippet files are now automatically reloaded when they change.
|
||||
- Support for other directory names for snippets beside
|
||||
"UltiSnips" *UltiSnips-snippet-search-path*
|
||||
- Errors are now shown in a scratch window.
|
||||
- Now fully supports Windows with python >= 2.6. UltiSnips should now work
|
||||
on all systems that Vim runs on.
|
||||
- a syntax file was added for snippets files with nice highlighting.
|
||||
- snippets definition files now have the filetype 'snippets'. It used to be
|
||||
'snippet'.
|
||||
|
||||
version 1.3:
|
||||
- Erlang snippets (g0rdin)
|
||||
- Other VimScripts can now define and immediately expand anonymous snippets
|
||||
( *UltiSnips_Anon* ) (Ryan Wooden)
|
||||
- Other VimScripts can now define new snippets via a function
|
||||
( *UltiSnips_AddSnippet* ) (Ryan Wooden)
|
||||
- New Snippets for eruby and rails (Ches Martin).
|
||||
- A new Option 't' has been added to snippets that avoid expanding tabstops.
|
||||
Be also more consistent with how indenting is handled. (Ryan Wooden)
|
||||
- Added a ftplugin script for .snippets files. Syntax highlighting still
|
||||
missing. (Rupa Deadwyler)
|
||||
- Added UltiSnipsReset and UltiSnipsEdit (Idea by JCEB)
|
||||
|
||||
version 1.2:
|
||||
- many bugs were fixed
|
||||
- smode mappings for printable characters are now removed before expanding a
|
||||
snippet. This is configurable. *UltiSnips-warning-smappings*
|
||||
- all shipped snippets are now fully compatible with UltiSnips
|
||||
- added support for global snippets which enhance python interpolation even
|
||||
more *UltiSnips-globals*
|
||||
- added support for multi word and regular expression triggers. Very
|
||||
powerful in combination with python interpolation.
|
||||
- Python interpolation became much more powerful *UltiSnips-python*
|
||||
- added support for clearsnippets command *UltiSnips-clearing-snippets*
|
||||
- added support for option w which is a little more strict than i.
|
||||
- added support for listing of valid triggers. Defaults to <c-tab>.
|
||||
- added support for option i (inword expansion)
|
||||
- extends keyword is now supported on the first line of snippet files. This makes it easy to
|
||||
define special cases, for example cpp extends c: a cpp trigger is useless
|
||||
in c, but a c trigger is valuable for cpp.
|
||||
- UltiSnips now adheres to expandtab and tabstop options of vim
|
||||
|
||||
version 1.1:
|
||||
- Made triggers configurable. You can also use the same trigger for
|
||||
expanding and tabbing. The TextMate configuration <tab> and <s-tab> is now
|
||||
possible.
|
||||
- Conditional Inserts can now be nested
|
||||
- Added support for b option. This only considers a snippet at the beginning
|
||||
of a line ( *UltiSnips-adding-snippets* )
|
||||
- Added support for ! option. This overwrites previously defined snippets
|
||||
with the same tab trigger ( *UltiSnips-adding-snippets* )
|
||||
- Support for dotted filetype syntax. Now snippets for more than one filetype
|
||||
can be active ( *UltiSnips-adding-snippets* )
|
||||
|
@ -0,0 +1,22 @@
|
||||
UltiSnips
|
||||
=========
|
||||
|
||||
This is the official repository for UltiSnips. Send Pull request to
|
||||
SirVer/ultisnips, not the automatic clone from vim-scripts or any
|
||||
other fork of this project.
|
||||
|
||||
Screencasts
|
||||
-----------
|
||||
|
||||
The blog posts of the screencasts contain more advanced examples of the things
|
||||
discussed in the videos.
|
||||
|
||||
* `Episode 1: What are snippets and do I need them?`__
|
||||
* `Episode 2: Creating Basic Snippets`__
|
||||
* `Episode 3: What's new in version 2.0`__
|
||||
* `Episode 4: Python Interpolation`__
|
||||
|
||||
__ http://www.sirver.net/blog/2011/12/30/first-episode-of-ultisnips-screencast/
|
||||
__ http://www.sirver.net/blog/2012/01/08/second-episode-of-ultisnips-screencast/
|
||||
__ http://www.sirver.net/blog/2012/02/05/third-episode-of-ultisnips-screencast/
|
||||
__ http://www.sirver.net/blog/2012/03/31/fourth-episode-of-ultisnips-screencast/
|
@ -0,0 +1,21 @@
|
||||
This directory contains the main scripts that come bundled with UltiSnips.
|
||||
|
||||
Standing On The Shoulders of Giants
|
||||
===================================
|
||||
|
||||
The snippets have been collected from various other project which I want to
|
||||
express my gratitude for. My main source for inspiration where the following
|
||||
two projects:
|
||||
|
||||
TextMate: http://svn.textmate.org/trunk/Bundles/
|
||||
SnipMate: http://code.google.com/p/snipmate/
|
||||
|
||||
All snippets from those sources were copied and cleaned up, so that they are
|
||||
- not using shell script, only python (so they are cross platform compatible)
|
||||
- not using any feature that UltiSnips doesn't offer
|
||||
|
||||
UltiSnips has seen contributions by various individuals. Those contributions
|
||||
have been merged into this collection seamlessly and without further comments.
|
||||
|
||||
-- vim:ft=rst:nospell:
|
||||
|
@ -0,0 +1,120 @@
|
||||
# This file contains snippets that are always defined. I personally
|
||||
# have snippets for signatures and often needed texts
|
||||
|
||||
priority -50
|
||||
|
||||
##############
|
||||
# NICE BOXES #
|
||||
##############
|
||||
global !p
|
||||
import string, vim
|
||||
|
||||
""" Maps a filetype to comment format used for boxes.
|
||||
Automatically filled during usage"""
|
||||
_commentDict = { }
|
||||
|
||||
def _parse_comments(s):
|
||||
""" Parses vim's comments option to extract comment format """
|
||||
i = iter(s.split(","))
|
||||
|
||||
rv = []
|
||||
try:
|
||||
while True:
|
||||
# get the flags and text of a comment part
|
||||
flags, text = next(i).split(':', 1)
|
||||
|
||||
if len(flags) == 0:
|
||||
rv.append((text, text, text, ""))
|
||||
# parse 3-part comment, but ignore those with O flag
|
||||
elif flags[0] == 's' and 'O' not in flags:
|
||||
ctriple = []
|
||||
indent = ""
|
||||
|
||||
if flags[-1] in string.digits:
|
||||
indent = " " * int(flags[-1])
|
||||
ctriple.append(text)
|
||||
|
||||
flags,text = next(i).split(':', 1)
|
||||
assert(flags[0] == 'm')
|
||||
ctriple.append(text)
|
||||
|
||||
flags,text = next(i).split(':', 1)
|
||||
assert(flags[0] == 'e')
|
||||
ctriple.append(text)
|
||||
ctriple.append(indent)
|
||||
|
||||
rv.append(ctriple)
|
||||
elif flags[0] == 'b':
|
||||
if len(text) == 1:
|
||||
rv.insert(0, (text,text,text, ""))
|
||||
except StopIteration:
|
||||
return rv
|
||||
|
||||
def _get_comment_format():
|
||||
""" Returns a 4-element tuple representing the comment format for
|
||||
the current file. """
|
||||
return _parse_comments(vim.eval("&comments"))[0]
|
||||
|
||||
|
||||
def make_box(twidth, bwidth=None):
|
||||
b, m, e, i = _get_comment_format()
|
||||
bwidth_inner = bwidth - 3 - max(len(b), len(i + e)) if bwidth else twidth + 2
|
||||
sline = b + m + bwidth_inner * m[0] + 2 * m[0]
|
||||
nspaces = (bwidth_inner - twidth) // 2
|
||||
mlines = i + m + " " + " " * nspaces
|
||||
mlinee = " " + " "*(bwidth_inner - twidth - nspaces) + m
|
||||
eline = i + m + bwidth_inner * m[0] + 2 * m[0] + e
|
||||
return sline, mlines, mlinee, eline
|
||||
|
||||
def foldmarker():
|
||||
"Return a tuple of (open fold marker, close fold marker)"
|
||||
return vim.eval("&foldmarker").split(",")
|
||||
|
||||
endglobal
|
||||
|
||||
snippet box "A nice box with the current comment symbol" b
|
||||
`!p
|
||||
box = make_box(len(t[1]))
|
||||
snip.rv = box[0] + '\n' + box[1]
|
||||
`${1:content}`!p
|
||||
box = make_box(len(t[1]))
|
||||
snip.rv = box[2] + '\n' + box[3]`
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet bbox "A nice box over the full width" b
|
||||
`!p
|
||||
width = int(vim.eval("&textwidth")) or 71
|
||||
box = make_box(len(t[1]), width)
|
||||
snip.rv = box[0] + '\n' + box[1]
|
||||
`${1:content}`!p
|
||||
box = make_box(len(t[1]), width)
|
||||
snip.rv = box[2] + '\n' + box[3]`
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet fold "Insert a vim fold marker" b
|
||||
`!p snip.rv = _get_comment_format()[0]` ${1:Fold description} `!p snip.rv = foldmarker()[0]`${2:1} `!p snip.rv = _get_comment_format()[2]`
|
||||
endsnippet
|
||||
|
||||
snippet foldc "Insert a vim fold close marker" b
|
||||
`!p snip.rv = _get_comment_format()[0]` ${2:1}`!p snip.rv = foldmarker()[1]` `!p snip.rv = _get_comment_format()[2]`
|
||||
endsnippet
|
||||
|
||||
snippet foldp "Insert a vim fold marker pair" b
|
||||
`!p snip.rv = _get_comment_format()[0]` ${1:Fold description} `!p snip.rv = foldmarker()[0]` `!p snip.rv = _get_comment_format()[2]`
|
||||
${2:${VISUAL:Content}}
|
||||
`!p snip.rv = _get_comment_format()[0]` `!p snip.rv = foldmarker()[1]` $1 `!p snip.rv = _get_comment_format()[2]`
|
||||
endsnippet
|
||||
|
||||
##########################
|
||||
# LOREM IPSUM GENERATORS #
|
||||
##########################
|
||||
snippet lorem "Lorem Ipsum - 50 Words" b
|
||||
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
|
||||
tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
|
||||
vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren,
|
||||
no sea takimata sanctus est Lorem ipsum dolor sit amet.
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,52 @@
|
||||
priority -50
|
||||
|
||||
snippet online "Online resource" b
|
||||
@online{${1:name},
|
||||
author={${2:author}},
|
||||
title={${3:title}},
|
||||
date={${4:date}},
|
||||
url={${5:url}}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet article "Article reference" b
|
||||
@article{${1:name},
|
||||
author={${2:author}},
|
||||
title={${3:title}},
|
||||
journaltitle={${4:journal}},
|
||||
volume={${5:NN}},
|
||||
number={${6:NN}},
|
||||
year={${7:YYYY}},
|
||||
pages={${8:NN}--${9:NN}}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet book "Book reference" b
|
||||
@book{${1:name},
|
||||
author={${2:author}},
|
||||
title={${3:title}},
|
||||
subtitle={${4:subtitle}},
|
||||
year={${5:YYYY}},
|
||||
location={${6:somewhere}},
|
||||
publisher={${7:publisher}},
|
||||
pages={${8:NN}--${9:NN}}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet inb "In Book reference" b
|
||||
@inbook{${1:name},
|
||||
author={${2:author}},
|
||||
title={${3:title}},
|
||||
subtitle={${4:subtitle}},
|
||||
booktitle={${5:book}},
|
||||
editor={${6:editor}},
|
||||
year={${7:YYYY}},
|
||||
location={${8:somewhere}},
|
||||
publisher={${9:publisher}},
|
||||
pages={${10:NN}--${11:NN}}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
@ -0,0 +1,29 @@
|
||||
priority -50
|
||||
|
||||
global !p
|
||||
def newsoa():
|
||||
import datetime
|
||||
now = datetime.datetime.now()
|
||||
# return standard SOA formatted serial for today
|
||||
return now.strftime("%Y%m%d00")
|
||||
endglobal
|
||||
|
||||
snippet zone "Bootstrap a new Bind zonefile" b
|
||||
$TTL 86400
|
||||
@ IN SOA ${1:example.net}. ${2:hostmaster.$1}.(
|
||||
`!p snip.rv = newsoa()`; serial
|
||||
21600; refresh every 6 hours
|
||||
3600; retry after one hour
|
||||
604800; expire after a week
|
||||
86400 ); minimum TTL of 1 day
|
||||
|
||||
IN NS ns01.$1.
|
||||
IN MX 10 mail.$1.
|
||||
|
||||
ns01.$1 IN A
|
||||
mail.$1 IN A
|
||||
endsnippet
|
||||
|
||||
snippet A "Insert A Record" b
|
||||
${1:hostname} IN A ${2:ip}
|
||||
endsnippet
|
@ -0,0 +1,155 @@
|
||||
###########################################################################
|
||||
# TextMate Snippets #
|
||||
###########################################################################
|
||||
|
||||
priority -50
|
||||
|
||||
snippet def "#define ..."
|
||||
#define ${1}
|
||||
endsnippet
|
||||
|
||||
snippet ifndef "#ifndef ... #define ... #endif"
|
||||
#ifndef ${1/([A-Za-z0-9_]+).*/$1/}
|
||||
#define ${1:SYMBOL} ${2:value}
|
||||
#endif
|
||||
endsnippet
|
||||
|
||||
snippet #if "#if #endif" b
|
||||
#if ${1:0}
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::code)/}}
|
||||
#endif
|
||||
endsnippet
|
||||
|
||||
snippet inc "#include local header (inc)"
|
||||
#include "${1:`!p snip.rv = snip.basename + '.h'`}"
|
||||
endsnippet
|
||||
|
||||
snippet Inc "#include <> (Inc)"
|
||||
#include <${1:.h}>
|
||||
endsnippet
|
||||
|
||||
snippet mark "#pragma mark (mark)"
|
||||
#if 0
|
||||
${1:#pragma mark -
|
||||
}#pragma mark $2
|
||||
#endif
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet main "main() (main)"
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
return 0;
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet for "for loop (for)"
|
||||
for (${2:i} = 0; $2 < ${1:count}; ${3:++$2})
|
||||
{
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet fori "for int loop (fori)"
|
||||
for (${4:int} ${2:i} = 0; $2 < ${1:count}; ${3:++$2})
|
||||
{
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet enum "Enumeration"
|
||||
enum ${1:name} { $0 };
|
||||
endsnippet
|
||||
|
||||
snippet once "Include header once only guard"
|
||||
#ifndef ${1:`!p
|
||||
if not snip.c:
|
||||
import random, string
|
||||
name = re.sub(r'[^A-Za-z0-9]+','_', snip.fn).upper()
|
||||
rand = ''.join(random.sample(string.ascii_letters+string.digits, 8))
|
||||
snip.rv = ('%s_%s' % (name,rand)).upper()
|
||||
else:
|
||||
snip.rv = snip.c`}
|
||||
#define $1
|
||||
|
||||
${0}
|
||||
|
||||
#endif /* end of include guard: $1 */
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet td "Typedef"
|
||||
typedef ${1:int} ${2:MyCustomType};
|
||||
endsnippet
|
||||
|
||||
snippet wh "while loop"
|
||||
while(${1:/* condition */}) {
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet do "do...while loop (do)"
|
||||
do {
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
} while(${1:/* condition */});
|
||||
endsnippet
|
||||
|
||||
snippet fprintf "fprintf ..."
|
||||
fprintf(${1:stderr}, "${2:%s}\n"${2/([^%]|%%)*(%.)?.*/(?2:, :\);)/}$3${2/([^%]|%%)*(%.)?.*/(?2:\);)/}
|
||||
endsnippet
|
||||
|
||||
snippet if "if .. (if)"
|
||||
if (${1:/* condition */})
|
||||
{
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet el "else .. (else)"
|
||||
else {
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet eli "else if .. (eli)"
|
||||
else if (${1:/* condition */}) {
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet ife "if .. else (ife)"
|
||||
if (${1:/* condition */})
|
||||
{
|
||||
${2:/* code */}
|
||||
}
|
||||
else
|
||||
{
|
||||
${3:/* else */}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet printf "printf .. (printf)"
|
||||
printf("${1:%s}\n"${1/([^%]|%%)*(%.)?.*/(?2:, :\);)/}$2${1/([^%]|%%)*(%.)?.*/(?2:\);)/}
|
||||
endsnippet
|
||||
|
||||
snippet st "struct"
|
||||
struct ${1:`!p snip.rv = (snip.basename or "name") + "_t"`}
|
||||
{
|
||||
${0:/* data */}
|
||||
};
|
||||
endsnippet
|
||||
|
||||
snippet fun "function" b
|
||||
${1:void} ${2:function_name}(${3})
|
||||
{
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet fund "function declaration" b
|
||||
${1:void} ${2:function_name}(${3});
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,91 @@
|
||||
# From the TextMate bundle
|
||||
|
||||
priority -50
|
||||
|
||||
snippet fun "Function" b
|
||||
${1:name} = (${2:args}) ->
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet bfun "Function (bound)" b
|
||||
${1:(${2:args}) }=>
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet if "If" b
|
||||
if ${1:condition}
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet ife "If .. Else" b
|
||||
if ${1:condition}
|
||||
${2:# body...}
|
||||
else
|
||||
${3:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet elif "Else if" b
|
||||
else if ${1:condition}
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet ifte "Ternary if" b
|
||||
if ${1:condition} then ${2:value} else ${3:other}
|
||||
endsnippet
|
||||
|
||||
snippet unl "Unless" b
|
||||
${1:action} unless ${2:condition}
|
||||
endsnippet
|
||||
|
||||
snippet fora "Array Comprehension" b
|
||||
for ${1:name} in ${2:array}
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet foro "Object Comprehension" b
|
||||
for ${1:key}, ${2:value} of ${3:Object}
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet forr "Range Comprehension (inclusive)" b
|
||||
for ${1:name} in [${2:start}..${3:finish}]${4: by ${5:step}}
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet forrex "Range Comprehension (exclusive)" b
|
||||
for ${1:name} in [${2:start}...${3:finish}]${4: by ${5:step}}
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet swi "Switch" b
|
||||
switch ${1:object}
|
||||
when ${2:value}
|
||||
${0:# body...}
|
||||
endsnippet
|
||||
|
||||
snippet cla "Class" b
|
||||
class ${1:ClassName}${2: extends ${3:Ancestor}}
|
||||
|
||||
${4:constructor: (${5:args}) ->
|
||||
${6:# body...}}
|
||||
$7
|
||||
endsnippet
|
||||
|
||||
snippet try "Try .. Catch" b
|
||||
try
|
||||
$1
|
||||
catch ${2:error}
|
||||
$3
|
||||
endsnippet
|
||||
|
||||
snippet req "Require" b
|
||||
${1/^'?(\w+)'?$/\L$1\E/} = require(${1:'${2:sys}'})
|
||||
endsnippet
|
||||
|
||||
snippet # "Interpolated Code"
|
||||
#{$1}$0
|
||||
endsnippet
|
||||
|
||||
snippet log "Log" b
|
||||
console.log ${1:"${2:msg}"}
|
||||
endsnippet
|
@ -0,0 +1,166 @@
|
||||
#
|
||||
# CoffeeScript versions -- adapted from the JS TextMate bundle + additions
|
||||
# for some jasmine-jquery matchers
|
||||
#
|
||||
priority -50
|
||||
|
||||
extends coffee
|
||||
|
||||
priority -49
|
||||
|
||||
snippet des "Describe (coffee)" b
|
||||
describe '${1:description}', ->
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet it "it (coffee)" b
|
||||
it '${1:description}', ->
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet bef "before each (coffee)" b
|
||||
beforeEach ->
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet aft "after each (coffee)" b
|
||||
afterEach ->
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet any "any (coffee)" b
|
||||
jasmine.any($1)
|
||||
endsnippet
|
||||
|
||||
snippet ru "runs (coffee)" b
|
||||
runs ->
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet wa "waits (coffee)" b
|
||||
waits($1)
|
||||
endsnippet
|
||||
|
||||
snippet ex "expect (coffee)" b
|
||||
expect(${1:target})$0
|
||||
endsnippet
|
||||
|
||||
snippet ee "expect to equal (coffee)" b
|
||||
expect(${1:target}).toEqual(${2:value})
|
||||
endsnippet
|
||||
|
||||
snippet em "expect to match (coffee)" b
|
||||
expect(${1:target}).toMatch(${2:pattern})
|
||||
endsnippet
|
||||
|
||||
snippet eha "expect to have attribute (coffee)" b
|
||||
expect(${1:target}).toHaveAttr('${2:attr}'${3:, '${4:value}'})
|
||||
endsnippet
|
||||
|
||||
snippet et "expect to be truthy (coffee)" b
|
||||
expect(${1:target}).toBeTruthy()
|
||||
endsnippet
|
||||
|
||||
snippet ef "expect to be falsy (coffee)" b
|
||||
expect(${1:target}).toBeFalsy()
|
||||
endsnippet
|
||||
|
||||
snippet ed "expect to be defined (coffee)" b
|
||||
expect(${1:target}).toBeDefined()
|
||||
endsnippet
|
||||
|
||||
snippet en "expect to be null (coffee)" b
|
||||
expect(${1:target}).toBeNull()
|
||||
endsnippet
|
||||
|
||||
snippet ec "expect to contain (coffee)" b
|
||||
expect(${1:target}).toContain(${2:value})
|
||||
endsnippet
|
||||
|
||||
snippet ev "expect to be visible (coffee)" b
|
||||
expect(${1:target}).toBeVisible()
|
||||
endsnippet
|
||||
|
||||
snippet eh "expect to be hidden (coffee)" b
|
||||
expect(${1:target}).toBeHidden()
|
||||
endsnippet
|
||||
|
||||
snippet notx "expect not (coffee)" b
|
||||
expect(${1:target}).not$0
|
||||
endsnippet
|
||||
|
||||
snippet note "expect not to equal (coffee)" b
|
||||
expect(${1:target}).not.toEqual(${2:value})
|
||||
endsnippet
|
||||
|
||||
snippet notm "expect not to match (coffee)" b
|
||||
expect(${1:target}).not.toMatch(${2:pattern})
|
||||
endsnippet
|
||||
|
||||
snippet notha "expect to not have attribute (coffee)" b
|
||||
expect(${1:target}).not.toHaveAttr('${2:attr}'${3:, '${4:value}'})
|
||||
endsnippet
|
||||
|
||||
snippet nott "expect not to be truthy (coffee)" b
|
||||
expect(${1:target}).not.toBeTruthy()
|
||||
endsnippet
|
||||
|
||||
snippet notf "expect not to be falsy (coffee)" b
|
||||
expect(${1:target}).not.toBeFalsy()
|
||||
endsnippet
|
||||
|
||||
snippet notd "expect not to be defined (coffee)" b
|
||||
expect(${1:target}).not.toBeDefined()
|
||||
endsnippet
|
||||
|
||||
snippet notn "expect not to be null (coffee)" b
|
||||
expect(${1:target}).not.toBeNull()
|
||||
endsnippet
|
||||
|
||||
snippet notc "expect not to contain (coffee)" b
|
||||
expect(${1:target}).not.toContain(${2:value})
|
||||
endsnippet
|
||||
|
||||
snippet notv "expect not to be visible (coffee)" b
|
||||
expect(${1:target}).not.toBeVisible()
|
||||
endsnippet
|
||||
|
||||
snippet noth "expect not to be hidden (coffee)" b
|
||||
expect(${1:target}).not.toBeHidden()
|
||||
endsnippet
|
||||
|
||||
snippet s "spy on (coffee)" b
|
||||
spyOn(${1:object}, "${2:method}")$0
|
||||
endsnippet
|
||||
|
||||
snippet sr "spy on and return (coffee)" b
|
||||
spyOn(${1:object}, "${2:method}").andReturn(${3:arguments})
|
||||
endsnippet
|
||||
|
||||
snippet st "spy on and throw (coffee)" b
|
||||
spyOn(${1:object}, "${2:method}").andThrow(${3:exception})
|
||||
endsnippet
|
||||
|
||||
snippet sct "spy on and call through (coffee)" b
|
||||
spyOn(${1:object}, "${2:method}").andCallThrough()
|
||||
endsnippet
|
||||
|
||||
snippet scf "spy on and call fake (coffee)" b
|
||||
spyOn(${1:object}, "${2:method}").andCallFake(${3:function})
|
||||
endsnippet
|
||||
|
||||
snippet esc "expect was called (coffee)" b
|
||||
expect(${1:target}).wasCalled()
|
||||
endsnippet
|
||||
|
||||
snippet escw "expect was called with (coffee)" b
|
||||
expect(${1:target}).wasCalledWith(${2:arguments})
|
||||
endsnippet
|
||||
|
||||
snippet notsc "expect was not called (coffee)" b
|
||||
expect(${1:target}).wasNotCalled()
|
||||
endsnippet
|
||||
|
||||
snippet noscw "expect was not called with (coffee)" b
|
||||
expect(${1:target}).wasNotCalledWith(${2:arguments})
|
||||
endsnippet
|
@ -0,0 +1,57 @@
|
||||
priority -50
|
||||
|
||||
extends c
|
||||
|
||||
# We want to overwrite everything in parent ft.
|
||||
priority -49
|
||||
|
||||
###########################################################################
|
||||
# TextMate Snippets #
|
||||
###########################################################################
|
||||
snippet beginend "$1.begin(), $1.end() (beginend)"
|
||||
${1:v}${1/^.*?(-)?(>)?$/(?2::(?1:>:.))/}begin(), $1${1/^.*?(-)?(>)?$/(?2::(?1:>:.))/}end()
|
||||
endsnippet
|
||||
|
||||
snippet cl "class .. (class)"
|
||||
class ${1:`!p snip.rv = snip.basename or "name"`}
|
||||
{
|
||||
public:
|
||||
${1/(\w+).*/$1/} (${2:arguments});
|
||||
virtual ~${1/(\w+).*/$1/} ();
|
||||
|
||||
private:
|
||||
${0:/* data */}
|
||||
};
|
||||
endsnippet
|
||||
|
||||
snippet ns "namespace .. (namespace)"
|
||||
namespace${1/.+/ /m}${1:`!p snip.rv = snip.basename or "name"`}
|
||||
{
|
||||
${VISUAL}${0:${VISUAL/(.*)/(?1::\/* code *\/)/}}
|
||||
}${1/.+/ \/* /m}$1${1/.+/ *\/ /m}
|
||||
endsnippet
|
||||
|
||||
snippet readfile "read file (readF)"
|
||||
std::vector<char> v;
|
||||
if (FILE *fp = fopen(${1:"filename"}, "r"))
|
||||
{
|
||||
char buf[1024];
|
||||
while(size_t len = fread(buf, 1, sizeof(buf), fp))
|
||||
v.insert(v.end(), buf, buf + len);
|
||||
fclose(fp);
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet map "std::map (map)"
|
||||
std::map<${1:key}, ${2:value}> map$0;
|
||||
endsnippet
|
||||
|
||||
snippet vector "std::vector (v)"
|
||||
std::vector<${1:char}> v$0;
|
||||
endsnippet
|
||||
|
||||
snippet tp "template <typename ..> (template)"
|
||||
template <typename ${1:_InputIter}>
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,328 @@
|
||||
#######################################################################
|
||||
# C# Snippets for UltiSnips #
|
||||
#######################################################################
|
||||
|
||||
priority -50
|
||||
|
||||
#########################
|
||||
# classes and structs #
|
||||
#########################
|
||||
|
||||
snippet namespace "namespace" b
|
||||
namespace ${1:MyNamespace}
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet class "class" w
|
||||
class ${1:MyClass}
|
||||
{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet struct "struct" w
|
||||
struct ${1:MyStruct}
|
||||
{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet interface "interface" w
|
||||
interface I${1:Interface}
|
||||
{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet enum "enumeration" b
|
||||
enum ${1:MyEnum} { ${2:Item} };
|
||||
endsnippet
|
||||
|
||||
|
||||
############
|
||||
# Main() #
|
||||
############
|
||||
|
||||
snippet sim "static int main" b
|
||||
static int Main(string[] args)
|
||||
{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet svm "static void main" b
|
||||
static void Main(string[] args)
|
||||
{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
################
|
||||
# properties #
|
||||
################
|
||||
|
||||
snippet prop "Simple property declaration" b
|
||||
public ${1:int} ${2:MyProperty} { get; set; }
|
||||
endsnippet
|
||||
|
||||
snippet propfull "Full property declaration" b
|
||||
private ${1:int} ${2:_myProperty};
|
||||
|
||||
public $1 ${3:MyProperty}
|
||||
{
|
||||
get { return $2; }
|
||||
set { $2 = value; }
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet propg "Property with a private setter" b
|
||||
public ${1:int} ${2:MyProperty} { get; private set; }
|
||||
endsnippet
|
||||
|
||||
|
||||
############
|
||||
# blocks #
|
||||
############
|
||||
|
||||
snippet #if "#if #endif" b
|
||||
#if ${1:DEBUG}
|
||||
${VISUAL}$0
|
||||
#endif
|
||||
endsnippet
|
||||
|
||||
snippet #region "#region #endregion" b
|
||||
#region ${1:Region}
|
||||
${VISUAL}$0
|
||||
#endregion
|
||||
endsnippet
|
||||
|
||||
|
||||
###########
|
||||
# loops #
|
||||
###########
|
||||
|
||||
snippet for "for loop" b
|
||||
for (int ${1:i} = 0; $1 < ${2:10}; $1++)
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet forr "for loop (reverse)" b
|
||||
for (int ${1:i} = ${2:10}; $1 >= 0; $1--)
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet foreach "foreach loop" b
|
||||
foreach (${3:var} ${2:item} in ${1:items})
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet while "while loop" b
|
||||
while (${1:true})
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet do "do loop" b
|
||||
do
|
||||
{
|
||||
${VISUAL}$0
|
||||
} while (${1:true});
|
||||
endsnippet
|
||||
|
||||
|
||||
###############
|
||||
# branching #
|
||||
###############
|
||||
|
||||
snippet if "if statement" b
|
||||
if ($1)
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet ife "if else statement" b
|
||||
if ($1)
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet elif "else if" b
|
||||
else if ($1)
|
||||
{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet elseif "else if" b
|
||||
else if ($1)
|
||||
{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet ifnn "if not null" b
|
||||
if ($1 != null)
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet switch "switch statement" b
|
||||
switch (${1:statement})
|
||||
{
|
||||
case ${2:value}:
|
||||
break;
|
||||
|
||||
default:
|
||||
$0break;
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet case "case" b
|
||||
case ${1:value}:
|
||||
$2
|
||||
break;
|
||||
endsnippet
|
||||
|
||||
|
||||
##############
|
||||
# wrappers #
|
||||
##############
|
||||
|
||||
snippet using "using statement" b
|
||||
using (${1:resource})
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet unchecked "unchecked block" b
|
||||
unchecked
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet checked "checked block" b
|
||||
checked
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet unsafe "unsafe" b
|
||||
unsafe
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
########################
|
||||
# exception handling #
|
||||
########################
|
||||
|
||||
snippet try "try catch block" b
|
||||
try
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
catch (${1:Exception} ${2:e})
|
||||
{
|
||||
throw;
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet tryf "try finally block" b
|
||||
try
|
||||
{
|
||||
${VISUAL}$0
|
||||
}
|
||||
finally
|
||||
{
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet throw "throw"
|
||||
throw new ${1}Exception("${2}");
|
||||
endsnippet
|
||||
|
||||
|
||||
##########
|
||||
# LINQ #
|
||||
##########
|
||||
|
||||
snippet from "LINQ syntax" b
|
||||
var ${1:seq} =
|
||||
from ${2:item1} in ${3:items1}
|
||||
join ${4:item2} in ${5:items2} on $2.${6:prop1} equals $4.${7:prop2}
|
||||
select ${8:$2.prop3}
|
||||
where ${9:clause}
|
||||
endsnippet
|
||||
|
||||
|
||||
############################
|
||||
# feedback and debugging #
|
||||
############################
|
||||
|
||||
snippet da "Debug.Assert" b
|
||||
Debug.Assert(${1:true});
|
||||
endsnippet
|
||||
|
||||
snippet cw "Console.WriteLine" b
|
||||
Console.WriteLine("$1");
|
||||
endsnippet
|
||||
|
||||
# as you first type comma-separated parameters on the right, {n} values appear in the format string
|
||||
snippet cwp "Console.WriteLine with parameters" b
|
||||
Console.WriteLine("${2:`!p
|
||||
snip.rv = ' '.join(['{' + str(i) + '}' for i in range(t[1].count(','))])
|
||||
`}"${1:, something});
|
||||
endsnippet
|
||||
|
||||
snippet mbox "Message box" b
|
||||
MessageBox.Show("${1:message}");
|
||||
endsnippet
|
||||
|
||||
|
||||
##################
|
||||
# full methods #
|
||||
##################
|
||||
|
||||
snippet equals "Equals method" b
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (obj == null || GetType() != obj.GetType())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$0
|
||||
return base.Equals(obj);
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
##############
|
||||
# comments #
|
||||
##############
|
||||
|
||||
snippet /// "XML comment" b
|
||||
/// <summary>
|
||||
/// $1
|
||||
/// </summary>
|
||||
endsnippet
|
@ -0,0 +1,407 @@
|
||||
###########################################################################
|
||||
# Most of these came from TextMate #
|
||||
###########################################################################
|
||||
|
||||
priority -50
|
||||
|
||||
snippet ! "!important CSS (!)"
|
||||
${1:!important}
|
||||
endsnippet
|
||||
|
||||
snippet fixed "Fixed Position Bottom 100% wide IE6"
|
||||
${2:bottom: auto;}top: expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-${1:THE HEIGHT OF THIS THING IN PIXELS}));
|
||||
${3:left: expression(eval(document.documentElement.scrollLeft));
|
||||
}${4:width: expression(eval(document.documentElement.clientWidth));}$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-attachment: scroll:fixed (background)"
|
||||
background-attachment: ${1:scroll/fixed};$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-color: color-hex (background)"
|
||||
background-color: #${1:DDD};$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-color: color-name (background)"
|
||||
background-color: ${1:red};$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-color: color-rgb (background)"
|
||||
background-color: rgb(${1:255},${2:255},${3:255});$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-color: transparent (background)"
|
||||
background-color: transparent;$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-image: none (background)"
|
||||
background-image: none;$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-image: url (background)"
|
||||
background-image: url($1);$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-position: position (background)"
|
||||
background-position: ${1:top left/top center/top right/center left/center center/center right/bottom left/bottom center/bottom right/x-% y-%/x-pos y-pos};$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background-repeat: r:r-x:r-y:n-r (background)"
|
||||
background-repeat: ${1:repeat/repeat-x/repeat-y/no-repeat};$0
|
||||
endsnippet
|
||||
|
||||
snippet background "background: color image repeat attachment position (background)"
|
||||
background:${6: #${1:DDD}} url($2) ${3:repeat/repeat-x/repeat-y/no-repeat} ${4:scroll/fixed} ${5:top left/top center/top right/center left/center center/center right/bottom left/bottom center/bottom right/x-% y-%/x-pos y-pos};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-bottom-color: size style color (border)"
|
||||
border-bottom-color: #${1:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-bottom-style: size style color (border)"
|
||||
border-bottom-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-bottom-width: size style color (border)"
|
||||
border-bottom-width: ${1:1}px ${2:solid} #${3:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-bottom: size style color (border)"
|
||||
border-bottom: ${1:1}px ${2:solid} #${3:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-color: color (border)"
|
||||
border-color: ${1:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-left-color: color (border)"
|
||||
border-right-color: #${1:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-left-style: style (border)"
|
||||
border-left-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-left-width: size (border)"
|
||||
border-left-width: ${1:1}px
|
||||
endsnippet
|
||||
|
||||
snippet border "border-left: size style color (border)"
|
||||
border-left: ${1:1}px ${2:solid} #${3:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-right-color: color (border)"
|
||||
border-right-color: #${1:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-right-style: style (border)"
|
||||
border-right-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-right-width: size (border)"
|
||||
border-right-width: ${1:1}px
|
||||
endsnippet
|
||||
|
||||
snippet border "border-right: size style color (border)"
|
||||
border-right: ${1:1}px ${2:solid} #${3:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-style: style (border)"
|
||||
border-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-top-color: color (border)"
|
||||
border-top-color: #${1:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-top-style: style (border)"
|
||||
border-top-style: ${1:none/hidden/dotted/dashed/solid/double/groove/ridge/inset/outset};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-top-width: size (border)"
|
||||
border-top-width: ${1:1}px
|
||||
endsnippet
|
||||
|
||||
snippet border "border-top: size style color (border)"
|
||||
border-top: ${1:1}px ${2:solid} #${3:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border-width: width (border)"
|
||||
border-width: ${1:1px};$0
|
||||
endsnippet
|
||||
|
||||
snippet border "border: size style color (border)"
|
||||
border: ${1:1px} ${2:solid} #${3:999};$0
|
||||
endsnippet
|
||||
|
||||
snippet clear "clear: value (clear)"
|
||||
clear: ${1:left/right/both/none};$0
|
||||
endsnippet
|
||||
|
||||
snippet color "color: color-hex (color)"
|
||||
color: #${1:DDD};$0
|
||||
endsnippet
|
||||
|
||||
snippet color "color: color-name (color)"
|
||||
color: ${1:red};$0
|
||||
endsnippet
|
||||
|
||||
snippet color "color: color-rgb (color)"
|
||||
color: rgb(${1:255},${2:255},${3:255});$0
|
||||
endsnippet
|
||||
|
||||
snippet cursor "cursor: type (cursor)"
|
||||
cursor: ${1:default/auto/crosshair/pointer/move/*-resize/text/wait/help};$0
|
||||
endsnippet
|
||||
|
||||
snippet cursor "cursor: url (cursor)"
|
||||
cursor: url($1);$0
|
||||
endsnippet
|
||||
|
||||
snippet direction "direction: ltr|rtl (direction)"
|
||||
direction: ${1:ltr|rtl};$0
|
||||
endsnippet
|
||||
|
||||
snippet display "display: block (display)"
|
||||
display: block;$0
|
||||
endsnippet
|
||||
|
||||
snippet display "display: common-types (display)"
|
||||
display: ${1:none/inline/block/list-item/run-in/compact/marker};$0
|
||||
endsnippet
|
||||
|
||||
snippet display "display: inline (display)"
|
||||
display: inline;$0
|
||||
endsnippet
|
||||
|
||||
snippet display "display: table-types (display)"
|
||||
display: ${1:table/inline-table/table-row-group/table-header-group/table-footer-group/table-row/table-column-group/table-column/table-cell/table-caption};$0
|
||||
endsnippet
|
||||
|
||||
snippet float "float: left:right:none (float)"
|
||||
float: ${1:left/right/none};$0
|
||||
endsnippet
|
||||
|
||||
snippet font "font-family: family (font)"
|
||||
font-family: ${1:Arial, "MS Trebuchet"}, ${2:sans-}serif;$0
|
||||
endsnippet
|
||||
|
||||
snippet font "font-size: size (font)"
|
||||
font-size: ${1:100%};$0
|
||||
endsnippet
|
||||
|
||||
snippet font "font-style: normal:italic:oblique (font)"
|
||||
font-style: ${1:normal/italic/oblique};$0
|
||||
endsnippet
|
||||
|
||||
snippet font "font-variant: normal:small-caps (font)"
|
||||
font-variant: ${1:normal/small-caps};$0
|
||||
endsnippet
|
||||
|
||||
snippet font "font-weight: weight (font)"
|
||||
font-weight: ${1:normal/bold};$0
|
||||
endsnippet
|
||||
|
||||
snippet font "font: style variant weight size:line-height font -family (font)"
|
||||
font: ${1:normal/italic/oblique} ${2:normal/small-caps} ${3:normal/bold} ${4:1em/1.5em} ${5:Arial}, ${6:sans-}serif;$0
|
||||
endsnippet
|
||||
|
||||
snippet font "font: size font (font)"
|
||||
font: ${1:75%} ${2:"Lucida Grande", "Trebuchet MS", Verdana,} ${3:sans-}serif;$0
|
||||
endsnippet
|
||||
|
||||
snippet letter "letter-spacing: length-em (letter)"
|
||||
letter-spacing: $1em;$0
|
||||
endsnippet
|
||||
|
||||
snippet letter "letter-spacing: length-px (letter)"
|
||||
letter-spacing: $1px;$0
|
||||
endsnippet
|
||||
|
||||
snippet list "list-style-image: url (list)"
|
||||
list-style-image: url($1);$0
|
||||
endsnippet
|
||||
|
||||
snippet list "list-style-position: pos (list)"
|
||||
list-style-position: ${1:inside/outside};$0
|
||||
endsnippet
|
||||
|
||||
snippet list "list-style-type: asian (list)"
|
||||
list-style-type: ${1:cjk-ideographic/hiragana/katakana/hiragana-iroha/katakana-iroha};$0
|
||||
endsnippet
|
||||
|
||||
snippet list "list-style-type: marker(list)"
|
||||
list-style-type: ${1:none/disc/circle/square};$0
|
||||
endsnippet
|
||||
|
||||
snippet list "list-style-type: numeric (list)"
|
||||
list-style-type: ${1:decimal/decimal-leading-zero/zero};$0
|
||||
endsnippet
|
||||
|
||||
snippet list "list-style-type: other (list)"
|
||||
list-style-type: ${1:hebrew/armenian/georgian};$0
|
||||
endsnippet
|
||||
|
||||
snippet list "list-style-type: roman-alpha-greek (list)"
|
||||
list-style-type: ${1:lower-roman/upper-roman/lower-alpha/upper-alpha/lower-greek/lower-latin/upper-latin};$0
|
||||
endsnippet
|
||||
|
||||
snippet list "list-style: type position image (list)"
|
||||
list-style: ${1:none/disc/circle/square/decimal/zero} ${2:inside/outside} url($3);$0
|
||||
endsnippet
|
||||
|
||||
snippet margin "margin-bottom: length (margin)"
|
||||
margin-bottom: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet margin "margin-left: length (margin)"
|
||||
margin-left: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet margin "margin-right: length (margin)"
|
||||
margin-right: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet margin "margin-top: length (margin)"
|
||||
margin-top: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet margin "margin: all (margin)"
|
||||
margin: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet margin "margin: T R B L (margin)"
|
||||
margin: ${1:20px} ${2:0px} ${3:40px} ${4:0px};$0
|
||||
endsnippet
|
||||
|
||||
snippet margin "margin: V H (margin)"
|
||||
margin: ${1:20px} ${2:0px};$0
|
||||
endsnippet
|
||||
|
||||
snippet marker "marker-offset: auto (marker)"
|
||||
marker-offset: auto;$0
|
||||
endsnippet
|
||||
|
||||
snippet marker "marker-offset: length (marker)"
|
||||
marker-offset: ${1:10px};$0
|
||||
endsnippet
|
||||
|
||||
snippet overflow "overflow: type (overflow)"
|
||||
overflow: ${1:visible/hidden/scroll/auto};$0
|
||||
endsnippet
|
||||
|
||||
snippet padding "padding-bottom: length (margin)"
|
||||
padding-bottom: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet padding "padding-left: length (margin)"
|
||||
padding-left: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet padding "padding-right: length (margin)"
|
||||
padding-right: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet padding "padding-top: length (margin)"
|
||||
padding-top: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet padding "padding: T R B L (padding)"
|
||||
padding: ${1:20px} ${2:0px} ${3:40px} ${4:0px};$0
|
||||
endsnippet
|
||||
|
||||
snippet padding "padding: V H (padding)"
|
||||
padding: ${1:20px} ${2:0px};$0
|
||||
endsnippet
|
||||
|
||||
snippet padding "padding: all (padding)"
|
||||
padding: ${1:20px};$0
|
||||
endsnippet
|
||||
|
||||
snippet position "position: type (position)"
|
||||
position: ${1:static/relative/absolute/fixed};$0
|
||||
endsnippet
|
||||
|
||||
snippet { "properties { } ( } )"
|
||||
{
|
||||
/* $1 */
|
||||
$0
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet scrollbar "scrollbar"
|
||||
scrollbar-base-color: ${1:#CCCCCC};${2:
|
||||
scrollbar-arrow-color: ${3:#000000};
|
||||
scrollbar-track-color: ${4:#999999};
|
||||
scrollbar-3dlight-color: ${5:#EEEEEE};
|
||||
scrollbar-highlight-color: ${6:#FFFFFF};
|
||||
scrollbar-face-color: ${7:#CCCCCC};
|
||||
scrollbar-shadow-color: ${9:#999999};
|
||||
scrollbar-darkshadow-color: ${8:#666666};}
|
||||
endsnippet
|
||||
|
||||
snippet selection "selection"
|
||||
$1::-moz-selection,
|
||||
$1::selection {
|
||||
color: ${2:inherit};
|
||||
background: ${3:inherit};
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet text "text-align: left:center:right (txt)"
|
||||
text-align: ${1:left/right/center/justify};$0
|
||||
endsnippet
|
||||
|
||||
snippet text "text-decoration: none:underline:overline:line-through:blink (text)"
|
||||
text-decoration: ${1:none/underline/overline/line-through/blink};$0
|
||||
endsnippet
|
||||
|
||||
snippet text "text-indent: length (text)"
|
||||
text-indent: ${1:10}px;$0
|
||||
endsnippet
|
||||
|
||||
snippet text "text-shadow: color-hex x y blur (text)"
|
||||
text-shadow: #${1:DDD} ${2:10px} ${3:10px} ${4:2px};$0
|
||||
endsnippet
|
||||
|
||||
snippet text "text-shadow: color-rgb x y blur (text)"
|
||||
text-shadow: rgb(${1:255},${2:255},${3:255}) ${4:10px} ${5:10px} ${6:2px};$0
|
||||
endsnippet
|
||||
|
||||
snippet text "text-shadow: none (text)"
|
||||
text-shadow: none;$0
|
||||
endsnippet
|
||||
|
||||
snippet text "text-transform: capitalize:upper:lower (text)"
|
||||
text-transform: ${1:capitalize/uppercase/lowercase};$0
|
||||
endsnippet
|
||||
|
||||
snippet text "text-transform: none (text)"
|
||||
text-transform: none;$0
|
||||
endsnippet
|
||||
|
||||
snippet vertical "vertical-align: type (vertical)"
|
||||
vertical-align: ${1:baseline/sub/super/top/text-top/middle/bottom/text-bottom/length/%};$0
|
||||
endsnippet
|
||||
|
||||
snippet visibility "visibility: type (visibility)"
|
||||
visibility: ${1:visible/hidden/collapse};$0
|
||||
endsnippet
|
||||
|
||||
snippet white "white-space: normal:pre:nowrap (white)"
|
||||
white-space: ${1:normal/pre/nowrap};$0
|
||||
endsnippet
|
||||
|
||||
snippet word "word-spacing: length (word)"
|
||||
word-spacing: ${1:10px};$0
|
||||
endsnippet
|
||||
|
||||
snippet word "word-spacing: normal (word)"
|
||||
word-spacing: normal;$0
|
||||
endsnippet
|
||||
|
||||
snippet z "z-index: index (z)"
|
||||
z-index: $1;$0
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,584 @@
|
||||
# Simple shortcuts
|
||||
|
||||
priority -50
|
||||
|
||||
snippet imp "import (imp)" b
|
||||
import ${1:std.stdio};
|
||||
endsnippet
|
||||
|
||||
snippet pimp "public import (pimp)" b
|
||||
public import ${1:/*module*/};
|
||||
endsnippet
|
||||
|
||||
snippet over "override (over)" b
|
||||
override ${1:/*function*/}
|
||||
endsnippet
|
||||
|
||||
snippet al "alias (al)"
|
||||
alias ${1:/*orig*/} ${2:/*alias*/};
|
||||
endsnippet
|
||||
|
||||
snippet mixin "mixin (mixin)" b
|
||||
mixin ${1:/*mixed_in*/} ${2:/*name*/};
|
||||
endsnippet
|
||||
|
||||
snippet new "new (new)"
|
||||
new ${1}(${2});
|
||||
endsnippet
|
||||
|
||||
snippet scpn "@safe const pure nothrow (scpn)"
|
||||
@safe const pure nothrow
|
||||
endsnippet
|
||||
|
||||
snippet spn "@safe pure nothrow (spn)"
|
||||
@safe pure nothrow
|
||||
endsnippet
|
||||
|
||||
snippet cont "continue (cont)"
|
||||
continue;
|
||||
endsnippet
|
||||
|
||||
snippet dis "@disable (dis)" b
|
||||
@disable ${1:/*method*/};
|
||||
endsnippet
|
||||
|
||||
snippet pub "public (pub)" b
|
||||
public:
|
||||
${1:/*members*/}
|
||||
endsnippet
|
||||
|
||||
snippet priv "private (priv)" b
|
||||
private:
|
||||
${1:/*members*/}
|
||||
endsnippet
|
||||
|
||||
snippet prot "protected (prot)" b
|
||||
protected:
|
||||
${1:/*members*/}
|
||||
endsnippet
|
||||
|
||||
snippet pack "package (pack)" b
|
||||
package:
|
||||
${1:/*members*/}
|
||||
endsnippet
|
||||
|
||||
snippet ret "return (ret)"
|
||||
return ${1:/*value to return*/};
|
||||
endsnippet
|
||||
|
||||
snippet auto "auto (auto)" b
|
||||
auto ${1:/*variable*/} = ${2:/*value*/};
|
||||
endsnippet
|
||||
|
||||
snippet con "const (con)" b
|
||||
const ${1:/*variable*/} = ${2:/*value*/};
|
||||
endsnippet
|
||||
|
||||
snippet siz "size_t (siz)" b
|
||||
size_t ${1:/*variable*/} = ${2:/*value*/};
|
||||
endsnippet
|
||||
|
||||
snippet sup "super (sup)" b
|
||||
super(${1:/*args*/});
|
||||
endsnippet
|
||||
|
||||
# Phobos
|
||||
|
||||
snippet tup "tuple (tup)"
|
||||
tuple(${1:/*args*/})
|
||||
endsnippet
|
||||
|
||||
snippet wr "writeln (wr)"
|
||||
writeln(${1:/*args*/});
|
||||
endsnippet
|
||||
|
||||
snippet to "to (to)"
|
||||
to!(${1:/*type*/})(${2:/*arg*/})
|
||||
endsnippet
|
||||
|
||||
snippet enf "enforce (enf)" b
|
||||
enforce(${1:/*condition*/},
|
||||
new ${2}Exception(${3:/*args*/}));
|
||||
endsnippet
|
||||
|
||||
# Branches
|
||||
|
||||
snippet if "if .. (if)"
|
||||
if(${1:/*condition*/})
|
||||
{
|
||||
${VISUAL}${0:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet ife "if .. else (ife)" b
|
||||
if(${1:/*condition*/})
|
||||
{
|
||||
${2:/*code*/}
|
||||
}
|
||||
else
|
||||
{
|
||||
${3:/*else*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet el "else (el)" b
|
||||
else
|
||||
{
|
||||
${VISUAL}${1:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet elif "else if (elif)" b
|
||||
else if(${1:/*condition*/})
|
||||
{
|
||||
${VISUAL}${0:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet sw "switch (sw)"
|
||||
switch(${1:/*var*/})
|
||||
{
|
||||
case ${2:/*value*/}:
|
||||
${3:/*code*/}
|
||||
break;
|
||||
case ${4:/*value*/}:
|
||||
${5:/*code*/}
|
||||
break;
|
||||
${7:/*more cases*/}
|
||||
default:
|
||||
${6:assert(false);}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet fsw "final switch (fsw)"
|
||||
switch(${1:/*var*/})
|
||||
{
|
||||
case ${2:/*value*/}:
|
||||
${3:/*code*/}
|
||||
break;
|
||||
case ${4:/*value*/}:
|
||||
${5:/*code*/}
|
||||
break;
|
||||
${7:/*more cases*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet case "case (case)" b
|
||||
case ${1:/*value*/}:
|
||||
${2:/*code*/}
|
||||
break;
|
||||
endsnippet
|
||||
|
||||
snippet ?: "ternary operator (?:)"
|
||||
${1:/*condition*/} ? ${2:/*then*/} : ${3:/*else*/}$4
|
||||
endsnippet
|
||||
|
||||
# Loops
|
||||
|
||||
snippet do "do while (do)" b
|
||||
do
|
||||
{
|
||||
${VISUAL}${2:/*code*/}
|
||||
} while(${1:/*condition*/});
|
||||
endsnippet
|
||||
|
||||
snippet wh "while (wh)" b
|
||||
while(${1:/*condition*/})
|
||||
{
|
||||
${VISUAL}${2:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet for "for (for)" b
|
||||
for (${4:size_t} ${2:i} = 0; $2 < ${1:count}; ${3:++$2})
|
||||
{
|
||||
${VISUAL}${0:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet forever "forever (forever)" b
|
||||
for(;;)
|
||||
{
|
||||
${VISUAL}${0:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet fore "foreach (fore)"
|
||||
foreach(${1:/*elem*/}; ${2:/*range*/})
|
||||
{
|
||||
${VISUAL}${3:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet forif "foreach if (forif)" b
|
||||
foreach(${1:/*elem*/}; ${2:/*range*/}) if(${3:/*condition*/})
|
||||
{
|
||||
${VISUAL}${4:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# Contracts
|
||||
snippet in "in contract (in)" b
|
||||
in
|
||||
{
|
||||
assert(${1:/*condition*/}, "${2:error message}");
|
||||
${3}
|
||||
}
|
||||
body
|
||||
endsnippet
|
||||
|
||||
snippet out "out contract (out)" b
|
||||
out${1:(result)}
|
||||
{
|
||||
assert(${2:/*condition*/}, "${3:error message}");
|
||||
${4}
|
||||
}
|
||||
body
|
||||
endsnippet
|
||||
|
||||
snippet inv "invariant (inv)" b
|
||||
invariant()
|
||||
{
|
||||
assert(${1:/*condition*/}, "${2:error message}");
|
||||
${3}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# Functions (generic)
|
||||
|
||||
snippet fun "function definition (fun)"
|
||||
${1:void} ${2:/*function name*/}(${3:/*args*/}) ${4:@safe pure nothrow}
|
||||
{
|
||||
${VISUAL}${5:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet void "void function definition (void)"
|
||||
void ${1:/*function name*/}(${2:/*args*/}) ${3:@safe pure nothrow}
|
||||
{
|
||||
${VISUAL}${4:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet this "ctor (this)" w
|
||||
this(${1:/*args*/})
|
||||
{
|
||||
${VISUAL}${2:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet get "getter property (get)"
|
||||
@property ${1:/*type*/} ${2:/*member_name*/}() const pure nothrow {return ${3:$2_};}
|
||||
endsnippet
|
||||
|
||||
snippet set "setter property (set)"
|
||||
@property void ${1:/*member_name*/}(${2:/*type*/} rhs) pure nothrow {${3:$1_} = rhs;}
|
||||
endsnippet
|
||||
|
||||
# Functions (concrete)
|
||||
|
||||
snippet main "Main" b
|
||||
void main(string[] args)
|
||||
{
|
||||
${VISUAL}${0: /*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# Mixins
|
||||
|
||||
snippet signal "signal (signal)" b
|
||||
mixin Signal!(${1:/*args*/}) ${2:/*name*/};
|
||||
endsnippet
|
||||
|
||||
# Scope
|
||||
|
||||
snippet scope "scope (scope)" b
|
||||
scope(${1:exit})
|
||||
{
|
||||
${VISUAL}${2:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# With
|
||||
|
||||
snippet with "with (with)"
|
||||
with(${1})
|
||||
{
|
||||
${VISUAL}${2:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# Exception handling
|
||||
|
||||
snippet try "try/catch (try)" b
|
||||
try
|
||||
{
|
||||
${VISUAL}${1:/*code to try*/}
|
||||
}
|
||||
catch(${2}Exception e)
|
||||
{
|
||||
${3:/*handle exception*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet tryf "try/catch/finally (tryf)" b
|
||||
try
|
||||
{
|
||||
${VISUAL}${1:/*code to try*/}
|
||||
}
|
||||
catch(${2}Exception e)
|
||||
{
|
||||
${3:/*handle exception*/}
|
||||
}
|
||||
finally
|
||||
{
|
||||
${4:/*cleanup*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet catch "catch (catch)" b
|
||||
catch(${1}Exception e)
|
||||
{
|
||||
${2:/*handle exception*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet thr "throw (thr)"
|
||||
throw new ${1}Exception("${2}");
|
||||
endsnippet
|
||||
|
||||
|
||||
# Type declarations
|
||||
|
||||
snippet struct "struct (struct)"
|
||||
struct ${1:`!p snip.rv = (snip.basename or "name")`}
|
||||
{
|
||||
${2}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet union "union (union)"
|
||||
union ${1:`!p snip.rv = (snip.basename or "name")`}
|
||||
{
|
||||
${2}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet class "class (class)"
|
||||
class ${1:`!p snip.rv = (snip.basename or "name")`}
|
||||
{
|
||||
${2}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet inter "interface (inter)"
|
||||
interface ${1:`!p snip.rv = (snip.basename or "name")`}
|
||||
{
|
||||
${2}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet enum "enum (enum)"
|
||||
enum ${1:`!p snip.rv = (snip.basename or "name")`}
|
||||
{
|
||||
${2}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
# Exception declarations
|
||||
|
||||
snippet exc "exception declaration (exc)" b
|
||||
/// ${3:/*documentation*/}
|
||||
class ${1}Exception : ${2}Exception
|
||||
{
|
||||
public this(string msg, string file = __FILE__, int line = __LINE__)
|
||||
{
|
||||
super(msg, file, line);
|
||||
}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
# Conditional compilation
|
||||
|
||||
snippet version "version (version)" b
|
||||
version(${1:/*version name*/})
|
||||
{
|
||||
${VISUAL}${2:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet debug "debug" b
|
||||
debug
|
||||
{
|
||||
${VISUAL}${1:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
# Templates
|
||||
|
||||
snippet temp "template (temp)" b
|
||||
template ${2:/*name*/}(${1:/*args*/})
|
||||
{
|
||||
${3:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
# Asserts
|
||||
|
||||
snippet ass "assert (ass)" b
|
||||
assert(${1:false}, "${2:TODO}");
|
||||
|
||||
endsnippet
|
||||
|
||||
|
||||
# Unittests
|
||||
|
||||
snippet unittest "unittest (unittest)" b
|
||||
unittest
|
||||
{
|
||||
${1:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
# Common member functions
|
||||
|
||||
snippet opDis "opDispatch (opDis)" b
|
||||
${1:/*return type*/} opDispatch(string s)()
|
||||
{
|
||||
${2:/*code*/};
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet op= "opAssign (op=)" b
|
||||
void opAssign(${1} rhs) ${2:@safe pure nothrow}
|
||||
{
|
||||
${2:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet opCmp "opCmp (opCmp)" b
|
||||
int opCmp(${1} rhs) @safe const pure nothrow
|
||||
{
|
||||
${2:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet opApply "opApply (opApply)" b
|
||||
int opApply(int delegate(ref ${1:/*iterated type/s*/}) dg)
|
||||
{
|
||||
int result = 0;
|
||||
${2:/*loop*/}
|
||||
{
|
||||
result = dg(${3:/*arg/s*/});
|
||||
if(result){break;}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet toString "toString (toString)" b
|
||||
string toString() @safe const pure nothrow
|
||||
{
|
||||
${1:/*code*/}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
|
||||
# Comments
|
||||
|
||||
|
||||
snippet todo "TODO (todo)"
|
||||
// TODO: ${1}
|
||||
endsnippet
|
||||
|
||||
|
||||
# DDoc
|
||||
|
||||
snippet doc "generic ddoc block (doc)" b
|
||||
/// ${1:description}
|
||||
///
|
||||
/// ${2:details}
|
||||
endsnippet
|
||||
|
||||
snippet fdoc "function ddoc block (fdoc)" b
|
||||
/// ${1:description}
|
||||
///
|
||||
/// ${2:Params: ${3:param} = ${4:param description}
|
||||
/// ${5}}
|
||||
///
|
||||
/// ${6:Returns: ${7:return value}}
|
||||
///
|
||||
/// ${8:Throws: ${9}Exception ${10}}
|
||||
endsnippet
|
||||
|
||||
snippet Par "Params (Par)"
|
||||
Params: ${1:param} = ${2:param description}
|
||||
/// ${3}
|
||||
endsnippet
|
||||
|
||||
snippet Ret "Returns (Ret)"
|
||||
Returns: ${1:return value/s}
|
||||
endsnippet
|
||||
|
||||
snippet Thr "Throws (Thr)"
|
||||
Throws: ${1}Exception ${2}
|
||||
endsnippet
|
||||
|
||||
snippet Example "Examples (Example)"
|
||||
Examples:
|
||||
/// --------------------
|
||||
/// ${1:example code}
|
||||
/// --------------------
|
||||
endsnippet
|
||||
|
||||
|
||||
# License blocks
|
||||
|
||||
snippet gpl "GPL (gpl)" b
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
//
|
||||
// Copyright (C) ${1:Author}, `!v strftime("%Y")`
|
||||
|
||||
${2}
|
||||
endsnippet
|
||||
|
||||
snippet boost "Boost (boost)" b
|
||||
// Copyright ${1:Author} `!v strftime("%Y")`.
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
${2}
|
||||
endsnippet
|
||||
|
||||
|
||||
# New module
|
||||
|
||||
snippet module "New module (module)" b
|
||||
// Copyright ${1:Author} `!v strftime("%Y")`.
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
module ${2}.`!v Filename('$1', 'name')`;
|
||||
|
||||
|
||||
${3}
|
||||
endsnippet
|
@ -0,0 +1,238 @@
|
||||
priority -50
|
||||
|
||||
# Generic Tags
|
||||
snippet %
|
||||
{% ${1} %}${2}
|
||||
endsnippet
|
||||
|
||||
snippet %%
|
||||
{% ${1:tag_name} %}
|
||||
${2}
|
||||
{% end$1 %}
|
||||
endsnippet
|
||||
|
||||
snippet {
|
||||
{{ ${1} }}${2}
|
||||
endsnippet
|
||||
|
||||
# Template Tags
|
||||
|
||||
snippet autoescape
|
||||
{% autoescape ${1:off} %}
|
||||
${2}
|
||||
{% endautoescape %}
|
||||
endsnippet
|
||||
|
||||
snippet block
|
||||
{% block ${1} %}
|
||||
${2}
|
||||
{% endblock $1 %}
|
||||
endsnippet
|
||||
|
||||
snippet #
|
||||
{# ${1:comment} #}
|
||||
endsnippet
|
||||
|
||||
snippet comment
|
||||
{% comment %}
|
||||
${1}
|
||||
{% endcomment %}
|
||||
endsnippet
|
||||
|
||||
snippet cycle
|
||||
{% cycle ${1:val1} ${2:val2} ${3:as ${4}} %}
|
||||
endsnippet
|
||||
|
||||
snippet debug
|
||||
{% debug %}
|
||||
endsnippet
|
||||
|
||||
snippet extends
|
||||
{% extends "${1:base.html}" %}
|
||||
endsnippet
|
||||
|
||||
snippet filter
|
||||
{% filter ${1} %}
|
||||
${2}
|
||||
{% endfilter %}
|
||||
endsnippet
|
||||
|
||||
snippet firstof
|
||||
{% firstof ${1} %}
|
||||
endsnippet
|
||||
|
||||
snippet for
|
||||
{% for ${1} in ${2} %}
|
||||
${3}
|
||||
{% endfor %}
|
||||
endsnippet
|
||||
|
||||
snippet empty
|
||||
{% empty %}
|
||||
${1}
|
||||
endsnippet
|
||||
|
||||
snippet if
|
||||
{% if ${1} %}
|
||||
${2}
|
||||
{% endif %}
|
||||
endsnippet
|
||||
|
||||
snippet else
|
||||
{% else %}
|
||||
${1}
|
||||
endsnippet
|
||||
|
||||
snippet ifchanged
|
||||
{% ifchanged %}${1}{% endifchanged %}
|
||||
endsnippet
|
||||
|
||||
snippet ifequal
|
||||
{% ifequal ${1} ${2} %}
|
||||
${3}
|
||||
{% endifequal %}
|
||||
endsnippet
|
||||
|
||||
snippet ifnotequal
|
||||
{% ifnotequal ${1} ${2} %}
|
||||
${3}
|
||||
{% endifnotequal %}
|
||||
endsnippet
|
||||
|
||||
snippet include
|
||||
{% include "${1}" %}
|
||||
endsnippet
|
||||
|
||||
snippet load
|
||||
{% load ${1} %}
|
||||
endsnippet
|
||||
|
||||
snippet now
|
||||
{% now "${1:jS F Y H:i}" %}
|
||||
endsnippet
|
||||
|
||||
snippet regroup
|
||||
{% regroup ${1} by ${2} as ${3} %}
|
||||
endsnippet
|
||||
|
||||
snippet spaceless
|
||||
{% spaceless %}${1}{% endspaceless %}
|
||||
endsnippet
|
||||
|
||||
snippet ssi
|
||||
{% ssi ${1} %}
|
||||
endsnippet
|
||||
|
||||
snippet trans
|
||||
{% trans "${1:string}" %}
|
||||
endsnippet
|
||||
|
||||
snippet url
|
||||
{% url ${1} as ${2} %}
|
||||
endsnippet
|
||||
|
||||
snippet widthratio
|
||||
{% widthratio ${1:this_value} ${2:max_value} ${3:100} %}
|
||||
endsnippet
|
||||
|
||||
snippet with
|
||||
{% with ${1} as ${2} %}
|
||||
endsnippet
|
||||
|
||||
# Template Filters
|
||||
|
||||
# Note: Since SnipMate can't determine which template filter you are
|
||||
# expanding without the "|" character, these do not add the "|"
|
||||
# character. These save a few keystrokes still.
|
||||
|
||||
# Note: Template tags that take no arguments are not implemented.
|
||||
|
||||
snippet add
|
||||
add:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet center
|
||||
center:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet cut
|
||||
cut:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet date
|
||||
date:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet default
|
||||
default:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet defaultifnone
|
||||
default_if_none:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet dictsort
|
||||
dictsort:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet dictsortrev
|
||||
dictsortreversed:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet divisibleby
|
||||
divisibleby:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet floatformat
|
||||
floatformat:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet getdigit
|
||||
get_digit:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet join
|
||||
join:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet lengthis
|
||||
length_is:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet pluralize
|
||||
pluralize:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet removetags
|
||||
removetags:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet slice
|
||||
slice:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet stringformat
|
||||
stringformat:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet time
|
||||
time:"${1}"
|
||||
endsnippet
|
||||
|
||||
snippet truncatewords
|
||||
truncatewords:${1}
|
||||
endsnippet
|
||||
|
||||
snippet truncatewordshtml
|
||||
truncatewords_html:${1}
|
||||
endsnippet
|
||||
|
||||
snippet urlizetrunc
|
||||
urlizetrunc:${1}
|
||||
endsnippet
|
||||
|
||||
snippet wordwrap
|
||||
wordwrap:${1}
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,100 @@
|
||||
###########################################################################
|
||||
# TEXTMATE SNIPPETS #
|
||||
###########################################################################
|
||||
|
||||
priority -50
|
||||
|
||||
snippet pat "Case:Receive:Try Clause"
|
||||
${1:pattern}${2: when ${3:guard}} ->;
|
||||
${4:body}
|
||||
endsnippet
|
||||
|
||||
snippet beh "Behaviour Directive"
|
||||
-behaviour (${1:behaviour}).
|
||||
endsnippet
|
||||
|
||||
snippet case "Case Expression"
|
||||
case ${1:expression} of
|
||||
${2:pattern}${3: when ${4:guard}} ->
|
||||
${5:body}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet def "Define Directive"
|
||||
-define (${1:macro}${2: (${3:param})}, ${4:body}).
|
||||
endsnippet
|
||||
|
||||
snippet exp "Export Directive"
|
||||
-export ([${1:function}/${2:arity}]).
|
||||
endsnippet
|
||||
|
||||
snippet fun "Fun Expression"
|
||||
fun
|
||||
(${1:pattern})${2: when ${3:guard}} ->
|
||||
${4:body}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet fu "Function"
|
||||
${1:function} (${2:param})${3: when ${4:guard}} ->
|
||||
${5:body}
|
||||
endsnippet
|
||||
|
||||
snippet if "If Expression"
|
||||
if
|
||||
${1:guard} ->
|
||||
${2:body}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet ifdef "Ifdef Directive"
|
||||
-ifdef (${1:macro}).
|
||||
endsnippet
|
||||
|
||||
snippet ifndef "Ifndef Directive"
|
||||
-ifndef (${1:macro}).
|
||||
endsnippet
|
||||
|
||||
snippet imp "Import Directive"
|
||||
-import (${1:module}, [${2:function}/${3:arity}]).
|
||||
endsnippet
|
||||
|
||||
snippet inc "Include Directive"
|
||||
-include ("${1:file}").
|
||||
endsnippet
|
||||
|
||||
snippet mod "Module Directive"
|
||||
-module (${1:`!p snip.rv = snip.basename or "module"`}).
|
||||
endsnippet
|
||||
|
||||
snippet rcv "Receive Expression"
|
||||
receive
|
||||
${1: ${2:pattern}${3: when ${4:guard}} ->
|
||||
${5:body}}
|
||||
${6:after
|
||||
${7:expression} ->
|
||||
${8:body}}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet rec "Record Directive"
|
||||
-record (${1:record}, {${2:field}${3: = ${4:value}}}).
|
||||
endsnippet
|
||||
|
||||
snippet try "Try Expression"
|
||||
try${1: ${2:expression}${3: of
|
||||
${4:pattern}${5: when ${6:guard}} ->
|
||||
${7:body}}}
|
||||
${8:catch
|
||||
${9:pattern}${10: when ${11:guard}} ->
|
||||
${12:body}}
|
||||
${13:after
|
||||
${14:body}}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet undef "Undef Directive"
|
||||
-undef (${1:macro}).
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,280 @@
|
||||
priority -50
|
||||
|
||||
# TextMate added these variables to cope with changes in ERB handling
|
||||
# in different versions of Rails -- for instance, Rails 3 automatically
|
||||
# strips whitespace so that it's no longer necessary to use a form like
|
||||
# <% end -%>, but if you're still maintaining Rails 2 projects, you
|
||||
# can't omit the minus sign and get the same behavior.
|
||||
#
|
||||
# The following regex replace substitutes the function below for the
|
||||
# TextMate variable references after the snippets are converted:
|
||||
#
|
||||
# /\v\$\{(TM_RAILS_TEMPLATE_([^_]+)_RUBY_([^_\s]+))\}/`!p textmate_var('\1', snip)`/g
|
||||
#
|
||||
global !p
|
||||
def textmate_var(var, snip):
|
||||
lookup = dict(
|
||||
TM_RAILS_TEMPLATE_START_RUBY_EXPR = snip.opt('g:tm_rails_template_start_ruby_expr', '<%= '),
|
||||
TM_RAILS_TEMPLATE_END_RUBY_EXPR = snip.opt('g:tm_rails_template_end_ruby_expr', ' %>'),
|
||||
TM_RAILS_TEMPLATE_START_RUBY_INLINE = snip.opt('g:tm_rails_template_start_ruby_inline', '<% '),
|
||||
TM_RAILS_TEMPLATE_END_RUBY_INLINE = snip.opt('g:tm_rails_template_end_ruby_inline', ' %>'),
|
||||
TM_RAILS_TEMPLATE_END_RUBY_BLOCK = '<% end %>'
|
||||
)
|
||||
snip.rv = lookup[var]
|
||||
return
|
||||
endglobal
|
||||
|
||||
|
||||
###########################################################################
|
||||
# GENERATED FROM get_tm_snippets.py + REGEX REPLACE #
|
||||
###########################################################################
|
||||
|
||||
snippet fi "<%= Fixtures.identify(:symbol) %>"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`Fixtures.identify(:${1:name})`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`$0
|
||||
endsnippet
|
||||
|
||||
snippet ft "form_tag"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`form_tag(${1::action => "${5:update}"}${6:, {:${8:class} => "${9:form}"\}}) do`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
$0
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet end "end (ERB)"
|
||||
<% end -%>
|
||||
endsnippet
|
||||
|
||||
snippet for "for loop (ERB)"
|
||||
<% if !${1:list}.blank? %>
|
||||
<% for ${2:item} in ${1} %>
|
||||
$3
|
||||
<% end %>
|
||||
<% else %>
|
||||
$4
|
||||
<% end %>
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet ffcb "form_for check_box"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.check_box :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ffff "form_for file_field 2"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.file_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ffhf "form_for hidden_field 2"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.hidden_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ffl "form_for label 2"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.label :${1:attribute}${2:, "${3:${1/[[:alpha:]]+|(_)/(?1: :\u$0)/g}}"}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ffpf "form_for password_field 2"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.password_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ffrb "form_for radio_box 2"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.radio_box :${1:attribute}, :${2:tag_value}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ffs "form_for submit 2"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.submit "${1:Submit}"${2:, :disable_with => '${3:$1ing...}'}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ffta "form_for text_area 2"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.text_area :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet fftf "form_for text_field 2"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.text_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet fields "fields_for"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`fields_for :${1:model}, @${2:$1} do |$1|`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_INLINE', snip)`
|
||||
$0
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f_fields_for (nff)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_INLINE', snip)`f.fields_for :${1:attribute} do |${2:f}|`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_INLINE', snip)`
|
||||
$0
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.checkbox"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.check_box :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.file_field"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.file_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.hidden_field"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.hidden_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.label"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.label :${1:attribute}${2:, "${3:${1/[[:alpha:]]+|(_)/(?1: :\u$0)/g}}"}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.password_field"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.password_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.radio_box"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.radio_box :${1:attribute}, :${2:tag_value}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.submit"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.submit "${1:Submit}"${2:, :disable_with => '${3:$1ing...}'}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.text_area"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.text_area :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet f. "f.text_field"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`f.text_field :${1:attribute}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ffe "form_for with errors"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`error_messages_for :${1:model}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`form_for @${2:$1} do |f|`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
$0
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ff "form_for"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`form_for @${1:model} do |f|`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
$0
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_BLOCK', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet ist "image_submit_tag"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`image_submit_tag("${1:agree.png}"${2:${3:, :id => "${4:${1/^(\w+)(\.\w*)?$/$1/}}"}${5:, :name => "${6:${1/^(\w+)(\.\w*)?$/$1/}}"}${7:, :class => "${8:${1/^(\w+)(\.\w*)?$/$1/}-button}"}${9:, :disabled => ${10:false}}})`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet it "image_tag"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`image_tag "$1${2:.png}"${3:${4:, :title => "${5:title}"}${6:, :class => "${7:class}"}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet layout "layout"
|
||||
layout "${1:template_name}"${2:${3:, :only => ${4:[:${5:action}, :${6:action}]}}${7:, :except => ${8:[:${9:action}, :${10:action}]}}}
|
||||
endsnippet
|
||||
|
||||
snippet jit "javascript_include_tag"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`javascript_include_tag ${1::all}${2:, :cache => ${3:true}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet lia "link_to (action)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :action => "${2:index}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet liai "link_to (action, id)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :action => "${2:edit}", :id => ${3:@item}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet lic "link_to (controller)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet lica "link_to (controller, action)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}", :action => "${3:index}"`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet licai "link_to (controller, action, id)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to "${1:link text...}", :controller => "${2:items}", :action => "${3:edit}", :id => ${4:@item}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet linpp "link_to (nested path plural)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${10:parent}_${11:child}_path(${12:@}${13:${10}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet linp "link_to (nested path)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet lipp "link_to (path plural)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${4:model}s_path}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet lip "link_to (path)"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:"${2:link text...}"}, ${3:${12:model}_path(${13:@}${14:${12}})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet lim "link_to model"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to ${1:model}.${2:name}, ${3:${4:$1}_path(${14:$1})}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet hide "page.hide (*ids)"
|
||||
page.hide ${1:"${2:id(s)}"}
|
||||
endsnippet
|
||||
|
||||
snippet ins "page.insert_html (position, id, partial)"
|
||||
page.insert_html :${1:top}, ${2:"${3:id}"}, :${4:partial => "${5:template}"}
|
||||
endsnippet
|
||||
|
||||
snippet rep "page.replace (id, partial)"
|
||||
page.replace ${1:"${2:id}"}, :${3:partial => "${4:template}"}
|
||||
endsnippet
|
||||
|
||||
snippet reph "page.replace_html (id, partial)"
|
||||
page.replace_html ${1:"${2:id}"}, :${3:partial => "${4:template}"}
|
||||
endsnippet
|
||||
|
||||
snippet show "page.show (*ids)"
|
||||
page.show ${1:"${2:id(s)}"}
|
||||
endsnippet
|
||||
|
||||
snippet tog "page.toggle (*ids)"
|
||||
page.toggle ${1:"${2:id(s)}"}
|
||||
endsnippet
|
||||
|
||||
snippet vis "page.visual_effect (effect, id)"
|
||||
page.visual_effect :${1:toggle_slide}, ${2:"${3:DOM ID}"}
|
||||
endsnippet
|
||||
|
||||
snippet rp "render (partial) (rp)"
|
||||
render :partial => "${1:item}"
|
||||
endsnippet
|
||||
|
||||
snippet rpc "render (partial,collection) (rpc)"
|
||||
render :partial => "${1:item}", :collection => ${2:@$1s}
|
||||
endsnippet
|
||||
|
||||
snippet rpl "render (partial,locals) (rpl)"
|
||||
render :partial => "${1:item}", :locals => { :${2:$1} => ${3:@$1}$0 }
|
||||
endsnippet
|
||||
|
||||
snippet rpo "render (partial,object) (rpo)"
|
||||
render :partial => "${1:item}", :object => ${2:@$1}
|
||||
endsnippet
|
||||
|
||||
snippet rps "render (partial,status) (rps)"
|
||||
render :partial => "${1:item}", :status => ${2:500}
|
||||
endsnippet
|
||||
|
||||
snippet slt "stylesheet_link_tag"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`stylesheet_link_tag ${1::all}${2:, :cache => ${3:true}}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet st "submit_tag"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`submit_tag "${1:Save changes}"${2:, :id => "${3:submit}"}${4:, :name => "${5:$3}"}${6:, :class => "${7:form_$3}"}${8:, :disabled => ${9:false}}${10:, :disable_with => "${11:Please wait...}"}`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
snippet else "else (ERB)"
|
||||
<% else %>
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet if "if (ERB)"
|
||||
<% if ${1:condition} %>$0
|
||||
endsnippet
|
||||
|
||||
snippet lf "link_to_function"
|
||||
`!p textmate_var('TM_RAILS_TEMPLATE_START_RUBY_EXPR', snip)`link_to_function ${1:"${2:Greeting}"}, "${3:alert('Hello world!')}"$4`!p textmate_var('TM_RAILS_TEMPLATE_END_RUBY_EXPR', snip)`
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,131 @@
|
||||
# Snippets for Go
|
||||
|
||||
priority -50
|
||||
|
||||
# when to abbriviate and when not?
|
||||
# b doesn't work here, because it ignores whitespace
|
||||
# optional local name?
|
||||
snippet /^import/ "Import declaration" r
|
||||
import (
|
||||
"${1:package}"
|
||||
)
|
||||
endsnippet
|
||||
|
||||
snippet /^package/ "Package declaration" r
|
||||
// Package $1 provides ...
|
||||
package ${1:main}
|
||||
endsnippet
|
||||
|
||||
# Mostly converted from: https://github.com/AlanQuatermain/go-tmbundle
|
||||
snippet /^cons/ "Constants declaration" r
|
||||
const (
|
||||
${1:constant}${2/(.+)/ /}${2:type} = ${0:value}
|
||||
)
|
||||
endsnippet
|
||||
|
||||
snippet /^con/ "Constant declaration" r
|
||||
const ${1:name}${2/(.+)/ /}${2:type} = ${0:value}
|
||||
endsnippet
|
||||
|
||||
snippet iota "Iota constant generator" b
|
||||
const (
|
||||
${1:constant}${2/(.+)/ /}${2:type} = iota
|
||||
)
|
||||
endsnippet
|
||||
|
||||
snippet struct "Struct declaration" b
|
||||
type ${1:Struct} struct {
|
||||
${0:${VISUAL}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet interface "Interface declaration" b
|
||||
type ${1:Interface} interface {
|
||||
${0:${VISUAL}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# statements
|
||||
snippet for "For loop" b
|
||||
for ${1:condition}${1/(.+)/ /}{
|
||||
${0:${VISUAL}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet forr "For range loop" b
|
||||
for ${2:name} := range ${1:collection} {
|
||||
${0:${VISUAL}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet if "If statement" b
|
||||
if ${1:condition}${1/(.+)/ /}{
|
||||
${0:${VISUAL}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet switch "Switch statement" b
|
||||
switch ${1:expression}${1/(.+)/ /}{
|
||||
case${0}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet select "Select statement" b
|
||||
select {
|
||||
case${0}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet case "Case clause" b
|
||||
case ${1:condition}:
|
||||
${0:${VISUAL}}
|
||||
endsnippet
|
||||
|
||||
snippet default "Default clause" b
|
||||
default:
|
||||
${0:${VISUAL}}
|
||||
endsnippet
|
||||
|
||||
# functions
|
||||
snippet /^main/ "Main function" r
|
||||
func main() {
|
||||
${0:${VISUAL}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /^meth/ "Method" r
|
||||
func (${1:receiver} ${2:type}) ${3:name}(${4:params})${5/(.+)/ /}${5:type} {
|
||||
${0:${VISUAL}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet func "Function" b
|
||||
func ${1:name}(${2:params})${3/(.+)/ /}${3:type} {
|
||||
${0:${VISUAL}}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# types and variables
|
||||
snippet map "Map type" b
|
||||
map[${1:keytype}]${2:valtype}
|
||||
endsnippet
|
||||
|
||||
snippet : "Variable declaration :=" b
|
||||
${1:name} := ${0:value}
|
||||
endsnippet
|
||||
|
||||
snippet var "Variable declaration" b
|
||||
var ${1:name}${2/(.+)/ /}${2:type}${3: = ${0:value}}
|
||||
endsnippet
|
||||
|
||||
snippet vars "Variables declaration" b
|
||||
var (
|
||||
${1:name}${2/(.+)/ /}${2:type}${3: = ${0:value} }
|
||||
)
|
||||
endsnippet
|
||||
|
||||
snippet json "JSON field"
|
||||
\`json:"${1:displayName}"\`
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,63 @@
|
||||
priority -50
|
||||
|
||||
snippet if "if ... then ... else ..."
|
||||
if ${1:condition}
|
||||
then ${2:expression}
|
||||
else ${3:expression}
|
||||
endsnippet
|
||||
|
||||
snippet case "case ... of ..."
|
||||
case ${1:expression} of
|
||||
${2:pattern} -> ${3:expression}
|
||||
${4:pattern} -> ${5:expression}
|
||||
endsnippet
|
||||
|
||||
snippet :: "Type signature"
|
||||
${1:name} :: ${2:Type} -> ${3:Type}
|
||||
endsnippet
|
||||
|
||||
snippet => "Type constraint"
|
||||
(${1:Class} ${2:Type var}) => ${3:$2}
|
||||
endsnippet
|
||||
|
||||
snippet def "Function definition"
|
||||
${1:name} :: ${2:Type} -> ${3:Type}
|
||||
endsnippet
|
||||
|
||||
snippet def[] "Function definition for list patterns"
|
||||
${1:name} :: [${2:Type}] -> ${3:Type}
|
||||
$1 [] = ${4:undefined}
|
||||
$1 ${5:(x:xs)} = ${6:undefined}
|
||||
endsnippet
|
||||
|
||||
snippet = "Function clause"
|
||||
${1:name} ${2:pattern} = ${3:undefined}
|
||||
endsnippet
|
||||
|
||||
snippet 2= "Function clause"
|
||||
${1:name} ${2:pattern} = ${3:undefined}
|
||||
$1 ${4:pattern} = ${5:undefined}
|
||||
endsnippet
|
||||
|
||||
snippet 3= "Function clause"
|
||||
${1:name} ${2:pattern} = ${3:undefined}
|
||||
$1 ${4:pattern} = ${5:undefined}
|
||||
$1 ${6:pattern} = ${7:undefined}
|
||||
endsnippet
|
||||
|
||||
snippet | "Guard"
|
||||
| ${1:predicate} = ${2:undefined}
|
||||
endsnippet
|
||||
|
||||
snippet \ "Lambda expression"
|
||||
\ ${1:pattern} -> ${2:expression}
|
||||
endsnippet
|
||||
|
||||
snippet [|] "List comprehension"
|
||||
[${3:foo }$1 | ${1:x} <- ${2:xs} ]
|
||||
endsnippet
|
||||
|
||||
snippet let "let ... in ..."
|
||||
let ${1:name} = ${2:expression}
|
||||
in ${3:expression}
|
||||
endsnippet
|
@ -0,0 +1,32 @@
|
||||
# Snippets for VIM Help Files
|
||||
|
||||
priority -50
|
||||
|
||||
global !p
|
||||
def sec_title(snip, t):
|
||||
file_start = snip.fn.split('.')[0]
|
||||
sec_name = t[1].strip("1234567890. ").lower().replace(' ', '-')
|
||||
return ("*%s-%s*" % (file_start, sec_name)).rjust(78-len(t[1]))
|
||||
endglobal
|
||||
|
||||
snippet sec "Section marker" b
|
||||
==============================================================================
|
||||
${1:SECTION}`!p snip.rv = sec_title(snip, t)`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet ssec "Sub section marker" b
|
||||
${1:Subsection}`!p snip.rv = sec_title(snip, t)
|
||||
snip += "-"*len(t[1])`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet sssec "Subsub Section marker" b
|
||||
${1:SubSubsection}:`!p snip.rv = sec_title(snip, t)`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,302 @@
|
||||
priority -50
|
||||
|
||||
###########################################################################
|
||||
# TextMate Snippets #
|
||||
###########################################################################
|
||||
|
||||
global !p
|
||||
def x(snip):
|
||||
if snip.ft.startswith("x"):
|
||||
snip.rv = '/'
|
||||
else:
|
||||
snip.rv = ""
|
||||
endglobal
|
||||
|
||||
############
|
||||
# Doctypes #
|
||||
############
|
||||
snippet doctype "DocType XHTML 1.0 Strict" b
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet doctype "DocType XHTML 1.0 Transitional" b
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet doctype "DocType XHTML 1.1" b
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet doctype "HTML - 4.0 Transitional (doctype)" b
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
||||
"http://www.w3.org/TR/html4/loose.dtd">
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet doctype "HTML - 5.0 (doctype)" b
|
||||
<!DOCTYPE html>
|
||||
|
||||
endsnippet
|
||||
|
||||
#############
|
||||
# Shortcuts #
|
||||
#############
|
||||
snippet down "Down (down)"
|
||||
↓
|
||||
endsnippet
|
||||
|
||||
snippet enter "Enter (enter)"
|
||||
⌅
|
||||
endsnippet
|
||||
|
||||
snippet escape "Escape (escape)"
|
||||
⎋
|
||||
endsnippet
|
||||
|
||||
snippet shift "Shift (shift)"
|
||||
⇧
|
||||
endsnippet
|
||||
|
||||
snippet tab "Tab (tab)"
|
||||
⇥
|
||||
endsnippet
|
||||
|
||||
snippet up "Up (up)"
|
||||
↑
|
||||
endsnippet
|
||||
|
||||
snippet return "Return (return)"
|
||||
↩
|
||||
endsnippet
|
||||
|
||||
snippet right "Right (right)"
|
||||
→
|
||||
endsnippet
|
||||
|
||||
snippet left "Left (left)"
|
||||
←
|
||||
endsnippet
|
||||
|
||||
snippet option "Option (option)"
|
||||
⌥
|
||||
endsnippet
|
||||
|
||||
#######################
|
||||
# Conditional inserts #
|
||||
#######################
|
||||
snippet ! "IE Conditional Comment: Internet Explorer 5_0 only"
|
||||
<!--[if IE 5.0]>${1:IE Conditional Comment: Internet Explorer 5.0 only }<![endif]-->$0
|
||||
endsnippet
|
||||
|
||||
snippet ! "IE Conditional Comment: Internet Explorer 5_5 only"
|
||||
<!--[if IE 5.5000]>${1:IE Conditional Comment: Internet Explorer 5.5 only }<![endif]-->$0
|
||||
endsnippet
|
||||
|
||||
snippet ! "IE Conditional Comment: Internet Explorer 5_x"
|
||||
<!--[if lt IE 6]>${1:IE Conditional Comment: Internet Explorer 5.x }<![endif]-->$0
|
||||
endsnippet
|
||||
|
||||
snippet ! "IE Conditional Comment: Internet Explorer 6 and below"
|
||||
<!--[if lte IE 6]>${1:IE Conditional Comment: Internet Explorer 6 and below }<![endif]-->$0
|
||||
endsnippet
|
||||
|
||||
snippet ! "IE Conditional Comment: Internet Explorer 6 only"
|
||||
<!--[if IE 6]>${1:IE Conditional Comment: Internet Explorer 6 only }<![endif]-->$0
|
||||
endsnippet
|
||||
|
||||
snippet ! "IE Conditional Comment: Internet Explorer 7+"
|
||||
<!--[if gte IE 7]>${1:IE Conditional Comment: Internet Explorer 7 and above }<![endif]-->$0
|
||||
endsnippet
|
||||
|
||||
snippet ! "IE Conditional Comment: Internet Explorer"
|
||||
<!--[if IE]>${1: IE Conditional Comment: Internet Explorer }<![endif]-->$0
|
||||
endsnippet
|
||||
|
||||
snippet ! "IE Conditional Comment: NOT Internet Explorer"
|
||||
<!--[if !IE]><!-->${1: IE Conditional Comment: NOT Internet Explorer }<!-- <![endif]-->$0
|
||||
endsnippet
|
||||
|
||||
#############
|
||||
# HTML TAGS #
|
||||
#############
|
||||
snippet input "Input with Label" w
|
||||
<label for="${2:${1/[[:alpha:]]+|( )/(?1:_:\L$0)/g}}">$1</label><input type="${3:text/submit/hidden/button}" name="${4:$2}" value="$5"${6: id="${7:$2}"}`!p x(snip)`>
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet input "XHTML <input>" w
|
||||
<input type="${1:text/submit/hidden/button}" name="${2:some_name}" value="$3"${4: id="${5:$2}"}`!p x(snip)`>
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet opt "Option" w
|
||||
<option${1: value="${2:option}"}>${3:$2}</option>
|
||||
endsnippet
|
||||
|
||||
snippet select "Select Box" w
|
||||
<select name="${1:some_name}" id="${2:$1}"${3:${4: multiple}${5: onchange="${6:}"}${7: size="${8:1}"}}>
|
||||
<option${9: value="${10:option1}"}>${11:$10}</option>
|
||||
<option${12: value="${13:option2}"}>${14:$13}</option>${15:}
|
||||
$0
|
||||
</select>
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet textarea "XHTML <textarea>" w
|
||||
<textarea name="${1:Name}" rows="${2:8}" cols="${3:40}">$0</textarea>
|
||||
endsnippet
|
||||
|
||||
snippet mailto "XHTML <a mailto: >" w
|
||||
<a href="mailto:${1:joe@example.com}?subject=${2:feedback}">${3:email me}</a>
|
||||
endsnippet
|
||||
|
||||
snippet base "XHTML <base>" w
|
||||
<base href="$1"${2: target="$3"}`!p x(snip)`>
|
||||
endsnippet
|
||||
|
||||
snippet img "XHTML <img>" w
|
||||
<img src="${1:imgsrc}">
|
||||
endsnippet
|
||||
|
||||
snippet body "XHTML <body>"
|
||||
<body id="${1:`!p
|
||||
snip.rv = snip.fn and 'Hallo' or 'Nothin'
|
||||
`}"${2: onload="$3"}>
|
||||
$0
|
||||
</body>
|
||||
endsnippet
|
||||
|
||||
snippet div "XHTML <div>" w
|
||||
<div`!p snip.rv=' id="' if t[1] else ""`${1:name}`!p snip.rv = '"' if t[1] else ""``!p snip.rv=' class="' if t[2] else ""`${2:name}`!p snip.rv = '"' if t[2] else ""`>
|
||||
$0
|
||||
</div>
|
||||
endsnippet
|
||||
|
||||
snippet form "XHTML <form>" w
|
||||
<form action="${1:`!p
|
||||
snip.rv = (snip.basename or 'unnamed') + '_submit'
|
||||
`}" method="${2:get}" accept-charset="utf-8">
|
||||
$0
|
||||
|
||||
<p><input type="submit" value="Continue →"`!p x(snip)`></p>
|
||||
</form>
|
||||
endsnippet
|
||||
|
||||
snippet h1 "XHTML <h1>" w
|
||||
<h1 id="${1/[\w\d]+|( )/(?1:_:\L$0\E)/g}">${1}</h1>
|
||||
endsnippet
|
||||
|
||||
snippet head "XHTML <head>"
|
||||
<head>
|
||||
<meta http-equiv="Content-type" content="text/html; charset=utf-8"`!p x(snip)`>
|
||||
<title>${1:`!p snip.rv = snip.basename or "Page Title"`}</title>
|
||||
$0
|
||||
</head>
|
||||
endsnippet
|
||||
|
||||
snippet link "XHTML <link>" w
|
||||
<link rel="${1:stylesheet}" href="${2:/css/master.css}" type="text/css" media="${3:screen}" title="${4:no title}" charset="${5:utf-8}"`!p x(snip)`>
|
||||
endsnippet
|
||||
|
||||
snippet meta "XHTML <meta>" w
|
||||
<meta name="${1:name}" content="${2:content}"`!p x(snip)`>
|
||||
endsnippet
|
||||
|
||||
snippet scriptsrc "XHTML <script src...>" w
|
||||
<script src="$1" type="text/javascript" charset="${3:utf-8}"></script>
|
||||
endsnippet
|
||||
|
||||
snippet script "XHTML <script>" w
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
$0
|
||||
</script>
|
||||
endsnippet
|
||||
|
||||
snippet style "XHTML <style>" w
|
||||
<style type="text/css" media="screen">
|
||||
$0
|
||||
</style>
|
||||
endsnippet
|
||||
|
||||
snippet table "XHTML <table>" w
|
||||
<table border="${1:0}"${2: cellspacing="${3:5}" cellpadding="${4:5}"}>
|
||||
<tr><th>${5:Header}</th></tr>
|
||||
<tr><td>${0:Data}</td></tr>
|
||||
</table>
|
||||
endsnippet
|
||||
|
||||
snippet a "Link" w
|
||||
<a href="${1:http://www.${2:url.com}}"${3: target="_blank"}>${4:Anchor Text}</a>
|
||||
endsnippet
|
||||
|
||||
snippet p "paragraph" w
|
||||
<p>$0</p>
|
||||
endsnippet
|
||||
|
||||
snippet li "list item" w
|
||||
<li>$0</li>
|
||||
endsnippet
|
||||
|
||||
snippet ul "unordered list" w
|
||||
<ul>
|
||||
$0
|
||||
</ul>
|
||||
endsnippet
|
||||
|
||||
snippet td "table cell" w
|
||||
<td>$0</td>
|
||||
endsnippet
|
||||
|
||||
snippet tr "table row" w
|
||||
<tr>$0</tr>
|
||||
endsnippet
|
||||
|
||||
snippet title "XHTML <title>" w
|
||||
<title>${1:`!p snip.rv = snip.basename or "Page Title"`}</title>
|
||||
endsnippet
|
||||
|
||||
snippet fieldset "Fieldset" w
|
||||
<fieldset id="${1/[\w\d]+|( )/(?1:_:\L$0\E)/g}" ${2:class="${3:}"}>
|
||||
<legend>$1</legend>
|
||||
$0
|
||||
</fieldset>
|
||||
endsnippet
|
||||
|
||||
snippet movie "Embed QT movie (movie)" b
|
||||
<object width="$2" height="$3" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab">
|
||||
<param name="src" value="$1"`!p x(snip)`>
|
||||
<param name="controller" value="$4"`!p x(snip)`>
|
||||
<param name="autoplay" value="$5"`!p x(snip)`>
|
||||
<embed src="${1:movie.mov}"
|
||||
width="${2:320}" height="${3:240}"
|
||||
controller="${4:true}" autoplay="${5:true}"
|
||||
scale="tofit" cache="true"
|
||||
pluginspage="http://www.apple.com/quicktime/download/"
|
||||
`!p x(snip)`>
|
||||
</object>
|
||||
endsnippet
|
||||
|
||||
snippet html5 "HTML5 Template"
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>${1}</title>
|
||||
<meta charset="utf-8" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
${2}
|
||||
</header>
|
||||
<footer>
|
||||
${4}
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
endsnippet
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,3 @@
|
||||
priority -50
|
||||
|
||||
extends html, django
|
@ -0,0 +1,3 @@
|
||||
priority -50
|
||||
|
||||
extends html, jinja2
|
@ -0,0 +1,431 @@
|
||||
priority -50
|
||||
|
||||
# Many of the snippets here use a global option called
|
||||
# "g:ultisnips_java_brace_style" which, if set to "nl" will put a newline
|
||||
# before '{' braces.
|
||||
# Setting "g:ultisnips_java_junit" will change how the test method snippet
|
||||
# looks, it is defaulted to junit4, setting this option to 3 will remove the
|
||||
# @Test annotation from the method
|
||||
|
||||
global !p
|
||||
def junit(snip):
|
||||
if snip.opt("g:ultisnips_java_junit", "") == "3":
|
||||
snip += ""
|
||||
else:
|
||||
snip.rv += "@Test\n\t"
|
||||
|
||||
def nl(snip):
|
||||
if snip.opt("g:ultisnips_java_brace_style", "") == "nl":
|
||||
snip += ""
|
||||
else:
|
||||
snip.rv += " "
|
||||
def getArgs(group):
|
||||
import re
|
||||
word = re.compile('[a-zA-Z><.]+ \w+')
|
||||
return [i.split(" ") for i in word.findall(group) ]
|
||||
|
||||
def camel(word):
|
||||
return word[0].upper() + word[1:]
|
||||
|
||||
endglobal
|
||||
|
||||
snippet sleep "try sleep catch" b
|
||||
try {
|
||||
Thread.sleep(${1:1000});
|
||||
} catch (InterruptedException e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /i|n/ "new primitive or int" br
|
||||
${1:int} ${2:i} = ${3:1};
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet /o|v/ "new Object or variable" br
|
||||
${1:Object} ${2:var} = new $1(${3});
|
||||
endsnippet
|
||||
|
||||
snippet f "field" b
|
||||
${1:private} ${2:String} ${3:`!p snip.rv = t[2].lower()`};
|
||||
endsnippet
|
||||
|
||||
snippet ab "abstract" b
|
||||
abstract $0
|
||||
endsnippet
|
||||
|
||||
snippet as "assert" b
|
||||
assert ${1:test}${2/(.+)/(?1: \: ")/}${2:Failure message}${2/(.+)/(?1:")/};$0
|
||||
endsnippet
|
||||
|
||||
snippet at "assert true" b
|
||||
assertTrue(${1:actual});
|
||||
endsnippet
|
||||
|
||||
snippet af "assert false" b
|
||||
assertFalse(${1:actual});$0
|
||||
endsnippet
|
||||
|
||||
snippet ae "assert equals" b
|
||||
assertEquals(${1:expected}, ${2:actual});
|
||||
endsnippet
|
||||
|
||||
snippet br "break"
|
||||
break;
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet cs "case" b
|
||||
case $1:
|
||||
$2
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet ca "catch" b
|
||||
catch (${1:Exception} ${2:e})`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet cle "class extends" b
|
||||
public class ${1:`!p
|
||||
snip.rv = snip.basename or "untitled"`} ${2:extends ${3:Parent} }${4:implements ${5:Interface} }{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet clc "class with constructor, fields, setter and getters" b
|
||||
public class `!p
|
||||
snip.rv = snip.basename or "untitled"` {
|
||||
`!p
|
||||
args = getArgs(t[1])
|
||||
if len(args) == 0: snip.rv = ""
|
||||
for i in args:
|
||||
snip.rv += "\n\tprivate " + i[0] + " " + i[1]+ ";"
|
||||
if len(args) > 0:
|
||||
snip.rv += "\n"`
|
||||
public `!p snip.rv = snip.basename or "unknown"`($1) { `!p
|
||||
args = getArgs(t[1])
|
||||
for i in args:
|
||||
snip.rv += "\n\t\tthis." + i[1] + " = " + i[1] + ";"
|
||||
if len(args) == 0:
|
||||
snip.rv += "\n"`
|
||||
}$0
|
||||
`!p
|
||||
args = getArgs(t[1])
|
||||
if len(args) == 0: snip.rv = ""
|
||||
for i in args:
|
||||
snip.rv += "\n\tpublic void set" + camel(i[1]) + "(" + i[0] + " " + i[1] + ") {\n" + "\
|
||||
\tthis." + i[1] + " = " + i[1] + ";\n\t}\n"
|
||||
|
||||
snip.rv += "\n\tpublic " + i[0] + " get" + camel(i[1]) + "() {\
|
||||
\n\t\treturn " + i[1] + ";\n\t}\n"
|
||||
`
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet clc "class with constructor, with field names" b
|
||||
public class `!p
|
||||
snip.rv = snip.basename or "untitled"` {
|
||||
`!p
|
||||
args = getArgs(t[1])
|
||||
for i in args:
|
||||
snip.rv += "\n\tprivate " + i[0] + " " + i[1]+ ";"
|
||||
if len(args) > 0:
|
||||
snip.rv += "\n"`
|
||||
public `!p snip.rv = snip.basename or "unknown"`($1) { `!p
|
||||
args = getArgs(t[1])
|
||||
for i in args:
|
||||
snip.rv += "\n\t\tthis." + i[1] + " = " + i[1]
|
||||
if len(args) == 0:
|
||||
snip.rv += "\n"`
|
||||
}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet clc "class and constructor" b
|
||||
public class `!p
|
||||
snip.rv = snip.basename or "untitled"` {
|
||||
|
||||
public `!p snip.rv = snip.basename or "untitled"`($2) {
|
||||
$0
|
||||
}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet cl "class" b
|
||||
public class ${1:`!p
|
||||
snip.rv = snip.basename or "untitled"`} {
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet cos "constant string" b
|
||||
public static final String ${1:var} = "$2";$0
|
||||
endsnippet
|
||||
|
||||
snippet co "constant" b
|
||||
public static final ${1:String} ${2:var} = $3;$0
|
||||
endsnippet
|
||||
|
||||
snippet de "default" b
|
||||
default:
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet elif "else if" b
|
||||
else if ($1)`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /el(se)?/ "else" br
|
||||
else`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet fi "final" b
|
||||
final $0
|
||||
endsnippet
|
||||
|
||||
snippet fore "for (each)" b
|
||||
for ($1 : $2)`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet fori "for" b
|
||||
for (int ${1:i} = 0; $1 < ${2:10}; $1++)`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet for "for" b
|
||||
for ($1; $2; $3)`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet if "if" b
|
||||
if ($1)`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet imt "import junit_framework_TestCase;" b
|
||||
import junit.framework.TestCase;
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet im "import" b
|
||||
import ${1:java}.${2:util}.$0
|
||||
endsnippet
|
||||
|
||||
snippet in "interface" b
|
||||
interface ${1:`!p snip.rv = snip.basename or "untitled"`} ${2:extends ${3:Parent} }{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet cc "constructor call or setter body"
|
||||
this.${1:var} = $1;
|
||||
endsnippet
|
||||
|
||||
snippet list "Collections List" b
|
||||
List<${1:String}> ${2:list} = new ${3:Array}List<$1>();
|
||||
endsnippet
|
||||
|
||||
snippet map "Collections Map" b
|
||||
Map<${1:String}, ${2:String}> ${3:map} = new ${4:Hash}Map<$1, $2>();
|
||||
endsnippet
|
||||
|
||||
snippet set "Collections Set" b
|
||||
Set<${1:String}> ${2:set} = new ${3:Hash}Set<$1>();
|
||||
endsnippet
|
||||
|
||||
snippet /Str?|str/ "String" br
|
||||
String $0
|
||||
endsnippet
|
||||
|
||||
snippet cn "Constructor" b
|
||||
public `!p snip.rv = snip.basename or "untitled"`(${1:}) {
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet cn "constructor, \w fields + assigments" b
|
||||
`!p
|
||||
args = getArgs(t[1])
|
||||
for i in args:
|
||||
snip.rv += "\n\tprivate " + i[0] + " " + i[1]+ ";"
|
||||
if len(args) > 0:
|
||||
snip.rv += "\n"`
|
||||
public `!p snip.rv = snip.basename or "unknown"`($1) { `!p
|
||||
args = getArgs(t[1])
|
||||
for i in args:
|
||||
snip.rv += "\n\t\tthis." + i[1] + " = " + i[1]
|
||||
if len(args) == 0:
|
||||
snip.rv += "\n"`
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet j.b "java_beans_" i
|
||||
java.beans.
|
||||
endsnippet
|
||||
|
||||
snippet j.i "java_io" i
|
||||
java.io.
|
||||
endsnippet
|
||||
|
||||
snippet j.m "java_math" i
|
||||
java.math.
|
||||
endsnippet
|
||||
|
||||
snippet j.n "java_net_" i
|
||||
java.net.
|
||||
endsnippet
|
||||
|
||||
snippet j.u "java_util_" i
|
||||
java.util.
|
||||
endsnippet
|
||||
|
||||
snippet main "method (main)" b
|
||||
public static void main(String[] args)`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet try "try/catch" b
|
||||
try {
|
||||
$1
|
||||
} catch(${2:Exception} ${3:e}){
|
||||
${4:e.printStackTrace();}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet mt "method throws" b
|
||||
${1:private} ${2:void} ${3:method}(${4}) ${5:throws $6 }{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet m "method" b
|
||||
${1:private} ${2:void} ${3:method}(${4}) {
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet md "Method With javadoc" b
|
||||
/**
|
||||
* ${7:Short Description}`!p
|
||||
for i in getArgs(t[4]):
|
||||
snip.rv += "\n\t * @param " + i[1] + " usage..."`
|
||||
* `!p
|
||||
if "throws" in t[5]:
|
||||
snip.rv = "\n\t * @throws " + t[6]
|
||||
else:
|
||||
snip.rv = ""` `!p
|
||||
if not "void" in t[2]:
|
||||
snip.rv = "\n\t * @return object"
|
||||
else:
|
||||
snip.rv = ""`
|
||||
**/
|
||||
${1:public} ${2:void} ${3:method}($4) ${5:throws $6 }{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /get(ter)?/ "getter" br
|
||||
public ${1:String} get${2:Name}() {
|
||||
return `!p snip.rv = t[2].lower()`;
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /set(ter)?/ "setter" br
|
||||
public void set${1:Name}(${2:String} $1) {
|
||||
return this.`!p snip.rv = t[1].lower()` = `!p snip.rv = t[1].lower()`;
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /se?tge?t|ge?tse?t|gs/ "setter and getter" br
|
||||
public void set${1:Name}(${2:String} `!p snip.rv = t[1].lower()`) {
|
||||
this.`!p snip.rv = t[1].lower()` = `!p snip.rv = t[1].lower()`;
|
||||
}
|
||||
|
||||
public $2 get$1() {
|
||||
return `!p snip.rv = t[1].lower()`;
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet pa "package" b
|
||||
package $0
|
||||
endsnippet
|
||||
|
||||
snippet p "print" b
|
||||
System.out.print($1);$0
|
||||
endsnippet
|
||||
|
||||
snippet pl "println" b
|
||||
System.out.println($1);$0
|
||||
endsnippet
|
||||
|
||||
snippet pr "private" b
|
||||
private $0
|
||||
endsnippet
|
||||
|
||||
snippet po "protected" b
|
||||
protected $0
|
||||
endsnippet
|
||||
|
||||
snippet pu "public" b
|
||||
public $0
|
||||
endsnippet
|
||||
|
||||
snippet re "return" b
|
||||
return $0
|
||||
endsnippet
|
||||
|
||||
snippet st "static"
|
||||
static $0
|
||||
endsnippet
|
||||
|
||||
snippet sw "switch" b
|
||||
switch ($1)`!p nl(snip)`{
|
||||
case $2: $0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet sy "synchronized"
|
||||
synchronized $0
|
||||
endsnippet
|
||||
|
||||
snippet tc "test case"
|
||||
public class ${1:`!p snip.rv = snip.basename or "untitled"`} extends ${2:TestCase}`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet t "test" b
|
||||
`!p junit(snip)`public void test${1:Name}() {
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet tt "test throws" b
|
||||
`!p junit(snip)`public void test${1:Name}() ${2:throws Exception }{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet th "throw" b
|
||||
throw new $0
|
||||
endsnippet
|
||||
|
||||
snippet wh "while" b
|
||||
while ($1)`!p nl(snip)`{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,162 @@
|
||||
priority -50
|
||||
|
||||
###########################################################################
|
||||
# TextMate Snippets #
|
||||
###########################################################################
|
||||
snippet get "Get Elements"
|
||||
getElement${1/(T)|.*/(?1:s)/}By${1:T}${1/(T)|(I)|.*/(?1:agName)(?2:d)/}('$2')
|
||||
endsnippet
|
||||
|
||||
snippet '':f "object method string"
|
||||
'${1:${2:#thing}:${3:click}}': function(element) {
|
||||
${VISUAL}$0
|
||||
}${10:,}
|
||||
endsnippet
|
||||
|
||||
snippet :f "Object Method"
|
||||
${1:method_name}: function(${3:attribute}) {
|
||||
${VISUAL}$0
|
||||
}${10:,}
|
||||
endsnippet
|
||||
|
||||
snippet :, "Object Value JS"
|
||||
${1:value_name}: ${0:value},
|
||||
endsnippet
|
||||
|
||||
snippet : "Object key key: 'value'"
|
||||
${1:key}: ${2:"${3:value}"}${4:, }
|
||||
endsnippet
|
||||
|
||||
snippet proto "Prototype (proto)"
|
||||
${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {
|
||||
${VISUAL}$0
|
||||
};
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet for "for (...) {...} (counting up)" b
|
||||
for (var ${1:i} = 0, ${2:len} = ${3:Things.length}; $1 < $2; $1++) {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet ford "for (...) {...} (counting down, faster)" b
|
||||
for (var ${2:i} = ${1:Things.length} - 1; $2 >= 0; $2--) {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet fun "function (fun)"
|
||||
function ${1:function_name}(${2:argument}) {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet iife "Immediately-Invoked Function Expression (iife)"
|
||||
(function (${1:argument}) {
|
||||
${VISUAL}$0
|
||||
}(${2:$1}));
|
||||
endsnippet
|
||||
|
||||
snippet ife "if ___ else"
|
||||
if (${1:condition}) {
|
||||
${2://code}
|
||||
}
|
||||
else {
|
||||
${3://code}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet if "if"
|
||||
if (${1:condition}) {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet timeout "setTimeout function"
|
||||
setTimeout(function() {
|
||||
${VISUAL}$0
|
||||
}${2:.bind(${3:this})}, ${1:10});
|
||||
endsnippet
|
||||
|
||||
# Snippets for Console Debug Output
|
||||
|
||||
snippet ca "console.assert" b
|
||||
console.assert(${1:assertion}, ${2:"${3:message}"});
|
||||
endsnippet
|
||||
|
||||
snippet cclear "console.clear" b
|
||||
console.clear();
|
||||
endsnippet
|
||||
|
||||
snippet cdir "console.dir" b
|
||||
console.dir(${1:object});
|
||||
endsnippet
|
||||
|
||||
snippet cdirx "console.dirxml" b
|
||||
console.dirxml(${1:object});
|
||||
endsnippet
|
||||
|
||||
snippet ce "console.error" b
|
||||
console.error(${1:"${2:value}"});
|
||||
endsnippet
|
||||
|
||||
snippet cgroup "console.group" b
|
||||
console.group("${1:label}");
|
||||
${VISUAL}$0
|
||||
console.groupEnd();
|
||||
endsnippet
|
||||
|
||||
snippet cgroupc "console.groupCollapsed" b
|
||||
console.groupCollapsed("${1:label}");
|
||||
${VISUAL}$0
|
||||
console.groupEnd();
|
||||
endsnippet
|
||||
|
||||
snippet ci "console.info" b
|
||||
console.info(${1:"${2:value}"});
|
||||
endsnippet
|
||||
|
||||
snippet cl "console.log" b
|
||||
console.log(${1:"${2:value}"});
|
||||
endsnippet
|
||||
|
||||
snippet cprof "console.profile" b
|
||||
console.profile("${1:label}");
|
||||
${VISUAL}$0
|
||||
console.profileEnd();
|
||||
endsnippet
|
||||
|
||||
snippet ctable "console.table" b
|
||||
console.table(${1:"${2:value}"});
|
||||
endsnippet
|
||||
|
||||
snippet ctime "console.time" b
|
||||
console.time("${1:label}");
|
||||
${VISUAL}$0
|
||||
console.timeEnd("$1");
|
||||
endsnippet
|
||||
|
||||
snippet ctimestamp "console.timeStamp" b
|
||||
console.timeStamp("${1:label}");
|
||||
endsnippet
|
||||
|
||||
snippet ctrace "console.trace" b
|
||||
console.trace();
|
||||
endsnippet
|
||||
|
||||
snippet cw "console.warn" b
|
||||
console.warn(${1:"${2:value}"});
|
||||
endsnippet
|
||||
|
||||
# AMD (Asynchronous Module Definition) snippets
|
||||
|
||||
snippet def "define an AMD module"
|
||||
define(${1:optional_name, }[${2:'jquery'}], ${3:callback});
|
||||
endsnippet
|
||||
|
||||
snippet req "require an AMD module"
|
||||
require([${1:'dependencies'}], ${2:callback});
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,169 @@
|
||||
priority -50
|
||||
extends javascript
|
||||
priority -49
|
||||
|
||||
# JavaScript versions -- from the TextMate bundle + some additions
|
||||
# for jasmine-jquery matchers
|
||||
#
|
||||
|
||||
snippet des "Describe (js)" b
|
||||
describe('${1:description}', function() {
|
||||
$0
|
||||
});
|
||||
endsnippet
|
||||
|
||||
snippet it "it (js)" b
|
||||
it('${1:description}', function() {
|
||||
$0
|
||||
});
|
||||
endsnippet
|
||||
|
||||
snippet bef "before each (js)" b
|
||||
beforeEach(function() {
|
||||
$0
|
||||
});
|
||||
endsnippet
|
||||
|
||||
snippet aft "after each (js)" b
|
||||
afterEach(function() {
|
||||
$0
|
||||
});
|
||||
endsnippet
|
||||
|
||||
snippet any "any (js)" b
|
||||
jasmine.any($1)
|
||||
endsnippet
|
||||
|
||||
snippet ru "runs (js)" b
|
||||
runs(function() {
|
||||
$0
|
||||
});
|
||||
endsnippet
|
||||
|
||||
snippet wa "waits (js)" b
|
||||
waits($1);
|
||||
endsnippet
|
||||
|
||||
snippet ex "expect (js)" b
|
||||
expect(${1:target})$0;
|
||||
endsnippet
|
||||
|
||||
snippet ee "expect to equal (js)" b
|
||||
expect(${1:target}).toEqual(${2:value});
|
||||
endsnippet
|
||||
|
||||
snippet em "expect to match (js)" b
|
||||
expect(${1:target}).toMatch(${2:pattern});
|
||||
endsnippet
|
||||
|
||||
snippet eha "expect to have attribute (js)" b
|
||||
expect(${1:target}).toHaveAttr('${2:attr}'${3:, '${4:value}'});
|
||||
endsnippet
|
||||
|
||||
snippet et "expect to be truthy (js)" b
|
||||
expect(${1:target}).toBeTruthy();
|
||||
endsnippet
|
||||
|
||||
snippet ef "expect to be falsy (js)" b
|
||||
expect(${1:target}).toBeFalsy();
|
||||
endsnippet
|
||||
|
||||
snippet ed "expect to be defined (js)" b
|
||||
expect(${1:target}).toBeDefined();
|
||||
endsnippet
|
||||
|
||||
snippet en "expect to be null (js)" b
|
||||
expect(${1:target}).toBeNull();
|
||||
endsnippet
|
||||
|
||||
snippet ec "expect to contain (js)" b
|
||||
expect(${1:target}).toContain(${2:value});
|
||||
endsnippet
|
||||
|
||||
snippet ev "expect to be visible (js)" b
|
||||
expect(${1:target}).toBeVisible();
|
||||
endsnippet
|
||||
|
||||
snippet eh "expect to be hidden (js)" b
|
||||
expect(${1:target}).toBeHidden();
|
||||
endsnippet
|
||||
|
||||
snippet notx "expect not (js)" b
|
||||
expect(${1:target}).not$0;
|
||||
endsnippet
|
||||
|
||||
snippet note "expect not to equal (js)" b
|
||||
expect(${1:target}).not.toEqual(${2:value});
|
||||
endsnippet
|
||||
|
||||
snippet notm "expect not to match (js)" b
|
||||
expect(${1:target}).not.toMatch(${2:pattern});
|
||||
endsnippet
|
||||
|
||||
snippet notha "expect to not have attribute (js)" b
|
||||
expect(${1:target}).not.toHaveAttr('${2:attr}'${3:, '${4:value}'});
|
||||
endsnippet
|
||||
|
||||
snippet nott "expect not to be truthy (js)" b
|
||||
expect(${1:target}).not.toBeTruthy();
|
||||
endsnippet
|
||||
|
||||
snippet notf "expect not to be falsy (js)" b
|
||||
expect(${1:target}).not.toBeFalsy();
|
||||
endsnippet
|
||||
|
||||
snippet notd "expect not to be defined (js)" b
|
||||
expect(${1:target}).not.toBeDefined();
|
||||
endsnippet
|
||||
|
||||
snippet notn "expect not to be null (js)" b
|
||||
expect(${1:target}).not.toBeNull();
|
||||
endsnippet
|
||||
|
||||
snippet notc "expect not to contain (js)" b
|
||||
expect(${1:target}).not.toContain(${2:value});
|
||||
endsnippet
|
||||
|
||||
snippet notv "expect not to be visible (js)" b
|
||||
expect(${1:target}).not.toBeVisible();
|
||||
endsnippet
|
||||
|
||||
snippet noth "expect not to be hidden (js)" b
|
||||
expect(${1:target}).not.toBeHidden();
|
||||
endsnippet
|
||||
|
||||
snippet s "spy on (js)" b
|
||||
spyOn(${1:object}, '${2:method}')$0;
|
||||
endsnippet
|
||||
|
||||
snippet sr "spy on and return (js)" b
|
||||
spyOn(${1:object}, '${2:method}').andReturn(${3:arguments});
|
||||
endsnippet
|
||||
|
||||
snippet st "spy on and throw (js)" b
|
||||
spyOn(${1:object}, '${2:method}').andThrow(${3:exception});
|
||||
endsnippet
|
||||
|
||||
snippet sct "spy on and call through (js)" b
|
||||
spyOn(${1:object}, '${2:method}').andCallThrough();
|
||||
endsnippet
|
||||
|
||||
snippet scf "spy on and call fake (js)" b
|
||||
spyOn(${1:object}, '${2:method}').andCallFake(${3:function});
|
||||
endsnippet
|
||||
|
||||
snippet esc "expect was called (js)" b
|
||||
expect(${1:target}).wasCalled();
|
||||
endsnippet
|
||||
|
||||
snippet escw "expect was called with (js)" b
|
||||
expect(${1:target}).wasCalledWith(${2:arguments});
|
||||
endsnippet
|
||||
|
||||
snippet notsc "expect was not called (js)" b
|
||||
expect(${1:target}).wasNotCalled();
|
||||
endsnippet
|
||||
|
||||
snippet noscw "expect was not called with (js)" b
|
||||
expect(${1:target}).wasNotCalledWith(${2:arguments});
|
||||
endsnippet
|
@ -0,0 +1,51 @@
|
||||
priority -50
|
||||
|
||||
# JSDoc snippets
|
||||
|
||||
snippet /* "A JSDoc comment" b
|
||||
/**
|
||||
* ${1:${VISUAL}}$0
|
||||
*/
|
||||
endsnippet
|
||||
|
||||
snippet @au "@author email (First Last)"
|
||||
@author ${1:`!v g:snips_author_email`} (${2:`!v g:snips_author`})
|
||||
endsnippet
|
||||
|
||||
snippet @li "@license Description"
|
||||
@license ${1:MIT}$0
|
||||
endsnippet
|
||||
|
||||
snippet @ver "@version Semantic version"
|
||||
@version ${1:0.1.0}$0
|
||||
endsnippet
|
||||
|
||||
snippet @fileo "@fileoverview Description" b
|
||||
/**
|
||||
* @fileoverview ${1:${VISUAL:A description of the file}}$0
|
||||
*/
|
||||
endsnippet
|
||||
|
||||
snippet @constr "@constructor"
|
||||
@constructor
|
||||
endsnippet
|
||||
|
||||
snippet @p "@param {Type} varname Description"
|
||||
@param {${1:Type}} ${2:varname} ${3:Description}
|
||||
endsnippet
|
||||
|
||||
snippet @ret "@return {Type} Description"
|
||||
@return {${1:Type}} ${2:Description}
|
||||
endsnippet
|
||||
|
||||
snippet @pri "@private"
|
||||
@private
|
||||
endsnippet
|
||||
|
||||
snippet @over "@override"
|
||||
@override
|
||||
endsnippet
|
||||
|
||||
snippet @pro "@protected"
|
||||
@protected
|
||||
endsnippet
|
@ -0,0 +1,209 @@
|
||||
priority -50
|
||||
|
||||
# http://jinja.pocoo.org/
|
||||
|
||||
# jinja2 is a full featured template engine for Python. It has full
|
||||
# unicode support, an optional integrated sandboxed execution
|
||||
# environment, widely used and BSD licensed.
|
||||
|
||||
# possible extends:
|
||||
#extends html
|
||||
|
||||
|
||||
snippet block "block" b
|
||||
{% block ${1:name} %}
|
||||
$2
|
||||
{% endblock $1 %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet {{ "variable" b
|
||||
{{ $1 }}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet {# "comment" b
|
||||
{# $1 #}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet # "comment" b
|
||||
{# $1 #}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet raw "escaped block" b
|
||||
{% raw %}
|
||||
$1
|
||||
{% endraw %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet extends "extends" b
|
||||
{% extends "${1:template}" %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet include "include" b
|
||||
{% include "${1:template}" %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet import "import" b
|
||||
{% import "${1:template}" %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet from "from/import/as" b
|
||||
{% from "${1:template}" import ${2:name}${3: as ${4:$2}} %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet filter "filter" b
|
||||
{% filter ${1:filter} %}
|
||||
$2
|
||||
{% endfilter %}
|
||||
endsnippet
|
||||
|
||||
|
||||
# Being able to quickly remove the whole 'else' block seems faster to me than
|
||||
# choosing between 'for' and 'for/else' snippets from the menu.
|
||||
# snippet for "for" b
|
||||
# {% for ${1:item} in ${2:sequence} %}
|
||||
# $3${4:
|
||||
# {% else %}
|
||||
# $5}
|
||||
# {% endfor %}
|
||||
# endsnippet
|
||||
|
||||
|
||||
snippet for "for" b
|
||||
{% for ${1:item} in ${2:sequence} %}
|
||||
$3
|
||||
{% endfor %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet for "for/else" b
|
||||
{% for ${1:item} in ${2:sequence} %}
|
||||
$3
|
||||
{% else %}
|
||||
$4
|
||||
{% endfor %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet if "if" b
|
||||
{% if ${1:expr} %}
|
||||
$2
|
||||
{% endif %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet if "if/else" b
|
||||
{% if ${1:expr} %}
|
||||
$2
|
||||
{% else %}
|
||||
$3
|
||||
{% endif %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet if "if/elif/else" b
|
||||
{% if ${1:expr} %}
|
||||
$2
|
||||
{% elif %}
|
||||
$3
|
||||
{% else %}
|
||||
$4
|
||||
{% endif %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet macro "macro" b
|
||||
{% macro ${1:name}(${2:args}) %}
|
||||
$3
|
||||
{% endmacro %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet call "call" b
|
||||
{% call ${1:name}(${2:args}) %}
|
||||
$3
|
||||
{% endcall %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet set "set" b
|
||||
{% set ${1:name} = ${2:'value'} %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet trans "translation" b
|
||||
{% trans %}
|
||||
$1
|
||||
{% endtrans %}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet with "with" b
|
||||
{% with %}
|
||||
$1
|
||||
{% endwith %}
|
||||
endsnippet
|
||||
|
||||
snippet autoescape "autoescape" b
|
||||
{% autoescape ${1:true} %}
|
||||
$2
|
||||
{% endautoescape %}
|
||||
endsnippet
|
||||
|
||||
# Filters
|
||||
# @todo: expand only when snippet is preceeded by a |
|
||||
|
||||
snippet batch "batch items" w
|
||||
batch(linecount=$1, fill_with=${2:None})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet dictsort "sort and yield (key, value) pairs" w
|
||||
dictsort(case_sensitive=${1:False}, by=${2:'key'})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet round "round number" w
|
||||
round(precision=${1:0}, method=${2:'common|ceil|floor'})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet urlize "convert plain-text url to <a/>" w
|
||||
urlize(trim_url_limit=${1:None}, nofollow=${2:False})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet wordwrap "wordwrap" w
|
||||
wordwrap(width=${1:79}, break_long_words=${2:True})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet truncate "truncate" w
|
||||
truncate(lenght=${1:79}, killwords=${2:False}, end=${3:'...''})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet sum "sum of sequence of numbers + start" w
|
||||
sum(attribute=${1:None}, start=${2:0})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet sort "sort an iterable" w
|
||||
sort(reverse=${1:False}, case_sensitive=${2:False}, attribute=${3:None})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet indent "indent" w
|
||||
indent(width=${1:4}, indentfirst=${2:False})
|
||||
endsnippet
|
||||
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,20 @@
|
||||
priority -50
|
||||
|
||||
snippet s "String" b
|
||||
"${1:key}": "${0:value}",
|
||||
endsnippet
|
||||
|
||||
snippet n "number" b
|
||||
"${1:key}": ${0:value},
|
||||
endsnippet
|
||||
|
||||
snippet a "Array" b
|
||||
[
|
||||
${VISUAL}$0
|
||||
],
|
||||
endsnippet
|
||||
snippet o "Object" b
|
||||
{
|
||||
${VISUAL}$0
|
||||
},
|
||||
endsnippet
|
@ -0,0 +1,8 @@
|
||||
priority -50
|
||||
|
||||
snippet t "Transaction" b
|
||||
${1:`!v strftime("%Y")`}-${2:`!v strftime("%m")`}-${3:`!v strftime("%d")`} ${4:*} ${5:Payee}
|
||||
${6:Expenses} \$${7:0.00}
|
||||
${8:Assets:Checking}
|
||||
$0
|
||||
endsnippet
|
@ -0,0 +1,3 @@
|
||||
priority -50
|
||||
|
||||
extends haskell
|
@ -0,0 +1,39 @@
|
||||
priority -50
|
||||
|
||||
#################################
|
||||
# Snippets for the Lua language #
|
||||
#################################
|
||||
snippet #! "Shebang header" b
|
||||
#!/usr/bin/env lua
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet !fun(ction)?! "New function" br
|
||||
function ${1:new_function}(${2:args})
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet forp "pair for loop" b
|
||||
for ${1:name},${2:val} in pairs(${3:table_name}) do
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet fori "ipair for foop" b
|
||||
for ${1:idx},${2:val} in ipairs(${3:table_name}) do
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet for "numeric for loop" b
|
||||
for ${1:i}=${2:first},${3:last}${4/^..*/(?0:,:)/}${4:step} do
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet local "local x = 1"
|
||||
local ${1:x} = ${0:1}
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,92 @@
|
||||
priority -50
|
||||
|
||||
#################
|
||||
# From snipmate #
|
||||
#################
|
||||
snippet def "definition" b
|
||||
<%def name="${1:name}">
|
||||
${2:}
|
||||
</%def>
|
||||
endsnippet
|
||||
|
||||
snippet call "call" b
|
||||
<%call expr="${1:name}">
|
||||
${2:}
|
||||
</%call>
|
||||
endsnippet
|
||||
|
||||
snippet doc "doc" b
|
||||
<%doc>
|
||||
${1:}
|
||||
</%doc>
|
||||
endsnippet
|
||||
|
||||
snippet text "text" b
|
||||
<%text>
|
||||
${1:}
|
||||
</%text>
|
||||
endsnippet
|
||||
|
||||
snippet for "for" b
|
||||
% for ${1:i} in ${2:iter}:
|
||||
${3:}
|
||||
% endfor
|
||||
endsnippet
|
||||
|
||||
snippet if "if " b
|
||||
% if ${1:condition}:
|
||||
${2:}
|
||||
% endif
|
||||
endsnippet
|
||||
|
||||
snippet if "if/else" b
|
||||
% if ${1:condition}:
|
||||
${2:}
|
||||
% else:
|
||||
${3:}
|
||||
% endif
|
||||
endsnippet
|
||||
|
||||
snippet try "try" b
|
||||
% try:
|
||||
${1:}
|
||||
% except${2:}:
|
||||
${3:pass}
|
||||
% endtry
|
||||
endsnippet
|
||||
|
||||
snippet wh "wh" b
|
||||
% while ${1:}:
|
||||
${2:}
|
||||
% endwhile
|
||||
endsnippet
|
||||
|
||||
snippet $ "$" i
|
||||
${${1:}}
|
||||
endsnippet
|
||||
|
||||
snippet <% "<%" b
|
||||
<% ${1:} %>
|
||||
endsnippet
|
||||
|
||||
snippet <!% "<!%" b
|
||||
<!% ${1:} %>
|
||||
endsnippet
|
||||
|
||||
snippet inherit "inherit" b
|
||||
<%inherit file="${1:filename}" />
|
||||
endsnippet
|
||||
|
||||
snippet include "include" b
|
||||
<%include file="${1:filename}" />
|
||||
endsnippet
|
||||
|
||||
snippet namespace "namespace" b
|
||||
<%namespace file="${1:name}" />
|
||||
endsnippet
|
||||
|
||||
snippet page "page" b
|
||||
<%page args="${1:}" />
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,42 @@
|
||||
priority -50
|
||||
|
||||
###########################
|
||||
# Sections and Paragraphs #
|
||||
###########################
|
||||
snippet sec "Section" b
|
||||
# ${1:Section Name} #
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet ssec "Sub Section" b
|
||||
## ${1:Section Name} ##
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet sssec "SubSub Section" b
|
||||
### ${1:Section Name} ###
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet par "Paragraph" b
|
||||
#### ${1:Paragraph Name} ####
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet spar "Paragraph" b
|
||||
##### ${1:Paragraph Name} #####
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
################
|
||||
# Common stuff #
|
||||
################
|
||||
snippet link "Link to something"
|
||||
[${1:${VISUAL:Text}}](${3:http://${2:www.url.com}})$0
|
||||
endsnippet
|
||||
|
||||
snippet img "Image"
|
||||
![${1:pic alt}](${2:path}${3/.+/ "/}${3:opt title}${3/.+/"/})$0
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,272 @@
|
||||
priority -50
|
||||
|
||||
###########################################################################
|
||||
# TextMate Snippets #
|
||||
###########################################################################
|
||||
|
||||
snippet imp "#import (imp)" b
|
||||
#import "${1:`!p snip.rv = re.sub(r'\..*$', '.h', fn)`}"
|
||||
endsnippet
|
||||
|
||||
snippet Imp "#import <> (Imp)"
|
||||
#import <${1:Cocoa/Cocoa.h}>
|
||||
endsnippet
|
||||
|
||||
snippet cl "020 Class (objc)"
|
||||
@interface ${1:`!p
|
||||
if len(fn):
|
||||
snip.rv = re.sub(r'\..*$', '', fn)
|
||||
else:
|
||||
snip.rv = "object"
|
||||
`} : ${2:NSObject}
|
||||
{
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation $1
|
||||
- (id)init
|
||||
{
|
||||
if((self = [super init]))
|
||||
{$0
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@end
|
||||
endsnippet
|
||||
|
||||
snippet array "NSArray (array)"
|
||||
NSMutableArray *${1:array} = [NSMutableArray array];
|
||||
endsnippet
|
||||
|
||||
snippet dict "NSDictionary (dict)"
|
||||
NSMutableDictionary *${1:dict} = [NSMutableDictionary dictionary];
|
||||
endsnippet
|
||||
|
||||
snippet forarray "for NSArray loop (forarray)"
|
||||
unsigned int ${1:object}Count = [${2:array} count];
|
||||
|
||||
for(unsigned int index = 0; index < $1Count; index += 1)
|
||||
{
|
||||
${3:id} $1 = [$2 objectAtIndex:index];
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet objacc "Object Accessors (objacc)"
|
||||
- (${1:id})${2:thing}
|
||||
{
|
||||
return $2;
|
||||
}
|
||||
|
||||
- (void)set${2/./\u$0/}:($1)aValue
|
||||
{
|
||||
$0${1/( \*)?$/(?1:$1: )/}old${2/./\u$0/} = $2;
|
||||
$2 = [aValue retain];
|
||||
[old${2/./\u$0/} release];
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet sel "@selector"
|
||||
@selector(${1:method}:)
|
||||
endsnippet
|
||||
|
||||
snippet cdacc "CoreData Accessors Implementation"
|
||||
- (${1:id})${2:attribute}
|
||||
{
|
||||
[self willAccessValueForKey:@"$2"];
|
||||
$1 value = [self primitiveValueForKey:@"$2"];
|
||||
[self didAccessValueForKey:@"$2"];
|
||||
return value;
|
||||
}
|
||||
|
||||
- (void)set${2/./\u$0/}:($1)aValue
|
||||
{
|
||||
[self willChangeValueForKey:@"$2"];
|
||||
[self setPrimitiveValue:aValue forKey:@"$2"];
|
||||
[self didChangeValueForKey:@"$2"];
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet delegate "Delegate Responds to Selector"
|
||||
if([${1:[self delegate]} respondsToSelector:@selector(${2:selfDidSomething:})])
|
||||
[$1 ${3:${2/((^\s*([A-Za-z0-9_]*:)\s*)|(:\s*$)|(:\s*))/(?2:$2self :\:<>)(?4::)(?5: :)/g}}];
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet thread "Detach New NSThread"
|
||||
[NSThread detachNewThreadSelector:@selector(${1:method}:) toTarget:${2:aTarget} withObject:${3:anArgument}]
|
||||
endsnippet
|
||||
|
||||
snippet ibo "IBOutlet (ibo)"
|
||||
IBOutlet ${1:NSSomeClass} *${2:${1/^[A-Z](?:[A-Z]+|[a-z]+)([A-Z]\w*)/\l$1/}};
|
||||
endsnippet
|
||||
|
||||
snippet I "Initialize Implementation (I)"
|
||||
+ (void)initialize
|
||||
{
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
$0@"value", @"key",
|
||||
nil]];
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet bind "Key:value binding (bind)"
|
||||
bind:@"${1:binding}" toObject:${2:observableController} withKeyPath:@"${3:keyPath}" options:${4:nil}
|
||||
endsnippet
|
||||
|
||||
snippet arracc "LoD array (arracc)"
|
||||
- (void)addObjectTo${1:Things}:(${2:id})anObject
|
||||
{
|
||||
[${3:${1/./\l$0/}} addObject:anObject];
|
||||
}
|
||||
|
||||
- (void)insertObject:($2)anObject in$1AtIndex:(unsigned int)i
|
||||
{
|
||||
[$3 insertObject:anObject atIndex:i];
|
||||
}
|
||||
|
||||
- ($2)objectIn$1AtIndex:(unsigned int)i
|
||||
{
|
||||
return [$3 objectAtIndex:i];
|
||||
}
|
||||
|
||||
- (unsigned int)indexOfObjectIn$1:($2)anObject
|
||||
{
|
||||
return [$3 indexOfObject:anObject];
|
||||
}
|
||||
|
||||
- (void)removeObjectFrom$1AtIndex:(unsigned int)i
|
||||
{
|
||||
[$3 removeObjectAtIndex:i];
|
||||
}
|
||||
|
||||
- (unsigned int)countOf$1
|
||||
{
|
||||
return [$3 count];
|
||||
}
|
||||
|
||||
- (NSArray *${1/./\l$0/}
|
||||
{
|
||||
return $3;
|
||||
}
|
||||
|
||||
- (void)set$1:(NSArray *)new$1
|
||||
{
|
||||
[$3 setArray:new$1];
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet arracc "LoD array interface (arracc)"
|
||||
- (void)addObjectTo${1:Things}:(${2:id})anObject;
|
||||
- (void)insertObject:($2)anObject in$1AtIndex:(unsigned int)i;
|
||||
- ($2)objectIn$1AtIndex:(unsigned int)i;
|
||||
- (unsigned int)indexOfObjectIn$1:($2)anObject;
|
||||
- (void)removeObjectFrom$1AtIndex:(unsigned int)i;
|
||||
- (unsigned int)countOf$1;
|
||||
- (NSArray *)${1/./\l$0/};
|
||||
- (void)set$1:(NSArray *)new$1;
|
||||
endsnippet
|
||||
|
||||
snippet focus "Lock Focus"
|
||||
[self lockFocus];
|
||||
$0
|
||||
[self unlockFocus];
|
||||
endsnippet
|
||||
|
||||
snippet pool "NSAutoreleasePool (pool)"
|
||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
||||
$0
|
||||
[pool drain];
|
||||
endsnippet
|
||||
|
||||
snippet log "NSLog (log) 2"
|
||||
NSLog(@"$1"${1/[^%]*(%)?.*/(?1:, :\);)/}$2${1/[^%]*(%)?.*/(?1:\);)/}
|
||||
endsnippet
|
||||
|
||||
snippet alert "NSRunAlertPanel (alert)"
|
||||
int choice = NSRunAlertPanel(@"${1:Something important!}", @"${2:Something important just happend, and now I need to ask you, do you want to continue?}", @"${3:Continue}", @"${4:Cancel}", nil);
|
||||
if(choice == NSAlertDefaultReturn) // "$3"
|
||||
{
|
||||
$0;
|
||||
}
|
||||
else if(choice == NSAlertAlternateReturn) // "$4"
|
||||
{
|
||||
$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet format "NSString stringWithFormat (format)"
|
||||
[NSString stringWithFormat:@"$1", $2]$0
|
||||
endsnippet
|
||||
|
||||
snippet objacc "Object Accessors Interface (objacc)"
|
||||
- (${1:id})${2:thing};
|
||||
- (void)set${2/./\u$0/}:($1)aValue;
|
||||
endsnippet
|
||||
|
||||
snippet prop "Property"
|
||||
@property (${1/^(e)$|.*/(?1:r)/}${1:r}${1/^(?:(r)|(e)|(c)|(a))$|.*/(?1:etain)(?2:adonly)(?3:opy)(?4:ssign)/}) ${2:NSSomeClass}$ *${3:${2/^[A-Z](?:[A-Z]+|[a-z]+)([A-Z]\w*)/\l$1/}};
|
||||
endsnippet
|
||||
|
||||
snippet getprefs "Read from defaults (getprefs)"
|
||||
[[NSUserDefaults standardUserDefaults] objectForKey:${1:key}];
|
||||
endsnippet
|
||||
|
||||
snippet obs "Register for Notification"
|
||||
[[NSNotificationCenter defaultCenter] addObserver:${1:self} selector:@selector(${3:${2/^([A-Z]{2})?(.+?)(Notification)?$/\l$2/}}:) name:${2:NSWindowDidBecomeMainNotification} object:${4:nil}];
|
||||
endsnippet
|
||||
|
||||
snippet responds "Responds to Selector"
|
||||
if ([${1:self} respondsToSelector:@selector(${2:someSelector:})])
|
||||
{
|
||||
[$1 ${3:${2/((:\s*$)|(:\s*))/:<>(?3: )/g}}];
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet gsave "Save and Restore Graphics Context (gsave)"
|
||||
[NSGraphicsContext saveGraphicsState];
|
||||
$0
|
||||
[NSGraphicsContext restoreGraphicsState];
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet acc "Scalar Accessors (acc)"
|
||||
- (${1:unsigned int})${2:thing}
|
||||
{
|
||||
return ${3:$2};
|
||||
}
|
||||
|
||||
- (void)set${2/./\u$0/}:(${1:unsigned int})new${2/./\u$0/}
|
||||
{
|
||||
$3 = new${2/./\u$0/};
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet acc "Scalar Accessors Interface (acc)"
|
||||
- (${1:unsigned int})${2:thing};
|
||||
- (void)set${2/./\u$0/}:($1)new${2/./\u$0/};
|
||||
endsnippet
|
||||
|
||||
snippet stracc "String Accessors (stracc)"
|
||||
- (NSString *)${1:thing}
|
||||
{
|
||||
return ${2:$1};
|
||||
}
|
||||
|
||||
- (void)set${1/.*/\u$0/}:(NSString *)/})${3:a${1/.*/\u$0/}}
|
||||
{
|
||||
$3 = [$3 copy];
|
||||
[$2 release];
|
||||
$2 = $3;
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet syn "Synthesize"
|
||||
@synthesize ${1:property};
|
||||
endsnippet
|
||||
|
||||
snippet setprefs "Write to defaults (setprefs)"
|
||||
[[NSUserDefaults standardUserDefaults] setObject:${1:object} forKey:${2:key}];
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,174 @@
|
||||
priority -50
|
||||
|
||||
snippet rs "raise" b
|
||||
raise (${1:Not_found})
|
||||
endsnippet
|
||||
|
||||
snippet open "open"
|
||||
let open ${1:module} in
|
||||
${2:e}
|
||||
endsnippet
|
||||
|
||||
snippet try "try"
|
||||
try ${1:e}
|
||||
with ${2:Not_found} -> ${3:()}
|
||||
endsnippet
|
||||
|
||||
snippet ref "ref"
|
||||
let ${1:name} = ref ${2:val} in
|
||||
${3:e}
|
||||
endsnippet
|
||||
|
||||
snippet matchl "pattern match on a list"
|
||||
match ${1:list} with
|
||||
| [] -> ${2:()}
|
||||
| x::xs -> ${3:()}
|
||||
endsnippet
|
||||
|
||||
snippet matcho "pattern match on an option type"
|
||||
match ${1:x} with
|
||||
| Some(${2:y}) -> ${3:()}
|
||||
| None -> ${4:()}
|
||||
endsnippet
|
||||
|
||||
snippet fun "anonymous function"
|
||||
(fun ${1:x} -> ${2:x})
|
||||
endsnippet
|
||||
|
||||
snippet cc "commment"
|
||||
(* ${1:comment} *)
|
||||
endsnippet
|
||||
|
||||
snippet let "let .. in binding"
|
||||
let ${1:x} = ${2:v} in
|
||||
${3:e}
|
||||
endsnippet
|
||||
|
||||
snippet lr "let rec"
|
||||
let rec ${1:f} =
|
||||
${2:expr}
|
||||
endsnippet
|
||||
|
||||
snippet if "if"
|
||||
if ${1:(* condition *)} then
|
||||
${2:(* A *)}
|
||||
else
|
||||
${3:(* B *)}
|
||||
endsnippet
|
||||
|
||||
snippet If "If"
|
||||
if ${1:(* condition *)} then
|
||||
${2:(* A *)}
|
||||
endsnippet
|
||||
|
||||
snippet while "while"
|
||||
while ${1:(* condition *)} do
|
||||
${2:(* A *)}
|
||||
done
|
||||
endsnippet
|
||||
|
||||
snippet for "for"
|
||||
for ${1:i} = ${2:1} to ${3:10} do
|
||||
${4:(* BODY *)}
|
||||
done
|
||||
endsnippet
|
||||
|
||||
snippet match "match"
|
||||
match ${1:(* e1 *)} with
|
||||
| ${2:p} -> ${3:e2}
|
||||
endsnippet
|
||||
|
||||
snippet Match "match"
|
||||
match ${1:(* e1 *)} with
|
||||
| ${2:p} -> ${3:e2}
|
||||
endsnippet
|
||||
|
||||
snippet class "class"
|
||||
class ${1:name} = object
|
||||
${2:methods}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet obj "obj"
|
||||
object
|
||||
${2:methods}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet Obj "object"
|
||||
object (self)
|
||||
${2:methods}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet {{ "object functional update"
|
||||
{< ${1:x} = ${2:y} >}
|
||||
endsnippet
|
||||
|
||||
snippet beg "beg"
|
||||
begin
|
||||
${1:block}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet ml "module instantiantion with functor"
|
||||
module ${1:Mod} = ${2:Functor}(${3:Arg})
|
||||
endsnippet
|
||||
|
||||
snippet mod "module - no signature"
|
||||
module ${1:(* Name *)} = struct
|
||||
${2:(* BODY *)}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet Mod "module with signature"
|
||||
module ${1:(* Name *)} : ${2:(* SIG *)} = struct
|
||||
${3:(* BODY *)}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet sig "anonymous signature"
|
||||
sig
|
||||
${2:(* BODY *)}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet sigf "functor signature or anonymous functor"
|
||||
functor (${1:Arg} : ${2:ARG}) -> ${3:(* BODY *)}
|
||||
endsnippet
|
||||
|
||||
snippet func "define functor - no signature"
|
||||
module ${1:M} (${2:Arg} : ${3:ARG}) = struct
|
||||
${4:(* BODY *)}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet Func "define functor - with signature"
|
||||
module ${1:M} (${2:Arg} : ${3:ARG}) : ${4:SIG} = struct
|
||||
${5:(* BODY *)}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet mot "Declare module signature"
|
||||
module type ${1:(* Name *)} = sig
|
||||
${2:(* BODY *)}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet module "Module with anonymous signature"
|
||||
module ${1:(* Name *)} : sig
|
||||
${2:(* SIGNATURE *)}
|
||||
end = struct
|
||||
${3:(* BODY *)}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet oo "odoc"
|
||||
(** ${1:odoc} *)
|
||||
endsnippet
|
||||
|
||||
snippet qt "inline qtest"
|
||||
(*$T ${1:name}
|
||||
${2:test}
|
||||
*)
|
||||
endsnippet
|
@ -0,0 +1,132 @@
|
||||
priority -50
|
||||
|
||||
###########################################################################
|
||||
# TextMate Snippets #
|
||||
###########################################################################
|
||||
snippet ife "Conditional if..else (ife)"
|
||||
if ($1) {
|
||||
${2:# body...}
|
||||
}
|
||||
else {
|
||||
${3:# else...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet ifee "Conditional if..elsif..else (ifee)"
|
||||
if ($1) {
|
||||
${2:# body...}
|
||||
}
|
||||
elsif ($3) {
|
||||
${4:# elsif...}
|
||||
}
|
||||
else {
|
||||
${5:# else...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet xunless "Conditional one-line (unless)"
|
||||
${1:expression} unless ${2:condition};
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet xif "Conditional one-line (xif)"
|
||||
${1:expression} if ${2:condition};
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet sub "Function (sub)"
|
||||
sub ${1:function_name} {
|
||||
${2:# body...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet xfore "Loop one-line (xforeach)"
|
||||
${1:expression} foreach @${2:array};
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet xwhile "Loop one-line (xwhile)"
|
||||
${1:expression} while ${2:condition};
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet test "Test"
|
||||
#!/usr/bin/env perl -w
|
||||
|
||||
use strict;
|
||||
use Test::More tests => ${1:1};
|
||||
use ${2:ModuleName};
|
||||
|
||||
ok(${3:assertion});
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet class "class"
|
||||
package ${1:ClassName};
|
||||
|
||||
${2:use parent qw(${3:ParentClass});}${2/.+/\n\n/}sub new {
|
||||
my $class = shift;
|
||||
$class = ref $class if ref $class;
|
||||
my $self = bless {}, $class;
|
||||
$self;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet eval "eval"
|
||||
local $@;
|
||||
eval {
|
||||
${1:# do something risky...}
|
||||
};
|
||||
if (my $${2:exception} = $@) {
|
||||
${3:# handle failure...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet for "for"
|
||||
for (my $${1:var} = 0; $$1 < ${2:expression}; $$1++) {
|
||||
${3:# body...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet fore "foreach"
|
||||
foreach ${1:my $${2:x}} (@${3:array}) {
|
||||
${4:# body...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet if "if"
|
||||
if ($1) {
|
||||
${2:# body...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet slurp "slurp"
|
||||
my $${1:var} = do { local $/ = undef; open my $fh, '<', ${2:$file}; <$fh> };
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet unless "unless"
|
||||
unless ($1) {
|
||||
${2:# body...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet while "while"
|
||||
while ($1) {
|
||||
${2:# body...}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,264 @@
|
||||
priority -50
|
||||
|
||||
## Snippets from SnipMate, taken from
|
||||
## https://github.com/scrooloose/snipmate-snippets.git
|
||||
|
||||
snippet array "array"
|
||||
$${1:arrayName} = array('${2}' => ${3});${4}
|
||||
endsnippet
|
||||
|
||||
snippet def "def"
|
||||
define('${1}'${2});${3}
|
||||
endsnippet
|
||||
|
||||
snippet do "do"
|
||||
do {
|
||||
${2:// code... }
|
||||
} while (${1:/* condition */});"
|
||||
endsnippet
|
||||
|
||||
snippet doc_f "doc_f"
|
||||
/**
|
||||
* $2
|
||||
* @return ${4:void}
|
||||
* @author ${5:`!v g:snips_author`}
|
||||
**/
|
||||
${1:public }function ${2:someFunc}(${3})
|
||||
{${6}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet doc_i "doc_i"
|
||||
/**
|
||||
* $1
|
||||
* @package ${2:default}
|
||||
* @author ${3:`!v g:snips_author`}
|
||||
**/
|
||||
interface ${1:someClass}
|
||||
{${4}
|
||||
} // END interface $1"
|
||||
endsnippet
|
||||
|
||||
snippet else "else"
|
||||
else {
|
||||
${1:// code...}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet for "for"
|
||||
for ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) {
|
||||
${4:// code...}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet foreachk "foreachk"
|
||||
foreach ($${1:variable} as $${2:key} => $${3:value}){
|
||||
${4:// code...}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet get "get"
|
||||
$_GET['${1}']${2}
|
||||
endsnippet
|
||||
|
||||
snippet if "if"
|
||||
if (${1:/* condition */}) {
|
||||
${2:// code...}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet inc "inc"
|
||||
include '${1:file}';${2}
|
||||
endsnippet
|
||||
|
||||
snippet log "log"
|
||||
error_log(var_export(${1}, true));${2}
|
||||
endsnippet
|
||||
|
||||
snippet post "post"
|
||||
$_POST['${1}']${2}
|
||||
endsnippet
|
||||
|
||||
snippet req1 "req1"
|
||||
require_once '${1:file}';${2}
|
||||
endsnippet
|
||||
|
||||
snippet session "session"
|
||||
$_SESSION['${1}']${2}
|
||||
endsnippet
|
||||
|
||||
snippet t "t"
|
||||
$${1:retVal} = (${2:condition}) ? ${3:a} : ${4:b};${5}
|
||||
endsnippet
|
||||
|
||||
snippet var "var"
|
||||
var_export(${1});${2}
|
||||
endsnippet
|
||||
|
||||
snippet getter "PHP Class Getter" b
|
||||
/*
|
||||
* Getter for $1
|
||||
*/
|
||||
public function get${1/\w+\s*/\u$0/}()
|
||||
{
|
||||
return $this->$1;$2
|
||||
}
|
||||
$4
|
||||
endsnippet
|
||||
|
||||
snippet setter "PHP Class Setter" b
|
||||
/*
|
||||
* Setter for $1
|
||||
*/
|
||||
public function set${1/\w+\s*/\u$0/}($$1)
|
||||
{
|
||||
$this->$1 = $$1;$3
|
||||
${4:return $this;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet gs "PHP Class Getter Setter" b
|
||||
/*
|
||||
* Getter for ${1/(\w+)\s*;/$1/}
|
||||
*/
|
||||
public function get${1/(\w+)\s*;/\u$1/}()
|
||||
{
|
||||
return $this->${1/(\w+)\s*;/$1/};$2
|
||||
}
|
||||
|
||||
/*
|
||||
* Setter for ${1/(\w+)\s*;/$1/}
|
||||
*/
|
||||
public function set${1/(\w+)\s*;/\u$1/}($${1/(\w+)\s*;/$1/})
|
||||
{
|
||||
$this->${1/(\w+)\s*;/$1/} = $${1/(\w+)\s*;/$1/};$3
|
||||
${4:return $this;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet pub "Public function" b
|
||||
public function ${1:name}(${2:$param})
|
||||
{
|
||||
${VISUAL}${3:return null;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet pro "Protected function" b
|
||||
protected function ${1:name}(${2:$param})
|
||||
{
|
||||
${VISUAL}${3:return null;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet pri "Private function" b
|
||||
private function ${1:name}(${2:$param})
|
||||
{
|
||||
${VISUAL}${3:return null;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet pubs "Public static function" b
|
||||
public static function ${1:name}(${2:$param})
|
||||
{
|
||||
${VISUAL}${3:return null;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet pros "Protected static function" b
|
||||
protected static function ${1:name}(${2:$param})
|
||||
{
|
||||
${VISUAL}${3:return null;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet pris "Private static function" b
|
||||
private static function ${1:name}(${2:$param})
|
||||
{
|
||||
${VISUAL}${3:return null;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet fu "Function snip" b
|
||||
function ${1:name}(${2:$param})
|
||||
{
|
||||
${VISUAL}${3:return null;}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet fore "Foreach loop"
|
||||
foreach ($${1:variable} as $${3:value}){
|
||||
${VISUAL}${4}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet new "New class instance" b
|
||||
$$1 = new $1($2);
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet ife "if else"
|
||||
if (${1:/* condition */}) {
|
||||
${2:// code...}
|
||||
} else {
|
||||
${3:// code...}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet class "Class declaration template" b
|
||||
/**
|
||||
* Class ${1:`!p snip.rv=snip.fn.split('.')[0]`}
|
||||
* @author ${2:`!v g:snips_author`}
|
||||
*/
|
||||
class $1
|
||||
{
|
||||
public function ${3:__construct}(${4:$options})
|
||||
{
|
||||
${4:// code}
|
||||
}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet construct "__construct()" b
|
||||
/**
|
||||
* @param $2mixed ${1/, /\n * \@param mixed /g}
|
||||
*/
|
||||
public function __construct(${1:$dependencies})
|
||||
{${1/\$(\w+)(, )*/\n $this->$1 = $$1;/g}
|
||||
}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet pr "Dumb debug helper in HTML"
|
||||
echo '<pre>' . var_export($1, 1) . '</pre>';$0
|
||||
endsnippet
|
||||
|
||||
snippet pc "Dumb debug helper in cli"
|
||||
var_export($1);$0
|
||||
endsnippet
|
||||
|
||||
# Symfony 2 based snippets
|
||||
snippet sfa "Symfony 2 Controller action"
|
||||
/**
|
||||
* @Route("/${1:route_name}", name="$1")
|
||||
* @Template()
|
||||
*/
|
||||
public function $1Action($2)
|
||||
{
|
||||
$3
|
||||
return ${4:array();}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
# :vim:ft=snippets:
|
@ -0,0 +1,232 @@
|
||||
priority -50
|
||||
|
||||
#########################################################################
|
||||
# Python helper code #
|
||||
#########################################################################
|
||||
|
||||
global !p
|
||||
import vim
|
||||
import os.path
|
||||
def get_module_namespace_and_basename():
|
||||
"""This function will try to guess the current class or define name you are
|
||||
trying to create. Note that for this to work you should be using the module
|
||||
structure as per the style guide. Examples inputs and it's output
|
||||
* /home/nikolavp/puppet/modules/collectd/manifests/init.pp -> collectd
|
||||
* /home/nikolavp/puppet/modules/collectd/manfistes/mysql.pp -> collectd::mysql
|
||||
"""
|
||||
first_time = True
|
||||
current_file_path_without_ext = vim.eval('expand("%:p:r")') or ""
|
||||
if not current_file_path_without_ext:
|
||||
return "name"
|
||||
parts = os.path.split(current_file_path_without_ext)
|
||||
namespace = ''
|
||||
while parts[0] and parts[0] != '/':
|
||||
if parts[1] == 'init' and first_time and not namespace:
|
||||
first_time = False
|
||||
parts = os.path.split(parts[0])
|
||||
continue
|
||||
if parts[1] == 'manifests':
|
||||
return os.path.split(parts[0])[1] + ('::' + namespace).rstrip(':')
|
||||
else:
|
||||
namespace = parts[1] + '::' + namespace
|
||||
parts = os.path.split(parts[0])
|
||||
# couldn't guess the namespace. The user is editing a raw file in no module like the site.pp file
|
||||
return "name"
|
||||
endglobal
|
||||
|
||||
###############################################################################
|
||||
# Puppet Language Constructs #
|
||||
# See http://docs.puppetlabs.com/puppet/latest/reference/lang_summary.html #
|
||||
###############################################################################
|
||||
|
||||
snippet class "Class declaration" b
|
||||
class ${1:`!p snip.rv = get_module_namespace_and_basename()`} {
|
||||
${0:# body}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet define "Definition" b
|
||||
define ${1:`!p snip.rv = get_module_namespace_and_basename()`} {
|
||||
${0:# body}
|
||||
}
|
||||
endsnippet
|
||||
|
||||
#################################################################
|
||||
# Puppet Types #
|
||||
# See http://docs.puppetlabs.com/references/latest/type.html #
|
||||
#################################################################
|
||||
|
||||
snippet cron "Cron resource type" b
|
||||
cron { '${1:name}':
|
||||
user => ${2:user},
|
||||
command => '${3:command}',
|
||||
minute => ${3:minute},
|
||||
hour => ${4:hour},
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet exec "Exec resource type" b
|
||||
exec { '${1:command}':
|
||||
refreshonly => true,
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet file "File resource type" b
|
||||
file { '${1:name}':
|
||||
source => "puppet://${2:path}",
|
||||
mode => ${3:mode},
|
||||
endsnippet
|
||||
|
||||
snippet File "Defaults for file" b
|
||||
File {
|
||||
owner => ${1:username},
|
||||
group => ${2:groupname},
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet group "Group resource type" b
|
||||
group { '${1:groupname}':
|
||||
ensure => ${3:present},
|
||||
gid => ${2:gid},
|
||||
endsnippet
|
||||
|
||||
snippet mount "Mount resource type" b
|
||||
mount { '${1:path}':
|
||||
device => '${2:/dev}',
|
||||
fstype => '${3:filesystem}',
|
||||
ensure => mounted,
|
||||
options => 'rw,errors=remount-ro',
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet package "Package resource type" b
|
||||
package { '${1:name}':
|
||||
ensure => ${2:installed},
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet user "user resource type" b
|
||||
user { '${1:username}':
|
||||
ensure => ${2:present},
|
||||
uid => ${3:uid},
|
||||
gid => ${4:gid},
|
||||
comment => ${5:gecos},
|
||||
home => ${6:homedirectory},
|
||||
managehome => false,
|
||||
require => Group['${7:group'}],
|
||||
endsnippet
|
||||
|
||||
snippet service "Service resource type" b
|
||||
service { '${1:name}':
|
||||
hasstatus => true,
|
||||
enable => true,
|
||||
ensure => running,
|
||||
}
|
||||
endsnippet
|
||||
|
||||
########################################################################
|
||||
# Puppet Functions #
|
||||
# See http://docs.puppetlabs.com/references/latest/function.html #
|
||||
########################################################################
|
||||
|
||||
snippet alert "Alert Function" b
|
||||
alert("${1:message}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet crit "Crit Function" b
|
||||
crit("${1:message}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet debug "Debug Function" b
|
||||
debug("${1:message}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet defined "Defined Function" b
|
||||
defined(${1:Resource}["${2:name}"])${0}
|
||||
endsnippet
|
||||
|
||||
snippet emerg "Emerg Function" b
|
||||
emerg("${1:message}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet extlookup "Simple Extlookup" b
|
||||
$${1:Variable} = extlookup("${2:Lookup}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet extlookup "Extlookup with defaults" b
|
||||
$${1:Variable} = extlookup("${2:Lookup}", ${3:Default})${0}
|
||||
endsnippet
|
||||
|
||||
snippet extlookup "Extlookup with defaults and custom data file" b
|
||||
$${1:Variable} = extlookup("${2:Lookup}", ${3:Default}, ${4:Data Source})${0}
|
||||
endsnippet
|
||||
|
||||
snippet fail "Fail Function" b
|
||||
fail("${1:message}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet hiera "Hiera Function" b
|
||||
$${1:Variable} = hiera("${2:Lookup}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet hiera "Hiera with defaults" b
|
||||
$${1:Variable} = hiera("${2:Lookup}", ${3:Default})${0}
|
||||
endsnippet
|
||||
|
||||
snippet hiera "Hiera with defaults and override" b
|
||||
$${1:Variable} = hiera("${2:Lookup}", ${3:Default}, ${4:Override})${0}
|
||||
endsnippet
|
||||
|
||||
snippet hiera_hash "Hiera Hash Function" b
|
||||
$${1:Variable} = hiera_hash("${2:Lookup}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet hiera_hash "Hiera Hash with defaults" b
|
||||
$${1:Variable} = hiera_hash("${2:Lookup}", ${3:Default})${0}
|
||||
endsnippet
|
||||
|
||||
snippet hiera_hash "Hiera Hash with defaults and override" b
|
||||
$${1:Variable} = hiera_hash("${2:Lookup}", ${3:Default}, ${4:Override})${0}
|
||||
endsnippet
|
||||
|
||||
snippet hiera_include "Hiera Include Function" b
|
||||
hiera_include("${1:Lookup}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet include "Include Function" b
|
||||
include ${1:classname}${0}
|
||||
endsnippet
|
||||
|
||||
snippet info "Info Function" b
|
||||
info("${1:message}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet inline_template "Inline Template Function" b
|
||||
inline_template("<%= ${1:template} %>")${0}
|
||||
endsnippet
|
||||
|
||||
snippet notice "Notice Function" b
|
||||
notice("${1:message}")${0}
|
||||
endsnippet
|
||||
|
||||
snippet realize "Realize Function" b
|
||||
realize(${1:Resource}["${2:name}"])${0}
|
||||
endsnippet
|
||||
|
||||
snippet regsubst "Regsubst Function" b
|
||||
regsubst($${1:Target}, '${2:regexp}', '${3:replacement}')${0}
|
||||
endsnippet
|
||||
|
||||
snippet split "Split Function" b
|
||||
$${1:Variable} = split($${1:Target}, '${2:regexp}')${0}
|
||||
endsnippet
|
||||
|
||||
snippet versioncmp "Version Compare Function" b
|
||||
$${1:Variable} = versioncmp('${1:version}', '${2:version}')${0}
|
||||
endsnippet
|
||||
|
||||
snippet warning "Warning Function" b
|
||||
warning("${1:message}")${0}
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,533 @@
|
||||
priority -50
|
||||
|
||||
###########################################################################
|
||||
# TEXTMATE SNIPPETS #
|
||||
###########################################################################
|
||||
|
||||
#! header
|
||||
snippet #! "Shebang header for python scripts" b
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet ifmain "ifmain" b
|
||||
if __name__ == '__main__':
|
||||
${1:main()}$0
|
||||
endsnippet
|
||||
|
||||
snippet for "for loop" b
|
||||
for ${1:item} in ${2:iterable}:
|
||||
${3:pass}
|
||||
endsnippet
|
||||
|
||||
##########
|
||||
# COMMON #
|
||||
##########
|
||||
|
||||
# The smart def and smart class snippets use a global option called
|
||||
# "g:ultisnips_python_style" which, if set to "doxygen" will use doxygen
|
||||
# style comments in docstrings.
|
||||
|
||||
global !p
|
||||
|
||||
NORMAL = 0x1
|
||||
DOXYGEN = 0x2
|
||||
SPHINX = 0x3
|
||||
|
||||
SINGLE_QUOTES = 0x1
|
||||
DOUBLE_QUOTES = 0x2
|
||||
|
||||
def get_args(arglist):
|
||||
args = [arg.split('=')[0].strip() for arg in arglist.split(',') if arg]
|
||||
args = [arg for arg in args if arg and arg != "self"]
|
||||
|
||||
return args
|
||||
|
||||
|
||||
def get_quoting_style(snip):
|
||||
style = snip.opt("g:ultisnips_python_quoting_style", "double")
|
||||
if style == 'single':
|
||||
return SINGLE_QUOTES
|
||||
return DOUBLE_QUOTES
|
||||
|
||||
def tripple_quotes(snip):
|
||||
if get_quoting_style(snip) == SINGLE_QUOTES:
|
||||
return "'''"
|
||||
return '"""'
|
||||
|
||||
def get_style(snip):
|
||||
style = snip.opt("g:ultisnips_python_style", "normal")
|
||||
|
||||
if style == "doxygen": return DOXYGEN
|
||||
elif style == "sphinx": return SPHINX
|
||||
else: return NORMAL
|
||||
|
||||
|
||||
def format_arg(arg, style):
|
||||
if style == DOXYGEN:
|
||||
return "@param %s @todo" % arg
|
||||
elif style == SPHINX:
|
||||
return ":param %s: @todo" % arg
|
||||
elif style == NORMAL:
|
||||
return ":%s: @todo" % arg
|
||||
|
||||
|
||||
def format_return(style):
|
||||
if style == DOXYGEN:
|
||||
return "@return: @todo"
|
||||
elif style in (NORMAL, SPHINX):
|
||||
return ":returns: @todo"
|
||||
|
||||
|
||||
def write_docstring_args(args, snip):
|
||||
if not args:
|
||||
snip.rv += ' {0}'.format(tripple_quotes(snip))
|
||||
return
|
||||
|
||||
snip.rv += '\n' + snip.mkline('', indent='')
|
||||
|
||||
style = get_style(snip)
|
||||
|
||||
for arg in args:
|
||||
snip += format_arg(arg, style)
|
||||
|
||||
|
||||
def write_init_body(args, parents, snip):
|
||||
parents = [p.strip() for p in parents.split(",")]
|
||||
parents = [p for p in parents if p != 'object']
|
||||
|
||||
for p in parents:
|
||||
snip += p + ".__init__(self)"
|
||||
|
||||
if parents:
|
||||
snip.rv += '\n' + snip.mkline('', indent='')
|
||||
|
||||
for arg in args:
|
||||
snip += "self._%s = %s" % (arg, arg)
|
||||
|
||||
|
||||
def write_slots_args(args, snip):
|
||||
args = ['"_%s"' % arg for arg in args]
|
||||
snip += '__slots__ = (%s,)' % ', '.join(args)
|
||||
|
||||
endglobal
|
||||
|
||||
########################################
|
||||
# Class & Special Method Name Snippets #
|
||||
########################################
|
||||
|
||||
snippet class "class with docstrings" b
|
||||
class ${1:MyClass}(${2:object}):
|
||||
|
||||
`!p snip.rv = tripple_quotes(snip)`${3:Docstring for $1. }`!p snip.rv = tripple_quotes(snip)`
|
||||
|
||||
def __init__(self$4):
|
||||
`!p snip.rv = tripple_quotes(snip)`${5:@todo: to be defined1.}`!p
|
||||
snip.rv = ""
|
||||
snip >> 2
|
||||
|
||||
args = get_args(t[4])
|
||||
|
||||
write_docstring_args(args, snip)
|
||||
if args:
|
||||
snip.rv += '\n' + snip.mkline('', indent='')
|
||||
snip += '{0}'.format(tripple_quotes(snip))
|
||||
|
||||
write_init_body(args, t[2], snip)
|
||||
`
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet slotclass "class with slots and docstrings" b
|
||||
class ${1:MyClass}(${2:object}):
|
||||
|
||||
`!p snip.rv = tripple_quotes(snip)`${3:Docstring for $1. }`!p snip.rv = tripple_quotes(snip)`
|
||||
`!p
|
||||
snip >> 1
|
||||
args = get_args(t[4])
|
||||
write_slots_args(args, snip)
|
||||
`
|
||||
|
||||
def __init__(self$4):
|
||||
`!p snip.rv = tripple_quotes(snip)`${5:@todo: to be defined.}`!p
|
||||
snip.rv = ""
|
||||
snip >> 2
|
||||
|
||||
args = get_args(t[4])
|
||||
|
||||
write_docstring_args(args, snip)
|
||||
if args:
|
||||
snip.rv += '\n' + snip.mkline('', indent='')
|
||||
snip += tripple_quotes(snip)
|
||||
|
||||
write_init_body(args, t[2], snip)
|
||||
`
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet contain "methods for emulating a container type" b
|
||||
def __len__(self):
|
||||
${1:pass}
|
||||
|
||||
def __getitem__(self, key):
|
||||
${2:pass}
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
${3:pass}
|
||||
|
||||
def __delitem__(self, key):
|
||||
${4:pass}
|
||||
|
||||
def __iter__(self):
|
||||
${5:pass}
|
||||
|
||||
def __reversed__(self):
|
||||
${6:pass}
|
||||
|
||||
def __contains__(self, item):
|
||||
${7:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet context "context manager methods" b
|
||||
def __enter__(self):
|
||||
${1:pass}
|
||||
|
||||
def __exit__(self, exc_type, exc_value, traceback):
|
||||
${2:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet attr "methods for customizing attribute access" b
|
||||
def __getattr__(self, name):
|
||||
${1:pass}
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
${2:pass}
|
||||
|
||||
def __delattr__(self, name):
|
||||
${3:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet desc "methods implementing descriptors" b
|
||||
def __get__(self, instance, owner):
|
||||
${1:pass}
|
||||
|
||||
def __set__(self, instance, value):
|
||||
${2:pass}
|
||||
|
||||
def __delete__(self, instance):
|
||||
${3:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet cmp "methods implementing rich comparison"
|
||||
def __eq__(self, other):
|
||||
${1:pass}
|
||||
|
||||
def __ne__(self, other):
|
||||
${2:pass}
|
||||
|
||||
def __lt__(self, other):
|
||||
${3:pass}
|
||||
|
||||
def __le__(self, other):
|
||||
${4:pass}
|
||||
|
||||
def __gt__(self, other):
|
||||
${5:pass}
|
||||
|
||||
def __ge__(self, other):
|
||||
${6:pass}
|
||||
|
||||
def __cmp__(self, other):
|
||||
${7:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet repr "methods implementing string representation"
|
||||
def __repr__(self):
|
||||
${1:pass}
|
||||
|
||||
def __str__(self):
|
||||
${2:pass}
|
||||
|
||||
def __unicode__(self):
|
||||
${3:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
# note: reflected operands and augmented arithmeitc assignements have been
|
||||
# intentionally ommited to reduce verbosity.
|
||||
snippet numeric "methods for emulating a numeric type" b
|
||||
def __add__(self, other):
|
||||
${1:pass}
|
||||
|
||||
def __sub__(self, other):
|
||||
${2:pass}
|
||||
|
||||
def __mul__(self, other):
|
||||
${3:pass}
|
||||
|
||||
def __div__(self, other):
|
||||
${4:pass}
|
||||
|
||||
def __truediv__(self, other):
|
||||
${5:pass}
|
||||
|
||||
def __floordiv__(self, other):
|
||||
${6:pass}
|
||||
|
||||
|
||||
def __mod__(self, other):
|
||||
${7:pass}
|
||||
|
||||
def __divmod__(self, other):
|
||||
${8:pass}
|
||||
|
||||
def __pow__(self, other):
|
||||
${9:pass}
|
||||
|
||||
|
||||
def __lshift__(self, other):
|
||||
${10:pass}
|
||||
|
||||
def __rshift__(self, other):
|
||||
${11:pass}
|
||||
|
||||
def __and__(self, other):
|
||||
${12:pass}
|
||||
|
||||
def __xor__(self, other):
|
||||
${13:pass}
|
||||
|
||||
def __or__(self, other):
|
||||
${14:pass}
|
||||
|
||||
|
||||
def __neg__(self):
|
||||
${15:pass}
|
||||
|
||||
def __pos__(self):
|
||||
${16:pass}
|
||||
|
||||
def __abs__(self):
|
||||
${17:pass}
|
||||
|
||||
def __invert__(self):
|
||||
${18:pass}
|
||||
|
||||
|
||||
def __complex__(self):
|
||||
${19:pass}
|
||||
|
||||
def __int__(self):
|
||||
${20:pass}
|
||||
|
||||
def __long__(self):
|
||||
${21:pass}
|
||||
|
||||
def __float__(self):
|
||||
${22:pass}
|
||||
|
||||
|
||||
def __oct__(self):
|
||||
${22:pass}
|
||||
|
||||
def __hex__(self):
|
||||
${23:pass}
|
||||
|
||||
|
||||
def __index__(self):
|
||||
${24:pass}
|
||||
|
||||
def __coerce__(self, other):
|
||||
${25:pass}
|
||||
endsnippet
|
||||
|
||||
snippet def "function with docstrings" b
|
||||
def ${1:function}(`!p
|
||||
if snip.indent:
|
||||
snip.rv = 'self' + (", " if len(t[2]) else "")`${2:arg1}):
|
||||
`!p snip.rv = tripple_quotes(snip)`${4:@todo: Docstring for $1.}`!p
|
||||
snip.rv = ""
|
||||
snip >> 1
|
||||
|
||||
args = get_args(t[2])
|
||||
if args:
|
||||
write_docstring_args(args, snip)
|
||||
|
||||
style = get_style(snip)
|
||||
snip += format_return(style)
|
||||
snip.rv += '\n' + snip.mkline('', indent='')
|
||||
snip += tripple_quotes(snip) `
|
||||
${0:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
# doesn't expand when there is a word in front
|
||||
snippet /(^|(?<=\W))\./ "self." r
|
||||
self.
|
||||
endsnippet
|
||||
|
||||
snippet from "from module import name" b
|
||||
from ${1:module} import ${2:Stuff}
|
||||
endsnippet
|
||||
|
||||
|
||||
##############
|
||||
# PROPERTIES #
|
||||
##############
|
||||
snippet roprop "Read Only Property" b
|
||||
@property
|
||||
def ${1:name}(self):
|
||||
${2:return self._$1}$0
|
||||
endsnippet
|
||||
|
||||
snippet rwprop "Read write property" b
|
||||
def ${1:name}():
|
||||
`!p snip.rv = tripple_quotes(snip) if t[2] else ''
|
||||
`${2:@todo: Docstring for $1.}`!p
|
||||
if t[2]:
|
||||
snip >> 1
|
||||
|
||||
style = get_style(snip)
|
||||
snip.rv += '\n' + snip.mkline('', indent='')
|
||||
snip += format_return(style)
|
||||
snip.rv += '\n' + snip.mkline('', indent='')
|
||||
snip += tripple_quotes(snip)
|
||||
else:
|
||||
snip.rv = ""`
|
||||
def fget(self):
|
||||
return self._$1$0
|
||||
|
||||
def fset(self, value):
|
||||
self._$1 = value
|
||||
return locals()
|
||||
|
||||
$1 = property(**$1(), doc=$1.__doc__)
|
||||
endsnippet
|
||||
|
||||
|
||||
####################
|
||||
# If / Else / Elif #
|
||||
####################
|
||||
snippet if "If" b
|
||||
if ${1:condition}:
|
||||
${2:pass}
|
||||
endsnippet
|
||||
|
||||
snippet ife "If / Else" b
|
||||
if ${1:condition}:
|
||||
${2:pass}
|
||||
else:
|
||||
${3:pass}
|
||||
endsnippet
|
||||
|
||||
snippet ifee "If / Elif / Else" b
|
||||
if ${1:condition}:
|
||||
${2:pass}
|
||||
elif ${3:condition}:
|
||||
${4:pass}
|
||||
else:
|
||||
${5:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
##########################
|
||||
# Try / Except / Finally #
|
||||
##########################
|
||||
snippet try "Try / Except" b
|
||||
try:
|
||||
${1:pass}
|
||||
except ${2:Exception}, ${3:e}:
|
||||
${4:raise $3}
|
||||
endsnippet
|
||||
|
||||
snippet try "Try / Except / Else" b
|
||||
try:
|
||||
${1:pass}
|
||||
except ${2:Exception}, ${3:e}:
|
||||
${4:raise $3}
|
||||
else:
|
||||
${5:pass}
|
||||
endsnippet
|
||||
|
||||
snippet try "Try / Except / Finally" b
|
||||
try:
|
||||
${1:pass}
|
||||
except ${2:Exception}, ${3:e}:
|
||||
${4:raise $3}
|
||||
finally:
|
||||
${5:pass}
|
||||
endsnippet
|
||||
|
||||
snippet try "Try / Except / Else / Finally" b
|
||||
try:
|
||||
${1:pass}
|
||||
except${2: ${3:Exception}, ${4:e}}:
|
||||
${5:raise}
|
||||
else:
|
||||
${6:pass}
|
||||
finally:
|
||||
${7:pass}
|
||||
endsnippet
|
||||
|
||||
|
||||
#####################
|
||||
# Assertions & Tests #
|
||||
#####################
|
||||
|
||||
snippet pdb "Set PDB breakpoint" b
|
||||
import pdb; pdb.set_trace()
|
||||
endsnippet
|
||||
|
||||
snippet ipdb "Set IPDB breakpoint" b
|
||||
import ipdb; ipdb.set_trace()
|
||||
endsnippet
|
||||
|
||||
snippet pudb "Set PUDB breakpoint" b
|
||||
import pudb; pudb.set_trace()
|
||||
endsnippet
|
||||
|
||||
snippet ae "Assert equal" b
|
||||
self.assertEqual(${1:first},${2:second})
|
||||
endsnippet
|
||||
|
||||
snippet at "Assert True" b
|
||||
self.assertTrue(${0:exp})
|
||||
endsnippet
|
||||
|
||||
snippet af "Assert False" b
|
||||
self.assertFalse(${1:expression})
|
||||
endsnippet
|
||||
|
||||
snippet aae "Assert almost equal" b
|
||||
self.assertAlmostEqual(${1:first},${2:second})
|
||||
endsnippet
|
||||
|
||||
snippet ar "Assert raises" b
|
||||
self.assertRaises(${1:exception}, ${2:func}${3/.+/, /}${3:arguments})
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet testcase "pyunit testcase" b
|
||||
class Test${1:Class}(${2:unittest.TestCase}):
|
||||
|
||||
`!p snip.rv = tripple_quotes(snip)`${3:Test case docstring.}`!p snip.rv = tripple_quotes(snip)`
|
||||
|
||||
def setUp(self):
|
||||
${4:pass}
|
||||
|
||||
def tearDown(self):
|
||||
${5:pass}
|
||||
|
||||
def test_${6:name}(self):
|
||||
${7:pass}
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,904 @@
|
||||
priority -50
|
||||
|
||||
snippet anaf "accepts_nested_attributes_for"
|
||||
accepts_nested_attributes_for :${1:association_name}${2:${3:, :allow_destroy => true}${4:, :reject_if => proc \{ |obj| ${5:obj.blank?} \}}}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet tcbi "Create binary column"
|
||||
t.binary :${1:title}${2:, :limit => ${3:2}.megabytes}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tcb "Create boolean column"
|
||||
t.boolean :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet cla "Create controller class"
|
||||
class ${1:Model}Controller < ApplicationController
|
||||
before_filter :find_${2:model}
|
||||
|
||||
$0
|
||||
|
||||
private
|
||||
def find_${2}
|
||||
@$2 = ${3:$1}.find(params[:id]) if params[:id]
|
||||
end
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet tcda "Create date column"
|
||||
t.date :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tcdt "Create datetime column"
|
||||
t.datetime :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tcd "Create decimal column"
|
||||
t.decimal :${1:title}${2:${3:, :precision => ${4:10}}${5:, :scale => ${6:2}}}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tcf "Create float column"
|
||||
t.float :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet cla "Create functional test class"
|
||||
require 'test_helper'
|
||||
|
||||
class ${1:Model}ControllerTest < ActionController::TestCase
|
||||
test$0
|
||||
end
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet tci "Create integer column"
|
||||
t.integer :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tcl "Create lock_version column"
|
||||
t.integer :lock_version, :null => false, :default => 0
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
# FIXME: handling literal bracket pair inside of nested tab groups?
|
||||
snippet tcr "Create references column"
|
||||
t.references :${1:taggable}${2:, :polymorphic => ${3:{ :default => '${4:Photo}' \}}}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet resources "Create resources controller class"
|
||||
class ${1:Model}sController < ApplicationController
|
||||
before_filter :find_${1/./\l$0/}, :only => [:show, :edit, :update, :destroy]
|
||||
|
||||
# GET /${1/./\l$0/}s
|
||||
# GET /${1/./\l$0/}s.xml
|
||||
def index
|
||||
@${1/./\l$0/}s = ${1:Model}.all
|
||||
|
||||
respond_to do |wants|
|
||||
wants.html # index.html.erb
|
||||
wants.xml { render :xml => @${1/./\l$0/}s }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /${1/./\l$0/}s/1
|
||||
# GET /${1/./\l$0/}s/1.xml
|
||||
def show
|
||||
respond_to do |wants|
|
||||
wants.html # show.html.erb
|
||||
wants.xml { render :xml => @${1/./\l$0/} }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /${1/./\l$0/}s/new
|
||||
# GET /${1/./\l$0/}s/new.xml
|
||||
def new
|
||||
@${1/./\l$0/} = ${1:Model}.new
|
||||
|
||||
respond_to do |wants|
|
||||
wants.html # new.html.erb
|
||||
wants.xml { render :xml => @${1/./\l$0/} }
|
||||
end
|
||||
end
|
||||
|
||||
# GET /${1/./\l$0/}s/1/edit
|
||||
def edit
|
||||
end
|
||||
|
||||
# POST /${1/./\l$0/}s
|
||||
# POST /${1/./\l$0/}s.xml
|
||||
def create
|
||||
@${1/./\l$0/} = ${1:Model}.new(params[:${1/./\l$0/}])
|
||||
|
||||
respond_to do |wants|
|
||||
if @${1/./\l$0/}.save
|
||||
flash[:notice] = '${1:Model} was successfully created.'
|
||||
wants.html { redirect_to(@${1/./\l$0/}) }
|
||||
wants.xml { render :xml => @${1/./\l$0/}, :status => :created, :location => @${1/./\l$0/} }
|
||||
else
|
||||
wants.html { render :action => "new" }
|
||||
wants.xml { render :xml => @${1/./\l$0/}.errors, :status => :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# PUT /${1/./\l$0/}s/1
|
||||
# PUT /${1/./\l$0/}s/1.xml
|
||||
def update
|
||||
respond_to do |wants|
|
||||
if @${1/./\l$0/}.update_attributes(params[:${1/./\l$0/}])
|
||||
flash[:notice] = '${1:Model} was successfully updated.'
|
||||
wants.html { redirect_to(@${1/./\l$0/}) }
|
||||
wants.xml { head :ok }
|
||||
else
|
||||
wants.html { render :action => "edit" }
|
||||
wants.xml { render :xml => @${1/./\l$0/}.errors, :status => :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# DELETE /${1/./\l$0/}s/1
|
||||
# DELETE /${1/./\l$0/}s/1.xml
|
||||
def destroy
|
||||
@${1/./\l$0/}.destroy
|
||||
|
||||
respond_to do |wants|
|
||||
wants.html { redirect_to(${1/./\l$0/}s_url) }
|
||||
wants.xml { head :ok }
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def find_${1/./\l$0/}
|
||||
@${1/./\l$0/} = ${1:Model}.find(params[:id])
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet tcs "Create string column"
|
||||
t.string :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tct "Create text column"
|
||||
t.text :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tcti "Create time column"
|
||||
t.time :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tcts "Create timestamp column"
|
||||
t.timestamp :${1:title}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet tctss "Create timestamps columns"
|
||||
t.timestamps
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet mcol "Migration Create Column (mcc)"
|
||||
t.column ${1:title}, :${2:string}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet mccc "Migration Create Column Continue (mccc)"
|
||||
t.column ${1:title}, :${2:string}
|
||||
mccc$0
|
||||
endsnippet
|
||||
|
||||
snippet mtab "Migration Drop Create Table (mdct)"
|
||||
drop_table :${1:table}${2: [press tab twice to generate create_table]}
|
||||
endsnippet
|
||||
|
||||
snippet mcol "Migration Remove and Add Column (mrac)"
|
||||
remove_column :${1:table}, :${2:column}${3: [press tab twice to generate add_column]}
|
||||
endsnippet
|
||||
|
||||
snippet rdb "RAILS_DEFAULT_LOGGER.debug (rdb)"
|
||||
RAILS_DEFAULT_LOGGER.debug "${1:message}"$0
|
||||
endsnippet
|
||||
|
||||
snippet tre "Table column(s) rename"
|
||||
t.rename(:${1:old_column_name}, :${2:new_column_name})
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet art "Test Assert Redirected To (art)"
|
||||
assert_redirected_to ${2::action => "${1:index}"}
|
||||
endsnippet
|
||||
|
||||
snippet asre "Test Assert Response (are)"
|
||||
assert_response :${1:success}, @response.body$0
|
||||
endsnippet
|
||||
|
||||
snippet aftc "after_create"
|
||||
after_create $0
|
||||
endsnippet
|
||||
|
||||
snippet aftd "after_destroy"
|
||||
after_destroy $0
|
||||
endsnippet
|
||||
|
||||
snippet afts "after_save"
|
||||
after_save $0
|
||||
endsnippet
|
||||
|
||||
snippet aftu "after_update"
|
||||
after_update $0
|
||||
endsnippet
|
||||
|
||||
snippet aftv "after_validation"
|
||||
after_validation $0
|
||||
endsnippet
|
||||
|
||||
snippet aftvoc "after_validation_on_create"
|
||||
after_validation_on_create $0
|
||||
endsnippet
|
||||
|
||||
snippet aftvou "after_validation_on_update"
|
||||
after_validation_on_update $0
|
||||
endsnippet
|
||||
|
||||
snippet asg "assert(var = assigns(:var))"
|
||||
assert(${1:var} = assigns(:${1}), "Cannot find @${1}")
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet asd "assert_difference"
|
||||
assert_difference "${1:Model}.${2:count}", ${3:1} do
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet asnd "assert_no_difference"
|
||||
assert_no_difference "${1:Model}.${2:count}" do
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet artnpp "assert_redirected_to (nested path plural)"
|
||||
assert_redirected_to ${10:${2:parent}_${3:child}_path(${4:@}${5:${2}})}
|
||||
endsnippet
|
||||
|
||||
snippet artnp "assert_redirected_to (nested path)"
|
||||
assert_redirected_to ${2:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})}
|
||||
endsnippet
|
||||
|
||||
snippet artpp "assert_redirected_to (path plural)"
|
||||
assert_redirected_to ${10:${2:model}s_path}
|
||||
endsnippet
|
||||
|
||||
snippet artp "assert_redirected_to (path)"
|
||||
assert_redirected_to ${2:${12:model}_path(${13:@}${14:${12}})}
|
||||
endsnippet
|
||||
|
||||
snippet asrj "assert_rjs"
|
||||
assert_rjs :${1:replace}, ${2:"${3:dom id}"}
|
||||
endsnippet
|
||||
|
||||
snippet ass "assert_select"
|
||||
assert_select '${1:path}'${2:, :${3:text} => ${4:'${5:inner_html}'}}${6: do
|
||||
$0
|
||||
end}
|
||||
endsnippet
|
||||
|
||||
snippet befc "before_create"
|
||||
before_create $0
|
||||
endsnippet
|
||||
|
||||
snippet befd "before_destroy"
|
||||
before_destroy $0
|
||||
endsnippet
|
||||
|
||||
snippet befs "before_save"
|
||||
before_save $0
|
||||
endsnippet
|
||||
|
||||
snippet befu "before_update"
|
||||
before_update $0
|
||||
endsnippet
|
||||
|
||||
snippet befv "before_validation"
|
||||
before_validation $0
|
||||
endsnippet
|
||||
|
||||
snippet befvoc "before_validation_on_create"
|
||||
before_validation_on_create $0
|
||||
endsnippet
|
||||
|
||||
snippet befvou "before_validation_on_update"
|
||||
before_validation_on_update
|
||||
endsnippet
|
||||
|
||||
snippet bt "belongs_to (bt)"
|
||||
belongs_to :${1:object}${2:, :class_name => "${3:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}", :foreign_key => "${4:${1}_id}"}
|
||||
endsnippet
|
||||
|
||||
snippet crw "cattr_accessor"
|
||||
cattr_accessor :${0:attr_names}
|
||||
endsnippet
|
||||
|
||||
snippet defcreate "def create - resource"
|
||||
def create
|
||||
@${1:model} = ${2:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}.new(params[:$1])
|
||||
$0
|
||||
respond_to do |wants|
|
||||
if @$1.save
|
||||
flash[:notice] = '$2 was successfully created.'
|
||||
wants.html { redirect_to(@$1) }
|
||||
wants.xml { render :xml => @$1, :status => :created, :location => @$1 }
|
||||
else
|
||||
wants.html { render :action => "new" }
|
||||
wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet test "test do..end"
|
||||
test "${1:something interesting}" do
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet deftg "def get request"
|
||||
def test_should_get_${1:action}
|
||||
${2:@${3:model} = ${4:$3s}(:${5:fixture_name})
|
||||
}get :${1}${6:, :id => @$3.to_param}
|
||||
assert_response :success
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet deftp "def post request"
|
||||
def test_should_post_${1:action}
|
||||
${3:@$2 = ${4:$2s}(:${5:fixture_name})
|
||||
}post :${1}${6:, :id => @$2.to_param}, :${2:model} => { $0 }
|
||||
assert_response :redirect
|
||||
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet fina "find(:all)"
|
||||
find(:all${1:, :conditions => ['${2:${3:field} = ?}', ${5:true}]})
|
||||
endsnippet
|
||||
|
||||
snippet finf "find(:first)"
|
||||
find(:first${1:, :conditions => ['${2:${3:field} = ?}', ${5:true}]})
|
||||
endsnippet
|
||||
|
||||
snippet fini "find(id)"
|
||||
find(${1:id})
|
||||
endsnippet
|
||||
|
||||
snippet fine "find_each"
|
||||
find_each(${1::conditions => {:${2:field} => ${3:true}\}}) do |${4:${TM_CURRENT_WORD/(\w+)\./\L$1/g}}|
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet finb "find_in_batches"
|
||||
find_in_batches(${1::conditions => {:${2:field} => ${3:true}\}}) do |${4:${TM_CURRENT_WORD/(\w+)\./\L$1/g}}s|
|
||||
$4s.each do |$4|
|
||||
$0
|
||||
end
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet habtm "has_and_belongs_to_many (habtm)"
|
||||
has_and_belongs_to_many :${1:object}${2:, :join_table => "${3:table_name}", :foreign_key => "${4:${1}_id}"}
|
||||
endsnippet
|
||||
|
||||
snippet hm "has_many (hm)"
|
||||
has_many :${1:object}s${2:, :class_name => "${1}", :foreign_key => "${4:reference}_id"}
|
||||
endsnippet
|
||||
|
||||
snippet hmt "has_many (through)"
|
||||
has_many :${1:objects}, :through => :${2:join_association}${3:, :source => :${4:${2}_table_foreign_key_to_${1}_table}}
|
||||
endsnippet
|
||||
|
||||
snippet hmd "has_many :dependent => :destroy"
|
||||
has_many :${1:object}s${2:, :class_name => "${1}", :foreign_key => "${4:reference}_id"}, :dependent => :destroy$0
|
||||
endsnippet
|
||||
|
||||
snippet ho "has_one (ho)"
|
||||
has_one :${1:object}${2:, :class_name => "${3:${1/[[:alpha:]]+|(_)/(?1::\u$0)/g}}", :foreign_key => "${4:${1}_id}"}
|
||||
endsnippet
|
||||
|
||||
snippet logd "logger.debug"
|
||||
${1:Rails.}logger.debug { "${1:message}" }$0
|
||||
endsnippet
|
||||
|
||||
snippet loge "logger.error"
|
||||
logger.error { "${1:message}" }$0
|
||||
endsnippet
|
||||
|
||||
snippet logf "logger.fatal"
|
||||
logger.fatal { "${1:message}" }$0
|
||||
endsnippet
|
||||
|
||||
snippet logi "logger.info"
|
||||
logger.info { "${1:message}" }$0
|
||||
endsnippet
|
||||
|
||||
snippet logw "logger.warn"
|
||||
logger.warn { "${1:message}" }$0
|
||||
endsnippet
|
||||
|
||||
snippet mp "map(&:sym_proc)"
|
||||
map(&:${1:id})
|
||||
endsnippet
|
||||
|
||||
snippet mapca "map.catch_all"
|
||||
${1:map}.catch_all "*${2:anything}", :controller => "${3:default}", :action => "${4:error}"
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet map "map.named_route"
|
||||
${1:map}.${2:connect} '${3::controller/:action/:id}'
|
||||
endsnippet
|
||||
|
||||
snippet mapr "map.resource"
|
||||
${1:map}.resource :${2:resource}${10: do |${11:$2}|
|
||||
$0
|
||||
end}
|
||||
endsnippet
|
||||
|
||||
snippet maprs "map.resources"
|
||||
${1:map}.resources :${2:resource}${10: do |${11:$2}|
|
||||
$0
|
||||
end}
|
||||
endsnippet
|
||||
|
||||
snippet mapwo "map.with_options"
|
||||
${1:map}.with_options :${2:controller} => '${3:thing}' do |${4:$3}|
|
||||
$0
|
||||
end
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet mrw "mattr_accessor"
|
||||
mattr_accessor :${0:attr_names}
|
||||
endsnippet
|
||||
|
||||
snippet ncl "named_scope lambda"
|
||||
named_scope :name, lambda { |${1:param}| { :conditions => ${3:['${4:${5:field} = ?}', ${6:$1}]} } }
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet nc "named_scope"
|
||||
named_scope :name${1:, :joins => :${2:table}}, :conditions => ${3:['${4:${5:field} = ?}', ${6:true}]}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet dscope "default_scope"
|
||||
default_scope ${1:order(${2:'${3:created_at DESC}'})}
|
||||
endsnippet
|
||||
|
||||
snippet flash "flash[...]"
|
||||
flash[:${1:notice}] = "${2:Successfully created...}"$0
|
||||
endsnippet
|
||||
|
||||
snippet rea "redirect_to (action)"
|
||||
redirect_to :action => "${1:index}"
|
||||
endsnippet
|
||||
|
||||
snippet reai "redirect_to (action, id)"
|
||||
redirect_to :action => "${1:show}", :id => ${0:@item}
|
||||
endsnippet
|
||||
|
||||
snippet rec "redirect_to (controller)"
|
||||
redirect_to :controller => "${1:items}"
|
||||
endsnippet
|
||||
|
||||
snippet reca "redirect_to (controller, action)"
|
||||
redirect_to :controller => "${1:items}", :action => "${2:list}"
|
||||
endsnippet
|
||||
|
||||
snippet recai "redirect_to (controller, action, id)"
|
||||
redirect_to :controller => "${1:items}", :action => "${2:show}", :id => ${0:@item}
|
||||
endsnippet
|
||||
|
||||
snippet renpp "redirect_to (nested path plural)"
|
||||
redirect_to(${2:${10:parent}_${11:child}_path(${12:@}${13:${10}})})
|
||||
endsnippet
|
||||
|
||||
snippet renp "redirect_to (nested path)"
|
||||
redirect_to(${2:${12:parent}_${13:child}_path(${14:@}${15:${12}}, ${16:@}${17:${13}})})
|
||||
endsnippet
|
||||
|
||||
snippet repp "redirect_to (path plural)"
|
||||
redirect_to(${2:${10:model}s_path})
|
||||
endsnippet
|
||||
|
||||
snippet rep "redirect_to (path)"
|
||||
redirect_to(${2:${12:model}_path(${13:@}${14:${12}})})
|
||||
endsnippet
|
||||
|
||||
snippet reb "redirect_to :back"
|
||||
redirect_to :back
|
||||
endsnippet
|
||||
|
||||
snippet ra "render (action)... (ra)"
|
||||
render :action => "${1:action}"
|
||||
endsnippet
|
||||
|
||||
snippet ral "render (action,layout) (ral)"
|
||||
render :action => "${1:action}", :layout => "${2:layoutname}"
|
||||
endsnippet
|
||||
|
||||
snippet rf "render (file) (rf)"
|
||||
render :file => "${1:filepath}"
|
||||
endsnippet
|
||||
|
||||
snippet rfu "render (file,use_full_path) (rfu)"
|
||||
render :file => "${1:filepath}", :use_full_path => ${2:false}
|
||||
endsnippet
|
||||
|
||||
snippet ri "render (inline) (ri)"
|
||||
render :inline => "${1:<%= 'hello' %>}"
|
||||
endsnippet
|
||||
|
||||
snippet ril "render (inline,locals) (ril)"
|
||||
render :inline => "${1:<%= 'hello' %>}", :locals => { ${2::name} => "${3:value}"$4 }
|
||||
endsnippet
|
||||
|
||||
snippet rit "render (inline,type) (rit)"
|
||||
render :inline => "${1:<%= 'hello' %>}", :type => ${2::rxml}
|
||||
endsnippet
|
||||
|
||||
snippet rl "render (layout) (rl)"
|
||||
render :layout => "${1:layoutname}"
|
||||
endsnippet
|
||||
|
||||
snippet rn "render (nothing) (rn)"
|
||||
render :nothing => ${1:true}
|
||||
endsnippet
|
||||
|
||||
snippet rns "render (nothing,status) (rns)"
|
||||
render :nothing => ${1:true}, :status => ${2:401}
|
||||
endsnippet
|
||||
|
||||
snippet rt "render (text) (rt)"
|
||||
render :text => "${1:text to render...}"
|
||||
endsnippet
|
||||
|
||||
snippet rtl "render (text,layout) (rtl)"
|
||||
render :text => "${1:text to render...}", :layout => "${2:layoutname}"
|
||||
endsnippet
|
||||
|
||||
snippet rtlt "render (text,layout => true) (rtlt)"
|
||||
render :text => "${1:text to render...}", :layout => ${2:true}
|
||||
endsnippet
|
||||
|
||||
snippet rts "render (text,status) (rts)"
|
||||
render :text => "${1:text to render...}", :status => ${2:401}
|
||||
endsnippet
|
||||
|
||||
snippet ru "render (update)"
|
||||
render :update do |${2:page}|
|
||||
$2.$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet rest "respond_to"
|
||||
respond_to do |wants|
|
||||
wants.${1:html}${2: { $0 \}}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet resw "respond_with"
|
||||
respond_with(${1:@${2:model}})${3: do |format|
|
||||
format.${4:html} { $0 \}
|
||||
end}
|
||||
endsnippet
|
||||
|
||||
# FIXME
|
||||
snippet returning "returning do |variable| ... end"
|
||||
returning ${1:variable} do${2/(^(?<var>\s*[a-z_][a-zA-Z0-9_]*\s*)(,\g<var>)*,?\s*$)|.*/(?1: |)/}${2:v}${2/(^(?<var>\s*[a-z_][a-zA-Z0-9_]*\s*)(,\g<var>)*,?\s*$)|.*/(?1:|)/}
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.binary (tcbi)"
|
||||
t.binary :${1:title}${2:, :limit => ${3:2}.megabytes}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.boolean (tcb)"
|
||||
t.boolean :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.date (tcda)"
|
||||
t.date :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.datetime (tcdt)"
|
||||
t.datetime :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.decimal (tcd)"
|
||||
t.decimal :${1:title}${2:${3:, :precision => ${4:10}}${5:, :scale => ${6:2}}}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.float (tcf)"
|
||||
t.float :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.integer (tci)"
|
||||
t.integer :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.lock_version (tcl)"
|
||||
t.integer :lock_version, :null => false, :default => 0
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.references (tcr)"
|
||||
t.references :${1:taggable}${2:, :polymorphic => ${3:{ :default => '${4:Photo}' \}}}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.rename (tre)"
|
||||
t.rename(:${1:old_column_name}, :${2:new_column_name})
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.string (tcs)"
|
||||
t.string :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.text (tct)"
|
||||
t.text :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.time (tcti)"
|
||||
t.time :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.timestamp (tcts)"
|
||||
t.timestamp :${1:title}
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet t. "t.timestamps (tctss)"
|
||||
t.timestamps
|
||||
t.$0
|
||||
endsnippet
|
||||
|
||||
snippet vaoif "validates_acceptance_of if"
|
||||
validates_acceptance_of :${1:terms}${2:${3:, :accept => "${4:1}"}${5:, :message => "${6:You must accept the terms of service}"}}, :if => proc { |obj| ${7:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet vao "validates_acceptance_of"
|
||||
validates_acceptance_of :${1:terms}${2:${3:, :accept => "${4:1}"}${5:, :message => "${6:You must accept the terms of service}"}}
|
||||
endsnippet
|
||||
|
||||
snippet va "validates_associated (va)"
|
||||
validates_associated :${1:attribute}${2:, :on => :${3:create}}
|
||||
endsnippet
|
||||
|
||||
snippet vaif "validates_associated if (vaif)"
|
||||
validates_associated :${1:attribute}${2:, :on => :${3:create}, :if => proc { |obj| ${5:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet vc "validates_confirmation_of (vc)"
|
||||
validates_confirmation_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:should match confirmation}"}
|
||||
endsnippet
|
||||
|
||||
snippet vcif "validates_confirmation_of if (vcif)"
|
||||
validates_confirmation_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:should match confirmation}", :if => proc { |obj| ${5:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet ve "validates_exclusion_of (ve)"
|
||||
validates_exclusion_of :${1:attribute}${2:, :in => ${3:%w( ${4:mov avi} )}, :on => :${5:create}, :message => "${6:extension %s is not allowed}"}
|
||||
endsnippet
|
||||
|
||||
snippet veif "validates_exclusion_of if (veif)"
|
||||
validates_exclusion_of :${1:attribute}${2:, :in => ${3:%w( ${4:mov avi} )}, :on => :${5:create}, :message => "${6:extension %s is not allowed}"}, :if => proc { |obj| ${7:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet vfif "validates_format_of if"
|
||||
validates_format_of :${1:attribute}, :with => /${2:^[${3:\w\d}]+\$}/${4:, :on => :${5:create}, :message => "${6:is invalid}"}, :if => proc { |obj| ${7:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet vf "validates_format_of"
|
||||
validates_format_of :${1:attribute}, :with => /${2:^[${3:\w\d}]+\$}/${4:, :on => :${5:create}, :message => "${6:is invalid}"}
|
||||
endsnippet
|
||||
|
||||
snippet viif "validates_inclusion_of if"
|
||||
validates_inclusion_of :${1:attribute}${2:, :in => ${3:%w( ${4:mov avi} )}, :on => :${5:create}, :message => "${6:extension %s is not included in the list}"}, :if => proc { |obj| ${7:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet vi "validates_inclusion_of"
|
||||
validates_inclusion_of :${1:attribute}${2:, :in => ${3:%w( ${4:mov avi} )}, :on => :${5:create}, :message => "${6:extension %s is not included in the list}"}
|
||||
endsnippet
|
||||
|
||||
snippet vl "validates_length_of (vl)"
|
||||
validates_length_of :${1:attribute}, :within => ${2:3..20}${3:, :on => :${4:create}, :message => "${5:must be present}"}
|
||||
endsnippet
|
||||
|
||||
snippet vlif "validates_length_of if"
|
||||
validates_length_of :${1:attribute}, :within => ${2:3..20}${3:, :on => :${4:create}, :message => "${5:must be present}"}, :if => proc { |obj| ${6:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet vnif "validates_numericality_of if"
|
||||
validates_numericality_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:is not a number}"}, :if => proc { |obj| ${5:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet vn "validates_numericality_of"
|
||||
validates_numericality_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:is not a number}"}
|
||||
endsnippet
|
||||
|
||||
snippet vp "validates_presence_of (vp)"
|
||||
validates_presence_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:can't be blank}"}
|
||||
endsnippet
|
||||
|
||||
snippet vpif "validates_presence_of if (vpif) 2"
|
||||
validates_presence_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:can't be blank}"}, :if => proc { |obj| ${5:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet vu "validates_uniqueness_of (vu)"
|
||||
validates_uniqueness_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:must be unique}"}
|
||||
endsnippet
|
||||
|
||||
snippet vuif "validates_uniqueness_of if (vuif)"
|
||||
validates_uniqueness_of :${1:attribute}${2:, :on => :${3:create}, :message => "${4:must be unique}", :if => proc { |obj| ${6:obj.condition?} }}
|
||||
endsnippet
|
||||
|
||||
snippet verify "verify -- render"
|
||||
verify :only => [:$1], :method => :post, :render => {:status => 500, :text => "use HTTP-POST"}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet verify "verify -- redirect"
|
||||
verify :only => [:$1], :session => :user, :params => :id, :redirect_to => {:action => '${2:index}'}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet wants "wants_format"
|
||||
wants.${1:js|xml|html}${2: { $0 \}}
|
||||
endsnippet
|
||||
|
||||
snippet xdelete "xhr delete"
|
||||
xhr :delete, :${1:destroy}, :id => ${2:1}$0
|
||||
endsnippet
|
||||
|
||||
snippet xget "xhr get"
|
||||
xhr :get, :${1:show}${2:, :id => ${3:1}}$0
|
||||
endsnippet
|
||||
|
||||
snippet xpost "xhr post"
|
||||
xhr :post, :${1:create}, :${2:object} => { $3 }
|
||||
endsnippet
|
||||
|
||||
snippet xput "xhr put"
|
||||
xhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { $4 }$0
|
||||
endsnippet
|
||||
|
||||
snippet finl "find(:last)"
|
||||
find(:last${1:, :conditions => ['${2:${3:field} = ?}', ${5:true}]})
|
||||
endsnippet
|
||||
|
||||
snippet sweeper "Create sweeper class"
|
||||
class ${1:Model}Sweeper < ActionController::Caching::Sweeper
|
||||
observe ${1:Model}
|
||||
|
||||
def after_save(${1/./\l$0/})
|
||||
expire_cache(${1/./\l$0/})
|
||||
end
|
||||
|
||||
def after_destroy(${1/./\l$0/})
|
||||
expire_cache(${1/./\l$0/})
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def expire_cache(${1/./\l$0/})
|
||||
${0:expire_page ${1/./\l$0/}s_path
|
||||
expire_page ${1/./\l$0/}_path(${1/./\l$0/})}
|
||||
end
|
||||
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet col "collection routes"
|
||||
collection do
|
||||
${1:get :${2:action}}
|
||||
${3:put :${4:action}}
|
||||
${5:post :${6:action}}
|
||||
${7:delete :${8:action}}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet format "format (respond_with)"
|
||||
format.${1:html|xml|json|js|any} { $0 }
|
||||
endsnippet
|
||||
|
||||
snippet gem "gem"
|
||||
gem '${1:name}'${2:${3:, "${4:1.0}"}${5:${6:, :require => ${7:"${8:$1}"}}${9:, :group => :${10:test}}}}
|
||||
endsnippet
|
||||
|
||||
snippet gemg "gem :git"
|
||||
gem '${1:paperclip}', :git => "${2:git://github.com/thoughtbot/paperclip.git}"${3:, :branch => "${4:rails3}"}
|
||||
endsnippet
|
||||
|
||||
snippet match "match"
|
||||
match '${1:${2::controller}${3:/${4::action}${5:/${6::id}${7:(.:format)}}}}'${8: => '${9:$2}#${10:$4}'${11:, :as => :${12:$10}}}
|
||||
endsnippet
|
||||
|
||||
snippet member "member routes"
|
||||
member do
|
||||
${1:get :${2:action}}
|
||||
${3:put :${4:action}}
|
||||
${5:post :${6:action}}
|
||||
${7:delete :${8:action}}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet res "resources"
|
||||
resources :${1:posts}${2: do
|
||||
$3
|
||||
end}
|
||||
endsnippet
|
||||
|
||||
snippet scope "scope"
|
||||
scope :${1:name}, ${2:joins(:${3:table}).}where(${4:'${5:$3.${6:field}} = ?', ${7:'${8:value}'}})
|
||||
endsnippet
|
||||
|
||||
snippet scopel "scope lambda"
|
||||
scope :${1:name}, lambda { |${2:param}| ${3:where(${4::${5:field} => ${6:"${7:value}"}})} }
|
||||
endsnippet
|
||||
|
||||
snippet scopee "scope with extension"
|
||||
scope :${1:name}, ${2:where(${3::${4:field} => ${5:'${6:value}'}})} do
|
||||
def ${7:method_name}
|
||||
$0
|
||||
end
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet sb "scoped_by"
|
||||
scoped_by_${1:attribute}(${2:id})
|
||||
endsnippet
|
||||
|
||||
snippet setup "setup do..end"
|
||||
setup do
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
snippet trans "Translation snippet"
|
||||
I18n.t('`!v substitute(substitute(substitute(@%, substitute(getcwd() . "/", "\/", "\\\\/", "g"), "", ""), "\\(\\.\\(html\\|js\\)\\.\\(haml\\|erb\\)\\|\\(_controller\\)\\?\\.rb\\)$", "", ""), "/", ".", "g")`.${2:${1/[^\w]/_/g}}${3}', :default => "${1:some_text}"${4})${5:$0}
|
||||
endsnippet
|
||||
|
||||
snippet route_spec
|
||||
it 'routes to #${1:action}' do
|
||||
${2:get}('/${3:url}').should route_to('`!v substitute(expand('%:t:r'), '_routing_spec$', '', '')`#$1'${4:, ${5:params}})${6}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,61 @@
|
||||
priority -50
|
||||
|
||||
###########################################################################
|
||||
# General Stuff #
|
||||
###########################################################################
|
||||
snippet part "Part" b
|
||||
`!p snip.rv = len(t[1])*'#'`
|
||||
${1:Part name}
|
||||
`!p snip.rv = len(t[1])*'#'`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet sec "Section" b
|
||||
${1:Section name}
|
||||
`!p snip.rv = len(t[1])*'='`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet ssec "Subsection" b
|
||||
${1:Section name}
|
||||
`!p snip.rv = len(t[1])*'-'`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet sssec "Subsubsection" b
|
||||
${1:Section name}
|
||||
`!p snip.rv = len(t[1])*'^'`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet chap "Chapter" b
|
||||
`!p snip.rv = len(t[1])*'*'`
|
||||
${1:Chapter name}
|
||||
`!p snip.rv = len(t[1])*'*'`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet para "Paragraph" b
|
||||
${1:Paragraph name}
|
||||
`!p snip.rv = len(t[1])*'"'`
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
###########################################################################
|
||||
# More Specialized Stuff. #
|
||||
###########################################################################
|
||||
snippet cb "Code Block" b
|
||||
.. code-block:: ${1:lua}
|
||||
|
||||
${2:code}
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,570 @@
|
||||
priority -50
|
||||
|
||||
snippet "^#!" "#!/usr/bin/env ruby" r
|
||||
#!/usr/bin/env ruby
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet "^# ?[uU][tT][fF]-?8" "# encoding: UTF-8" r
|
||||
# encoding: UTF-8
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet If "<command> if <expression>"
|
||||
${1:command} if ${0:expression}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet Unless "<command> unless <expression>"
|
||||
${1:command} unless ${0:expression}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet if "if <condition> ... end"
|
||||
if ${1:condition}
|
||||
${2:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet ife "if <condition> ... else ... end"
|
||||
if ${1:condition}
|
||||
${2:# TODO}
|
||||
else
|
||||
${3:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet ifee "if <condition> ... elseif <condition> ... else ... end"
|
||||
if ${1:condition}
|
||||
${2:# TODO}
|
||||
elsif ${3:condition}
|
||||
${4:# TODO}
|
||||
else
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet unless "unless <condition> ... end"
|
||||
unless ${1:condition}
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet unlesse "unless <condition> ... else ... end"
|
||||
unless ${1:condition}
|
||||
${2:# TODO}
|
||||
else
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet unlesee "unless <condition> ... elseif <condition> ... else ... end"
|
||||
unless ${1:condition}
|
||||
${2:# TODO}
|
||||
elsif ${3:condition}
|
||||
${4:# TODO}
|
||||
else
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "\b(de)?f" "def <name>..." r
|
||||
def ${1:function_name}${2: ${3:*args}}
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet defi "def initialize ..."
|
||||
def initialize${1: ${2:*args}}
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet defr "def <name> ... rescue ..."
|
||||
def ${1:function_name}${2: ${3:*args}}
|
||||
${4:# TODO}
|
||||
rescue
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet For "(<from>..<to>).each { |<i>| <block> }"
|
||||
(${1:from}..${2:to}).each { |${3:i}| ${4:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet for "(<from>..<to>).each do |<i>| <block> end"
|
||||
(${1:from}..${2:to}).each do |${3:i}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Merge!" ".merge!(<other_hash>) { |<key>,<oldval>,<newval>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.merge!(${1:other_hash}) { |${2:key},${3:oldval},${4:newval}| ${5:block} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.merge!" ".merge!(<other_hash>) do |<key>,<oldval>,<newval>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.merge!(${1:other_hash}) do |${2:key},${3:oldval},${4:newval}|
|
||||
${0:block}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Del(ete)?_?if" ".delete_if { |<key>,<value>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.delete_if { |${1:key},${2:value}| ${3:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.del(ete)?_?if" ".delete_if do |<key>,<value>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.delete_if do |${1:key},${2:value}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Keep_?if" ".keep_if { |<key>,<value>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.keep_if { |${1:key},${2:value}| ${3:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.keep_?if" ".keep_if do <key>,<value>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.keep_if do |${1:key},${2:value}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Reject" ".reject { |<key>,<value>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.reject { |${1:key},${2:value}| ${3:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.reject" ".reject do <key>,<value>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.reject do |${1:key},${2:value}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Select" ".select { |<item>| <block>}" r
|
||||
`!p snip.rv=match.group(1)`.select { |${1:item}| ${2:block} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.select" ".select do |<item>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.select do |${1:item}|
|
||||
${0:block}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Sort" ".sort { |<a>,<b>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.sort { |${1:a},${2:b}| ${3:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.sort" ".sort do |<a>,<b>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.sort do |${1:a},${2:b}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Each_?k(ey)?" ".each_key { |<key>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.each_key { |${1:key}| ${2:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.each_?k(ey)?" ".each_key do |key| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.each_key do |${1:key}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Each_?val(ue)?" ".each_value { |<value>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.each_value { |${1:value}| ${2:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.each_?val(ue)?" ".each_value do |<value>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.each_value do |${1:value}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet Each "<elements>.each { |<element>| <block> }"
|
||||
${1:elements}.each { |${2:${1/s$//}}| ${3:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet each "<elements>.each do |<element>| <block> end"
|
||||
${1:elements}.each do |${2:${1/s$//}}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "each_?s(lice)?" "<array>.each_slice(n) do |slice| <block> end" r
|
||||
${1:elements}.each_slice(${2:2}) do |${3:slice}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "Each_?s(lice)?" "<array>.each_slice(n) { |slice| <block> }" r
|
||||
${1:elements}.each_slice(${2:2}) { |${3:slice}| ${0:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Map" ".map { |<element>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.map { |${1:`!p
|
||||
element_name = match.group(1).lstrip('$@')
|
||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
||||
try:
|
||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
||||
snip.rv = wmatch.group(1).lower()
|
||||
except:
|
||||
snip.rv = 'element'
|
||||
`}| ${2:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.map" ".map do |<element>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.map do |${1:`!p
|
||||
element_name = match.group(1).lstrip('$@')
|
||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
||||
try:
|
||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
||||
snip.rv = wmatch.group(1).lower()
|
||||
except:
|
||||
snip.rv = 'element'
|
||||
`}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Rev(erse)?_?each" ".reverse_each { |<element>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.reverse_each { |${1:`!p
|
||||
element_name = match.group(1).lstrip('$@')
|
||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
||||
try:
|
||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
||||
snip.rv = wmatch.group(1).lower()
|
||||
except:
|
||||
snip.rv = 'element'
|
||||
`}| ${2:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.rev(erse)?_?each" ".reverse_each do |<element>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.reverse_each do |${1:`!p
|
||||
element_name = match.group(1).lstrip('$@')
|
||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
||||
try:
|
||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
||||
snip.rv = wmatch.group(1).lower()
|
||||
except:
|
||||
snip.rv = 'element'
|
||||
`}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Each" ".each { |<element>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.each { |${1:`!p
|
||||
element_name = match.group(1).lstrip('$@')
|
||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
||||
try:
|
||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
||||
snip.rv = wmatch.group(1).lower()
|
||||
except:
|
||||
snip.rv = 'element'
|
||||
`}| ${2:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.each" ".each do |<element>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.each do |${1:`!p
|
||||
element_name = match.group(1).lstrip('$@')
|
||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
||||
try:
|
||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
||||
snip.rv = wmatch.group(1).lower()
|
||||
except:
|
||||
snip.rv = 'element'
|
||||
`}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Each_?w(ith)?_?i(ndex)?" ".each_with_index { |<element>,<i>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.each_with_index { |${1:`!p
|
||||
element_name = match.group(1).lstrip('$@')
|
||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
||||
try:
|
||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
||||
snip.rv = wmatch.group(1).lower()
|
||||
except:
|
||||
snip.rv = 'element'
|
||||
`},${2:i}| ${3:# TODO} }$0
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.each_?w(ith)?_?i(ndex)?" ".each_with_index do |<element>,<i>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.each_with_index do |${1:`!p
|
||||
element_name = match.group(1).lstrip('$@')
|
||||
ematch = re.search("([A-Za-z][A-Za-z0-9_]+?)s?[^A-Za-z0-9_]*?$", element_name)
|
||||
try:
|
||||
wmatch = re.search("([A-Za-z][A-Za-z0-9_]+)$", ematch.group(1))
|
||||
snip.rv = wmatch.group(1).lower()
|
||||
except:
|
||||
snip.rv = 'element'
|
||||
`},${2:i}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Each_?p(air)?" ".each_pair { |<key>,<value>| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.each_pair { |${1:key},${2:value}| ${3:# TODO} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.each_?p(air)?" ".each_pair do |<key>,<value>| <block> end" r
|
||||
`!p snip.rv=match.group(1)`.each_pair do |${1:key},${2:value}|
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.sub" ".sub(<expression>) { <block> }" r
|
||||
`!p snip.rv=match.group(1)`.sub(${1:expression}) { ${2:"replace_with"} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.gsub" ".gsub(<expression>) { <block> }" r
|
||||
`!p snip.rv=match.group(1)`.gsub(${1:expression}) { ${2:"replace_with"} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.index" ".index { |item| <block> }" r
|
||||
`!p snip.rv=match.group(1)`.index { |${1:item}| ${2:block} }
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "(\S+)\.Index" ".index do |item| ... end" r
|
||||
`!p snip.rv=match.group(1)`.index do |${1:item}|
|
||||
${0:block}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet do "do |<key>| ... end" i
|
||||
do |${1:args}|
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet Do "do ... end" i
|
||||
do
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
snippet until "until <expression> ... end"
|
||||
until ${1:expression}
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet Until "begin ... end until <expression>"
|
||||
begin
|
||||
${0:# TODO}
|
||||
end until ${1:expression}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet while "while <expression> ... end"
|
||||
while ${1:expression}
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet While "begin ... end while <expression>"
|
||||
begin
|
||||
${0:# TODO}
|
||||
end while ${1:expression}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "\b(r|attr)" "attr_reader :<attr_names>" r
|
||||
attr_reader :${0:attr_names}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "\b(w|attr)" "attr_writer :<attr_names>" r
|
||||
attr_writer :${0:attr_names}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "\b(rw|attr)" "attr_accessor :<attr_names>" r
|
||||
attr_accessor :${0:attr_names}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet begin "begin ... rescue ... end"
|
||||
begin
|
||||
${1:# TODO}
|
||||
rescue
|
||||
${0:# TODO}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet begin "begin ... rescue ... else ... ensure ... end"
|
||||
begin
|
||||
${1:# Raise exception}
|
||||
rescue Exception => e
|
||||
puts e.message
|
||||
puts e.backtrace.inspect
|
||||
${2:# Rescue}
|
||||
else
|
||||
${3:# other exception}
|
||||
ensure
|
||||
${0:# always excute}
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet rescue
|
||||
rescue Exception => e
|
||||
puts e.message
|
||||
puts e.backtrace.inspect
|
||||
${0:# Rescue}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet "\b(case|sw(itch)?)" "case <variable> when <expression> ... end" r
|
||||
case ${1:variable}
|
||||
when ${2:expression}
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet alias "alias :<new_name> :<old_name>"
|
||||
alias :${1:new_name} :${2:old_name}
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet class "class <class_name> def initialize ... end end"
|
||||
class ${1:class_name}
|
||||
def initialize ${2:*args}
|
||||
$0
|
||||
end
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet module "module"
|
||||
module ${1:module_name}
|
||||
$0
|
||||
end
|
||||
endsnippet
|
||||
|
||||
|
||||
|
||||
snippet ###
|
||||
=begin
|
||||
$0
|
||||
=end
|
||||
endsnippet
|
||||
|
||||
# vim: set ts=2 sw=2 expandtab:
|
@ -0,0 +1,55 @@
|
||||
priority -50
|
||||
|
||||
snippet /@?imp/ "@import '...';" br
|
||||
@import '${1:file}';
|
||||
endsnippet
|
||||
|
||||
snippet /@?inc/ "@include mixin(...);" br
|
||||
@include ${1:mixin}(${2:arguments});
|
||||
endsnippet
|
||||
|
||||
snippet /@?ext?/ "@extend %placeholder;" br
|
||||
@extend %${1:placeholder};
|
||||
endsnippet
|
||||
|
||||
snippet /@?mixin/ "@mixin (...) { ... }" br
|
||||
@mixin ${1:name}(${2:arguments}) {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /@?fun/ "@function (...) { ... }" br
|
||||
@function ${1:name}(${2:arguments}) {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /@?if/ "@if (...) { ... }" br
|
||||
@if ${1:condition} {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /(} )?@?else/ "@else { ... }" br
|
||||
@else ${1:condition} {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /@?for/ "@for loop" br
|
||||
@for ${1:$i} from ${2:1} through ${3:3} {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /@?each/ "@each loop" br
|
||||
@each ${1:$item} in ${2:item, item, item} {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
||||
|
||||
snippet /@?while/ "@while loop" br
|
||||
@while ${1:$i} ${2:>} ${3:0} {
|
||||
${VISUAL}$0
|
||||
}
|
||||
endsnippet
|
@ -0,0 +1,92 @@
|
||||
priority -50
|
||||
|
||||
global !p
|
||||
import vim
|
||||
|
||||
# Tests for the existence of a variable declared by Vim's filetype detection
|
||||
# suggesting the type of shell script of the current file
|
||||
def testShell(scope, shell):
|
||||
return vim.eval("exists('" + scope + ":is_" + shell + "')")
|
||||
|
||||
# Loops over the possible variables, checking for global variables
|
||||
# first since they indicate an override by the user.
|
||||
def getShell():
|
||||
for scope in ["g", "b"]:
|
||||
for shell in ["bash", "posix", "sh", "kornshell"]:
|
||||
if testShell(scope, shell) == "1":
|
||||
if shell == "kornshell":
|
||||
return "ksh"
|
||||
if shell == "posix":
|
||||
return "sh"
|
||||
return shell
|
||||
return "sh"
|
||||
endglobal
|
||||
|
||||
###########################################################################
|
||||
# TextMate Snippets #
|
||||
###########################################################################
|
||||
snippet #!
|
||||
`!p snip.rv = '#!/bin/' + getShell() + "\n\n" `
|
||||
endsnippet
|
||||
|
||||
snippet !env "#!/usr/bin/env (!env)"
|
||||
`!p snip.rv = '#!/usr/bin/env ' + getShell() + "\n\n" `
|
||||
endsnippet
|
||||
|
||||
snippet temp "Tempfile"
|
||||
${1:TMPFILE}="$(mktemp -t ${2:`!p
|
||||
snip.rv = re.sub(r'[^a-zA-Z]', '_', snip.fn) or "untitled"
|
||||
`})"
|
||||
${3:${4/(.+)/trap "/}${4:rm -f '$${1/.*\s//}'}${4/(.+)/" 0 # EXIT\n/}${5/(.+)/trap "/}${5:rm -f '$${1/.*\s//}'; exit 1}${5/(.+)/" 2 # INT\n/}${6/(.+)/trap "/}${6:rm -f '$${1/.*\s//}'; exit 1}${6/(.+)/" 1 15 # HUP TERM\n/}}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet case "case .. esac (case)"
|
||||
case ${1:word} in
|
||||
${2:pattern} )
|
||||
$0;;
|
||||
esac
|
||||
endsnippet
|
||||
|
||||
snippet elif "elif .. (elif)"
|
||||
elif ${2:[[ ${1:condition} ]]}; then
|
||||
${0:#statements}
|
||||
endsnippet
|
||||
|
||||
snippet for "for ... done (for)"
|
||||
for (( i = 0; i < ${1:10}; i++ )); do
|
||||
${0:#statements}
|
||||
done
|
||||
endsnippet
|
||||
|
||||
snippet forin "for ... in ... done (forin)"
|
||||
for ${1:i}${2/.+/ in /}${2:words}; do
|
||||
${0:#statements}
|
||||
done
|
||||
endsnippet
|
||||
|
||||
snippet here "here document (here)"
|
||||
<<-${2:'${1:TOKEN}'}
|
||||
$0
|
||||
${1/['"`](.+)['"`]/$1/}
|
||||
endsnippet
|
||||
|
||||
snippet if "if ... then (if)"
|
||||
if ${2:[[ ${1:condition} ]]}; then
|
||||
${0:#statements}
|
||||
fi
|
||||
endsnippet
|
||||
|
||||
snippet until "until ... (done)"
|
||||
until ${2:[[ ${1:condition} ]]}; do
|
||||
${0:#statements}
|
||||
done
|
||||
endsnippet
|
||||
|
||||
snippet while "while ... (done)"
|
||||
while ${2:[[ ${1:condition} ]]}; do
|
||||
${0:#statements}
|
||||
done
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,21 @@
|
||||
priority -50
|
||||
|
||||
# We use a little hack so that the snippet is expanded
|
||||
# and parsed correctly
|
||||
snippet snip "Snippet definition" b
|
||||
`!p snip.rv = "snippet"` ${1:Tab_trigger} "${2:Description}" ${3:b}
|
||||
$0
|
||||
`!p snip.rv = "endsnippet"`
|
||||
endsnippet
|
||||
|
||||
snippet global "Global snippet" b
|
||||
`!p snip.rv = "global"` !p
|
||||
$0
|
||||
`!p snip.rv = "endglobal"`
|
||||
endsnippet
|
||||
|
||||
snippet vis "${VISUAL}" i
|
||||
\$\{VISUAL${1:${2:default}${3:/transform/}}\}
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,52 @@
|
||||
priority -50
|
||||
|
||||
###########################################################################
|
||||
# TEXTMATE SNIPPETS #
|
||||
###########################################################################
|
||||
snippet for "for... (for)" b
|
||||
for {${1:set i 0}} {${2:\$i < \$n}} {${3:incr i}} {
|
||||
${4}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet foreach "foreach... (foreach)"
|
||||
foreach ${1:var} ${2:\$list} {
|
||||
${3}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet if "if... (if)" b
|
||||
if {${1:condition}} {
|
||||
${2}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet proc "proc... (proc)" b
|
||||
proc ${1:name} {${2:args}} \
|
||||
{
|
||||
${3}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet switch "switch... (switch)" b
|
||||
switch ${1:-exact} -- ${2:\$var} {
|
||||
${3:match} {
|
||||
${4}
|
||||
}
|
||||
default {${5}}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet while "while... (while)" b
|
||||
while {${1:condition}} {
|
||||
${2}
|
||||
}
|
||||
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,110 @@
|
||||
priority -50
|
||||
|
||||
extends texmath
|
||||
|
||||
snippet "b(egin)?" "begin{} / end{}" br
|
||||
\begin{${1:something}}
|
||||
${0:${VISUAL}}
|
||||
\end{$1}
|
||||
endsnippet
|
||||
|
||||
snippet tab
|
||||
\begin{${1:t}${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}{${2:c}}
|
||||
$0${2/((?<=.)c|l|r)|./(?1: & )/g}
|
||||
\end{$1${1/(t)$|(a)$|(.*)/(?1:abular)(?2:rray)/}}
|
||||
endsnippet
|
||||
|
||||
snippet fig "Figure environment" b
|
||||
\begin{figure}${2:[htpb]}
|
||||
\centering
|
||||
\includegraphics[width=${3:0.8}\linewidth]{${4:name.ext}}
|
||||
\caption{${4/(\w+)\.\w+/\u$1/}$0}
|
||||
\label{fig:${4/(\w+)\.\w+/$1/}}
|
||||
\end{figure}
|
||||
endsnippet
|
||||
|
||||
snippet enum "Enumerate" b
|
||||
\begin{enumerate}
|
||||
\item $0
|
||||
\end{enumerate}
|
||||
endsnippet
|
||||
|
||||
snippet item "Itemize" b
|
||||
\begin{itemize}
|
||||
\item $0
|
||||
\end{itemize}
|
||||
endsnippet
|
||||
|
||||
snippet desc "Description" b
|
||||
\begin{description}
|
||||
\item[$1] $0
|
||||
\end{description}
|
||||
endsnippet
|
||||
|
||||
snippet it "Individual item" b
|
||||
\item ${1}
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet part "Part" b
|
||||
\part{${1:part name}}
|
||||
\label{prt:${2:${1/(\w+)|\W+/(?1:\L$0\E:_)/ga}}}
|
||||
|
||||
${0}
|
||||
endsnippet
|
||||
|
||||
snippet cha "Chapter" b
|
||||
\chapter{${1:chapter name}}
|
||||
\label{cha:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
||||
|
||||
${0}
|
||||
endsnippet
|
||||
|
||||
snippet sec "Section" b
|
||||
\section{${1:section name}}
|
||||
\label{sec:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
||||
|
||||
${0}
|
||||
endsnippet
|
||||
|
||||
snippet sub "Subsection" b
|
||||
\subsection{${1:subsection name}}
|
||||
\label{sub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
||||
|
||||
${0}
|
||||
endsnippet
|
||||
|
||||
snippet ssub "Subsubsection" b
|
||||
\subsubsection{${1:subsubsection name}}
|
||||
\label{ssub:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
||||
|
||||
${0}
|
||||
endsnippet
|
||||
|
||||
snippet par "Paragraph" b
|
||||
\paragraph{${1:paragraph name}}
|
||||
\label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
||||
|
||||
${0}
|
||||
endsnippet
|
||||
|
||||
snippet subp "Subparagraph" b
|
||||
\subparagraph{${1:subparagraph name}}
|
||||
\label{par:${2:${1/\\\w+\{(.*?)\}|\\(.)|(\w+)|([^\w\\]+)/(?4:_:\L$1$2$3\E)/ga}}}
|
||||
|
||||
${0}
|
||||
endsnippet
|
||||
|
||||
snippet ni "Non-indented paragraph" b
|
||||
\noindent
|
||||
${0}
|
||||
endsnippet
|
||||
|
||||
snippet pac "Package" b
|
||||
\usepackage[${1:options}]{${2:package}}$0
|
||||
endsnippet
|
||||
|
||||
snippet lp "Long parenthesis"
|
||||
\left(${1:${VISUAL:contents}}\right)$0
|
||||
endsnippet
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,56 @@
|
||||
priority -50
|
||||
|
||||
##############
|
||||
# MATH STUFF #
|
||||
##############
|
||||
snippet eq "Equation" b
|
||||
\begin{equation}
|
||||
$0
|
||||
\end{equation}
|
||||
endsnippet
|
||||
|
||||
snippet eqnn "Equation without number" b
|
||||
\begin{equation*}
|
||||
$0
|
||||
\end{equation*}
|
||||
endsnippet
|
||||
|
||||
snippet eqa "Equation array" b
|
||||
\begin{eqnarray}
|
||||
$1 & $2 & $0
|
||||
\end{eqnarray}
|
||||
endsnippet
|
||||
|
||||
snippet eqann "Equation array without numbers" b
|
||||
\begin{eqnarray*}
|
||||
$1 & $2 & $0
|
||||
\end{eqnarray*}
|
||||
|
||||
endsnippet
|
||||
snippet frac "Fraction" w
|
||||
\frac{${1:${VISUAL:nom}}}{${2:denom}}
|
||||
endsnippet
|
||||
|
||||
snippet mat "Smart Matrix"
|
||||
\begin{${1:p/b/v/V/B/small}matrix}
|
||||
$0
|
||||
\end{$1matrix}
|
||||
endsnippet
|
||||
|
||||
snippet lr( "left( right)" w
|
||||
\left( ${1:${VISUAL}} \right)
|
||||
endsnippet
|
||||
|
||||
snippet lr| "left| right|" w
|
||||
\left| ${1:${VISUAL}} \right|
|
||||
endsnippet
|
||||
|
||||
snippet lr{ "left\{ right\}" w
|
||||
\left\\{ ${1:${VISUAL}} \right\\}
|
||||
endsnippet
|
||||
|
||||
snippet lr[ "left[ right]" w
|
||||
\left[ ${1:${VISUAL}} \right]
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,60 @@
|
||||
priority -50
|
||||
|
||||
###########################################################################
|
||||
# SnipMate Snippets #
|
||||
###########################################################################
|
||||
snippet header
|
||||
" File: ${1:`!v expand('%:t')`}
|
||||
" Author: ${2:`!v g:snips_author`}
|
||||
" Description: ${3}
|
||||
${4:" Last Modified: `!v strftime("%B %d, %Y")`}
|
||||
|
||||
$0
|
||||
endsnippet
|
||||
|
||||
snippet gvar "Global / configuration variable"
|
||||
if !exists("g:${1:MyUltraImportantVar}")
|
||||
let g:$1 = ${2:"${3:<tab>}"}
|
||||
endif
|
||||
endsnippet
|
||||
|
||||
snippet guard
|
||||
if exists('${1:did_`!p snip.rv = snip.fn.replace('.','_')`}') || &cp${2: || version < 700}
|
||||
finish
|
||||
endif
|
||||
let $1 = 1${3}
|
||||
endsnippet
|
||||
|
||||
snippet f
|
||||
fun ${1:function_name}(${2})
|
||||
${3:" code}
|
||||
endf
|
||||
endsnippet
|
||||
|
||||
snippet for
|
||||
for ${1:needle} in ${2:haystack}
|
||||
${3:" code}
|
||||
endfor
|
||||
endsnippet
|
||||
|
||||
snippet wh
|
||||
while ${1:condition}
|
||||
${2:" code}
|
||||
endw
|
||||
endsnippet
|
||||
|
||||
snippet if
|
||||
if ${1:condition}
|
||||
${2:" code}
|
||||
endif
|
||||
endsnippet
|
||||
|
||||
snippet ife
|
||||
if ${1:condition}
|
||||
${2}
|
||||
else
|
||||
${3}
|
||||
endif
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,3 @@
|
||||
priority -50
|
||||
|
||||
extends html
|
@ -0,0 +1,16 @@
|
||||
priority -50
|
||||
|
||||
snippet xml "XML declaration" b
|
||||
<?xml version="1.0"?>
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet t "Simple tag" b
|
||||
<${1:tag}>
|
||||
${2:content}
|
||||
</${1/([\w:._-]+).*/$1/}>
|
||||
endsnippet
|
||||
|
||||
snippet ti "Inline tag" b
|
||||
<${1:tag}>${2:content}</${1/([\w:._-]+).*/$1/}>
|
||||
endsnippet
|
@ -0,0 +1,17 @@
|
||||
priority -50
|
||||
|
||||
extends sh
|
||||
|
||||
priority -49
|
||||
|
||||
snippet #! "shebang" b
|
||||
#!/bin/zsh
|
||||
|
||||
endsnippet
|
||||
|
||||
snippet !env "#!/usr/bin/env (!env)" b
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
endsnippet
|
||||
|
||||
# vim:ft=snippets:
|
@ -0,0 +1,13 @@
|
||||
" File: UltiSnips_after.vim
|
||||
" Author: Holger Rapp <SirVer@gmx.de>
|
||||
" Description: Called after everything else to reclaim keys (Needed for
|
||||
" Supertab)
|
||||
" Last Modified: July 27, 2009
|
||||
|
||||
if exists('did_UltiSnips_after') || &cp || version < 700
|
||||
finish
|
||||
endif
|
||||
|
||||
call UltiSnips#map_keys#MapKeys()
|
||||
|
||||
let did_UltiSnips_after=1
|
@ -0,0 +1,188 @@
|
||||
" File: UltiSnips.vim
|
||||
" Author: Holger Rapp <SirVer@gmx.de>
|
||||
" Description: The Ultimate Snippets solution for Vim
|
||||
|
||||
if exists('did_UltiSnips_autoload') || &cp || version < 700
|
||||
finish
|
||||
endif
|
||||
|
||||
" Define dummy version of function called by autocommand setup in
|
||||
" ftdetect/UltiSnips.vim. If the function isn't defined (probably due to
|
||||
" using a copy of vim without python support) it will cause an error anytime a
|
||||
" new file is opened.
|
||||
function! UltiSnips#FileTypeChanged()
|
||||
endfunction
|
||||
|
||||
if !exists("g:UltiSnipsUsePythonVersion")
|
||||
let g:_uspy=":py3 "
|
||||
if !has("python3")
|
||||
if !has("python")
|
||||
if !exists("g:UltiSnipsNoPythonWarning")
|
||||
echo "UltiSnips requires py >= 2.6 or any py3"
|
||||
endif
|
||||
finish
|
||||
endif
|
||||
let g:_uspy=":py "
|
||||
endif
|
||||
let g:UltiSnipsUsePythonVersion = "<tab>"
|
||||
else
|
||||
if g:UltiSnipsUsePythonVersion == 2
|
||||
let g:_uspy=":py "
|
||||
else
|
||||
let g:_uspy=":py3 "
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
" FUNCTIONS {{{
|
||||
function! s:compensate_for_pum()
|
||||
""" The CursorMovedI event is not triggered while the popup-menu is visible,
|
||||
""" and it's by this event that UltiSnips updates its vim-state. The fix is
|
||||
""" to explicitly check for the presence of the popup menu, and update
|
||||
""" the vim-state accordingly.
|
||||
if pumvisible()
|
||||
exec g:_uspy "UltiSnips_Manager._cursor_moved()"
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#Edit(...)
|
||||
if a:0 == 1 && a:1 != ''
|
||||
let type = a:1
|
||||
else
|
||||
exec g:_uspy "vim.command(\"let type = '%s'\" % UltiSnips_Manager._primary_filetype)"
|
||||
endif
|
||||
exec g:_uspy "vim.command(\"let file = '%s'\" % UltiSnips_Manager._file_to_edit(vim.eval(\"type\")))"
|
||||
|
||||
let mode = 'e'
|
||||
if exists('g:UltiSnipsEditSplit')
|
||||
if g:UltiSnipsEditSplit == 'vertical'
|
||||
let mode = 'vs'
|
||||
elseif g:UltiSnipsEditSplit == 'horizontal'
|
||||
let mode = 'sp'
|
||||
endif
|
||||
endif
|
||||
exe ':'.mode.' '.file
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#AddFiletypes(filetypes)
|
||||
exec g:_uspy "UltiSnips_Manager.add_buffer_filetypes('" . a:filetypes . ".all')"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#FileTypeComplete(arglead, cmdline, cursorpos)
|
||||
let ret = {}
|
||||
let items = map(
|
||||
\ split(globpath(&runtimepath, 'syntax/*.vim'), '\n'),
|
||||
\ 'fnamemodify(v:val, ":t:r")'
|
||||
\ )
|
||||
call insert(items, 'all')
|
||||
for item in items
|
||||
if !has_key(ret, item) && item =~ '^'.a:arglead
|
||||
let ret[item] = 1
|
||||
endif
|
||||
endfor
|
||||
|
||||
return sort(keys(ret))
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#ExpandSnippet()
|
||||
exec g:_uspy "UltiSnips_Manager.expand()"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#ExpandSnippetOrJump()
|
||||
call s:compensate_for_pum()
|
||||
exec g:_uspy "UltiSnips_Manager.expand_or_jump()"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#ListSnippets()
|
||||
exec g:_uspy "UltiSnips_Manager.list_snippets()"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#SnippetsInCurrentScope()
|
||||
let g:current_ulti_dict = {}
|
||||
exec g:_uspy "UltiSnips_Manager.snippets_in_current_scope()"
|
||||
return g:current_ulti_dict
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#SaveLastVisualSelection()
|
||||
exec g:_uspy "UltiSnips_Manager._save_last_visual_selection()"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#JumpBackwards()
|
||||
call s:compensate_for_pum()
|
||||
exec g:_uspy "UltiSnips_Manager.jump_backwards()"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#JumpForwards()
|
||||
call s:compensate_for_pum()
|
||||
exec g:_uspy "UltiSnips_Manager.jump_forwards()"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#FileTypeChanged()
|
||||
exec g:_uspy "UltiSnips_Manager.reset_buffer_filetypes()"
|
||||
exec g:_uspy "UltiSnips_Manager.add_buffer_filetypes('" . &ft . "')"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
|
||||
function! UltiSnips#AddSnippet(trigger, value, description, options, ...)
|
||||
" Takes the same arguments as SnippetManager.add_snippet.
|
||||
echoerr "Deprecated UltiSnips#AddSnippet called. Please use UltiSnips#AddSnippetWithPriority." | sleep 1
|
||||
exec g:_uspy "args = vim.eval(\"a:000\")"
|
||||
exec g:_uspy "trigger = vim.eval(\"a:trigger\")"
|
||||
exec g:_uspy "value = vim.eval(\"a:value\")"
|
||||
exec g:_uspy "description = vim.eval(\"a:description\")"
|
||||
exec g:_uspy "options = vim.eval(\"a:options\")"
|
||||
exec g:_uspy "UltiSnips_Manager.add_snippet(trigger, value, description, options, *args)"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#AddSnippetWithPriority(trigger, value, description, options, filetype, priority)
|
||||
exec g:_uspy "trigger = vim.eval(\"a:trigger\")"
|
||||
exec g:_uspy "value = vim.eval(\"a:value\")"
|
||||
exec g:_uspy "description = vim.eval(\"a:description\")"
|
||||
exec g:_uspy "options = vim.eval(\"a:options\")"
|
||||
exec g:_uspy "filetype = vim.eval(\"a:filetype\")"
|
||||
exec g:_uspy "priority = vim.eval(\"a:priority\")"
|
||||
exec g:_uspy "UltiSnips_Manager.add_snippet(trigger, value, description, options, filetype, priority)"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
function! UltiSnips#Anon(value, ...)
|
||||
" Takes the same arguments as SnippetManager.expand_anon:
|
||||
" (value, trigger="", description="", options="")
|
||||
exec g:_uspy "args = vim.eval(\"a:000\")"
|
||||
exec g:_uspy "value = vim.eval(\"a:value\")"
|
||||
exec g:_uspy "UltiSnips_Manager.expand_anon(value, *args)"
|
||||
return ""
|
||||
endfunction
|
||||
|
||||
|
||||
function! UltiSnips#CursorMoved()
|
||||
exec g:_uspy "UltiSnips_Manager._cursor_moved()"
|
||||
endf
|
||||
|
||||
function! UltiSnips#LeavingBuffer()
|
||||
exec g:_uspy "UltiSnips_Manager._leaving_buffer()"
|
||||
endf
|
||||
|
||||
function! UltiSnips#LeavingInsertMode()
|
||||
exec g:_uspy "UltiSnips_Manager._leaving_insert_mode()"
|
||||
endfunction
|
||||
" }}}
|
||||
|
||||
" Expand our path
|
||||
exec g:_uspy "import vim, os, sys"
|
||||
exec g:_uspy "new_path = os.path.abspath(os.path.join(
|
||||
\ vim.eval('expand(\"<sfile>:h\")'), '..', 'pythonx'))"
|
||||
exec g:_uspy "vim.command(\"let g:UltiSnipsPythonPath = '%s'\" % new_path)"
|
||||
exec g:_uspy "if not hasattr(vim, 'VIM_SPECIAL_PATH'): sys.path.append(new_path)"
|
||||
exec g:_uspy "from UltiSnips import UltiSnips_Manager"
|
||||
|
||||
let did_UltiSnips_autoload=1
|
@ -0,0 +1,38 @@
|
||||
call UltiSnips#variables#WasRun()
|
||||
|
||||
function! UltiSnips#map_keys#MapKeys()
|
||||
" Map the keys correctly
|
||||
if g:UltiSnipsExpandTrigger == g:UltiSnipsJumpForwardTrigger
|
||||
|
||||
exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=UltiSnips#ExpandSnippetOrJump()<cr>"
|
||||
exec "snoremap <silent> " . g:UltiSnipsExpandTrigger . " <Esc>:call UltiSnips#ExpandSnippetOrJump()<cr>"
|
||||
else
|
||||
exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=UltiSnips#ExpandSnippet()<cr>"
|
||||
exec "snoremap <silent> " . g:UltiSnipsExpandTrigger . " <Esc>:call UltiSnips#ExpandSnippet()<cr>"
|
||||
endif
|
||||
exec 'xnoremap ' . g:UltiSnipsExpandTrigger. ' :call UltiSnips#SaveLastVisualSelection()<cr>gvs'
|
||||
exec "inoremap <silent> " . g:UltiSnipsListSnippets . " <C-R>=UltiSnips#ListSnippets()<cr>"
|
||||
exec "snoremap <silent> " . g:UltiSnipsListSnippets . " <Esc>:call UltiSnips#ListSnippets()<cr>"
|
||||
|
||||
snoremap <silent> <BS> <c-g>c
|
||||
snoremap <silent> <DEL> <c-g>c
|
||||
snoremap <silent> <c-h> <c-g>c
|
||||
endf
|
||||
|
||||
function! UltiSnips#map_keys#MapInnerKeys()
|
||||
if g:UltiSnipsExpandTrigger != g:UltiSnipsJumpForwardTrigger
|
||||
exec "inoremap <buffer> <silent> " . g:UltiSnipsJumpForwardTrigger . " <C-R>=UltiSnips#JumpForwards()<cr>"
|
||||
exec "snoremap <buffer> <silent> " . g:UltiSnipsJumpForwardTrigger . " <Esc>:call UltiSnips#JumpForwards()<cr>"
|
||||
endif
|
||||
exec "inoremap <buffer> <silent> " . g:UltiSnipsJumpBackwardTrigger . " <C-R>=UltiSnips#JumpBackwards()<cr>"
|
||||
exec "snoremap <buffer> <silent> " . g:UltiSnipsJumpBackwardTrigger . " <Esc>:call UltiSnips#JumpBackwards()<cr>"
|
||||
endf
|
||||
|
||||
function! UltiSnips#map_keys#RestoreInnerKeys()
|
||||
if g:UltiSnipsExpandTrigger != g:UltiSnipsJumpForwardTrigger
|
||||
exec "iunmap <buffer> " . g:UltiSnipsJumpForwardTrigger
|
||||
exec "sunmap <buffer> " . g:UltiSnipsJumpForwardTrigger
|
||||
endif
|
||||
exec "iunmap <buffer> " . g:UltiSnipsJumpBackwardTrigger
|
||||
exec "sunmap <buffer> " . g:UltiSnipsJumpBackwardTrigger
|
||||
endf
|
@ -0,0 +1,48 @@
|
||||
" Kludge to make sure that this file is really run.
|
||||
function! UltiSnips#variables#WasRun()
|
||||
endfunction
|
||||
|
||||
" The trigger used to expand a snippet.
|
||||
" NOTE: expansion and forward jumping can, but needn't be the same trigger
|
||||
if !exists("g:UltiSnipsExpandTrigger")
|
||||
let g:UltiSnipsExpandTrigger = "<tab>"
|
||||
endif
|
||||
|
||||
" The trigger used to display all triggers that could possible
|
||||
" match in the current position.
|
||||
if !exists("g:UltiSnipsListSnippets")
|
||||
let g:UltiSnipsListSnippets = "<c-tab>"
|
||||
endif
|
||||
|
||||
" The trigger used to jump forward to the next placeholder.
|
||||
" NOTE: expansion and forward jumping can, but needn't be the same trigger
|
||||
if !exists("g:UltiSnipsJumpForwardTrigger")
|
||||
let g:UltiSnipsJumpForwardTrigger = "<c-j>"
|
||||
endif
|
||||
|
||||
" The trigger to jump backward inside a snippet
|
||||
if !exists("g:UltiSnipsJumpBackwardTrigger")
|
||||
let g:UltiSnipsJumpBackwardTrigger = "<c-k>"
|
||||
endif
|
||||
|
||||
" Should UltiSnips unmap select mode mappings automagically?
|
||||
if !exists("g:UltiSnipsRemoveSelectModeMappings")
|
||||
let g:UltiSnipsRemoveSelectModeMappings = 1
|
||||
end
|
||||
|
||||
" If UltiSnips should remove Mappings, which should be ignored
|
||||
if !exists("g:UltiSnipsMappingsToIgnore")
|
||||
let g:UltiSnipsMappingsToIgnore = []
|
||||
endif
|
||||
|
||||
" UltiSnipsEdit will use this variable to decide if a new window
|
||||
" is opened when editing. default is "normal", allowed are also
|
||||
" "vertical", "horizontal"
|
||||
if !exists("g:UltiSnipsEditSplit")
|
||||
let g:UltiSnipsEditSplit = 'normal'
|
||||
endif
|
||||
|
||||
" A list of directory names that are searched for snippets.
|
||||
if !exists("g:UltiSnipsSnippetDirectories")
|
||||
let g:UltiSnipsSnippetDirectories = [ "UltiSnips" ]
|
||||
endif
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,5 @@
|
||||
" This has to be called before ftplugins are loaded. Therefore
|
||||
" it is here in ftdetect though it maybe shouldn't
|
||||
if has("autocmd")
|
||||
autocmd FileType * call UltiSnips#FileTypeChanged()
|
||||
endif
|
@ -0,0 +1,4 @@
|
||||
" recognize .snippet files
|
||||
if has("autocmd")
|
||||
autocmd BufNewFile,BufRead *.snippets setf snippets
|
||||
endif
|
@ -0,0 +1,16 @@
|
||||
" Set some sane defaults for snippet files
|
||||
|
||||
" Fold by syntax, but open all folds by default
|
||||
setlocal foldmethod=syntax
|
||||
setlocal foldlevel=99
|
||||
|
||||
setlocal commentstring=#%s
|
||||
|
||||
setlocal noexpandtab
|
||||
|
||||
" Define match words for use with matchit plugin
|
||||
" http://www.vim.org/scripts/script.php?script_id=39
|
||||
if exists("loaded_matchit") && !exists("b:match_words")
|
||||
let b:match_ignorecase = 0
|
||||
let b:match_words = '^snippet\>:^endsnippet\>,^global\>:^endglobal\>,\${:}'
|
||||
endif
|
@ -0,0 +1,69 @@
|
||||
" File: UltiSnips.vim
|
||||
" Author: Holger Rapp <SirVer@gmx.de>
|
||||
" Description: The Ultimate Snippets solution for Vim
|
||||
"
|
||||
" Testing Info:
|
||||
" See directions at the top of the test.py script located one
|
||||
" directory above this file.
|
||||
|
||||
if exists('did_UltiSnips_plugin') || &cp || version < 700
|
||||
finish
|
||||
endif
|
||||
|
||||
" The Commands we define.
|
||||
command! -nargs=? -complete=customlist,UltiSnips#FileTypeComplete UltiSnipsEdit
|
||||
\ :call UltiSnips#Edit(<q-args>)
|
||||
|
||||
command! -nargs=1 UltiSnipsAddFiletypes :call UltiSnips#AddFiletypes(<q-args>)
|
||||
|
||||
" Backwards compatible functions. Prefer the ones in autoload/.
|
||||
function! UltiSnips_FileTypeChanged()
|
||||
echoerr "Deprecated UltiSnips_FileTypeChanged called. Please use UltiSnips#FileTypeChanged." | sleep 1
|
||||
return UltiSnips#FileTypeChanged()
|
||||
endfunction
|
||||
|
||||
function! UltiSnips_ExpandSnippet()
|
||||
echoerr "Deprecated UltiSnips_ExpandSnippet called. Please use UltiSnips#ExpandSnippet." | sleep 1
|
||||
return UltiSnips#ExpandSnippet()
|
||||
endfunction
|
||||
|
||||
function! UltiSnips_ExpandSnippetOrJump()
|
||||
echoerr "Deprecated UltiSnips_ExpandSnippetOrJump called. Please use UltiSnips#ExpandSnippetOrJump." | sleep 1
|
||||
return UltiSnips#ExpandSnippetOrJump()
|
||||
endfunction
|
||||
|
||||
function! UltiSnips_SnippetsInCurrentScope()
|
||||
echoerr "Deprecated UltiSnips_SnippetsInCurrentScope called. Please use UltiSnips#SnippetsInCurrentScope." | sleep 1
|
||||
return UltiSnips#SnippetsInCurrentScope()
|
||||
endfunction
|
||||
|
||||
function! UltiSnips_JumpBackwards()
|
||||
echoerr "Deprecated UltiSnips_JumpBackwards called. Please use UltiSnips#JumpBackwards." | sleep 1
|
||||
return UltiSnips#JumpBackwards()
|
||||
endfunction
|
||||
|
||||
function! UltiSnips_JumpForwards()
|
||||
echoerr "Deprecated UltiSnips_JumpForwards called. Please use UltiSnips#JumpForwards." | sleep 1
|
||||
return UltiSnips#JumpForwards()
|
||||
endfunction
|
||||
|
||||
function! UltiSnips_AddSnippet(...)
|
||||
echoerr "Deprecated UltiSnips_AddSnippet called. Please use UltiSnips#AddSnippetWithPriority." | sleep 1
|
||||
return call(function('UltiSnips#AddSnippet'), a:000)
|
||||
endfunction
|
||||
|
||||
function! UltiSnips_Anon(...)
|
||||
echoerr "Deprecated UltiSnips_Anon called. Please use UltiSnips#Anon." | sleep 1
|
||||
return call(function('UltiSnips#Anon'), a:000)
|
||||
endfunction
|
||||
|
||||
au CursorMovedI * call UltiSnips#CursorMoved()
|
||||
au CursorMoved * call UltiSnips#CursorMoved()
|
||||
au BufLeave * call UltiSnips#LeavingBuffer()
|
||||
au InsertLeave * call UltiSnips#LeavingInsertMode()
|
||||
|
||||
call UltiSnips#map_keys#MapKeys()
|
||||
|
||||
let did_UltiSnips_plugin=1
|
||||
|
||||
" vim: ts=8 sts=4 sw=4
|
@ -0,0 +1,28 @@
|
||||
" File: snipMate_compatibility.vim
|
||||
" Author: Phillip Berndt <phillip.berndt@gmail.com>
|
||||
" Description: Snipmate compatibility helper functions for UltiSnips
|
||||
"
|
||||
" Snipmate defines a function named Filename and a variable called
|
||||
" g:snips_author for use in snippet subtitutions. See
|
||||
" https://github.com/msanders/snipmate.vim/blob/master/doc/snipMate.txt
|
||||
" for details.
|
||||
"
|
||||
|
||||
if exists('did_UltiSnips_snipmate_compatibility')
|
||||
finish
|
||||
endif
|
||||
let did_UltiSnips_snipmate_compatibility = 1
|
||||
|
||||
" Define g:snips_author; some snipmate snippets use this
|
||||
if ! exists('g:snips_author')
|
||||
let g:snips_author = "John Doe"
|
||||
endif
|
||||
|
||||
" Filename function, taken from snipMate.vim {{{
|
||||
fun! Filename(...)
|
||||
let filename = expand('%:t:r')
|
||||
if filename == '' | return a:0 == 2 ? a:2 : '' | endif
|
||||
return !a:0 || a:1 == '' ? filename : substitute(a:1, '$1', filename, 'g')
|
||||
endf
|
||||
" }}}
|
||||
|
@ -0,0 +1,268 @@
|
||||
[MASTER]
|
||||
|
||||
# Python code to execute, usually for sys.path manipulation such as
|
||||
# pygtk.require().
|
||||
init-hook='import sys; sys.path.append("pythonx/")'
|
||||
|
||||
# Add files or directories to the blacklist. They should be base names, not
|
||||
# paths.
|
||||
ignore=CVS,compatibility_py3
|
||||
|
||||
# Pickle collected data for later comparisons.
|
||||
persistent=no
|
||||
|
||||
# List of plugins (as comma separated values of python modules names) to load,
|
||||
# usually to register additional checkers.
|
||||
load-plugins=
|
||||
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
|
||||
# Enable the message, report, category or checker with the given id(s). You can
|
||||
# either give multiple identifier separated by comma (,) or put this option
|
||||
# multiple time. See also the "--disable" option for examples.
|
||||
#enable=
|
||||
|
||||
# Disable the message, report, category or checker with the given id(s). You
|
||||
# can either give multiple identifiers separated by comma (,) or put this
|
||||
# option multiple times (only on the command line, not in the configuration
|
||||
# file where it should appear only once).You can also use "--disable=all" to
|
||||
# disable everything first and then reenable specific checks. For example, if
|
||||
# you want to run only the similarities checker, you can use "--disable=all
|
||||
# --enable=similarities". If you want to run only the classes checker, but have
|
||||
# no Warning level messages displayed, use"--disable=all --enable=classes
|
||||
# --disable=W"
|
||||
disable=
|
||||
attribute-defined-outside-init,
|
||||
fixme,
|
||||
redefined-builtin,
|
||||
too-few-public-methods,
|
||||
too-many-arguments,
|
||||
too-many-branches,
|
||||
too-many-instance-attributes,
|
||||
too-many-locals,
|
||||
too-many-public-methods,
|
||||
too-many-return-statements,
|
||||
too-many-statements,
|
||||
|
||||
|
||||
[REPORTS]
|
||||
|
||||
# Set the output format. Available formats are text, parseable, colorized, msvs
|
||||
# (visual studio) and html. You can also give a reporter class, eg
|
||||
# mypackage.mymodule.MyReporterClass.
|
||||
output-format=text
|
||||
|
||||
# Tells whether to display a full report or only the messages
|
||||
reports=no
|
||||
|
||||
msg-template="{path}:{line}: [{msg_id}({symbol}), {obj}] {msg}"
|
||||
|
||||
|
||||
|
||||
[BASIC]
|
||||
|
||||
# Required attributes for module, separated by a comma
|
||||
required-attributes=
|
||||
|
||||
# List of builtins function names that should not be used, separated by a comma
|
||||
bad-functions=apply,input
|
||||
|
||||
# Regular expression which should only match correct module names
|
||||
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
|
||||
|
||||
# Regular expression which should only match correct module level names
|
||||
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
|
||||
|
||||
# Regular expression which should only match correct class names
|
||||
class-rgx=[A-Z_][a-zA-Z0-9]+$
|
||||
|
||||
# Regular expression which should only match correct function names
|
||||
function-rgx=_?[a-z_][a-z0-9_]{2,50}$
|
||||
|
||||
# Regular expression which should only match correct method names
|
||||
method-rgx=[a-z_][a-z0-9_]{2,50}$
|
||||
|
||||
# Regular expression which should only match correct instance attribute names
|
||||
attr-rgx=[a-z_][a-z0-9_]{2,50}$
|
||||
|
||||
# Regular expression which should only match correct argument names
|
||||
argument-rgx=[a-z_][a-z0-9_]{1,50}$
|
||||
|
||||
# Regular expression which should only match correct variable names
|
||||
variable-rgx=[a-z_][a-z0-9_]{1,50}$
|
||||
|
||||
# Regular expression which should only match correct attribute names in class
|
||||
# bodies
|
||||
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
|
||||
|
||||
# Regular expression which should only match correct list comprehension /
|
||||
# generator expression variable names
|
||||
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
|
||||
|
||||
# Good variable names which should always be accepted, separated by a comma
|
||||
good-names=i,j,a,b,x,y,k,ex,Run,_
|
||||
|
||||
# Bad variable names which should always be refused, separated by a comma
|
||||
bad-names=foo,bar,baz,toto,tutu,tata
|
||||
|
||||
# Regular expression which should only match function or class names that do
|
||||
# not require a docstring.
|
||||
no-docstring-rgx=(__.*__|wrapper)
|
||||
|
||||
# Minimum line length for functions/classes that require docstrings, shorter
|
||||
# ones are exempt.
|
||||
docstring-min-length=-1
|
||||
|
||||
|
||||
[FORMAT]
|
||||
|
||||
# Maximum number of characters on a single line.
|
||||
max-line-length=80
|
||||
|
||||
# Regexp for a line that is allowed to be longer than the limit.
|
||||
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
|
||||
|
||||
# Allow the body of an if to be on the same line as the test if there is no
|
||||
# else.
|
||||
single-line-if-stmt=no
|
||||
|
||||
# List of optional constructs for which whitespace checking is disabled
|
||||
no-space-check=trailing-comma,dict-separator
|
||||
|
||||
# Maximum number of lines in a module
|
||||
max-module-lines=1000
|
||||
|
||||
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
|
||||
# tab).
|
||||
indent-string=' '
|
||||
|
||||
|
||||
[MISCELLANEOUS]
|
||||
|
||||
# List of note tags to take in consideration, separated by a comma.
|
||||
notes=TODO
|
||||
|
||||
|
||||
[SIMILARITIES]
|
||||
|
||||
# Minimum lines number of a similarity.
|
||||
min-similarity-lines=4
|
||||
|
||||
# Ignore comments when computing similarities.
|
||||
ignore-comments=yes
|
||||
|
||||
# Ignore docstrings when computing similarities.
|
||||
ignore-docstrings=yes
|
||||
|
||||
# Ignore imports when computing similarities.
|
||||
ignore-imports=no
|
||||
|
||||
|
||||
[TYPECHECK]
|
||||
|
||||
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||
ignore-mixin-members=yes
|
||||
|
||||
# List of classes names for which member attributes should not be checked
|
||||
# (useful for classes with attributes dynamically set).
|
||||
ignored-classes=SQLObject
|
||||
|
||||
# When zope mode is activated, add a predefined set of Zope acquired attributes
|
||||
# to generated-members.
|
||||
zope=no
|
||||
|
||||
# List of members which are set dynamically and missed by pylint inference
|
||||
# system, and so shouldn't trigger E0201 when accessed. Python regular
|
||||
# expressions are accepted.
|
||||
generated-members=REQUEST,acl_users,aq_parent
|
||||
|
||||
|
||||
[VARIABLES]
|
||||
|
||||
# Tells whether we should check for unused import in __init__ files.
|
||||
init-import=no
|
||||
|
||||
# A regular expression matching the beginning of the name of dummy variables
|
||||
# (i.e. not used).
|
||||
dummy-variables-rgx=_$|dummy
|
||||
|
||||
# List of additional names supposed to be defined in builtins. Remember that
|
||||
# you should avoid to define new builtins when possible.
|
||||
additional-builtins=
|
||||
|
||||
|
||||
[CLASSES]
|
||||
|
||||
# List of interface methods to ignore, separated by a comma. This is used for
|
||||
# instance to not check methods defines in Zope's Interface base class.
|
||||
ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
|
||||
|
||||
# List of method names used to declare (i.e. assign) instance attributes.
|
||||
defining-attr-methods=__init__,__new__,setUp
|
||||
|
||||
# List of valid names for the first argument in a class method.
|
||||
valid-classmethod-first-arg=cls
|
||||
|
||||
# List of valid names for the first argument in a metaclass class method.
|
||||
valid-metaclass-classmethod-first-arg=mcs
|
||||
|
||||
|
||||
[DESIGN]
|
||||
|
||||
# Maximum number of arguments for function / method
|
||||
max-args=5
|
||||
|
||||
# Argument names that match this expression will be ignored. Default to name
|
||||
# with leading underscore
|
||||
ignored-argument-names=_.*
|
||||
|
||||
# Maximum number of locals for function / method body
|
||||
max-locals=15
|
||||
|
||||
# Maximum number of return / yield for function / method body
|
||||
max-returns=6
|
||||
|
||||
# Maximum number of branch for function / method body
|
||||
max-branches=12
|
||||
|
||||
# Maximum number of statements in function / method body
|
||||
max-statements=50
|
||||
|
||||
# Maximum number of parents for a class (see R0901).
|
||||
max-parents=7
|
||||
|
||||
# Maximum number of attributes for a class (see R0902).
|
||||
max-attributes=7
|
||||
|
||||
# Minimum number of public methods for a class (see R0903).
|
||||
min-public-methods=2
|
||||
|
||||
# Maximum number of public methods for a class (see R0904).
|
||||
max-public-methods=20
|
||||
|
||||
|
||||
[IMPORTS]
|
||||
|
||||
# Deprecated modules which should not be used, separated by a comma
|
||||
deprecated-modules=regsub,TERMIOS,Bastion,rexec
|
||||
|
||||
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||
# given file (report RP0402 must not be disabled)
|
||||
import-graph=
|
||||
|
||||
# Create a graph of external dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
ext-import-graph=
|
||||
|
||||
# Create a graph of internal dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
int-import-graph=
|
||||
|
||||
|
||||
[EXCEPTIONS]
|
||||
|
||||
# Exceptions that will emit a warning when being caught. Defaults to
|
||||
# "Exception"
|
||||
overgeneral-exceptions=Exception
|
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Entry point for all thinks UltiSnips."""
|
||||
|
||||
import vim # pylint:disable=import-error
|
||||
|
||||
from UltiSnips.snippet_manager import SnippetManager
|
||||
|
||||
UltiSnips_Manager = SnippetManager( # pylint:disable=invalid-name
|
||||
vim.eval('g:UltiSnipsExpandTrigger'),
|
||||
vim.eval('g:UltiSnipsJumpForwardTrigger'),
|
||||
vim.eval('g:UltiSnipsJumpBackwardTrigger'))
|
@ -0,0 +1,219 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Commands to compare text objects and to guess how to transform from one to
|
||||
another."""
|
||||
|
||||
from collections import defaultdict
|
||||
import sys
|
||||
|
||||
from UltiSnips import _vim
|
||||
from UltiSnips.position import Position
|
||||
|
||||
def is_complete_edit(initial_line, original, wanted, cmds):
|
||||
"""Returns true if 'original' is changed to 'wanted' with the edit commands
|
||||
in 'cmds'. Initial line is to change the line numbers in 'cmds'."""
|
||||
buf = original[:]
|
||||
for cmd in cmds:
|
||||
ctype, line, col, char = cmd
|
||||
line -= initial_line
|
||||
if ctype == "D":
|
||||
if char != '\n':
|
||||
buf[line] = buf[line][:col] + buf[line][col+len(char):]
|
||||
else:
|
||||
if line + 1 < len(buf):
|
||||
buf[line] = buf[line] + buf[line+1]
|
||||
del buf[line+1]
|
||||
else:
|
||||
del buf[line]
|
||||
elif ctype == "I":
|
||||
buf[line] = buf[line][:col] + char + buf[line][col:]
|
||||
buf = '\n'.join(buf).split('\n')
|
||||
return (len(buf) == len(wanted) and
|
||||
all(j == k for j, k in zip(buf, wanted)))
|
||||
|
||||
def guess_edit(initial_line, last_text, current_text, vim_state):
|
||||
"""
|
||||
Try to guess what the user might have done by heuristically looking at
|
||||
cursor movement, number of changed lines and if they got longer or shorter.
|
||||
This will detect most simple movements like insertion, deletion of a line
|
||||
or carriage return. 'initial_text' is the index of where the comparison
|
||||
starts, 'last_text' is the last text of the snippet, 'current_text' is the
|
||||
current text of the snippet and 'vim_state' is the cached vim state.
|
||||
|
||||
Returns (True, edit_cmds) when the edit could be guessed, (False, None)
|
||||
otherwise.
|
||||
"""
|
||||
if not len(last_text) and not len(current_text):
|
||||
return True, ()
|
||||
pos = vim_state.pos
|
||||
ppos = vim_state.ppos
|
||||
|
||||
# All text deleted?
|
||||
if (len(last_text) and
|
||||
(not current_text or
|
||||
(len(current_text) == 1 and not current_text[0]))
|
||||
):
|
||||
es = []
|
||||
if not current_text:
|
||||
current_text = ['']
|
||||
for i in last_text:
|
||||
es.append(("D", initial_line, 0, i))
|
||||
es.append(("D", initial_line, 0, "\n"))
|
||||
es.pop() # Remove final \n because it is not really removed
|
||||
if is_complete_edit(initial_line, last_text, current_text, es):
|
||||
return True, es
|
||||
if ppos.mode == 'v': # Maybe selectmode?
|
||||
sv = list(map(int, _vim.eval("""getpos("'<")""")))
|
||||
sv = Position(sv[1]-1, sv[2]-1)
|
||||
ev = list(map(int, _vim.eval("""getpos("'>")""")))
|
||||
ev = Position(ev[1]-1, ev[2]-1)
|
||||
if "exclusive" in _vim.eval("&selection"):
|
||||
ppos.col -= 1 # We want to be inclusive, sorry.
|
||||
ev.col -= 1
|
||||
es = []
|
||||
if sv.line == ev.line:
|
||||
es.append(("D", sv.line, sv.col,
|
||||
last_text[sv.line - initial_line][sv.col:ev.col+1]))
|
||||
if sv != pos and sv.line == pos.line:
|
||||
es.append(("I", sv.line, sv.col,
|
||||
current_text[sv.line - initial_line][sv.col:pos.col+1]))
|
||||
if is_complete_edit(initial_line, last_text, current_text, es):
|
||||
return True, es
|
||||
if pos.line == ppos.line:
|
||||
if len(last_text) == len(current_text): # Movement only in one line
|
||||
llen = len(last_text[ppos.line - initial_line])
|
||||
clen = len(current_text[pos.line - initial_line])
|
||||
if ppos < pos and clen > llen: # maybe only chars have been added
|
||||
es = (
|
||||
("I", ppos.line, ppos.col,
|
||||
current_text[ppos.line - initial_line]
|
||||
[ppos.col:pos.col]),
|
||||
)
|
||||
if is_complete_edit(initial_line, last_text, current_text, es):
|
||||
return True, es
|
||||
if clen < llen:
|
||||
if ppos == pos: # 'x' or DEL or dt or something
|
||||
es = (
|
||||
("D", pos.line, pos.col,
|
||||
last_text[ppos.line - initial_line]
|
||||
[ppos.col:ppos.col + (llen - clen)]),
|
||||
)
|
||||
if is_complete_edit(initial_line, last_text,
|
||||
current_text, es):
|
||||
return True, es
|
||||
if pos < ppos: # Backspacing or dT dF?
|
||||
es = (
|
||||
("D", pos.line, pos.col,
|
||||
last_text[pos.line - initial_line]
|
||||
[pos.col:pos.col + llen - clen]),
|
||||
)
|
||||
if is_complete_edit(initial_line, last_text,
|
||||
current_text, es):
|
||||
return True, es
|
||||
elif len(current_text) < len(last_text):
|
||||
# where some lines deleted? (dd or so)
|
||||
es = []
|
||||
for i in range(len(last_text)-len(current_text)):
|
||||
es.append(("D", pos.line, 0,
|
||||
last_text[pos.line - initial_line + i]))
|
||||
es.append(("D", pos.line, 0, '\n'))
|
||||
if is_complete_edit(initial_line, last_text,
|
||||
current_text, es):
|
||||
return True, es
|
||||
else:
|
||||
# Movement in more than one line
|
||||
if ppos.line + 1 == pos.line and pos.col == 0: # Carriage return?
|
||||
es = (("I", ppos.line, ppos.col, "\n"),)
|
||||
if is_complete_edit(initial_line, last_text,
|
||||
current_text, es):
|
||||
return True, es
|
||||
return False, None
|
||||
|
||||
def diff(a, b, sline=0):
|
||||
"""
|
||||
Return a list of deletions and insertions that will turn 'a' into 'b'. This
|
||||
is done by traversing an implicit edit graph and searching for the shortest
|
||||
route. The basic idea is as follows:
|
||||
|
||||
- Matching a character is free as long as there was no
|
||||
deletion/insertion before. Then, matching will be seen as delete +
|
||||
insert [1].
|
||||
- Deleting one character has the same cost everywhere. Each additional
|
||||
character costs only have of the first deletion.
|
||||
- Insertion is cheaper the earlier it happens. The first character is
|
||||
more expensive that any later [2].
|
||||
|
||||
[1] This is that world -> aolsa will be "D" world + "I" aolsa instead of
|
||||
"D" w , "D" rld, "I" a, "I" lsa
|
||||
[2] This is that "hello\n\n" -> "hello\n\n\n" will insert a newline after
|
||||
hello and not after \n
|
||||
"""
|
||||
d = defaultdict(list) # pylint:disable=invalid-name
|
||||
seen = defaultdict(lambda: sys.maxsize)
|
||||
|
||||
d[0] = [(0, 0, sline, 0, ())]
|
||||
cost = 0
|
||||
deletion_cost = len(a)+len(b)
|
||||
insertion_cost = len(a)+len(b)
|
||||
while True:
|
||||
while len(d[cost]):
|
||||
x, y, line, col, what = d[cost].pop()
|
||||
|
||||
if a[x:] == b[y:]:
|
||||
return what
|
||||
|
||||
if x < len(a) and y < len(b) and a[x] == b[y]:
|
||||
ncol = col + 1
|
||||
nline = line
|
||||
if a[x] == '\n':
|
||||
ncol = 0
|
||||
nline += 1
|
||||
lcost = cost + 1
|
||||
if (what and what[-1][0] == "D" and what[-1][1] == line and
|
||||
what[-1][2] == col and a[x] != '\n'):
|
||||
# Matching directly after a deletion should be as costly as
|
||||
# DELETE + INSERT + a bit
|
||||
lcost = (deletion_cost + insertion_cost)*1.5
|
||||
if seen[x+1, y+1] > lcost:
|
||||
d[lcost].append((x+1, y+1, nline, ncol, what))
|
||||
seen[x+1, y+1] = lcost
|
||||
if y < len(b): # INSERT
|
||||
ncol = col + 1
|
||||
nline = line
|
||||
if b[y] == '\n':
|
||||
ncol = 0
|
||||
nline += 1
|
||||
if (what and what[-1][0] == "I" and what[-1][1] == nline and
|
||||
what[-1][2]+len(what[-1][-1]) == col and b[y] != '\n' and
|
||||
seen[x, y+1] > cost + (insertion_cost + ncol) // 2
|
||||
):
|
||||
seen[x, y+1] = cost + (insertion_cost + ncol) // 2
|
||||
d[cost + (insertion_cost + ncol) // 2].append(
|
||||
(x, y+1, line, ncol, what[:-1] + (
|
||||
("I", what[-1][1], what[-1][2],
|
||||
what[-1][-1] + b[y]),)
|
||||
)
|
||||
)
|
||||
elif seen[x, y+1] > cost + insertion_cost + ncol:
|
||||
seen[x, y+1] = cost + insertion_cost + ncol
|
||||
d[cost + ncol + insertion_cost].append((x, y+1, nline, ncol,
|
||||
what + (("I", line, col, b[y]),))
|
||||
)
|
||||
if x < len(a): # DELETE
|
||||
if (what and what[-1][0] == "D" and what[-1][1] == line and
|
||||
what[-1][2] == col and a[x] != '\n' and
|
||||
what[-1][-1] != '\n' and
|
||||
seen[x+1, y] > cost + deletion_cost // 2
|
||||
):
|
||||
seen[x+1, y] = cost + deletion_cost // 2
|
||||
d[cost + deletion_cost // 2].append(
|
||||
(x+1, y, line, col, what[:-1] + (
|
||||
("D", line, col, what[-1][-1] + a[x]),))
|
||||
)
|
||||
elif seen[x+1, y] > cost + deletion_cost:
|
||||
seen[x+1, y] = cost + deletion_cost
|
||||
d[cost + deletion_cost].append((x+1, y, line, col, what +
|
||||
(("D", line, col, a[x]),))
|
||||
)
|
||||
cost += 1
|
@ -0,0 +1,294 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Wrapper functionality around the functions we need from Vim."""
|
||||
|
||||
import re
|
||||
|
||||
import vim # pylint:disable=import-error
|
||||
from vim import error # pylint:disable=import-error,unused-import
|
||||
|
||||
from UltiSnips.compatibility import col2byte, byte2col, \
|
||||
as_unicode, as_vimencoding
|
||||
from UltiSnips.position import Position
|
||||
|
||||
class VimBuffer(object):
|
||||
"""Wrapper around the current Vim buffer."""
|
||||
|
||||
def __getitem__(self, idx):
|
||||
if isinstance(idx, slice): # Py3
|
||||
return self.__getslice__(idx.start, idx.stop)
|
||||
rv = vim.current.buffer[idx]
|
||||
return as_unicode(rv)
|
||||
|
||||
def __getslice__(self, i, j): # pylint:disable=no-self-use
|
||||
rv = vim.current.buffer[i:j]
|
||||
return [as_unicode(l) for l in rv]
|
||||
|
||||
def __setitem__(self, idx, text):
|
||||
if isinstance(idx, slice): # Py3
|
||||
return self.__setslice__(idx.start, idx.stop, text)
|
||||
vim.current.buffer[idx] = as_vimencoding(text)
|
||||
|
||||
def __setslice__(self, i, j, text): # pylint:disable=no-self-use
|
||||
vim.current.buffer[i:j] = [as_vimencoding(l) for l in text]
|
||||
|
||||
def __len__(self):
|
||||
return len(vim.current.buffer)
|
||||
|
||||
@property
|
||||
def line_till_cursor(self): # pylint:disable=no-self-use
|
||||
"""Returns the text before the cursor."""
|
||||
# Note: we want byte position here
|
||||
_, col = vim.current.window.cursor
|
||||
line = vim.current.line
|
||||
before = as_unicode(line[:col])
|
||||
return before
|
||||
|
||||
@property
|
||||
def number(self): # pylint:disable=no-self-use
|
||||
"""The bufnr() of this buffer."""
|
||||
return int(eval("bufnr('%')"))
|
||||
|
||||
@property
|
||||
def cursor(self): # pylint:disable=no-self-use
|
||||
"""
|
||||
The current windows cursor. Note that this is 0 based in col and 0
|
||||
based in line which is different from Vim's cursor.
|
||||
"""
|
||||
line, nbyte = vim.current.window.cursor
|
||||
col = byte2col(line, nbyte)
|
||||
return Position(line - 1, col)
|
||||
|
||||
@cursor.setter
|
||||
def cursor(self, pos): # pylint:disable=no-self-use
|
||||
"""See getter."""
|
||||
nbyte = col2byte(pos.line + 1, pos.col)
|
||||
vim.current.window.cursor = pos.line + 1, nbyte
|
||||
buf = VimBuffer() # pylint:disable=invalid-name
|
||||
|
||||
def escape(inp):
|
||||
"""Creates a vim-friendly string from a group of
|
||||
dicts, lists and strings."""
|
||||
def conv(obj):
|
||||
"""Convert obj."""
|
||||
if isinstance(obj, list):
|
||||
rv = as_unicode('[' + ','.join(conv(o) for o in obj) + ']')
|
||||
elif isinstance(obj, dict):
|
||||
rv = as_unicode('{' + ','.join([
|
||||
"%s:%s" % (conv(key), conv(value))
|
||||
for key, value in obj.iteritems()]) + '}')
|
||||
else:
|
||||
rv = as_unicode('"%s"') % as_unicode(obj).replace('"', '\\"')
|
||||
return rv
|
||||
return conv(inp)
|
||||
|
||||
def command(cmd):
|
||||
"""Wraps vim.command."""
|
||||
return as_unicode(vim.command(as_vimencoding(cmd)))
|
||||
|
||||
def eval(text):
|
||||
"""Wraps vim.eval."""
|
||||
rv = vim.eval(as_vimencoding(text))
|
||||
if not isinstance(rv, (dict, list)):
|
||||
return as_unicode(rv)
|
||||
return rv
|
||||
|
||||
def feedkeys(keys, mode='n'):
|
||||
"""Wrapper around vim's feedkeys function. Mainly for convenience."""
|
||||
command(as_unicode(r'call feedkeys("%s", "%s")') % (keys, mode))
|
||||
|
||||
def new_scratch_buffer(text):
|
||||
"""Create a new scratch buffer with the text given"""
|
||||
vim.command("botright new")
|
||||
vim.command("set ft=")
|
||||
vim.command("set buftype=nofile")
|
||||
|
||||
vim.current.buffer[:] = text.splitlines()
|
||||
|
||||
feedkeys(r"\<Esc>")
|
||||
|
||||
def select(start, end):
|
||||
"""Select the span in Select mode"""
|
||||
|
||||
_unmap_select_mode_mapping()
|
||||
|
||||
delta = end - start
|
||||
lineno, col = start.line, start.col
|
||||
|
||||
col = col2byte(lineno + 1, col)
|
||||
vim.current.window.cursor = lineno + 1, col
|
||||
|
||||
move_cmd = ""
|
||||
if eval("mode()") != 'n':
|
||||
move_cmd += r"\<Esc>"
|
||||
|
||||
# Case 1: Zero Length Tabstops
|
||||
if delta.line == delta.col == 0:
|
||||
if col == 0 or eval("mode()") not in 'i' and \
|
||||
col < len(buf[lineno]):
|
||||
move_cmd += "i"
|
||||
else:
|
||||
move_cmd += "a"
|
||||
else:
|
||||
# Case 2a: Non zero length
|
||||
# If a tabstop immediately starts with a newline, the selection must
|
||||
# start after the last character in the current line. But if we are in
|
||||
# insert mode and <Esc> out of it, we cannot go past the last character
|
||||
# with move_one_right and therefore cannot visual-select this newline.
|
||||
# We have to hack around this by adding an extra space which we can
|
||||
# select. Note that this problem could be circumvent by selecting the
|
||||
# tab backwards (that is starting at the end); one would not need to
|
||||
# modify the line for this. This creates other trouble though
|
||||
if col >= len(buf[lineno]):
|
||||
buf[lineno] += " "
|
||||
|
||||
if delta.line:
|
||||
move_lines = "%ij" % delta.line
|
||||
else:
|
||||
move_lines = ""
|
||||
# Depending on the current mode and position, we
|
||||
# might need to move escape out of the mode and this
|
||||
# will move our cursor one left
|
||||
if col != 0 and eval("mode()") == 'i':
|
||||
move_one_right = "l"
|
||||
else:
|
||||
move_one_right = ""
|
||||
|
||||
# After moving to the correct line, we go back to column 0
|
||||
# and select right from there. Note that the we have to select
|
||||
# one column less since Vim's visual selection is including the
|
||||
# ending while Python slicing is excluding the ending.
|
||||
inclusive = "inclusive" in eval("&selection")
|
||||
if end.col == 0:
|
||||
# Selecting should end at beginning of line -> Select the
|
||||
# previous line till its end
|
||||
do_select = "k$"
|
||||
if not inclusive:
|
||||
do_select += "j0"
|
||||
elif end.col > 1:
|
||||
do_select = "0%il" % (end.col-1 if inclusive else end.col)
|
||||
else:
|
||||
do_select = "0" if inclusive else "0l"
|
||||
|
||||
move_cmd += _LangMapTranslator().translate(
|
||||
r"%sv%s%s\<c-g>" % (move_one_right, move_lines, do_select)
|
||||
)
|
||||
|
||||
feedkeys(move_cmd)
|
||||
|
||||
def _unmap_select_mode_mapping():
|
||||
"""This function unmaps select mode mappings if so wished by the user.
|
||||
Removes select mode mappings that can actually be typed by the user
|
||||
(ie, ignores things like <Plug>).
|
||||
"""
|
||||
if int(eval("g:UltiSnipsRemoveSelectModeMappings")):
|
||||
ignores = eval("g:UltiSnipsMappingsToIgnore") + ['UltiSnips']
|
||||
|
||||
for option in ("<buffer>", ""):
|
||||
# Put all smaps into a var, and then read the var
|
||||
command(r"redir => _tmp_smaps | silent smap %s " % option +
|
||||
"| redir END")
|
||||
|
||||
# Check if any mappings where found
|
||||
all_maps = list(filter(len, eval(r"_tmp_smaps").splitlines()))
|
||||
if len(all_maps) == 1 and all_maps[0][0] not in " sv":
|
||||
# "No maps found". String could be localized. Hopefully
|
||||
# it doesn't start with any of these letters in any
|
||||
# language
|
||||
continue
|
||||
|
||||
# Only keep mappings that should not be ignored
|
||||
maps = [m for m in all_maps if
|
||||
not any(i in m for i in ignores) and len(m.strip())]
|
||||
|
||||
for map in maps:
|
||||
# The first three chars are the modes, that might be listed.
|
||||
# We are not interested in them here.
|
||||
trig = map[3:].split()[0] if len(map[3:].split()) != 0 else None
|
||||
|
||||
if trig is None:
|
||||
continue
|
||||
|
||||
# The bar separates commands
|
||||
if trig[-1] == "|":
|
||||
trig = trig[:-1] + "<Bar>"
|
||||
|
||||
# Special ones
|
||||
if trig[0] == "<":
|
||||
add = False
|
||||
# Only allow these
|
||||
for valid in ["Tab", "NL", "CR", "C-Tab", "BS"]:
|
||||
if trig == "<%s>" % valid:
|
||||
add = True
|
||||
if not add:
|
||||
continue
|
||||
|
||||
# UltiSnips remaps <BS>. Keep this around.
|
||||
if trig == "<BS>":
|
||||
continue
|
||||
|
||||
# Actually unmap it
|
||||
try:
|
||||
command("silent! sunmap %s %s" % (option, trig))
|
||||
except: # pylint:disable=bare-except
|
||||
# Bug 908139: ignore unmaps that fail because of
|
||||
# unprintable characters. This is not ideal because we
|
||||
# will not be able to unmap lhs with any unprintable
|
||||
# character. If the lhs stats with a printable
|
||||
# character this will leak to the user when he tries to
|
||||
# type this character as a first in a selected tabstop.
|
||||
# This case should be rare enough to not bother us
|
||||
# though.
|
||||
pass
|
||||
|
||||
class _RealLangMapTranslator(object):
|
||||
"""This cares for the Vim langmap option and basically reverses the
|
||||
mappings. This was the only solution to get UltiSnips to work nicely with
|
||||
langmap; other stuff I tried was using inoremap movement commands and
|
||||
caching and restoring the langmap option.
|
||||
|
||||
Note that this will not work if the langmap overwrites a character
|
||||
completely, for example if 'j' is remapped, but nothing is mapped back to
|
||||
'j', then moving one line down is no longer possible and UltiSnips will
|
||||
fail.
|
||||
"""
|
||||
_maps = {}
|
||||
_SEMICOLONS = re.compile(r"(?<!\\);")
|
||||
_COMMA = re.compile(r"(?<!\\),")
|
||||
|
||||
def _create_translation(self, langmap):
|
||||
"""Create the reverse mapping from 'langmap'."""
|
||||
from_chars, to_chars = "", ""
|
||||
for char in self._COMMA.split(langmap):
|
||||
char = char.replace("\\,", ",")
|
||||
res = self._SEMICOLONS.split(char)
|
||||
if len(res) > 1:
|
||||
from_char, to_char = [a.replace("\\;", ";") for a in res]
|
||||
from_chars += from_char
|
||||
to_chars += to_char
|
||||
else:
|
||||
from_chars += char[::2]
|
||||
to_chars += char[1::2]
|
||||
self._maps[langmap] = (from_chars, to_chars)
|
||||
|
||||
def translate(self, text):
|
||||
"""Inverse map 'text' through langmap."""
|
||||
langmap = eval("&langmap").strip()
|
||||
if langmap == "":
|
||||
return text
|
||||
text = as_unicode(text)
|
||||
if langmap not in self._maps:
|
||||
self._create_translation(langmap)
|
||||
for before, after in zip(*self._maps[langmap]):
|
||||
text = text.replace(before, after)
|
||||
return text
|
||||
|
||||
class _DummyLangMapTranslator(object):
|
||||
"""If vim hasn't got the langmap compiled in, we never have to do anything.
|
||||
Then this class is used. """
|
||||
translate = lambda self, s: s
|
||||
|
||||
_LangMapTranslator = _RealLangMapTranslator
|
||||
if not int(eval('has("langmap")')):
|
||||
_LangMapTranslator = _DummyLangMapTranslator
|
@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""
|
||||
This file contains compatibility code to stay compatible with
|
||||
as many python versions as possible.
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
||||
import vim # pylint:disable=import-error
|
||||
|
||||
def _vim_dec(string):
|
||||
"""Decode 'string' using &encoding."""
|
||||
try:
|
||||
return string.decode(vim.eval("&encoding"))
|
||||
except UnicodeDecodeError:
|
||||
# At least we tried. There might be some problems down the road now
|
||||
return string
|
||||
|
||||
def _vim_enc(string):
|
||||
"""Encode 'string' using &encoding."""
|
||||
try:
|
||||
return string.encode(vim.eval("&encoding"))
|
||||
except UnicodeEncodeError:
|
||||
return string
|
||||
|
||||
if sys.version_info >= (3, 0):
|
||||
def col2byte(line, col):
|
||||
"""
|
||||
Convert a valid column index into a byte index inside
|
||||
of vims buffer.
|
||||
"""
|
||||
pre_chars = vim.current.buffer[line-1][:col]
|
||||
return len(_vim_enc(pre_chars))
|
||||
|
||||
def byte2col(line, nbyte):
|
||||
"""
|
||||
Convert a column into a byteidx suitable for a mark or cursor
|
||||
position inside of vim
|
||||
"""
|
||||
line = vim.current.buffer[line-1]
|
||||
raw_bytes = _vim_enc(line)[:nbyte]
|
||||
return len(_vim_dec(raw_bytes))
|
||||
|
||||
def as_unicode(string):
|
||||
"""Return 'string' as unicode instance."""
|
||||
if isinstance(string, bytes):
|
||||
return _vim_dec(string)
|
||||
return str(string)
|
||||
|
||||
def as_vimencoding(string):
|
||||
"""Return 'string' as Vim internal encoding."""
|
||||
return string
|
||||
else:
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
||||
|
||||
def col2byte(line, col):
|
||||
"""
|
||||
Convert a valid column index into a byte index inside
|
||||
of vims buffer.
|
||||
"""
|
||||
pre_chars = _vim_dec(vim.current.buffer[line-1])[:col]
|
||||
return len(_vim_enc(pre_chars))
|
||||
|
||||
def byte2col(line, nbyte):
|
||||
"""
|
||||
Convert a column into a byteidx suitable for a mark or cursor
|
||||
position inside of vim
|
||||
"""
|
||||
line = vim.current.buffer[line-1]
|
||||
if nbyte >= len(line): # This is beyond end of line
|
||||
return nbyte
|
||||
return len(_vim_dec(line[:nbyte]))
|
||||
|
||||
def as_unicode(string):
|
||||
"""Return 'string' as unicode instance."""
|
||||
if isinstance(string, str):
|
||||
return _vim_dec(string)
|
||||
return unicode(string)
|
||||
|
||||
def as_vimencoding(string):
|
||||
"""Return 'string' as unicode instance."""
|
||||
return _vim_enc(string)
|
@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Convenience methods that help with debugging. They should never be used in
|
||||
production code."""
|
||||
|
||||
import sys
|
||||
|
||||
from UltiSnips.compatibility import as_unicode
|
||||
|
||||
DUMP_FILENAME = "/tmp/file.txt" if not sys.platform.lower().startswith("win") \
|
||||
else "C:/windows/temp/ultisnips.txt"
|
||||
with open(DUMP_FILENAME, "w"):
|
||||
pass # clears the file
|
||||
|
||||
def echo_to_hierarchy(text_object):
|
||||
"""Outputs the given 'text_object' and its children hierarchically."""
|
||||
# pylint:disable=protected-access
|
||||
parent = text_object
|
||||
while parent._parent:
|
||||
parent = parent._parent
|
||||
|
||||
def _do_print(text_object, indent=""):
|
||||
"""prints recursively."""
|
||||
debug(indent + as_unicode(text_object))
|
||||
try:
|
||||
for child in text_object._children:
|
||||
_do_print(child, indent=indent + " ")
|
||||
except AttributeError:
|
||||
pass
|
||||
_do_print(parent)
|
||||
|
||||
def debug(msg):
|
||||
"""Dumb 'msg' into the debug file."""
|
||||
msg = as_unicode(msg)
|
||||
with open(DUMP_FILENAME, "ab") as dump_file:
|
||||
dump_file.write((msg + '\n').encode("utf-8"))
|
||||
|
||||
def print_stack():
|
||||
"""Dump a stack trace into the debug file."""
|
||||
import traceback
|
||||
with open(DUMP_FILENAME, "ab") as dump_file:
|
||||
traceback.print_stack(file=dump_file)
|
@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Utilities to deal with text escaping."""
|
||||
|
||||
def unescape(text):
|
||||
"""Removes '\\' escaping from 'text'."""
|
||||
rv = ""
|
||||
i = 0
|
||||
while i < len(text):
|
||||
if i+1 < len(text) and text[i] == '\\':
|
||||
rv += text[i+1]
|
||||
i += 1
|
||||
else:
|
||||
rv += text[i]
|
||||
i += 1
|
||||
return rv
|
||||
|
||||
def fill_in_whitespace(text):
|
||||
"""Returns 'text' with escaped whitespace replaced through whitespaces."""
|
||||
text = text.replace(r"\n", "\n")
|
||||
text = text.replace(r"\t", "\t")
|
||||
text = text.replace(r"\r", "\r")
|
||||
text = text.replace(r"\a", "\a")
|
||||
text = text.replace(r"\b", "\b")
|
||||
return text
|
@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""See module doc."""
|
||||
|
||||
import UltiSnips._vim as _vim
|
||||
|
||||
class IndentUtil(object):
|
||||
"""Utility class for dealing properly with indentation. """
|
||||
|
||||
def __init__(self):
|
||||
self.reset()
|
||||
|
||||
def reset(self):
|
||||
""" Gets the spacing properties from Vim. """
|
||||
self.shiftwidth = int(_vim.eval("&shiftwidth"))
|
||||
self._expandtab = (_vim.eval("&expandtab") == "1")
|
||||
self._tabstop = int(_vim.eval("&tabstop"))
|
||||
|
||||
def ntabs_to_proper_indent(self, ntabs):
|
||||
"""Convert 'ntabs' number of tabs to the proper indent prefix."""
|
||||
line_ind = ntabs * self.shiftwidth * " "
|
||||
line_ind = self.indent_to_spaces(line_ind)
|
||||
line_ind = self.spaces_to_indent(line_ind)
|
||||
return line_ind
|
||||
|
||||
def indent_to_spaces(self, indent):
|
||||
""" Converts indentation to spaces respecting Vim settings. """
|
||||
indent = indent.expandtabs(self._tabstop)
|
||||
right = (len(indent) - len(indent.rstrip(" "))) * " "
|
||||
indent = indent.replace(" ", "")
|
||||
indent = indent.replace('\t', " " * self._tabstop)
|
||||
return indent + right
|
||||
|
||||
def spaces_to_indent(self, indent):
|
||||
""" Converts spaces to proper indentation respecting Vim settings """
|
||||
if not self._expandtab:
|
||||
indent = indent.replace(" " * self._tabstop, '\t')
|
||||
return indent
|
@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Represents a Position in a text file: (0 based line index, 0 based column
|
||||
index) and provides methods for moving them around."""
|
||||
|
||||
class Position(object):
|
||||
"""See module docstring."""
|
||||
|
||||
def __init__(self, line, col):
|
||||
self.line = line
|
||||
self.col = col
|
||||
|
||||
def move(self, pivot, delta):
|
||||
"""'pivot' is the position of the first changed character, 'delta' is
|
||||
how text after it moved"""
|
||||
if self < pivot:
|
||||
return
|
||||
if delta.line == 0:
|
||||
if self.line == pivot.line:
|
||||
self.col += delta.col
|
||||
elif delta.line > 0:
|
||||
if self.line == pivot.line:
|
||||
self.col += delta.col - pivot.col
|
||||
self.line += delta.line
|
||||
else:
|
||||
self.line += delta.line
|
||||
if self.line == pivot.line:
|
||||
self.col += - delta.col + pivot.col
|
||||
|
||||
def delta(self, pos):
|
||||
"""Returns the difference that the cursor must move to come from 'pos'
|
||||
to us."""
|
||||
assert isinstance(pos, Position)
|
||||
if self.line == pos.line:
|
||||
return Position(0, self.col - pos.col)
|
||||
else:
|
||||
if self > pos:
|
||||
return Position(self.line - pos.line, self.col)
|
||||
else:
|
||||
return Position(self.line - pos.line, pos.col)
|
||||
return Position(self.line - pos.line, self.col - pos.col)
|
||||
|
||||
def __add__(self, pos):
|
||||
assert isinstance(pos, Position)
|
||||
return Position(self.line + pos.line, self.col + pos.col)
|
||||
|
||||
def __sub__(self, pos):
|
||||
assert isinstance(pos, Position)
|
||||
return Position(self.line - pos.line, self.col - pos.col)
|
||||
|
||||
def __eq__(self, other):
|
||||
return (self.line, self.col) == (other.line, other.col)
|
||||
|
||||
def __ne__(self, other):
|
||||
return (self.line, self.col) != (other.line, other.col)
|
||||
|
||||
def __lt__(self, other):
|
||||
return (self.line, self.col) < (other.line, other.col)
|
||||
|
||||
def __le__(self, other):
|
||||
return (self.line, self.col) <= (other.line, other.col)
|
||||
|
||||
def __repr__(self):
|
||||
return "(%i,%i)" % (self.line, self.col)
|
@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Sources of snippet definitions."""
|
||||
|
||||
# TODO(sirver): these should register themselves with the Manager, so that
|
||||
# other plugins can extend them more easily.
|
||||
from UltiSnips.providers.snippet_file import UltiSnipsFileProvider, \
|
||||
base_snippet_files_for
|
||||
from UltiSnips.providers.added_snippets_provider import AddedSnippetsProvider
|
@ -0,0 +1,43 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Base class for snippet providers."""
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
from UltiSnips.providers._snippet_dictionary import SnippetDictionary
|
||||
|
||||
class SnippetProvider(object):
|
||||
"""See module docstring."""
|
||||
|
||||
def __init__(self):
|
||||
self._snippets = defaultdict(SnippetDictionary)
|
||||
|
||||
def get_snippets(self, filetypes, before, possible):
|
||||
"""Returns the snippets for all 'filetypes' (in order) and their
|
||||
parents matching the text 'before'. If 'possible' is true, a partial
|
||||
match is enough."""
|
||||
found_snippets = []
|
||||
for ft in filetypes:
|
||||
found_snippets += self._find_snippets(ft, before, possible)
|
||||
return found_snippets
|
||||
|
||||
def _find_snippets(self, ft, trigger, potentially=False, seen=None):
|
||||
"""Find snippets matching 'trigger' for 'ft'. If 'potentially' is True,
|
||||
partial matches are enough."""
|
||||
snips = self._snippets.get(ft, None)
|
||||
if not snips:
|
||||
return []
|
||||
if not seen:
|
||||
seen = set()
|
||||
seen.add(ft)
|
||||
parent_results = []
|
||||
# TODO(sirver): extends information is not bound to one
|
||||
# provider. It should be tracked further up.
|
||||
for parent_ft in snips.extends:
|
||||
if parent_ft not in seen:
|
||||
seen.add(parent_ft)
|
||||
parent_results += self._find_snippets(parent_ft, trigger,
|
||||
potentially, seen)
|
||||
return parent_results + snips.get_matching_snippets(
|
||||
trigger, potentially)
|
@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Implements a container for parsed snippets."""
|
||||
|
||||
import hashlib
|
||||
import os
|
||||
|
||||
def _hash_file(path):
|
||||
"""Returns a hashdigest of 'path'"""
|
||||
if not os.path.isfile(path):
|
||||
return False
|
||||
return hashlib.sha1(open(path, "rb").read()).hexdigest()
|
||||
|
||||
# TODO(sirver): This class should not hash any files nor keep track of extends.
|
||||
class SnippetDictionary(object):
|
||||
"""See module docstring."""
|
||||
|
||||
def __init__(self):
|
||||
self._added = []
|
||||
self._extends = []
|
||||
self._files = {}
|
||||
self._snippets = []
|
||||
|
||||
def add_snippet(self, snippet, filename):
|
||||
"""Add 'snippet' to this dictionary. If 'filename' is given, also watch
|
||||
the original file for changes."""
|
||||
if filename:
|
||||
self._snippets.append(snippet)
|
||||
if filename not in self.files:
|
||||
self.addfile(filename)
|
||||
else:
|
||||
self._added.append(snippet)
|
||||
|
||||
def get_matching_snippets(self, trigger, potentially):
|
||||
"""Returns all snippets matching the given trigger. If 'potentially' is
|
||||
true, returns all that could_match()."""
|
||||
all_snippets = self._added + self._snippets
|
||||
if not potentially:
|
||||
return [s for s in all_snippets if s.matches(trigger)]
|
||||
else:
|
||||
return [s for s in all_snippets if s.could_match(trigger)]
|
||||
|
||||
def clear_snippets(self, triggers=None):
|
||||
"""Remove all snippets that match each trigger in 'triggers'. When
|
||||
'triggers' is None, empties this dictionary completely."""
|
||||
if triggers is None:
|
||||
triggers = []
|
||||
if triggers:
|
||||
for trigger in triggers:
|
||||
for snippet in self.get_matching_snippets(trigger, False):
|
||||
if snippet in self._snippets:
|
||||
self._snippets.remove(snippet)
|
||||
if snippet in self._added:
|
||||
self._added.remove(snippet)
|
||||
else:
|
||||
self._snippets = []
|
||||
self._added = []
|
||||
|
||||
def addfile(self, path):
|
||||
"""Add this file to the files we read triggers from."""
|
||||
self.files[path] = _hash_file(path)
|
||||
|
||||
def has_any_file_changed(self):
|
||||
"""Returns True if any of our watched files has changed since we read
|
||||
it last."""
|
||||
for path, hash in self.files.items():
|
||||
if not hash or hash != _hash_file(path):
|
||||
return True
|
||||
return False
|
||||
|
||||
@property
|
||||
def files(self):
|
||||
"""All files we have read snippets from."""
|
||||
return self._files
|
||||
|
||||
@property
|
||||
def extends(self):
|
||||
"""The list of filetypes this filetype extends."""
|
||||
return self._extends
|
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Handles manually added snippets UltiSnips_Manager.add_snippet()."""
|
||||
|
||||
from UltiSnips.providers._base import SnippetProvider
|
||||
|
||||
class AddedSnippetsProvider(SnippetProvider):
|
||||
"""See module docstring."""
|
||||
|
||||
def add_snippet(self, ft, snippet):
|
||||
"""Adds the given 'snippet' for 'ft'."""
|
||||
self._snippets[ft].add_snippet(snippet, None)
|
@ -0,0 +1,152 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Code to provide access to UltiSnips files from disk."""
|
||||
|
||||
import glob
|
||||
import os
|
||||
|
||||
from UltiSnips.providers._base import SnippetProvider
|
||||
from UltiSnips.providers.ultisnips_file import parse_snippets_file
|
||||
from UltiSnips.snippet_definition import SnippetDefinition
|
||||
import UltiSnips._vim as _vim
|
||||
|
||||
def _plugin_dir():
|
||||
"""Calculates the plugin directory for UltiSnips."""
|
||||
directory = __file__
|
||||
for _ in range(10):
|
||||
directory = os.path.dirname(directory)
|
||||
if (os.path.isdir(os.path.join(directory, "plugin")) and
|
||||
os.path.isdir(os.path.join(directory, "doc"))):
|
||||
return directory
|
||||
raise Exception("Unable to find the plugin directory.")
|
||||
|
||||
def base_snippet_files_for(ft, default=True):
|
||||
"""Returns a list of snippet files matching the given filetype (ft).
|
||||
If default is set to false, it doesn't include shipped files.
|
||||
|
||||
Searches through each path in 'runtimepath' in reverse order,
|
||||
in each of these, it searches each directory name listed in
|
||||
'g:UltiSnipsSnippetDirectories' in order, then looks for files in these
|
||||
directories called 'ft.snippets' or '*_ft.snippets' replacing ft with
|
||||
the filetype.
|
||||
"""
|
||||
if _vim.eval("exists('b:UltiSnipsSnippetDirectories')") == "1":
|
||||
snippet_dirs = _vim.eval("b:UltiSnipsSnippetDirectories")
|
||||
else:
|
||||
snippet_dirs = _vim.eval("g:UltiSnipsSnippetDirectories")
|
||||
|
||||
paths = _vim.eval("&runtimepath").split(',')
|
||||
base_snippets = os.path.realpath(os.path.join(_plugin_dir(), "UltiSnips"))
|
||||
ret = []
|
||||
for rtp in paths:
|
||||
for snippet_dir in snippet_dirs:
|
||||
pth = os.path.realpath(os.path.expanduser(
|
||||
os.path.join(rtp, snippet_dir)))
|
||||
patterns = ["%s.snippets", "%s_*.snippets", os.path.join("%s", "*")]
|
||||
if not default and pth == base_snippets:
|
||||
patterns.remove("%s.snippets")
|
||||
|
||||
for pattern in patterns:
|
||||
for fn in glob.glob(os.path.join(pth, pattern % ft)):
|
||||
if fn not in ret:
|
||||
ret.append(fn)
|
||||
return ret
|
||||
|
||||
class SnippetSyntaxError(RuntimeError):
|
||||
"""Thrown when a syntax error is found in a file."""
|
||||
def __init__(self, filename, line_index, msg):
|
||||
RuntimeError.__init__(self, "%s in %s:%d" % (
|
||||
msg, filename, line_index))
|
||||
|
||||
class UltiSnipsFileProvider(SnippetProvider):
|
||||
"""Manages all snippets definitions found in rtp."""
|
||||
|
||||
def get_snippets(self, filetypes, before, possible):
|
||||
for ft in filetypes:
|
||||
self._ensure_loaded(ft)
|
||||
|
||||
return SnippetProvider.get_snippets(self, filetypes, before, possible)
|
||||
|
||||
def _ensure_loaded(self, ft, already_loaded=None):
|
||||
"""Make sure that the snippets for 'ft' and everything it extends are
|
||||
loaded."""
|
||||
if not already_loaded:
|
||||
already_loaded = set()
|
||||
|
||||
if ft in already_loaded:
|
||||
return
|
||||
already_loaded.add(ft)
|
||||
|
||||
if self._needs_update(ft):
|
||||
self._load_snippets_for(ft)
|
||||
|
||||
for parent in self._snippets[ft].extends:
|
||||
self._ensure_loaded(parent, already_loaded)
|
||||
|
||||
def _needs_update(self, ft):
|
||||
"""Returns true if any files for 'ft' have changed and must be
|
||||
reloaded."""
|
||||
if ft not in self._snippets:
|
||||
return True
|
||||
elif self._snippets[ft].has_any_file_changed():
|
||||
return True
|
||||
else:
|
||||
cur_snips = set(base_snippet_files_for(ft))
|
||||
old_snips = set(self._snippets[ft].files)
|
||||
if cur_snips - old_snips:
|
||||
return True
|
||||
return False
|
||||
|
||||
def _load_snippets_for(self, ft):
|
||||
"""Load all snippets for the given 'ft'."""
|
||||
if ft in self._snippets:
|
||||
del self._snippets[ft]
|
||||
for fn in base_snippet_files_for(ft):
|
||||
self._parse_snippets(ft, fn)
|
||||
# Now load for the parents
|
||||
for parent_ft in self._snippets[ft].extends:
|
||||
if parent_ft not in self._snippets:
|
||||
self._load_snippets_for(parent_ft)
|
||||
|
||||
def _parse_snippets(self, ft, filename):
|
||||
"""Parse the file 'filename' for the given 'ft' and watch it for
|
||||
changes in the future. 'file_data' can be injected in tests."""
|
||||
current_snippet_priority = 0
|
||||
self._snippets[ft].addfile(filename)
|
||||
file_data = open(filename, "r").read()
|
||||
for event, data in parse_snippets_file(file_data):
|
||||
if event == "error":
|
||||
msg, line_index = data
|
||||
filename = _vim.eval("""fnamemodify(%s, ":~:.")""" %
|
||||
_vim.escape(filename))
|
||||
raise SnippetSyntaxError(filename, line_index, msg)
|
||||
elif event == "clearsnippets":
|
||||
# TODO(sirver): clear snippets should clear for
|
||||
# more providers, not only ultisnips files.
|
||||
triggers, = data
|
||||
self._snippets[ft].clear_snippets(triggers)
|
||||
elif event == "extends":
|
||||
# TODO(sirver): extends information is more global
|
||||
# than one snippet provider.
|
||||
filetypes, = data
|
||||
self._add_extending_info(ft, filetypes)
|
||||
elif event == "snippet":
|
||||
trigger, value, description, options, global_pythons = data
|
||||
self._snippets[ft].add_snippet(
|
||||
SnippetDefinition(current_snippet_priority, trigger, value,
|
||||
description, options, global_pythons), filename
|
||||
)
|
||||
elif event == "priority":
|
||||
priority, = data
|
||||
current_snippet_priority = priority
|
||||
else:
|
||||
assert False, "Unhandled %s: %r" % (event, data)
|
||||
|
||||
def _add_extending_info(self, ft, parents):
|
||||
"""Add the list of 'parents' as being extended by the 'ft'."""
|
||||
sd = self._snippets[ft]
|
||||
for parent in parents:
|
||||
if parent in sd.extends:
|
||||
continue
|
||||
sd.extends.append(parent)
|
@ -0,0 +1,125 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Parsing of snippet files."""
|
||||
|
||||
from collections import defaultdict
|
||||
|
||||
class _LineIterator(object):
|
||||
"""Convenience class that keeps track of line numbers."""
|
||||
|
||||
def __init__(self, text):
|
||||
self._line_index = None
|
||||
self._lines = enumerate(text.splitlines(True), 1)
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def __next__(self):
|
||||
"""Returns the next line."""
|
||||
self._line_index, line = next(self._lines)
|
||||
return line
|
||||
next = __next__ # for python2
|
||||
|
||||
@property
|
||||
def line_index(self):
|
||||
"""The 1 based line index in the current file."""
|
||||
return self._line_index
|
||||
|
||||
def _handle_snippet_or_global(line, lines, globals):
|
||||
"""Parses the snippet that begins at the current line."""
|
||||
|
||||
descr = ""
|
||||
opts = ""
|
||||
|
||||
# Ensure this is a snippet
|
||||
snip = line.split()[0]
|
||||
|
||||
# Get and strip options if they exist
|
||||
remain = line[len(snip):].strip()
|
||||
words = remain.split()
|
||||
if len(words) > 2:
|
||||
# second to last word ends with a quote
|
||||
if '"' not in words[-1] and words[-2][-1] == '"':
|
||||
opts = words[-1]
|
||||
remain = remain[:-len(opts) - 1].rstrip()
|
||||
|
||||
# Get and strip description if it exists
|
||||
remain = remain.strip()
|
||||
if len(remain.split()) > 1 and remain[-1] == '"':
|
||||
left = remain[:-1].rfind('"')
|
||||
if left != -1 and left != 0:
|
||||
descr, remain = remain[left:], remain[:left]
|
||||
|
||||
# The rest is the trigger
|
||||
trig = remain.strip()
|
||||
if len(trig.split()) > 1 or "r" in opts:
|
||||
if trig[0] != trig[-1]:
|
||||
return "error", ("Invalid multiword trigger: '%s'" % trig,
|
||||
lines.line_index)
|
||||
trig = trig[1:-1]
|
||||
end = "end" + snip
|
||||
content = ""
|
||||
|
||||
found_end = False
|
||||
for line in lines:
|
||||
if line.rstrip() == end:
|
||||
content = content[:-1] # Chomp the last newline
|
||||
found_end = True
|
||||
break
|
||||
content += line
|
||||
|
||||
if not found_end:
|
||||
return "error", ("Missing 'endsnippet' for %r" % trig, lines.line_index)
|
||||
|
||||
if snip == "global":
|
||||
globals[trig].append(content)
|
||||
elif snip == "snippet":
|
||||
return "snippet", (trig, content, descr, opts, globals)
|
||||
else:
|
||||
return "error", ("Invalid snippet type: '%s'" % snip, lines.line_index)
|
||||
|
||||
def _head_tail(line):
|
||||
"""Returns the first word in 'line' and the rest of 'line' or None if the
|
||||
line is too short."""
|
||||
generator = (t.strip() for t in line.split(None, 1))
|
||||
head = next(generator).strip()
|
||||
tail = ''
|
||||
try:
|
||||
tail = next(generator).strip()
|
||||
except StopIteration:
|
||||
pass
|
||||
return head, tail
|
||||
|
||||
|
||||
def parse_snippets_file(data):
|
||||
"""Parse 'data' assuming it is a snippet file. Yields events in the
|
||||
file."""
|
||||
|
||||
globals = defaultdict(list)
|
||||
lines = _LineIterator(data)
|
||||
for line in lines:
|
||||
if not line.strip():
|
||||
continue
|
||||
|
||||
head, tail = _head_tail(line)
|
||||
if head == "extends":
|
||||
if tail:
|
||||
yield "extends", ([p.strip() for p in tail.split(',')],)
|
||||
else:
|
||||
yield "error", ("'extends' without file types",
|
||||
lines.line_index)
|
||||
elif head in ("snippet", "global"):
|
||||
snippet = _handle_snippet_or_global(line, lines, globals)
|
||||
if snippet is not None:
|
||||
yield snippet
|
||||
elif head == "clearsnippets":
|
||||
yield "clearsnippets", (tail.split(),)
|
||||
elif head == "priority":
|
||||
try:
|
||||
priority = int(tail.split()[0])
|
||||
yield "priority", (priority,)
|
||||
except (ValueError, IndexError):
|
||||
yield "error", ("Invalid priority %r" % tail, lines.line_index)
|
||||
elif head and not head.startswith('#'):
|
||||
yield "error", ("Invalid line %r" % line.rstrip(), lines.line_index)
|
@ -0,0 +1,214 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Snippet representation after parsing."""
|
||||
|
||||
import re
|
||||
|
||||
from UltiSnips.compatibility import as_unicode
|
||||
from UltiSnips.text_objects import SnippetInstance
|
||||
from UltiSnips.indent_util import IndentUtil
|
||||
import UltiSnips._vim as _vim
|
||||
|
||||
|
||||
def _words_for_line(trigger, before, num_words=None):
|
||||
""" Gets the final 'num_words' words from 'before'.
|
||||
If num_words is None, then use the number of words in
|
||||
'trigger'.
|
||||
"""
|
||||
if not len(before):
|
||||
return ''
|
||||
|
||||
if num_words is None:
|
||||
num_words = len(trigger.split())
|
||||
|
||||
word_list = before.split()
|
||||
if len(word_list) <= num_words:
|
||||
return before.strip()
|
||||
else:
|
||||
before_words = before
|
||||
for i in range(-1, -(num_words + 1), -1):
|
||||
left = before_words.rfind(word_list[i])
|
||||
before_words = before_words[:left]
|
||||
return before[len(before_words):].strip()
|
||||
|
||||
|
||||
class SnippetDefinition(object):
|
||||
"""Represents a snippet as parsed from a file."""
|
||||
|
||||
_INDENT = re.compile(r"^[ \t]*")
|
||||
_TABS = re.compile(r"^\t*")
|
||||
|
||||
def __init__(self, priority, trigger, value, description, options, globals):
|
||||
self._priority = priority
|
||||
self._trigger = as_unicode(trigger)
|
||||
self._value = as_unicode(value)
|
||||
self._description = as_unicode(description)
|
||||
self._opts = options
|
||||
self._matched = ""
|
||||
self._last_re = None
|
||||
self._globals = globals
|
||||
|
||||
def __repr__(self):
|
||||
return "SnippetDefinition(%r,%s,%s,%s)" % (
|
||||
self._priority, self._trigger, self._description, self._opts)
|
||||
|
||||
def _re_match(self, trigger):
|
||||
""" Test if a the current regex trigger matches
|
||||
`trigger`. If so, set _last_re and _matched.
|
||||
"""
|
||||
for match in re.finditer(self._trigger, trigger):
|
||||
if match.end() != len(trigger):
|
||||
continue
|
||||
else:
|
||||
self._matched = trigger[match.start():match.end()]
|
||||
|
||||
self._last_re = match
|
||||
return match
|
||||
return False
|
||||
|
||||
def has_option(self, opt):
|
||||
""" Check if the named option is set """
|
||||
return opt in self._opts
|
||||
|
||||
def matches(self, trigger):
|
||||
"""Returns True if this snippet matches 'trigger'."""
|
||||
# If user supplies both "w" and "i", it should perhaps be an
|
||||
# error, but if permitted it seems that "w" should take precedence
|
||||
# (since matching at word boundary and within a word == matching at word
|
||||
# boundary).
|
||||
self._matched = ""
|
||||
|
||||
# Don't expand on whitespace
|
||||
if trigger and trigger.rstrip() != trigger:
|
||||
return False
|
||||
|
||||
words = _words_for_line(self._trigger, trigger)
|
||||
|
||||
if "r" in self._opts:
|
||||
match = self._re_match(trigger)
|
||||
elif "w" in self._opts:
|
||||
words_len = len(self._trigger)
|
||||
words_prefix = words[:-words_len]
|
||||
words_suffix = words[-words_len:]
|
||||
match = (words_suffix == self._trigger)
|
||||
if match and words_prefix:
|
||||
# Require a word boundary between prefix and suffix.
|
||||
boundary_chars = words_prefix[-1:] + words_suffix[:1]
|
||||
boundary_chars = boundary_chars.replace('"', '\\"')
|
||||
match = _vim.eval('"%s" =~# "\\\\v.<."' % boundary_chars) != '0'
|
||||
elif "i" in self._opts:
|
||||
match = words.endswith(self._trigger)
|
||||
else:
|
||||
match = (words == self._trigger)
|
||||
|
||||
# By default, we match the whole trigger
|
||||
if match and not self._matched:
|
||||
self._matched = self._trigger
|
||||
|
||||
# Ensure the match was on a word boundry if needed
|
||||
if "b" in self._opts and match:
|
||||
text_before = trigger.rstrip()[:-len(self._matched)]
|
||||
if text_before.strip(" \t") != '':
|
||||
self._matched = ""
|
||||
return False
|
||||
return match
|
||||
|
||||
def could_match(self, trigger):
|
||||
"""Return True if this snippet could match the (partial) 'trigger'."""
|
||||
self._matched = ""
|
||||
|
||||
# List all on whitespace.
|
||||
if trigger and trigger[-1] in (" ", "\t"):
|
||||
trigger = ""
|
||||
if trigger and trigger.rstrip() is not trigger:
|
||||
return False
|
||||
|
||||
words = _words_for_line(self._trigger, trigger)
|
||||
|
||||
if "r" in self._opts:
|
||||
# Test for full match only
|
||||
match = self._re_match(trigger)
|
||||
elif "w" in self._opts:
|
||||
# Trim non-empty prefix up to word boundary, if present.
|
||||
qwords = words.replace('"', '\\"')
|
||||
words_suffix = _vim.eval(
|
||||
'substitute("%s", "\\\\v^.+<(.+)", "\\\\1", "")' % qwords)
|
||||
match = self._trigger.startswith(words_suffix)
|
||||
self._matched = words_suffix
|
||||
|
||||
# TODO: list_snippets() function cannot handle partial-trigger
|
||||
# matches yet, so for now fail if we trimmed the prefix.
|
||||
if words_suffix != words:
|
||||
match = False
|
||||
elif "i" in self._opts:
|
||||
# TODO: It is hard to define when a inword snippet could match,
|
||||
# therefore we check only for full-word trigger.
|
||||
match = self._trigger.startswith(words)
|
||||
else:
|
||||
match = self._trigger.startswith(words)
|
||||
|
||||
# By default, we match the words from the trigger
|
||||
if match and not self._matched:
|
||||
self._matched = words
|
||||
|
||||
# Ensure the match was on a word boundry if needed
|
||||
if "b" in self._opts and match:
|
||||
text_before = trigger.rstrip()[:-len(self._matched)]
|
||||
if text_before.strip(" \t") != '':
|
||||
self._matched = ""
|
||||
return False
|
||||
|
||||
return match
|
||||
|
||||
@property
|
||||
def description(self):
|
||||
"""Descriptive text for this snippet."""
|
||||
return ("(%s) %s" % (self._trigger, self._description)).strip()
|
||||
|
||||
@property
|
||||
def priority(self):
|
||||
"""The snippets priority, which defines which snippet will be preferred
|
||||
over others with the same trigger."""
|
||||
return self._priority
|
||||
|
||||
@property
|
||||
def trigger(self):
|
||||
"""The trigger text for the snippet."""
|
||||
return self._trigger
|
||||
|
||||
@property
|
||||
def matched(self):
|
||||
"""The last text that matched this snippet in match() or
|
||||
could_match()."""
|
||||
return self._matched
|
||||
|
||||
def launch(self, text_before, visual_content, parent, start, end):
|
||||
"""Launch this snippet, overwriting the text 'start' to 'end' and
|
||||
keeping the 'text_before' on the launch line. 'Parent' is the parent
|
||||
snippet instance if any."""
|
||||
indent = self._INDENT.match(text_before).group(0)
|
||||
lines = (self._value + "\n").splitlines()
|
||||
ind_util = IndentUtil()
|
||||
|
||||
# Replace leading tabs in the snippet definition via proper indenting
|
||||
snippet_definition = []
|
||||
for line_num, line in enumerate(lines):
|
||||
if "t" in self._opts:
|
||||
tabs = 0
|
||||
else:
|
||||
tabs = len(self._TABS.match(line).group(0))
|
||||
|
||||
line_ind = ind_util.ntabs_to_proper_indent(tabs)
|
||||
|
||||
if line_num != 0:
|
||||
line_ind = indent + line_ind
|
||||
|
||||
snippet_definition.append(line_ind + line[tabs:])
|
||||
snippet_definition = '\n'.join(snippet_definition)
|
||||
|
||||
si = SnippetInstance(self, parent, indent, snippet_definition, start,
|
||||
end, visual_content, last_re=self._last_re,
|
||||
globals=self._globals)
|
||||
|
||||
return si
|
@ -0,0 +1,526 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Contains the SnippetManager facade used by all Vim Functions."""
|
||||
|
||||
from collections import defaultdict
|
||||
from functools import wraps
|
||||
import os
|
||||
import traceback
|
||||
|
||||
from UltiSnips._diff import diff, guess_edit
|
||||
from UltiSnips.compatibility import as_unicode
|
||||
from UltiSnips.position import Position
|
||||
from UltiSnips.providers import UltiSnipsFileProvider, \
|
||||
base_snippet_files_for, AddedSnippetsProvider
|
||||
from UltiSnips.snippet_definition import SnippetDefinition
|
||||
from UltiSnips.vim_state import VimState, VisualContentPreserver
|
||||
import UltiSnips._vim as _vim
|
||||
|
||||
def _ask_snippets(snippets):
|
||||
""" Given a list of snippets, ask the user which one they
|
||||
want to use, and return it.
|
||||
"""
|
||||
display = [as_unicode("%i: %s") % (i+1, s.description) for
|
||||
i, s in enumerate(snippets)]
|
||||
try:
|
||||
rv = _vim.eval("inputlist(%s)" % _vim.escape(display))
|
||||
if rv is None or rv == '0':
|
||||
return None
|
||||
rv = int(rv)
|
||||
if rv > len(snippets):
|
||||
rv = len(snippets)
|
||||
return snippets[rv-1]
|
||||
except _vim.error:
|
||||
# Likely "invalid expression", but might be translated. We have no way
|
||||
# of knowing the exact error, therefore, we ignore all errors silently.
|
||||
return None
|
||||
except KeyboardInterrupt:
|
||||
return None
|
||||
|
||||
|
||||
def err_to_scratch_buffer(func):
|
||||
"""Decorator that will catch any Exception that 'func' throws and displays
|
||||
it in a new Vim scratch buffer."""
|
||||
@wraps(func)
|
||||
def wrapper(self, *args, **kwds):
|
||||
try:
|
||||
return func(self, *args, **kwds)
|
||||
except: # pylint: disable=bare-except
|
||||
msg = \
|
||||
"""An error occured. This is either a bug in UltiSnips or a bug in a
|
||||
snippet definition. If you think this is a bug, please report it to
|
||||
https://github.com/SirVer/ultisnips/issues/new.
|
||||
|
||||
Following is the full stack trace:
|
||||
"""
|
||||
msg += traceback.format_exc()
|
||||
# Vim sends no WinLeave msg here.
|
||||
self._leaving_buffer() # pylint:disable=protected-access
|
||||
_vim.new_scratch_buffer(msg)
|
||||
return wrapper
|
||||
|
||||
|
||||
# TODO(sirver): This class is still too long. It should only contain public
|
||||
# facing methods, most of the private methods should be moved outside of it.
|
||||
class SnippetManager(object):
|
||||
"""The main entry point for all UltiSnips functionality. All Vim functions
|
||||
call methods in this class."""
|
||||
|
||||
def __init__(self, expand_trigger, forward_trigger, backward_trigger):
|
||||
self.expand_trigger = expand_trigger
|
||||
self.forward_trigger = forward_trigger
|
||||
self.backward_trigger = backward_trigger
|
||||
self._supertab_keys = None
|
||||
self._csnippets = []
|
||||
self._reset()
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def jump_forwards(self):
|
||||
"""Jumps to the next tabstop."""
|
||||
_vim.command("let g:ulti_jump_forwards_res = 1")
|
||||
if not self._jump():
|
||||
_vim.command("let g:ulti_jump_forwards_res = 0")
|
||||
return self._handle_failure(self.forward_trigger)
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def jump_backwards(self):
|
||||
"""Jumps to the previous tabstop."""
|
||||
_vim.command("let g:ulti_jump_backwards_res = 1")
|
||||
if not self._jump(True):
|
||||
_vim.command("let g:ulti_jump_backwards_res = 0")
|
||||
return self._handle_failure(self.backward_trigger)
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def expand(self):
|
||||
"""Try to expand a snippet at the current position."""
|
||||
_vim.command("let g:ulti_expand_res = 1")
|
||||
if not self._try_expand():
|
||||
_vim.command("let g:ulti_expand_res = 0")
|
||||
self._handle_failure(self.expand_trigger)
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def expand_or_jump(self):
|
||||
"""
|
||||
This function is used for people who wants to have the same trigger for
|
||||
expansion and forward jumping. It first tries to expand a snippet, if
|
||||
this fails, it tries to jump forward.
|
||||
"""
|
||||
_vim.command('let g:ulti_expand_or_jump_res = 1')
|
||||
rv = self._try_expand()
|
||||
if not rv:
|
||||
_vim.command('let g:ulti_expand_or_jump_res = 2')
|
||||
rv = self._jump()
|
||||
if not rv:
|
||||
_vim.command('let g:ulti_expand_or_jump_res = 0')
|
||||
self._handle_failure(self.expand_trigger)
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def snippets_in_current_scope(self):
|
||||
"""Returns the snippets that could be expanded to Vim as a global
|
||||
variable."""
|
||||
before = _vim.buf.line_till_cursor
|
||||
snippets = self._snips(before, True)
|
||||
|
||||
# Sort snippets alphabetically
|
||||
snippets.sort(key=lambda x: x.trigger)
|
||||
for snip in snippets:
|
||||
description = snip.description[snip.description.find(snip.trigger) +
|
||||
len(snip.trigger) + 2:]
|
||||
|
||||
key = as_unicode(snip.trigger)
|
||||
description = as_unicode(description)
|
||||
|
||||
# remove surrounding "" or '' in snippet description if it exists
|
||||
if len(description) > 2:
|
||||
if (description[0] == description[-1] and
|
||||
description[0] in "'\""):
|
||||
description = description[1:-1]
|
||||
|
||||
_vim.command(as_unicode(
|
||||
"let g:current_ulti_dict['{key}'] = '{val}'").format(
|
||||
key=key.replace("'", "''"),
|
||||
val=description.replace("'", "''")))
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def list_snippets(self):
|
||||
"""Shows the snippets that could be expanded to the User and let her
|
||||
select one."""
|
||||
before = _vim.buf.line_till_cursor
|
||||
snippets = self._snips(before, True)
|
||||
|
||||
if len(snippets) == 0:
|
||||
self._handle_failure(self.backward_trigger)
|
||||
return True
|
||||
|
||||
# Sort snippets alphabetically
|
||||
snippets.sort(key=lambda x: x.trigger)
|
||||
|
||||
if not snippets:
|
||||
return True
|
||||
|
||||
snippet = _ask_snippets(snippets)
|
||||
if not snippet:
|
||||
return True
|
||||
|
||||
self._do_snippet(snippet, before)
|
||||
|
||||
return True
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def add_snippet(self, trigger, value, description,
|
||||
options, ft="all", priority=0):
|
||||
"""Add a snippet to the list of known snippets of the given 'ft'."""
|
||||
self._added_snippets_provider.add_snippet(ft, SnippetDefinition(
|
||||
priority, trigger, value, description, options, {})
|
||||
)
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def expand_anon(self, value, trigger="", description="", options=""):
|
||||
"""Expand an anonymous snippet right here."""
|
||||
before = _vim.buf.line_till_cursor
|
||||
snip = SnippetDefinition(0, trigger, value, description, options, {})
|
||||
|
||||
if not trigger or snip.matches(before):
|
||||
self._do_snippet(snip, before)
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def reset_buffer_filetypes(self):
|
||||
"""Reset the filetypes for the current buffer."""
|
||||
if _vim.buf.number in self._filetypes:
|
||||
del self._filetypes[_vim.buf.number]
|
||||
|
||||
def add_buffer_filetypes(self, ft):
|
||||
"""Checks for changes in the list of snippet files or the contents of
|
||||
the snippet files and reloads them if necessary. """
|
||||
buf_fts = self._filetypes[_vim.buf.number]
|
||||
idx = -1
|
||||
for ft in ft.split("."):
|
||||
ft = ft.strip()
|
||||
if not ft:
|
||||
continue
|
||||
try:
|
||||
idx = buf_fts.index(ft)
|
||||
except ValueError:
|
||||
self._filetypes[_vim.buf.number].insert(idx + 1, ft)
|
||||
idx += 1
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def _cursor_moved(self):
|
||||
"""Called whenever the cursor moved."""
|
||||
self._vstate.remember_position()
|
||||
if _vim.eval("mode()") not in 'in':
|
||||
return
|
||||
|
||||
if self._ignore_movements:
|
||||
self._ignore_movements = False
|
||||
return
|
||||
|
||||
if self._csnippets:
|
||||
cstart = self._csnippets[0].start.line
|
||||
cend = self._csnippets[0].end.line + \
|
||||
self._vstate.diff_in_buffer_length
|
||||
ct = _vim.buf[cstart:cend + 1]
|
||||
lt = self._vstate.remembered_buffer
|
||||
pos = _vim.buf.cursor
|
||||
|
||||
lt_span = [0, len(lt)]
|
||||
ct_span = [0, len(ct)]
|
||||
initial_line = cstart
|
||||
|
||||
# Cut down on lines searched for changes. Start from behind and
|
||||
# remove all equal lines. Then do the same from the front.
|
||||
if lt and ct:
|
||||
while (lt[lt_span[1]-1] == ct[ct_span[1]-1] and
|
||||
self._vstate.ppos.line < initial_line + lt_span[1]-1 and
|
||||
pos.line < initial_line + ct_span[1]-1 and
|
||||
(lt_span[0] < lt_span[1]) and
|
||||
(ct_span[0] < ct_span[1])):
|
||||
ct_span[1] -= 1
|
||||
lt_span[1] -= 1
|
||||
while (lt_span[0] < lt_span[1] and
|
||||
ct_span[0] < ct_span[1] and
|
||||
lt[lt_span[0]] == ct[ct_span[0]] and
|
||||
self._vstate.ppos.line >= initial_line and
|
||||
pos.line >= initial_line):
|
||||
ct_span[0] += 1
|
||||
lt_span[0] += 1
|
||||
initial_line += 1
|
||||
ct_span[0] = max(0, ct_span[0] - 1)
|
||||
lt_span[0] = max(0, lt_span[0] - 1)
|
||||
initial_line = max(cstart, initial_line - 1)
|
||||
|
||||
lt = lt[lt_span[0]:lt_span[1]]
|
||||
ct = ct[ct_span[0]:ct_span[1]]
|
||||
|
||||
try:
|
||||
rv, es = guess_edit(initial_line, lt, ct, self._vstate)
|
||||
if not rv:
|
||||
lt = '\n'.join(lt)
|
||||
ct = '\n'.join(ct)
|
||||
es = diff(lt, ct, initial_line)
|
||||
self._csnippets[0].replay_user_edits(es)
|
||||
except IndexError:
|
||||
# Rather do nothing than throwing an error. It will be correct
|
||||
# most of the time
|
||||
pass
|
||||
|
||||
self._check_if_still_inside_snippet()
|
||||
if self._csnippets:
|
||||
self._csnippets[0].update_textobjects()
|
||||
self._vstate.remember_buffer(self._csnippets[0])
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def _reset(self):
|
||||
"""Reset the class to the state it had directly after creation."""
|
||||
self._vstate = VimState()
|
||||
self._filetypes = defaultdict(lambda: ['all'])
|
||||
self._visual_content = VisualContentPreserver()
|
||||
self._snippet_providers = [
|
||||
AddedSnippetsProvider(),
|
||||
UltiSnipsFileProvider()
|
||||
]
|
||||
self._added_snippets_provider = self._snippet_providers[0]
|
||||
|
||||
while len(self._csnippets):
|
||||
self._current_snippet_is_done()
|
||||
|
||||
self._reinit()
|
||||
|
||||
@err_to_scratch_buffer
|
||||
def _save_last_visual_selection(self):
|
||||
"""
|
||||
This is called when the expand trigger is pressed in visual mode.
|
||||
Our job is to remember everything between '< and '> and pass it on to
|
||||
${VISUAL} in case it will be needed.
|
||||
"""
|
||||
self._visual_content.conserve()
|
||||
|
||||
|
||||
def _leaving_buffer(self):
|
||||
"""Called when the user switches tabs/windows/buffers. It basically
|
||||
means that all snippets must be properly terminated."""
|
||||
while len(self._csnippets):
|
||||
self._current_snippet_is_done()
|
||||
self._reinit()
|
||||
|
||||
def _reinit(self):
|
||||
"""Resets transient state."""
|
||||
self._ctab = None
|
||||
self._ignore_movements = False
|
||||
|
||||
def _check_if_still_inside_snippet(self):
|
||||
"""Checks if the cursor is outside of the current snippet."""
|
||||
if self._cs and (
|
||||
not self._cs.start <= _vim.buf.cursor <= self._cs.end
|
||||
):
|
||||
self._current_snippet_is_done()
|
||||
self._reinit()
|
||||
self._check_if_still_inside_snippet()
|
||||
|
||||
def _current_snippet_is_done(self):
|
||||
"""The current snippet should be terminated."""
|
||||
self._csnippets.pop()
|
||||
if not self._csnippets:
|
||||
_vim.command("call UltiSnips#map_keys#RestoreInnerKeys()")
|
||||
|
||||
def _jump(self, backwards=False):
|
||||
"""Helper method that does the actual jump."""
|
||||
jumped = False
|
||||
if self._cs:
|
||||
self._ctab = self._cs.select_next_tab(backwards)
|
||||
if self._ctab:
|
||||
if self._cs.snippet.has_option("s"):
|
||||
lineno = _vim.buf.cursor.line
|
||||
_vim.buf[lineno] = _vim.buf[lineno].rstrip()
|
||||
_vim.select(self._ctab.start, self._ctab.end)
|
||||
jumped = True
|
||||
if self._ctab.number == 0:
|
||||
self._current_snippet_is_done()
|
||||
else:
|
||||
# This really shouldn't happen, because a snippet should
|
||||
# have been popped when its final tabstop was used.
|
||||
# Cleanup by removing current snippet and recursing.
|
||||
self._current_snippet_is_done()
|
||||
jumped = self._jump(backwards)
|
||||
if jumped:
|
||||
self._vstate.remember_position()
|
||||
self._vstate.remember_unnamed_register(self._ctab.current_text)
|
||||
self._ignore_movements = True
|
||||
return jumped
|
||||
|
||||
def _leaving_insert_mode(self):
|
||||
"""Called whenever we leave the insert mode."""
|
||||
self._vstate.restore_unnamed_register()
|
||||
|
||||
def _handle_failure(self, trigger):
|
||||
"""Mainly make sure that we play well with SuperTab."""
|
||||
if trigger.lower() == "<tab>":
|
||||
feedkey = "\\" + trigger
|
||||
elif trigger.lower() == "<s-tab>":
|
||||
feedkey = "\\" + trigger
|
||||
else:
|
||||
feedkey = None
|
||||
mode = "n"
|
||||
if not self._supertab_keys:
|
||||
if _vim.eval("exists('g:SuperTabMappingForward')") != "0":
|
||||
self._supertab_keys = (
|
||||
_vim.eval("g:SuperTabMappingForward"),
|
||||
_vim.eval("g:SuperTabMappingBackward"),
|
||||
)
|
||||
else:
|
||||
self._supertab_keys = ['', '']
|
||||
|
||||
for idx, sttrig in enumerate(self._supertab_keys):
|
||||
if trigger.lower() == sttrig.lower():
|
||||
if idx == 0:
|
||||
feedkey = r"\<Plug>SuperTabForward"
|
||||
mode = "n"
|
||||
elif idx == 1:
|
||||
feedkey = r"\<Plug>SuperTabBackward"
|
||||
mode = "p"
|
||||
# Use remap mode so SuperTab mappings will be invoked.
|
||||
break
|
||||
|
||||
if (feedkey == r"\<Plug>SuperTabForward" or
|
||||
feedkey == r"\<Plug>SuperTabBackward"):
|
||||
_vim.command("return SuperTab(%s)" % _vim.escape(mode))
|
||||
elif feedkey:
|
||||
_vim.command("return %s" % _vim.escape(feedkey))
|
||||
|
||||
def _snips(self, before, possible):
|
||||
""" Returns all the snippets for the given text
|
||||
before the cursor. If possible is True, then get all
|
||||
possible matches.
|
||||
"""
|
||||
filetypes = self._filetypes[_vim.buf.number][::-1]
|
||||
matching_snippets = defaultdict(list)
|
||||
for provider in self._snippet_providers:
|
||||
for snippet in provider.get_snippets(filetypes, before, possible):
|
||||
matching_snippets[snippet.trigger].append(snippet)
|
||||
if not matching_snippets:
|
||||
return []
|
||||
|
||||
# Now filter duplicates and only keep the one with the highest
|
||||
# priority. Only keep the snippets with the highest priority.
|
||||
snippets = []
|
||||
for snippets_with_trigger in matching_snippets.values():
|
||||
highest_priority = max(s.priority for s in snippets_with_trigger)
|
||||
snippets.extend(s for s in snippets_with_trigger
|
||||
if s.priority == highest_priority)
|
||||
return snippets
|
||||
|
||||
def _do_snippet(self, snippet, before):
|
||||
"""Expands the given snippet, and handles everything
|
||||
that needs to be done with it."""
|
||||
_vim.command("call UltiSnips#map_keys#MapInnerKeys()")
|
||||
|
||||
# Adjust before, maybe the trigger is not the complete word
|
||||
text_before = before
|
||||
if snippet.matched:
|
||||
text_before = before[:-len(snippet.matched)]
|
||||
|
||||
if self._cs:
|
||||
start = Position(_vim.buf.cursor.line, len(text_before))
|
||||
end = Position(_vim.buf.cursor.line, len(before))
|
||||
|
||||
# It could be that our trigger contains the content of TextObjects
|
||||
# in our containing snippet. If this is indeed the case, we have to
|
||||
# make sure that those are properly killed. We do this by
|
||||
# pretending that the user deleted and retyped the text that our
|
||||
# trigger matched.
|
||||
edit_actions = [
|
||||
("D", start.line, start.col, snippet.matched),
|
||||
("I", start.line, start.col, snippet.matched),
|
||||
]
|
||||
self._csnippets[0].replay_user_edits(edit_actions)
|
||||
|
||||
si = snippet.launch(text_before, self._visual_content,
|
||||
self._cs.find_parent_for_new_to(start), start, end)
|
||||
else:
|
||||
start = Position(_vim.buf.cursor.line, len(text_before))
|
||||
end = Position(_vim.buf.cursor.line, len(before))
|
||||
si = snippet.launch(text_before, self._visual_content,
|
||||
None, start, end)
|
||||
|
||||
self._visual_content.reset()
|
||||
self._csnippets.append(si)
|
||||
|
||||
self._ignore_movements = True
|
||||
self._vstate.remember_buffer(self._csnippets[0])
|
||||
|
||||
self._jump()
|
||||
|
||||
def _try_expand(self):
|
||||
"""Try to expand a snippet in the current place."""
|
||||
before = _vim.buf.line_till_cursor
|
||||
if not before:
|
||||
return False
|
||||
snippets = self._snips(before, False)
|
||||
if not snippets:
|
||||
# No snippet found
|
||||
return False
|
||||
elif len(snippets) == 1:
|
||||
snippet = snippets[0]
|
||||
else:
|
||||
snippet = _ask_snippets(snippets)
|
||||
if not snippet:
|
||||
return True
|
||||
self._do_snippet(snippet, before)
|
||||
return True
|
||||
|
||||
@property
|
||||
def _cs(self):
|
||||
"""The current snippet or None."""
|
||||
if not len(self._csnippets):
|
||||
return None
|
||||
return self._csnippets[-1]
|
||||
|
||||
|
||||
@property
|
||||
def _primary_filetype(self):
|
||||
"""This filetype will be edited when UltiSnipsEdit is called without
|
||||
any arguments."""
|
||||
return self._filetypes[_vim.buf.number][0]
|
||||
|
||||
# TODO(sirver): this should talk directly to the UltiSnipsFileProvider.
|
||||
def _file_to_edit(self, ft): # pylint: disable=no-self-use
|
||||
""" Gets a file to edit based on the given filetype.
|
||||
If no filetype is given, uses the current filetype from Vim.
|
||||
|
||||
Checks 'g:UltiSnipsSnippetsDir' and uses it if it exists
|
||||
If a non-shipped file already exists, it uses it.
|
||||
Otherwise uses a file in ~/.vim/ or ~/vimfiles
|
||||
"""
|
||||
# This method is not using self, but is called by UltiSnips.vim and is
|
||||
# therefore in this class because it is the facade to Vim.
|
||||
edit = None
|
||||
existing = base_snippet_files_for(ft, False)
|
||||
filename = ft + ".snippets"
|
||||
|
||||
if _vim.eval("exists('g:UltiSnipsSnippetsDir')") == "1":
|
||||
snipdir = _vim.eval("g:UltiSnipsSnippetsDir")
|
||||
edit = os.path.join(snipdir, filename)
|
||||
elif existing:
|
||||
edit = existing[-1] # last sourced/highest priority
|
||||
else:
|
||||
home = _vim.eval("$HOME")
|
||||
rtp = [os.path.realpath(os.path.expanduser(p))
|
||||
for p in _vim.eval("&rtp").split(",")]
|
||||
snippet_dirs = ["UltiSnips"] + \
|
||||
_vim.eval("g:UltiSnipsSnippetDirectories")
|
||||
us = snippet_dirs[-1]
|
||||
|
||||
path = os.path.join(home, ".vim", us)
|
||||
for dirname in [".vim", "vimfiles"]:
|
||||
pth = os.path.join(home, dirname)
|
||||
if pth in rtp:
|
||||
path = os.path.join(pth, us)
|
||||
|
||||
if not os.path.isdir(path):
|
||||
os.mkdir(path)
|
||||
|
||||
edit = os.path.join(path, filename)
|
||||
return edit
|
@ -0,0 +1,186 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
# pylint: skip-file
|
||||
|
||||
import unittest
|
||||
|
||||
from _diff import diff, guess_edit
|
||||
from position import Position
|
||||
|
||||
|
||||
def transform(a, cmds):
|
||||
buf = a.split("\n")
|
||||
|
||||
for cmd in cmds:
|
||||
ctype, line, col, char = cmd
|
||||
if ctype == "D":
|
||||
if char != '\n':
|
||||
buf[line] = buf[line][:col] + buf[line][col+len(char):]
|
||||
else:
|
||||
buf[line] = buf[line] + buf[line+1]
|
||||
del buf[line+1]
|
||||
elif ctype == "I":
|
||||
buf[line] = buf[line][:col] + char + buf[line][col:]
|
||||
buf = '\n'.join(buf).split('\n')
|
||||
return '\n'.join(buf)
|
||||
|
||||
|
||||
import unittest
|
||||
|
||||
# Test Guessing {{{
|
||||
class _BaseGuessing(object):
|
||||
def runTest(self):
|
||||
rv, es = guess_edit(self.initial_line, self.a, self.b, Position(*self.ppos), Position(*self.pos))
|
||||
self.assertEqual(rv, True)
|
||||
self.assertEqual(self.wanted, es)
|
||||
|
||||
class TestGuessing_Noop0(_BaseGuessing, unittest.TestCase):
|
||||
a, b = [], []
|
||||
initial_line = 0
|
||||
ppos, pos = (0, 6), (0, 7)
|
||||
wanted = ()
|
||||
|
||||
class TestGuessing_InsertOneChar(_BaseGuessing, unittest.TestCase):
|
||||
a, b = ["Hello World"], ["Hello World"]
|
||||
initial_line = 0
|
||||
ppos, pos = (0, 6), (0, 7)
|
||||
wanted = (
|
||||
("I", 0, 6, " "),
|
||||
)
|
||||
class TestGuessing_InsertOneChar1(_BaseGuessing, unittest.TestCase):
|
||||
a, b = ["Hello World"], ["Hello World"]
|
||||
initial_line = 0
|
||||
ppos, pos = (0, 7), (0, 8)
|
||||
wanted = (
|
||||
("I", 0, 7, " "),
|
||||
)
|
||||
class TestGuessing_BackspaceOneChar(_BaseGuessing, unittest.TestCase):
|
||||
a, b = ["Hello World"], ["Hello World"]
|
||||
initial_line = 0
|
||||
ppos, pos = (0, 7), (0, 6)
|
||||
wanted = (
|
||||
("D", 0, 6, " "),
|
||||
)
|
||||
class TestGuessing_DeleteOneChar(_BaseGuessing, unittest.TestCase):
|
||||
a, b = ["Hello World"], ["Hello World"]
|
||||
initial_line = 0
|
||||
ppos, pos = (0, 5), (0, 5)
|
||||
wanted = (
|
||||
("D", 0, 5, " "),
|
||||
)
|
||||
|
||||
# End: Test Guessing }}}
|
||||
|
||||
class _Base(object):
|
||||
def runTest(self):
|
||||
es = diff(self.a, self.b)
|
||||
tr = transform(self.a, es)
|
||||
self.assertEqual(self.b, tr)
|
||||
self.assertEqual(self.wanted, es)
|
||||
|
||||
class TestEmptyString(_Base, unittest.TestCase):
|
||||
a, b = "", ""
|
||||
wanted = ()
|
||||
|
||||
class TestAllMatch(_Base, unittest.TestCase):
|
||||
a, b = "abcdef", "abcdef"
|
||||
wanted = ()
|
||||
|
||||
class TestLotsaNewlines(_Base, unittest.TestCase):
|
||||
a, b = "Hello", "Hello\nWorld\nWorld\nWorld"
|
||||
wanted = (
|
||||
("I", 0, 5, "\n"),
|
||||
("I", 1, 0, "World"),
|
||||
("I", 1, 5, "\n"),
|
||||
("I", 2, 0, "World"),
|
||||
("I", 2, 5, "\n"),
|
||||
("I", 3, 0, "World"),
|
||||
)
|
||||
|
||||
class TestCrash(_Base, unittest.TestCase):
|
||||
a = 'hallo Blah mitte=sdfdsfsd\nhallo kjsdhfjksdhfkjhsdfkh mittekjshdkfhkhsdfdsf'
|
||||
b = 'hallo Blah mitte=sdfdsfsd\nhallo b mittekjshdkfhkhsdfdsf'
|
||||
wanted = (
|
||||
("D", 1, 6, "kjsdhfjksdhfkjhsdfkh"),
|
||||
("I", 1, 6, "b"),
|
||||
)
|
||||
|
||||
class TestRealLife(_Base, unittest.TestCase):
|
||||
a = 'hallo End Beginning'
|
||||
b = 'hallo End t'
|
||||
wanted = (
|
||||
("D", 0, 10, "Beginning"),
|
||||
("I", 0, 10, "t"),
|
||||
)
|
||||
|
||||
class TestRealLife1(_Base, unittest.TestCase):
|
||||
a = 'Vorne hallo Hinten'
|
||||
b = 'Vorne hallo Hinten'
|
||||
wanted = (
|
||||
("I", 0, 11, " "),
|
||||
)
|
||||
|
||||
class TestWithNewline(_Base, unittest.TestCase):
|
||||
a = 'First Line\nSecond Line'
|
||||
b = 'n'
|
||||
wanted = (
|
||||
("D", 0, 0, "First Line"),
|
||||
("D", 0, 0, "\n"),
|
||||
("D", 0, 0, "Second Line"),
|
||||
("I", 0, 0, "n"),
|
||||
)
|
||||
|
||||
|
||||
class TestCheapDelete(_Base, unittest.TestCase):
|
||||
a = 'Vorne hallo Hinten'
|
||||
b = 'Vorne Hinten'
|
||||
wanted = (
|
||||
("D", 0, 5, " hallo"),
|
||||
)
|
||||
|
||||
class TestNoSubstring(_Base, unittest.TestCase):
|
||||
a,b = "abc", "def"
|
||||
wanted = (
|
||||
("D", 0, 0, "abc"),
|
||||
("I", 0, 0, "def"),
|
||||
)
|
||||
|
||||
class TestCommonCharacters(_Base, unittest.TestCase):
|
||||
a,b = "hasomelongertextbl", "hol"
|
||||
wanted = (
|
||||
("D", 0, 1, "asomelongertextb"),
|
||||
("I", 0, 1, "o"),
|
||||
)
|
||||
|
||||
class TestUltiSnipsProblem(_Base, unittest.TestCase):
|
||||
a = "this is it this is it this is it"
|
||||
b = "this is it a this is it"
|
||||
wanted = (
|
||||
("D", 0, 11, "this is it"),
|
||||
("I", 0, 11, "a"),
|
||||
)
|
||||
|
||||
class MatchIsTooCheap(_Base, unittest.TestCase):
|
||||
a = "stdin.h"
|
||||
b = "s"
|
||||
wanted = (
|
||||
("D", 0, 1, "tdin.h"),
|
||||
)
|
||||
|
||||
class MultiLine(_Base, unittest.TestCase):
|
||||
a = "hi first line\nsecond line first line\nsecond line world"
|
||||
b = "hi first line\nsecond line k world"
|
||||
|
||||
wanted = (
|
||||
("D", 1, 12, "first line"),
|
||||
("D", 1, 12, "\n"),
|
||||
("D", 1, 12, "second line"),
|
||||
("I", 1, 12, "k"),
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
# k = TestEditScript()
|
||||
# unittest.TextTestRunner().run(k)
|
@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
# pylint: skip-file
|
||||
|
||||
import unittest
|
||||
|
||||
from position import Position
|
||||
|
||||
class _MPBase(object):
|
||||
def runTest(self):
|
||||
obj = Position(*self.obj)
|
||||
for pivot, delta, wanted in self.steps:
|
||||
obj.move(Position(*pivot), Position(*delta))
|
||||
self.assertEqual(Position(*wanted), obj)
|
||||
|
||||
class MovePosition_DelSameLine(_MPBase, unittest.TestCase):
|
||||
# hello wor*ld -> h*ld -> hl*ld
|
||||
obj = (0, 9)
|
||||
steps = (
|
||||
((0, 1), (0, -8), (0, 1)),
|
||||
((0, 1), (0, 1), (0, 2)),
|
||||
)
|
||||
class MovePosition_DelSameLine1(_MPBase, unittest.TestCase):
|
||||
# hel*lo world -> hel*world -> hel*worl
|
||||
obj = (0,3)
|
||||
steps = (
|
||||
((0, 4), (0, -3), (0,3)),
|
||||
((0, 8), (0, -1), (0,3)),
|
||||
)
|
||||
class MovePosition_InsSameLine1(_MPBase, unittest.TestCase):
|
||||
# hel*lo world -> hel*woresld
|
||||
obj = (0, 3)
|
||||
steps = (
|
||||
((0, 4), (0, -3), (0, 3)),
|
||||
((0, 6), (0, 2), (0, 3)),
|
||||
((0, 8), (0, -1), (0, 3))
|
||||
)
|
||||
class MovePosition_InsSameLine2(_MPBase, unittest.TestCase):
|
||||
# hello wor*ld -> helesdlo wor*ld
|
||||
obj = (0, 9)
|
||||
steps = (
|
||||
((0, 3), (0, 3), (0, 12)),
|
||||
)
|
||||
|
||||
class MovePosition_DelSecondLine(_MPBase, unittest.TestCase):
|
||||
# hello world. sup hello world.*a, was
|
||||
# *a, was ach nix
|
||||
# ach nix
|
||||
obj = (1, 0)
|
||||
steps = (
|
||||
((0, 12), (0, -4), (1, 0)),
|
||||
((0, 12), (-1, 0), (0, 12)),
|
||||
)
|
||||
class MovePosition_DelSecondLine1(_MPBase, unittest.TestCase):
|
||||
# hello world. sup
|
||||
# a, *was
|
||||
# ach nix
|
||||
# hello world.a*was
|
||||
# ach nix
|
||||
obj = (1, 3)
|
||||
steps = (
|
||||
((0, 12), (0, -4), (1, 3)),
|
||||
((0, 12), (-1, 0), (0, 15)),
|
||||
((0, 12), (0, -3), (0, 12)),
|
||||
((0, 12), (0, 1), (0, 13)),
|
||||
)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Public facing classes for TextObjects."""
|
||||
|
||||
from ._snippet_instance import SnippetInstance
|
@ -0,0 +1,362 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Base classes for all text objects."""
|
||||
|
||||
import UltiSnips._vim as _vim
|
||||
from UltiSnips.position import Position
|
||||
|
||||
def _calc_end(text, start):
|
||||
"""Calculate the end position of the 'text' starting at 'start."""
|
||||
if len(text) == 1:
|
||||
new_end = start + Position(0, len(text[0]))
|
||||
else:
|
||||
new_end = Position(start.line + len(text)-1, len(text[-1]))
|
||||
return new_end
|
||||
|
||||
def _text_to_vim(start, end, text):
|
||||
"""Copy the given text to the current buffer, overwriting the span 'start'
|
||||
to 'end'."""
|
||||
lines = text.split('\n')
|
||||
|
||||
new_end = _calc_end(lines, start)
|
||||
|
||||
before = _vim.buf[start.line][:start.col]
|
||||
after = _vim.buf[end.line][end.col:]
|
||||
|
||||
new_lines = []
|
||||
if len(lines):
|
||||
new_lines.append(before + lines[0])
|
||||
new_lines.extend(lines[1:])
|
||||
new_lines[-1] += after
|
||||
_vim.buf[start.line:end.line + 1] = new_lines
|
||||
|
||||
# Open any folds this might have created
|
||||
_vim.buf.cursor = start
|
||||
_vim.command("normal! zv")
|
||||
|
||||
return new_end
|
||||
|
||||
# These classes use their subclasses a lot and we really do not want to expose
|
||||
# their functions more globally.
|
||||
# pylint: disable=protected-access
|
||||
class TextObject(object):
|
||||
"""Represents any object in the text that has a span in any ways."""
|
||||
|
||||
def __init__(self, parent, token, end=None,
|
||||
initial_text="", tiebreaker=None):
|
||||
self._parent = parent
|
||||
|
||||
if end is not None: # Took 4 arguments
|
||||
self._start = token
|
||||
self._end = end
|
||||
self._initial_text = initial_text
|
||||
else: # Initialize from token
|
||||
self._start = token.start
|
||||
self._end = token.end
|
||||
self._initial_text = token.initial_text
|
||||
self._tiebreaker = tiebreaker or Position(
|
||||
self._start.line, self._end.line)
|
||||
if parent is not None:
|
||||
parent._add_child(self)
|
||||
|
||||
def _move(self, pivot, diff):
|
||||
"""Move this object by 'diff' while 'pivot' is the point of change."""
|
||||
self._start.move(pivot, diff)
|
||||
self._end.move(pivot, diff)
|
||||
|
||||
def __lt__(self, other):
|
||||
me_tuple = (self.start.line, self.start.col,
|
||||
self._tiebreaker.line, self._tiebreaker.col)
|
||||
other_tuple = (other._start.line, other._start.col,
|
||||
other._tiebreaker.line, other._tiebreaker.col)
|
||||
return me_tuple < other_tuple
|
||||
|
||||
def __le__(self, other):
|
||||
me_tuple = (self._start.line, self._start.col,
|
||||
self._tiebreaker.line, self._tiebreaker.col)
|
||||
other_tuple = (other._start.line, other._start.col,
|
||||
other._tiebreaker.line, other._tiebreaker.col)
|
||||
return me_tuple <= other_tuple
|
||||
|
||||
def __repr__(self):
|
||||
ct = ""
|
||||
try:
|
||||
ct = self.current_text
|
||||
except IndexError:
|
||||
ct = "<err>"
|
||||
|
||||
return "%s(%r->%r,%r)" % (self.__class__.__name__,
|
||||
self._start, self._end, ct)
|
||||
|
||||
@property
|
||||
def current_text(self):
|
||||
"""The current text of this object."""
|
||||
if self._start.line == self._end.line:
|
||||
return _vim.buf[self._start.line][self._start.col:self._end.col]
|
||||
else:
|
||||
lines = [_vim.buf[self._start.line][self._start.col:]]
|
||||
lines.extend(_vim.buf[self._start.line+1:self._end.line])
|
||||
lines.append(_vim.buf[self._end.line][:self._end.col])
|
||||
return '\n'.join(lines)
|
||||
|
||||
@property
|
||||
def start(self):
|
||||
"""The start position."""
|
||||
return self._start
|
||||
|
||||
@property
|
||||
def end(self):
|
||||
"""The end position."""
|
||||
return self._end
|
||||
|
||||
def overwrite(self, gtext=None):
|
||||
"""Overwrite the text of this object in the Vim Buffer and update its
|
||||
length information. If 'gtext' is None use the initial text of this
|
||||
object.
|
||||
"""
|
||||
# We explicitly do not want to move our children around here as we
|
||||
# either have non or we are replacing text initially which means we do
|
||||
# not want to mess with their positions
|
||||
if self.current_text == gtext:
|
||||
return
|
||||
old_end = self._end
|
||||
self._end = _text_to_vim(
|
||||
self._start, self._end, gtext or self._initial_text)
|
||||
if self._parent:
|
||||
self._parent._child_has_moved(
|
||||
self._parent._children.index(self), min(old_end, self._end),
|
||||
self._end.delta(old_end)
|
||||
)
|
||||
|
||||
def _update(self, done):
|
||||
"""Update this object inside the Vim Buffer.
|
||||
|
||||
Return False if you need to be called again for this edit cycle.
|
||||
Otherwise return True.
|
||||
"""
|
||||
raise NotImplementedError("Must be implemented by subclasses.")
|
||||
|
||||
class EditableTextObject(TextObject):
|
||||
"""
|
||||
This base class represents any object in the text
|
||||
that can be changed by the user
|
||||
"""
|
||||
def __init__(self, *args, **kwargs):
|
||||
TextObject.__init__(self, *args, **kwargs)
|
||||
self._children = []
|
||||
self._tabstops = {}
|
||||
|
||||
##############
|
||||
# Properties #
|
||||
##############
|
||||
@property
|
||||
def children(self):
|
||||
"""List of all children."""
|
||||
return self._children
|
||||
|
||||
@property
|
||||
def _editable_children(self):
|
||||
"""List of all children that are EditableTextObjects"""
|
||||
return [child for child in self._children if
|
||||
isinstance(child, EditableTextObject)]
|
||||
|
||||
####################
|
||||
# Public Functions #
|
||||
####################
|
||||
def find_parent_for_new_to(self, pos):
|
||||
"""Figure out the parent object for something at 'pos'."""
|
||||
for children in self._editable_children:
|
||||
if children._start <= pos < children._end:
|
||||
return children.find_parent_for_new_to(pos)
|
||||
return self
|
||||
|
||||
###############################
|
||||
# Private/Protected functions #
|
||||
###############################
|
||||
def _do_edit(self, cmd):
|
||||
"""Apply the edit 'cmd' to this object."""
|
||||
ctype, line, col, text = cmd
|
||||
assert ('\n' not in text) or (text == "\n")
|
||||
pos = Position(line, col)
|
||||
|
||||
to_kill = set()
|
||||
new_cmds = []
|
||||
for child in self._children:
|
||||
if ctype == "I": # Insertion
|
||||
if (child._start < pos <
|
||||
Position(child._end.line, child._end.col) and
|
||||
isinstance(child, NoneditableTextObject)):
|
||||
to_kill.add(child)
|
||||
new_cmds.append(cmd)
|
||||
break
|
||||
elif ((child._start <= pos <= child._end) and
|
||||
isinstance(child, EditableTextObject)):
|
||||
child._do_edit(cmd)
|
||||
return
|
||||
else: # Deletion
|
||||
delend = pos + Position(0, len(text)) if text != "\n" \
|
||||
else Position(line + 1, 0)
|
||||
if ((child._start <= pos < child._end) and
|
||||
(child._start < delend <= child._end)):
|
||||
# this edit command is completely for the child
|
||||
if isinstance(child, NoneditableTextObject):
|
||||
to_kill.add(child)
|
||||
new_cmds.append(cmd)
|
||||
break
|
||||
else:
|
||||
child._do_edit(cmd)
|
||||
return
|
||||
elif ((pos < child._start and child._end <= delend) or
|
||||
(pos <= child._start and child._end < delend)):
|
||||
# Case: this deletion removes the child
|
||||
to_kill.add(child)
|
||||
new_cmds.append(cmd)
|
||||
break
|
||||
elif (pos < child._start and
|
||||
(child._start < delend <= child._end)):
|
||||
# Case: partially for us, partially for the child
|
||||
my_text = text[:(child._start-pos).col]
|
||||
c_text = text[(child._start-pos).col:]
|
||||
new_cmds.append((ctype, line, col, my_text))
|
||||
new_cmds.append((ctype, line, col, c_text))
|
||||
break
|
||||
elif (delend >= child._end and (
|
||||
child._start <= pos < child._end)):
|
||||
# Case: partially for us, partially for the child
|
||||
c_text = text[(child._end-pos).col:]
|
||||
my_text = text[:(child._end-pos).col]
|
||||
new_cmds.append((ctype, line, col, c_text))
|
||||
new_cmds.append((ctype, line, col, my_text))
|
||||
break
|
||||
|
||||
for child in to_kill:
|
||||
self._del_child(child)
|
||||
if len(new_cmds):
|
||||
for child in new_cmds:
|
||||
self._do_edit(child)
|
||||
return
|
||||
|
||||
# We have to handle this ourselves
|
||||
delta = Position(1, 0) if text == "\n" else Position(0, len(text))
|
||||
if ctype == "D":
|
||||
# Makes no sense to delete in empty textobject
|
||||
if self._start == self._end:
|
||||
return
|
||||
delta.line *= -1
|
||||
delta.col *= -1
|
||||
pivot = Position(line, col)
|
||||
idx = -1
|
||||
for cidx, child in enumerate(self._children):
|
||||
if child._start < pivot <= child._end:
|
||||
idx = cidx
|
||||
self._child_has_moved(idx, pivot, delta)
|
||||
|
||||
def _move(self, pivot, diff):
|
||||
TextObject._move(self, pivot, diff)
|
||||
|
||||
for child in self._children:
|
||||
child._move(pivot, diff)
|
||||
|
||||
def _child_has_moved(self, idx, pivot, diff):
|
||||
"""Called when a the child with 'idx' has moved behind 'pivot' by
|
||||
'diff'."""
|
||||
self._end.move(pivot, diff)
|
||||
|
||||
for child in self._children[idx+1:]:
|
||||
child._move(pivot, diff)
|
||||
|
||||
if self._parent:
|
||||
self._parent._child_has_moved(
|
||||
self._parent._children.index(self), pivot, diff
|
||||
)
|
||||
|
||||
def _get_next_tab(self, number):
|
||||
"""Returns the next tabstop after 'number'."""
|
||||
if not len(self._tabstops.keys()):
|
||||
return
|
||||
tno_max = max(self._tabstops.keys())
|
||||
|
||||
possible_sol = []
|
||||
i = number + 1
|
||||
while i <= tno_max:
|
||||
if i in self._tabstops:
|
||||
possible_sol.append((i, self._tabstops[i]))
|
||||
break
|
||||
i += 1
|
||||
|
||||
child = [c._get_next_tab(number) for c in self._editable_children]
|
||||
child = [c for c in child if c]
|
||||
|
||||
possible_sol += child
|
||||
|
||||
if not len(possible_sol):
|
||||
return None
|
||||
|
||||
return min(possible_sol)
|
||||
|
||||
|
||||
def _get_prev_tab(self, number):
|
||||
"""Returns the previous tabstop before 'number'."""
|
||||
if not len(self._tabstops.keys()):
|
||||
return
|
||||
tno_min = min(self._tabstops.keys())
|
||||
|
||||
possible_sol = []
|
||||
i = number - 1
|
||||
while i >= tno_min and i > 0:
|
||||
if i in self._tabstops:
|
||||
possible_sol.append((i, self._tabstops[i]))
|
||||
break
|
||||
i -= 1
|
||||
|
||||
child = [c._get_prev_tab(number) for c in self._editable_children]
|
||||
child = [c for c in child if c]
|
||||
|
||||
possible_sol += child
|
||||
|
||||
if not len(possible_sol):
|
||||
return None
|
||||
|
||||
return max(possible_sol)
|
||||
|
||||
def _get_tabstop(self, requester, number):
|
||||
"""Returns the tabstop 'number'. 'requester' is the class that is
|
||||
interested in this."""
|
||||
if number in self._tabstops:
|
||||
return self._tabstops[number]
|
||||
for child in self._editable_children:
|
||||
if child is requester:
|
||||
continue
|
||||
rv = child._get_tabstop(self, number)
|
||||
if rv is not None:
|
||||
return rv
|
||||
if self._parent and requester is not self._parent:
|
||||
return self._parent._get_tabstop(self, number)
|
||||
|
||||
def _update(self, done):
|
||||
if all((child in done) for child in self._children):
|
||||
assert self not in done
|
||||
done.add(self)
|
||||
return True
|
||||
|
||||
def _add_child(self, child):
|
||||
"""Add 'child' as a new child of this text object."""
|
||||
self._children.append(child)
|
||||
self._children.sort()
|
||||
|
||||
def _del_child(self, child):
|
||||
"""Delete this 'child'."""
|
||||
child._parent = None
|
||||
self._children.remove(child)
|
||||
|
||||
# If this is a tabstop, delete it
|
||||
try:
|
||||
del self._tabstops[child.number]
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
class NoneditableTextObject(TextObject):
|
||||
"""All passive text objects that the user can't edit by hand."""
|
||||
def _update(self, done):
|
||||
return True
|
@ -0,0 +1,349 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""
|
||||
Not really a lexer in the classical sense, but code to convert snippet
|
||||
definitions into logical units called Tokens.
|
||||
"""
|
||||
|
||||
import string
|
||||
import re
|
||||
|
||||
from UltiSnips.compatibility import as_unicode
|
||||
from UltiSnips.position import Position
|
||||
from UltiSnips.escaping import unescape
|
||||
|
||||
class _TextIterator(object):
|
||||
"""Helper class to make iterating over text easier."""
|
||||
|
||||
def __init__(self, text, offset):
|
||||
self._text = as_unicode(text)
|
||||
self._line = offset.line
|
||||
self._col = offset.col
|
||||
|
||||
self._idx = 0
|
||||
|
||||
def __iter__(self):
|
||||
"""Iterator interface."""
|
||||
return self
|
||||
|
||||
def __next__(self):
|
||||
"""Returns the next character."""
|
||||
if self._idx >= len(self._text):
|
||||
raise StopIteration
|
||||
|
||||
rv = self._text[self._idx]
|
||||
if self._text[self._idx] in ('\n', '\r\n'):
|
||||
self._line += 1
|
||||
self._col = 0
|
||||
else:
|
||||
self._col += 1
|
||||
self._idx += 1
|
||||
return rv
|
||||
next = __next__ # for python2
|
||||
|
||||
def peek(self, count=1):
|
||||
"""Returns the next 'count' characters without advancing the stream."""
|
||||
if count > 1: # This might return '' if nothing is found
|
||||
return self._text[self._idx:self._idx + count]
|
||||
try:
|
||||
return self._text[self._idx]
|
||||
except IndexError:
|
||||
return None
|
||||
|
||||
@property
|
||||
def pos(self):
|
||||
"""Current position in the text."""
|
||||
return Position(self._line, self._col)
|
||||
|
||||
def _parse_number(stream):
|
||||
"""
|
||||
Expects the stream to contain a number next, returns the number
|
||||
without consuming any more bytes
|
||||
"""
|
||||
rv = ""
|
||||
while stream.peek() and stream.peek() in string.digits:
|
||||
rv += next(stream)
|
||||
|
||||
return int(rv)
|
||||
|
||||
def _parse_till_closing_brace(stream):
|
||||
"""
|
||||
Returns all chars till a non-escaped } is found. Other
|
||||
non escaped { are taken into account and skipped over.
|
||||
|
||||
Will also consume the closing }, but not return it
|
||||
"""
|
||||
rv = ""
|
||||
in_braces = 1
|
||||
while True:
|
||||
if EscapeCharToken.starts_here(stream, '{}'):
|
||||
rv += next(stream) + next(stream)
|
||||
else:
|
||||
char = next(stream)
|
||||
if char == '{':
|
||||
in_braces += 1
|
||||
elif char == '}':
|
||||
in_braces -= 1
|
||||
if in_braces == 0:
|
||||
break
|
||||
rv += char
|
||||
return rv
|
||||
|
||||
def _parse_till_unescaped_char(stream, chars):
|
||||
"""
|
||||
Returns all chars till a non-escaped char is found.
|
||||
|
||||
Will also consume the closing char, but and return it as second
|
||||
return value
|
||||
"""
|
||||
rv = ""
|
||||
while True:
|
||||
escaped = False
|
||||
for char in chars:
|
||||
if EscapeCharToken.starts_here(stream, char):
|
||||
rv += next(stream) + next(stream)
|
||||
escaped = True
|
||||
if not escaped:
|
||||
char = next(stream)
|
||||
if char in chars:
|
||||
break
|
||||
rv += char
|
||||
return rv, char
|
||||
|
||||
class Token(object):
|
||||
"""Represents a Token as parsed from a snippet definition."""
|
||||
|
||||
def __init__(self, gen, indent):
|
||||
self.initial_text = as_unicode("")
|
||||
self.start = gen.pos
|
||||
self._parse(gen, indent)
|
||||
self.end = gen.pos
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
"""Parses the token from 'stream' with the current 'indent'."""
|
||||
pass # Does nothing
|
||||
|
||||
class TabStopToken(Token):
|
||||
"""${1:blub}"""
|
||||
CHECK = re.compile(r'^\${\d+[:}]')
|
||||
|
||||
@classmethod
|
||||
def starts_here(cls, stream):
|
||||
"""Returns true if this token starts at the current position in
|
||||
'stream'."""
|
||||
return cls.CHECK.match(stream.peek(10)) is not None
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
next(stream) # $
|
||||
next(stream) # {
|
||||
|
||||
self.number = _parse_number(stream)
|
||||
|
||||
if stream.peek() == ":":
|
||||
next(stream)
|
||||
self.initial_text = _parse_till_closing_brace(stream)
|
||||
|
||||
def __repr__(self):
|
||||
return "TabStopToken(%r,%r,%r,%r)" % (
|
||||
self.start, self.end, self.number, self.initial_text
|
||||
)
|
||||
|
||||
class VisualToken(Token):
|
||||
"""${VISUAL}"""
|
||||
CHECK = re.compile(r"^\${VISUAL[:}/]")
|
||||
|
||||
@classmethod
|
||||
def starts_here(cls, stream):
|
||||
"""Returns true if this token starts at the current position in
|
||||
'stream'."""
|
||||
return cls.CHECK.match(stream.peek(10)) is not None
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
for _ in range(8): # ${VISUAL
|
||||
next(stream)
|
||||
|
||||
if stream.peek() == ":":
|
||||
next(stream)
|
||||
self.alternative_text, char = _parse_till_unescaped_char(stream, '/}')
|
||||
self.alternative_text = unescape(self.alternative_text)
|
||||
|
||||
if char == '/': # Transformation going on
|
||||
try:
|
||||
self.search = _parse_till_unescaped_char(stream, '/')[0]
|
||||
self.replace = _parse_till_unescaped_char(stream, '/')[0]
|
||||
self.options = _parse_till_closing_brace(stream)
|
||||
except StopIteration:
|
||||
raise RuntimeError(
|
||||
"Invalid ${VISUAL} transformation! Forgot to escape a '/'?")
|
||||
else:
|
||||
self.search = None
|
||||
self.replace = None
|
||||
self.options = None
|
||||
|
||||
def __repr__(self):
|
||||
return "VisualToken(%r,%r)" % (
|
||||
self.start, self.end
|
||||
)
|
||||
|
||||
class TransformationToken(Token):
|
||||
"""${1/match/replace/options}"""
|
||||
|
||||
CHECK = re.compile(r'^\${\d+\/')
|
||||
|
||||
@classmethod
|
||||
def starts_here(cls, stream):
|
||||
"""Returns true if this token starts at the current position in
|
||||
'stream'."""
|
||||
return cls.CHECK.match(stream.peek(10)) is not None
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
next(stream) # $
|
||||
next(stream) # {
|
||||
|
||||
self.number = _parse_number(stream)
|
||||
|
||||
next(stream) # /
|
||||
|
||||
self.search = _parse_till_unescaped_char(stream, '/')[0]
|
||||
self.replace = _parse_till_unescaped_char(stream, '/')[0]
|
||||
self.options = _parse_till_closing_brace(stream)
|
||||
|
||||
def __repr__(self):
|
||||
return "TransformationToken(%r,%r,%r,%r,%r)" % (
|
||||
self.start, self.end, self.number, self.search, self.replace
|
||||
)
|
||||
|
||||
class MirrorToken(Token):
|
||||
"""$1"""
|
||||
CHECK = re.compile(r'^\$\d+')
|
||||
|
||||
@classmethod
|
||||
def starts_here(cls, stream):
|
||||
"""Returns true if this token starts at the current position in
|
||||
'stream'."""
|
||||
return cls.CHECK.match(stream.peek(10)) is not None
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
next(stream) # $
|
||||
self.number = _parse_number(stream)
|
||||
|
||||
def __repr__(self):
|
||||
return "MirrorToken(%r,%r,%r)" % (
|
||||
self.start, self.end, self.number
|
||||
)
|
||||
|
||||
class EscapeCharToken(Token):
|
||||
"""\\n"""
|
||||
@classmethod
|
||||
def starts_here(cls, stream, chars=r'{}\$`'):
|
||||
"""Returns true if this token starts at the current position in
|
||||
'stream'."""
|
||||
cs = stream.peek(2)
|
||||
if len(cs) == 2 and cs[0] == '\\' and cs[1] in chars:
|
||||
return True
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
next(stream) # \
|
||||
self.initial_text = next(stream)
|
||||
|
||||
def __repr__(self):
|
||||
return "EscapeCharToken(%r,%r,%r)" % (
|
||||
self.start, self.end, self.initial_text
|
||||
)
|
||||
|
||||
class ShellCodeToken(Token):
|
||||
"""`! echo "hi"`"""
|
||||
@classmethod
|
||||
def starts_here(cls, stream):
|
||||
"""Returns true if this token starts at the current position in
|
||||
'stream'."""
|
||||
return stream.peek(1) == '`'
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
next(stream) # `
|
||||
self.code = _parse_till_unescaped_char(stream, '`')[0]
|
||||
|
||||
def __repr__(self):
|
||||
return "ShellCodeToken(%r,%r,%r)" % (
|
||||
self.start, self.end, self.code
|
||||
)
|
||||
|
||||
class PythonCodeToken(Token):
|
||||
"""`!p snip.rv = "Hi"`"""
|
||||
CHECK = re.compile(r'^`!p\s')
|
||||
|
||||
@classmethod
|
||||
def starts_here(cls, stream):
|
||||
"""Returns true if this token starts at the current position in
|
||||
'stream'."""
|
||||
return cls.CHECK.match(stream.peek(4)) is not None
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
for _ in range(3):
|
||||
next(stream) # `!p
|
||||
if stream.peek() in '\t ':
|
||||
next(stream)
|
||||
|
||||
code = _parse_till_unescaped_char(stream, '`')[0]
|
||||
|
||||
# Strip the indent if any
|
||||
if len(indent):
|
||||
lines = code.splitlines()
|
||||
self.code = lines[0] + '\n'
|
||||
self.code += '\n'.join([l[len(indent):]
|
||||
for l in lines[1:]])
|
||||
else:
|
||||
self.code = code
|
||||
self.indent = indent
|
||||
|
||||
def __repr__(self):
|
||||
return "PythonCodeToken(%r,%r,%r)" % (
|
||||
self.start, self.end, self.code
|
||||
)
|
||||
|
||||
class VimLCodeToken(Token):
|
||||
"""`!v g:hi`"""
|
||||
CHECK = re.compile(r'^`!v\s')
|
||||
|
||||
@classmethod
|
||||
def starts_here(cls, stream):
|
||||
"""Returns true if this token starts at the current position in
|
||||
'stream'."""
|
||||
return cls.CHECK.match(stream.peek(4)) is not None
|
||||
|
||||
def _parse(self, stream, indent):
|
||||
for _ in range(4):
|
||||
next(stream) # `!v
|
||||
self.code = _parse_till_unescaped_char(stream, '`')[0]
|
||||
|
||||
def __repr__(self):
|
||||
return "VimLCodeToken(%r,%r,%r)" % (
|
||||
self.start, self.end, self.code
|
||||
)
|
||||
|
||||
class EndOfTextToken(Token):
|
||||
"""Appears at the end of the text."""
|
||||
def __repr__(self):
|
||||
return "EndOfText(%r)" % self.end
|
||||
|
||||
__ALLOWED_TOKENS = [
|
||||
EscapeCharToken, VisualToken, TransformationToken, TabStopToken,
|
||||
MirrorToken, PythonCodeToken, VimLCodeToken, ShellCodeToken
|
||||
]
|
||||
def tokenize(text, indent, offset):
|
||||
"""Returns an iterator of tokens of 'text'['offset':] which is assumed to
|
||||
have 'indent' as the whitespace of the begging of the lines."""
|
||||
stream = _TextIterator(text, offset)
|
||||
try:
|
||||
while True:
|
||||
done_something = False
|
||||
for token in __ALLOWED_TOKENS:
|
||||
if token.starts_here(stream):
|
||||
yield token(stream, indent)
|
||||
done_something = True
|
||||
break
|
||||
if not done_something:
|
||||
next(stream)
|
||||
except StopIteration:
|
||||
yield EndOfTextToken(stream, indent)
|
@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""A Mirror object contains the same text as its related tabstop."""
|
||||
|
||||
from UltiSnips.text_objects._base import NoneditableTextObject
|
||||
|
||||
class Mirror(NoneditableTextObject):
|
||||
"""See module docstring."""
|
||||
|
||||
def __init__(self, parent, tabstop, token):
|
||||
NoneditableTextObject.__init__(self, parent, token)
|
||||
|
||||
self._ts = tabstop
|
||||
|
||||
def _update(self, done):
|
||||
if self._ts.is_killed:
|
||||
self.overwrite("")
|
||||
self._parent._del_child(self) # pylint:disable=protected-access
|
||||
return True
|
||||
|
||||
if self._ts not in done:
|
||||
return False
|
||||
|
||||
self.overwrite(self._get_text())
|
||||
return True
|
||||
|
||||
def _get_text(self):
|
||||
"""Returns the text used for mirroring. Overwritten by base classes."""
|
||||
return self._ts.current_text
|
@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Parses tokens into text objects."""
|
||||
|
||||
from UltiSnips.text_objects._lexer import tokenize, EscapeCharToken, \
|
||||
VisualToken, TransformationToken, TabStopToken, MirrorToken, \
|
||||
PythonCodeToken, VimLCodeToken, ShellCodeToken
|
||||
from UltiSnips.position import Position
|
||||
from UltiSnips.text_objects._escaped_char import EscapedChar
|
||||
from UltiSnips.text_objects._mirror import Mirror
|
||||
from UltiSnips.text_objects._python_code import PythonCode
|
||||
from UltiSnips.text_objects._shell_code import ShellCode
|
||||
from UltiSnips.text_objects._tabstop import TabStop
|
||||
from UltiSnips.text_objects._transformation import Transformation
|
||||
from UltiSnips.text_objects._viml_code import VimLCode
|
||||
from UltiSnips.text_objects._visual import Visual
|
||||
|
||||
_TOKEN_TO_TEXTOBJECT = {
|
||||
EscapeCharToken: EscapedChar,
|
||||
VisualToken: Visual,
|
||||
ShellCodeToken: ShellCode,
|
||||
PythonCodeToken: PythonCode,
|
||||
VimLCodeToken: VimLCode,
|
||||
}
|
||||
|
||||
def _resolve_ambiguity(all_tokens, seen_ts):
|
||||
"""$1 could be a Mirror or a TabStop. This figures this out."""
|
||||
for parent, token in all_tokens:
|
||||
if isinstance(token, MirrorToken):
|
||||
if token.number not in seen_ts:
|
||||
seen_ts[token.number] = TabStop(parent, token)
|
||||
else:
|
||||
Mirror(parent, seen_ts[token.number], token)
|
||||
|
||||
def _create_transformations(all_tokens, seen_ts):
|
||||
"""Create the objects that need to know about tabstops."""
|
||||
for parent, token in all_tokens:
|
||||
if isinstance(token, TransformationToken):
|
||||
if token.number not in seen_ts:
|
||||
raise RuntimeError(
|
||||
"Tabstop %i is not known but is used by a Transformation"
|
||||
% token.number)
|
||||
Transformation(parent, seen_ts[token.number], token)
|
||||
|
||||
def _do_parse(all_tokens, seen_ts, parent_to, text, indent):
|
||||
"""Recursive function that actually creates the objects."""
|
||||
tokens = list(tokenize(text, indent, parent_to.start))
|
||||
for token in tokens:
|
||||
all_tokens.append((parent_to, token))
|
||||
if isinstance(token, TabStopToken):
|
||||
ts = TabStop(parent_to, token)
|
||||
seen_ts[token.number] = ts
|
||||
|
||||
_do_parse(all_tokens, seen_ts, ts, token.initial_text, indent)
|
||||
else:
|
||||
klass = _TOKEN_TO_TEXTOBJECT.get(token.__class__, None)
|
||||
if klass is not None:
|
||||
klass(parent_to, token)
|
||||
|
||||
def parse_text_object(parent_to, text, indent):
|
||||
"""Parses a text object from 'text' assuming the current 'indent'. Will
|
||||
instantiate all the objects and link them as children to parent_to. Will
|
||||
also put the initial text into Vim."""
|
||||
seen_ts = {}
|
||||
all_tokens = []
|
||||
|
||||
_do_parse(all_tokens, seen_ts, parent_to, text, indent)
|
||||
_resolve_ambiguity(all_tokens, seen_ts)
|
||||
_create_transformations(all_tokens, seen_ts)
|
||||
|
||||
if 0 not in seen_ts:
|
||||
mark = all_tokens[-1][1].end # Last token is always EndOfText
|
||||
m1 = Position(mark.line, mark.col)
|
||||
TabStop(parent_to, 0, mark, m1)
|
||||
parent_to.replace_initial_text()
|
@ -0,0 +1,209 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Implements `!p ` interpolation."""
|
||||
|
||||
import os
|
||||
from collections import namedtuple
|
||||
|
||||
from UltiSnips.compatibility import as_unicode
|
||||
from UltiSnips.indent_util import IndentUtil
|
||||
from UltiSnips.text_objects._base import NoneditableTextObject
|
||||
import UltiSnips._vim as _vim
|
||||
|
||||
|
||||
class _Tabs(object):
|
||||
"""Allows access to tabstop content via t[] inside of python code."""
|
||||
def __init__(self, to):
|
||||
self._to = to
|
||||
|
||||
def __getitem__(self, no):
|
||||
ts = self._to._get_tabstop(self._to, int(no)) # pylint:disable=protected-access
|
||||
if ts is None:
|
||||
return ""
|
||||
return ts.current_text
|
||||
|
||||
_VisualContent = namedtuple('_VisualContent', ['mode', 'text'])
|
||||
|
||||
class SnippetUtil(object):
|
||||
"""Provides easy access to indentation, etc. This is the 'snip' object in
|
||||
python code."""
|
||||
|
||||
def __init__(self, initial_indent, vmode, vtext):
|
||||
self._ind = IndentUtil()
|
||||
self._visual = _VisualContent(vmode, vtext)
|
||||
self._initial_indent = self._ind.indent_to_spaces(initial_indent)
|
||||
self._reset("")
|
||||
|
||||
def _reset(self, cur):
|
||||
"""Gets the snippet ready for another update.
|
||||
:cur: the new value for c.
|
||||
"""
|
||||
self._ind.reset()
|
||||
self._cur = cur
|
||||
self._rv = ""
|
||||
self._changed = False
|
||||
self.reset_indent()
|
||||
|
||||
def shift(self, amount=1):
|
||||
"""Shifts the indentation level.
|
||||
Note that this uses the shiftwidth because thats what code
|
||||
formatters use.
|
||||
|
||||
:amount: the amount by which to shift.
|
||||
"""
|
||||
self.indent += " " * self._ind.shiftwidth * amount
|
||||
|
||||
def unshift(self, amount=1):
|
||||
"""Unshift the indentation level.
|
||||
Note that this uses the shiftwidth because thats what code
|
||||
formatters use.
|
||||
|
||||
:amount: the amount by which to unshift.
|
||||
"""
|
||||
by = -self._ind.shiftwidth * amount
|
||||
try:
|
||||
self.indent = self.indent[:by]
|
||||
except IndexError:
|
||||
self.indent = ""
|
||||
|
||||
def mkline(self, line="", indent=None):
|
||||
"""Creates a properly set up line.
|
||||
|
||||
:line: the text to add
|
||||
:indent: the indentation to have at the beginning
|
||||
if None, it uses the default amount
|
||||
"""
|
||||
if indent is None:
|
||||
indent = self.indent
|
||||
# this deals with the fact that the first line is
|
||||
# already properly indented
|
||||
if '\n' not in self._rv:
|
||||
try:
|
||||
indent = indent[len(self._initial_indent):]
|
||||
except IndexError:
|
||||
indent = ""
|
||||
indent = self._ind.spaces_to_indent(indent)
|
||||
|
||||
return indent + line
|
||||
|
||||
def reset_indent(self):
|
||||
"""Clears the indentation."""
|
||||
self.indent = self._initial_indent
|
||||
|
||||
# Utility methods
|
||||
@property
|
||||
def fn(self): # pylint:disable=no-self-use,invalid-name
|
||||
"""The filename."""
|
||||
return _vim.eval('expand("%:t")') or ""
|
||||
|
||||
@property
|
||||
def basename(self): # pylint:disable=no-self-use
|
||||
"""The filename without extension."""
|
||||
return _vim.eval('expand("%:t:r")') or ""
|
||||
|
||||
@property
|
||||
def ft(self): # pylint:disable=invalid-name
|
||||
"""The filetype."""
|
||||
return self.opt("&filetype", "")
|
||||
|
||||
@property
|
||||
def rv(self): # pylint:disable=invalid-name
|
||||
"""The return value. The text to insert at the location of the
|
||||
placeholder."""
|
||||
return self._rv
|
||||
|
||||
@rv.setter
|
||||
def rv(self, value): # pylint:disable=invalid-name
|
||||
"""See getter."""
|
||||
self._changed = True
|
||||
self._rv = value
|
||||
|
||||
@property
|
||||
def _rv_changed(self):
|
||||
"""True if rv has changed."""
|
||||
return self._changed
|
||||
|
||||
@property
|
||||
def c(self): # pylint:disable=invalid-name
|
||||
"""The current text of the placeholder."""
|
||||
return self._cur
|
||||
|
||||
@property
|
||||
def v(self): # pylint:disable=invalid-name
|
||||
"""Content of visual expansions"""
|
||||
return self._visual
|
||||
|
||||
def opt(self, option, default=None): # pylint:disable=no-self-use
|
||||
"""Gets a Vim variable."""
|
||||
if _vim.eval("exists('%s')" % option) == "1":
|
||||
try:
|
||||
return _vim.eval(option)
|
||||
except _vim.error:
|
||||
pass
|
||||
return default
|
||||
|
||||
def __add__(self, value):
|
||||
"""Appends the given line to rv using mkline."""
|
||||
self.rv += '\n' # pylint:disable=invalid-name
|
||||
self.rv += self.mkline(value)
|
||||
return self
|
||||
|
||||
def __lshift__(self, other):
|
||||
"""Same as unshift."""
|
||||
self.unshift(other)
|
||||
|
||||
def __rshift__(self, other):
|
||||
"""Same as shift."""
|
||||
self.shift(other)
|
||||
|
||||
|
||||
class PythonCode(NoneditableTextObject):
|
||||
"""See module docstring."""
|
||||
|
||||
def __init__(self, parent, token):
|
||||
|
||||
# Find our containing snippet for snippet local data
|
||||
snippet = parent
|
||||
while snippet:
|
||||
try:
|
||||
self._locals = snippet.locals
|
||||
text = snippet.visual_content.text
|
||||
mode = snippet.visual_content.mode
|
||||
break
|
||||
except AttributeError:
|
||||
snippet = snippet._parent # pylint:disable=protected-access
|
||||
self._snip = SnippetUtil(token.indent, mode, text)
|
||||
|
||||
self._codes = ((
|
||||
"import re, os, vim, string, random",
|
||||
"\n".join(snippet.globals.get("!p", [])).replace("\r\n", "\n"),
|
||||
token.code.replace("\\`", "`")
|
||||
))
|
||||
NoneditableTextObject.__init__(self, parent, token)
|
||||
|
||||
def _update(self, done):
|
||||
path = _vim.eval('expand("%")') or ""
|
||||
ct = self.current_text
|
||||
self._locals.update({
|
||||
't': _Tabs(self._parent),
|
||||
'fn': os.path.basename(path),
|
||||
'path': path,
|
||||
'cur': ct,
|
||||
'res': ct,
|
||||
'snip': self._snip,
|
||||
})
|
||||
self._snip._reset(ct) # pylint:disable=protected-access
|
||||
|
||||
for code in self._codes:
|
||||
exec(code, self._locals) # pylint:disable=exec-used
|
||||
|
||||
rv = as_unicode(
|
||||
self._snip.rv if self._snip._rv_changed # pylint:disable=protected-access
|
||||
else as_unicode(self._locals['res'])
|
||||
)
|
||||
|
||||
if ct != rv:
|
||||
self.overwrite(rv)
|
||||
return False
|
||||
return True
|
@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Implements `echo hi` shell code interpolation."""
|
||||
|
||||
import os
|
||||
import platform
|
||||
from subprocess import Popen, PIPE
|
||||
import stat
|
||||
import tempfile
|
||||
|
||||
from UltiSnips.compatibility import as_unicode
|
||||
from UltiSnips.text_objects._base import NoneditableTextObject
|
||||
|
||||
def _chomp(string):
|
||||
"""Rather than rstrip(), remove only the last newline and preserve
|
||||
purposeful whitespace."""
|
||||
if len(string) and string[-1] == '\n':
|
||||
string = string[:-1]
|
||||
if len(string) and string[-1] == '\r':
|
||||
string = string[:-1]
|
||||
return string
|
||||
|
||||
def _run_shell_command(cmd, tmpdir):
|
||||
"""Write the code to a temporary file"""
|
||||
cmdsuf = ''
|
||||
if platform.system() == 'Windows':
|
||||
# suffix required to run command on windows
|
||||
cmdsuf = '.bat'
|
||||
# turn echo off
|
||||
cmd = '@echo off\r\n' + cmd
|
||||
handle, path = tempfile.mkstemp(text=True, dir=tmpdir, suffix=cmdsuf)
|
||||
os.write(handle, cmd.encode("utf-8"))
|
||||
os.close(handle)
|
||||
os.chmod(path, stat.S_IRWXU)
|
||||
|
||||
# Execute the file and read stdout
|
||||
proc = Popen(path, shell=True, stdout=PIPE, stderr=PIPE)
|
||||
proc.wait()
|
||||
stdout, _ = proc.communicate()
|
||||
os.unlink(path)
|
||||
return _chomp(as_unicode(stdout))
|
||||
|
||||
def _get_tmp():
|
||||
"""Find an executable tmp directory."""
|
||||
userdir = os.path.expanduser("~")
|
||||
for testdir in [tempfile.gettempdir(), os.path.join(userdir, '.cache'),
|
||||
os.path.join(userdir, '.tmp'), userdir]:
|
||||
if (not os.path.exists(testdir) or
|
||||
not _run_shell_command('echo success', testdir) == 'success'):
|
||||
continue
|
||||
return testdir
|
||||
return ''
|
||||
|
||||
class ShellCode(NoneditableTextObject):
|
||||
"""See module docstring."""
|
||||
|
||||
def __init__(self, parent, token):
|
||||
NoneditableTextObject.__init__(self, parent, token)
|
||||
self._code = token.code.replace("\\`", "`")
|
||||
self._tmpdir = _get_tmp()
|
||||
|
||||
def _update(self, done):
|
||||
if not self._tmpdir:
|
||||
output = \
|
||||
"Unable to find executable tmp directory, check noexec on /tmp"
|
||||
else:
|
||||
output = _run_shell_command(self._code, self._tmpdir)
|
||||
self.overwrite(output)
|
||||
self._parent._del_child(self) # pylint:disable=protected-access
|
||||
return True
|
@ -0,0 +1,131 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""A Snippet instance is an instance of a Snippet Definition. That is, when the
|
||||
user expands a snippet, a SnippetInstance is created to keep track of the
|
||||
corresponding TextObjects. The Snippet itself is also a TextObject. """
|
||||
|
||||
from UltiSnips.position import Position
|
||||
import UltiSnips._vim as _vim
|
||||
from UltiSnips.text_objects._base import EditableTextObject, \
|
||||
NoneditableTextObject
|
||||
from UltiSnips.text_objects._parser import parse_text_object
|
||||
|
||||
class SnippetInstance(EditableTextObject):
|
||||
"""See module docstring."""
|
||||
# pylint:disable=protected-access
|
||||
|
||||
def __init__(self, snippet, parent, indent, initial_text,
|
||||
start, end, visual_content, last_re, globals):
|
||||
if start is None:
|
||||
start = Position(0, 0)
|
||||
if end is None:
|
||||
end = Position(0, 0)
|
||||
self.snippet = snippet
|
||||
self._cts = 0
|
||||
|
||||
self.locals = {"match" : last_re}
|
||||
self.globals = globals
|
||||
self.visual_content = visual_content
|
||||
|
||||
EditableTextObject.__init__(self, parent, start, end, initial_text)
|
||||
|
||||
parse_text_object(self, initial_text, indent)
|
||||
|
||||
self.update_textobjects()
|
||||
|
||||
def replace_initial_text(self):
|
||||
"""Puts the initial text of all text elements into Vim."""
|
||||
def _place_initial_text(obj):
|
||||
"""recurses on the children to do the work."""
|
||||
obj.overwrite()
|
||||
if isinstance(obj, EditableTextObject):
|
||||
for child in obj._children:
|
||||
_place_initial_text(child)
|
||||
_place_initial_text(self)
|
||||
|
||||
def replay_user_edits(self, cmds):
|
||||
"""Replay the edits the user has done to keep endings of our
|
||||
Text objects in sync with reality"""
|
||||
for cmd in cmds:
|
||||
self._do_edit(cmd)
|
||||
|
||||
def update_textobjects(self):
|
||||
"""Update the text objects that should change automagically after
|
||||
the users edits have been replayed. This might also move the Cursor
|
||||
"""
|
||||
vc = _VimCursor(self)
|
||||
done = set()
|
||||
not_done = set()
|
||||
def _find_recursive(obj):
|
||||
"""Finds all text objects and puts them into 'not_done'."""
|
||||
if isinstance(obj, EditableTextObject):
|
||||
for child in obj._children:
|
||||
_find_recursive(child)
|
||||
not_done.add(obj)
|
||||
_find_recursive(self)
|
||||
|
||||
counter = 10
|
||||
while (done != not_done) and counter:
|
||||
# Order matters for python locals!
|
||||
for obj in sorted(not_done - done):
|
||||
if obj._update(done):
|
||||
done.add(obj)
|
||||
counter -= 1
|
||||
if not counter:
|
||||
raise RuntimeError(
|
||||
"The snippets content did not converge: Check for Cyclic "
|
||||
"dependencies or random strings in your snippet. You can use "
|
||||
"'if not snip.c' to make sure to only expand random output "
|
||||
"once.")
|
||||
vc.to_vim()
|
||||
self._del_child(vc)
|
||||
|
||||
def select_next_tab(self, backwards=False):
|
||||
"""Selects the next tabstop or the previous if 'backwards' is True."""
|
||||
if self._cts is None:
|
||||
return
|
||||
|
||||
if backwards:
|
||||
cts_bf = self._cts
|
||||
|
||||
res = self._get_prev_tab(self._cts)
|
||||
if res is None:
|
||||
self._cts = cts_bf
|
||||
return self._tabstops.get(self._cts, None)
|
||||
self._cts, ts = res
|
||||
return ts
|
||||
else:
|
||||
res = self._get_next_tab(self._cts)
|
||||
if res is None:
|
||||
self._cts = None
|
||||
return self._tabstops.get(0, None)
|
||||
else:
|
||||
self._cts, ts = res
|
||||
return ts
|
||||
|
||||
return self._tabstops[self._cts]
|
||||
|
||||
def _get_tabstop(self, requester, no):
|
||||
# SnippetInstances are completely self contained, therefore, we do not
|
||||
# need to ask our parent for Tabstops
|
||||
cached_parent = self._parent
|
||||
self._parent = None
|
||||
rv = EditableTextObject._get_tabstop(self, requester, no)
|
||||
self._parent = cached_parent
|
||||
return rv
|
||||
|
||||
|
||||
class _VimCursor(NoneditableTextObject):
|
||||
"""Helper class to keep track of the Vim Cursor when text objects expand
|
||||
and move."""
|
||||
|
||||
def __init__(self, parent):
|
||||
NoneditableTextObject.__init__(
|
||||
self, parent, _vim.buf.cursor, _vim.buf.cursor,
|
||||
tiebreaker=Position(-1, -1))
|
||||
|
||||
def to_vim(self):
|
||||
"""Moves the cursor in the Vim to our position."""
|
||||
assert self._start == self._end
|
||||
_vim.buf.cursor = self._start
|
@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""This is the most important TextObject. A TabStop is were the cursor
|
||||
comes to rest when the user taps through the Snippet."""
|
||||
|
||||
from UltiSnips.text_objects._base import EditableTextObject
|
||||
|
||||
class TabStop(EditableTextObject):
|
||||
"""See module docstring."""
|
||||
|
||||
def __init__(self, parent, token, start=None, end=None):
|
||||
if start is not None:
|
||||
self._number = token
|
||||
EditableTextObject.__init__(self, parent, start, end)
|
||||
else:
|
||||
self._number = token.number
|
||||
EditableTextObject.__init__(self, parent, token)
|
||||
parent._tabstops[self._number] = self # pylint:disable=protected-access
|
||||
|
||||
@property
|
||||
def number(self):
|
||||
"""The tabstop number."""
|
||||
return self._number
|
||||
|
||||
@property
|
||||
def is_killed(self):
|
||||
"""True if this tabstop has been typed over and the user therefore can
|
||||
no longer jump to it."""
|
||||
return self._parent is None
|
@ -0,0 +1,149 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Implements TabStop transformations."""
|
||||
|
||||
import re
|
||||
import sys
|
||||
from UltiSnips.text_objects._mirror import Mirror
|
||||
from UltiSnips.escaping import unescape, fill_in_whitespace
|
||||
|
||||
def _find_closing_brace(string, start_pos):
|
||||
"""Finds the corresponding closing brace after start_pos."""
|
||||
bracks_open = 1
|
||||
for idx, char in enumerate(string[start_pos:]):
|
||||
if char == '(':
|
||||
if string[idx+start_pos-1] != '\\':
|
||||
bracks_open += 1
|
||||
elif char == ')':
|
||||
if string[idx+start_pos-1] != '\\':
|
||||
bracks_open -= 1
|
||||
if not bracks_open:
|
||||
return start_pos+idx+1
|
||||
|
||||
def _split_conditional(string):
|
||||
"""Split the given conditional 'string' into its arguments."""
|
||||
bracks_open = 0
|
||||
args = []
|
||||
carg = ""
|
||||
for idx, char in enumerate(string):
|
||||
if char == '(':
|
||||
if string[idx-1] != '\\':
|
||||
bracks_open += 1
|
||||
elif char == ')':
|
||||
if string[idx-1] != '\\':
|
||||
bracks_open -= 1
|
||||
elif char == ':' and not bracks_open and not string[idx-1] == '\\':
|
||||
args.append(carg)
|
||||
carg = ""
|
||||
continue
|
||||
carg += char
|
||||
args.append(carg)
|
||||
return args
|
||||
|
||||
def _replace_conditional(match, string):
|
||||
"""Replaces a conditional match in a transformation."""
|
||||
conditional_match = _CONDITIONAL.search(string)
|
||||
while conditional_match:
|
||||
start = conditional_match.start()
|
||||
end = _find_closing_brace(string, start+4)
|
||||
args = _split_conditional(string[start+4:end-1])
|
||||
rv = ""
|
||||
if match.group(int(conditional_match.group(1))):
|
||||
rv = unescape(_replace_conditional(match, args[0]))
|
||||
elif len(args) > 1:
|
||||
rv = unescape(_replace_conditional(match, args[1]))
|
||||
string = string[:start] + rv + string[end:]
|
||||
conditional_match = _CONDITIONAL.search(string)
|
||||
return string
|
||||
|
||||
_ONE_CHAR_CASE_SWITCH = re.compile(r"\\([ul].)", re.DOTALL)
|
||||
_LONG_CASEFOLDINGS = re.compile(r"\\([UL].*?)\\E", re.DOTALL)
|
||||
_DOLLAR = re.compile(r"\$(\d+)", re.DOTALL)
|
||||
_CONDITIONAL = re.compile(r"\(\?(\d+):", re.DOTALL)
|
||||
class _CleverReplace(object):
|
||||
"""Mimics TextMates replace syntax."""
|
||||
|
||||
def __init__(self, expression):
|
||||
self._expression = expression
|
||||
|
||||
def replace(self, match):
|
||||
"""Replaces 'match' through the correct replacement string."""
|
||||
transformed = self._expression
|
||||
# Replace all $? with capture groups
|
||||
transformed = _DOLLAR.subn(
|
||||
lambda m: match.group(int(m.group(1))), transformed)[0]
|
||||
|
||||
# Replace Case switches
|
||||
def _one_char_case_change(match):
|
||||
"""Replaces one character case changes."""
|
||||
if match.group(1)[0] == 'u':
|
||||
return match.group(1)[-1].upper()
|
||||
else:
|
||||
return match.group(1)[-1].lower()
|
||||
transformed = _ONE_CHAR_CASE_SWITCH.subn(
|
||||
_one_char_case_change, transformed)[0]
|
||||
|
||||
def _multi_char_case_change(match):
|
||||
"""Replaces multi character case changes."""
|
||||
if match.group(1)[0] == 'U':
|
||||
return match.group(1)[1:].upper()
|
||||
else:
|
||||
return match.group(1)[1:].lower()
|
||||
transformed = _LONG_CASEFOLDINGS.subn(
|
||||
_multi_char_case_change, transformed)[0]
|
||||
transformed = _replace_conditional(match, transformed)
|
||||
return unescape(fill_in_whitespace(transformed))
|
||||
|
||||
# flag used to display only one time the lack of unidecode
|
||||
UNIDECODE_ALERT_RAISED = False
|
||||
class TextObjectTransformation(object):
|
||||
"""Base class for Transformations and ${VISUAL}."""
|
||||
|
||||
def __init__(self, token):
|
||||
self._convert_to_ascii = False
|
||||
|
||||
self._find = None
|
||||
if token.search is None:
|
||||
return
|
||||
|
||||
flags = 0
|
||||
self._match_this_many = 1
|
||||
if token.options:
|
||||
if "g" in token.options:
|
||||
self._match_this_many = 0
|
||||
if "i" in token.options:
|
||||
flags |= re.IGNORECASE
|
||||
if "a" in token.options:
|
||||
self._convert_to_ascii = True
|
||||
|
||||
self._find = re.compile(token.search, flags | re.DOTALL)
|
||||
self._replace = _CleverReplace(token.replace)
|
||||
|
||||
def _transform(self, text):
|
||||
"""Do the actual transform on the given text."""
|
||||
global UNIDECODE_ALERT_RAISED # pylint:disable=global-statement
|
||||
if self._convert_to_ascii:
|
||||
try:
|
||||
import unidecode
|
||||
text = unidecode.unidecode(text)
|
||||
except Exception: # pylint:disable=broad-except
|
||||
if UNIDECODE_ALERT_RAISED == False:
|
||||
UNIDECODE_ALERT_RAISED = True
|
||||
sys.stderr.write(
|
||||
"Please install unidecode python package in order to "
|
||||
"be able to make ascii conversions.\n")
|
||||
if self._find is None:
|
||||
return text
|
||||
return self._find.subn(
|
||||
self._replace.replace, text, self._match_this_many)[0]
|
||||
|
||||
class Transformation(Mirror, TextObjectTransformation):
|
||||
"""See module docstring."""
|
||||
|
||||
def __init__(self, parent, ts, token):
|
||||
Mirror.__init__(self, parent, ts, token)
|
||||
TextObjectTransformation.__init__(self, token)
|
||||
|
||||
def _get_text(self):
|
||||
return self._transform(self._ts.current_text)
|
@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Implements `!v ` VimL interpolation."""
|
||||
|
||||
import UltiSnips._vim as _vim
|
||||
from UltiSnips.text_objects._base import NoneditableTextObject
|
||||
|
||||
class VimLCode(NoneditableTextObject):
|
||||
"""See module docstring."""
|
||||
def __init__(self, parent, token):
|
||||
self._code = token.code.replace("\\`", "`").strip()
|
||||
|
||||
NoneditableTextObject.__init__(self, parent, token)
|
||||
|
||||
def _update(self, done):
|
||||
self.overwrite(_vim.eval(self._code))
|
||||
return True
|
@ -0,0 +1,129 @@
|
||||
#!/usr/bin/env python
|
||||
# encoding: utf-8
|
||||
|
||||
"""Some classes to conserve Vim's state for comparing over time."""
|
||||
|
||||
from collections import deque
|
||||
|
||||
from UltiSnips.compatibility import as_unicode, byte2col
|
||||
from UltiSnips.position import Position
|
||||
import UltiSnips._vim as _vim
|
||||
|
||||
class VimPosition(Position):
|
||||
"""Represents the current position in the buffer, together with some status
|
||||
variables that might change our decisions down the line."""
|
||||
|
||||
def __init__(self):
|
||||
pos = _vim.buf.cursor
|
||||
self._mode = _vim.eval("mode()")
|
||||
Position.__init__(self, pos.line, pos.col)
|
||||
|
||||
@property
|
||||
def mode(self):
|
||||
"""Returns the mode() this position was created."""
|
||||
return self._mode
|
||||
|
||||
class VimState(object):
|
||||
"""Caches some state information from Vim to better guess what editing
|
||||
tasks the user might have done in the last step."""
|
||||
|
||||
def __init__(self):
|
||||
self._poss = deque(maxlen=5)
|
||||
self._lvb = None
|
||||
|
||||
self._text_to_expect = None
|
||||
self._unnamed_reg_cache = None
|
||||
self._unnamed_reg_cached = False
|
||||
|
||||
def remember_unnamed_register(self, text_to_expect):
|
||||
"""Save the unnamed register. 'text_to_expect' is text that we expect
|
||||
to be contained in the register the next time this method is called -
|
||||
this could be text from the tabstop that was selected and might have
|
||||
been overwritten. We will not cash that then."""
|
||||
self._unnamed_reg_cached = True
|
||||
unnamed_reg = _vim.eval('@"')
|
||||
if unnamed_reg != self._text_to_expect:
|
||||
self._unnamed_reg_cache = unnamed_reg
|
||||
self._text_to_expect = text_to_expect
|
||||
|
||||
def restore_unnamed_register(self):
|
||||
"""Restores the unnamed register and forgets what we cached."""
|
||||
if not self._unnamed_reg_cached:
|
||||
return
|
||||
escaped_cache = self._unnamed_reg_cache.replace("'", "''")
|
||||
_vim.command("let @\"='%s'" % escaped_cache)
|
||||
self._unnamed_reg_cached = False
|
||||
|
||||
def remember_position(self):
|
||||
"""Remember the current position as a previous pose."""
|
||||
self._poss.append(VimPosition())
|
||||
|
||||
def remember_buffer(self, to):
|
||||
"""Remember the content of the buffer and the position."""
|
||||
self._lvb = _vim.buf[to.start.line:to.end.line+1]
|
||||
self._lvb_len = len(_vim.buf)
|
||||
self.remember_position()
|
||||
|
||||
@property
|
||||
def diff_in_buffer_length(self):
|
||||
"""Returns the difference in the length of the current buffer compared
|
||||
to the remembered."""
|
||||
return len(_vim.buf) - self._lvb_len
|
||||
|
||||
@property
|
||||
def pos(self):
|
||||
"""The last remembered position."""
|
||||
return self._poss[-1]
|
||||
|
||||
@property
|
||||
def ppos(self):
|
||||
"""The second to last remembered position."""
|
||||
return self._poss[-2]
|
||||
|
||||
@property
|
||||
def remembered_buffer(self):
|
||||
"""The content of the remembered buffer."""
|
||||
return self._lvb[:]
|
||||
|
||||
class VisualContentPreserver(object):
|
||||
"""Saves the current visual selection and the selection mode it was done in
|
||||
(e.g. line selection, block selection or regular selection.)"""
|
||||
|
||||
def __init__(self):
|
||||
self.reset()
|
||||
|
||||
def reset(self):
|
||||
"""Forget the preserved state."""
|
||||
self._mode = ""
|
||||
self._text = as_unicode("")
|
||||
|
||||
def conserve(self):
|
||||
"""Save the last visual selection ond the mode it was made in."""
|
||||
sl, sbyte = map(int,
|
||||
(_vim.eval("""line("'<")"""), _vim.eval("""col("'<")""")))
|
||||
el, ebyte = map(int,
|
||||
(_vim.eval("""line("'>")"""), _vim.eval("""col("'>")""")))
|
||||
sc = byte2col(sl, sbyte - 1)
|
||||
ec = byte2col(el, ebyte - 1)
|
||||
self._mode = _vim.eval("visualmode()")
|
||||
|
||||
_vim_line_with_eol = lambda ln: _vim.buf[ln] + '\n'
|
||||
|
||||
if sl == el:
|
||||
text = _vim_line_with_eol(sl-1)[sc:ec+1]
|
||||
else:
|
||||
text = _vim_line_with_eol(sl-1)[sc:]
|
||||
for cl in range(sl, el-1):
|
||||
text += _vim_line_with_eol(cl)
|
||||
text += _vim_line_with_eol(el-1)[:ec+1]
|
||||
self._text = text
|
||||
|
||||
@property
|
||||
def text(self):
|
||||
"""The conserved text."""
|
||||
return self._text
|
||||
|
||||
@property
|
||||
def mode(self):
|
||||
"""The conserved visualmode()."""
|
||||
return self._mode
|
@ -0,0 +1,72 @@
|
||||
" Syntax highlighting for snippet files (used for UltiSnips.vim)
|
||||
" Revision: 26/03/11 19:53:33
|
||||
|
||||
if exists("b:current_syntax")
|
||||
finish
|
||||
endif
|
||||
|
||||
syntax include @Python syntax/python.vim
|
||||
syntax include @Viml syntax/vim.vim
|
||||
|
||||
" global matches
|
||||
syn match snipComment "^#.*" contains=snipTODO
|
||||
syn keyword snipTODO FIXME NOTE NOTES TODO XXX contained
|
||||
|
||||
syn match snipDocString '"[^"]*"$'
|
||||
syn match snipString '"[^"]*"'
|
||||
syn match snipTabsOnly "^\t\+$"
|
||||
syn match snipLeadingSpaces "^\t* \+"
|
||||
|
||||
syn match snipKeyword "\(\<\(end\)\?\(snippet\|global\)\>\)\|extends\|clearsnippets\|priority" contained
|
||||
|
||||
" extends definitions
|
||||
syn match snipExtends "^extends.*" contains=snipKeyword
|
||||
|
||||
" snippet definitions
|
||||
syn match snipStart "^snippet.*" contained contains=snipKeyword,snipDocString
|
||||
syn match snipEnd "^endsnippet" contained contains=snipKeyword
|
||||
syn region snipCommand contained keepend start="`" end="`" contains=snipPythonCommand,snipVimLCommand
|
||||
syn region snipPythonCommand contained keepend start="`!p" end="`" contained contains=@Python
|
||||
syn region snipVimLCommand contained keepend start="`!v" end="`" contained contains=@Viml
|
||||
syn match snipVar "\$\d*" contained
|
||||
syn region snipVisual matchgroup=Define start="\${VISUAL" end="}" contained
|
||||
syn region snipVarExpansion matchgroup=Define start="\${\d*" end="}" contained contains=snipVar,snipVarExpansion,snipCommand
|
||||
syn region snippet fold keepend start="^snippet" end="^endsnippet" contains=snipStart,snipEnd,snipTabsOnly,snipLeadingSpaces,snipCommand,snipVarExpansion,snipVar,snipVisual
|
||||
|
||||
" global definitions
|
||||
syn match snipGlobalStart "^global.*" contained contains=snipKeyword,snipString
|
||||
syn match snipGlobalEnd "^endglobal" contained contains=snipKeyword
|
||||
syn region snipGlobal fold keepend start="^global" end="^endglobal" contains=snipGlobalStart,snipGlobalEnd,snipLeadingSpaces,snipTabsOnly,snipCommand,snipVarExpansion,snipVar,@Python
|
||||
|
||||
" snippet clearing
|
||||
syn match snipClear "^clearsnippets"
|
||||
syn match snipPriority "^priority"
|
||||
|
||||
" highlighting rules
|
||||
|
||||
hi link snipComment Comment
|
||||
hi link snipLeadingSpaces Error
|
||||
hi link snipString String
|
||||
hi link snipDocString String
|
||||
hi link snipTabsOnly Error
|
||||
|
||||
hi link snipKeyword Keyword
|
||||
|
||||
hi link snipExtends Statement
|
||||
|
||||
hi link snipStart Statement
|
||||
hi link snipEnd Statement
|
||||
hi link snipCommand Special
|
||||
hi link snipVar StorageClass
|
||||
hi link snipVarExpansion Normal
|
||||
hi link snipVisual Normal
|
||||
hi link snippet Normal
|
||||
|
||||
hi link snipGlobalStart Statement
|
||||
hi link snipGlobalEnd Statement
|
||||
hi link snipGlobal Normal
|
||||
|
||||
hi link snipClear Statement
|
||||
hi link snipPriority Statement
|
||||
|
||||
let b:current_syntax = "snippet"
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue