diff --git a/vim/bundle/AutoComplPop b/vim/bundle/AutoComplPop
index 84ec18d..0b075cf 160000
--- a/vim/bundle/AutoComplPop
+++ b/vim/bundle/AutoComplPop
@@ -1 +1 @@
-Subproject commit 84ec18dfc503bebd863ddce108ee4503c334b615
+Subproject commit 0b075cf5e6ef05584ef6377e116e8d0fe1f8f788
diff --git a/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-TOC-demo-more-background.png b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-TOC-demo-more-background.png
new file mode 100644
index 0000000..3dfb3c8
Binary files /dev/null and b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-TOC-demo-more-background.png differ
diff --git a/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-TOC-demo.png b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-TOC-demo.png
new file mode 100644
index 0000000..ad8a259
Binary files /dev/null and b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-TOC-demo.png differ
diff --git a/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-Team.png b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-Team.png
new file mode 100644
index 0000000..ec8005d
Binary files /dev/null and b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-Team.png differ
diff --git a/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-Team.svg b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-Team.svg
new file mode 100644
index 0000000..66a27a5
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX-Team.svg
@@ -0,0 +1,198 @@
+
+
+
+
diff --git a/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX.png b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX.png
new file mode 100644
index 0000000..5b41b74
Binary files /dev/null and b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX.png differ
diff --git a/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX.svg b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX.svg
new file mode 100644
index 0000000..2b189aa
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/.assets/LaTeX-BoX.svg
@@ -0,0 +1,176 @@
+
+
+
+
diff --git a/vim/bundle/LaTeX-Box/.gitignore b/vim/bundle/LaTeX-Box/.gitignore
new file mode 100644
index 0000000..926ccaa
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/.gitignore
@@ -0,0 +1 @@
+doc/tags
diff --git a/vim/bundle/LaTeX-Box/LICENSE b/vim/bundle/LaTeX-Box/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ 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.
+
+
+ Copyright (C)
+
+ 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 .
+
+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:
+
+ Copyright (C)
+ 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
+.
+
+ 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
+.
diff --git a/vim/bundle/LaTeX-Box/README.md b/vim/bundle/LaTeX-Box/README.md
new file mode 100644
index 0000000..9760dbf
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/README.md
@@ -0,0 +1,88 @@
+# LaTeX-BoX
+![LaTeX-BoX](https://raw.github.com/LaTeX-Box-Team/LaTeX-Box/master/.assets/LaTeX-BoX.png)
+
+## This plugin provides:
+- Background compilation using latexmk.
+- Completion for commands, environments, labels, bibtex entries, and inline maths.
+- A simple table of contents improving the navigation of large files.
+- Smart indentation.
+- Highlight matching \begin/\end and \left\right pairs.
+- Motion between \begin/\end and \left\right pairs with the % key.
+- Motion through brackets/braces (with user-defined keys).
+- Environment objects (e.g., select environement with "vie" or "vae").
+- Inline math objects (e.g., select inline math with "vi$" or "va$").
+- Folding of parts (part/chapter/section/etc) and environments.
+- OmniCompletion for bibliography entries respects BibLaTeX's
+ `\addbibresource`, `\addglobalbib` and `\addsectionbib` commands.
+- The table of contents functionality does not depend anymore on the assumption
+ that `\@writefile{toc}{\contentsline ...}` entries in the `*.aux` file always
+ occur at the start of some line.
+- Completion of `\ref{...}` commands was completely rewritten. It is now able
+ to handle `\@newlabel{label}{{number}{page}...}` entries in the `*.aux` file
+ even if `number` or `page` contain arbitrary nested levels of braces. Labels
+ are additionally held in a cache per `*.aux` file, which is updated only if
+ the modification time of the file changes.
+- The table of contents now opens files different from the one currently being
+ edited in a new buffer. (I actually think, that this behaviour was
+ implemented already, but I could not get it working.) To make this work,
+ LaTeX-Box is not loaded per buffer but globally.
+
+This plugins aims at being lightweight and simple. For more fully-fledged
+plugins, see:
+- LaTeX-Suite: vimscript#475
+- AutomaticTexPlugin: vimscript#2945
+
+## Installation
+### With gmarik vundle
+_https://github.com/gmarik/vundle_
+
+Add `Plugin 'LaTeX-Box-Team/LaTeX-Box'` to your ~/.vimrc and run
+`:PluginInstall` in a vim buffer. Add `!` to the command to update.
+
+### With pathogen
+_https://github.com/tpope/vim-pathogen_
+
+Add the LaTeX-Box bundle to your bundle directory, for instance with `git
+clone`. This will typically be enough:
+
+ cd ~/.vim/bundle
+ git clone git://github.com/LaTeX-Box-Team/LaTeX-Box.git
+
+### Without a plugin manager
+
+Copy the directories to your `.vim/` folder.
+
+### Windows users
+
+Users working with (g)vim on Windows must have a Perl environment installed.
+Such an environment can be downloaded at : http://strawberryperl.com/
+
+### Installation Notes
+
+Make sure `filetype plugin on` is set in host `.vimrc`, else LaTeX-Box
+will not load.
+
+Note that there are configurable global variables that can be put in the
+`.vimrc`. These are documented, but as an example, one can have the
+table of contents open as a horizontal split by utilizing this:
+
+ ~/.vimrc
+ ...
+ if s:extfname ==? "tex"
+ ...
+ let g:LatexBox_split_type="new"
+ ...
+ endif
+
+## Mirror information
+
+This is mirrored on
+
+- http://www.vim.org/scripts/script.php?script_id=3109
+- https://launchpad.net/~vim-latex-box
+
+## Example Table of Contents
+
+![LaTeX-BoX TOC](https://raw.github.com/LaTeX-Box-Team/LaTeX-Box/master/.assets/LaTeX-BoX-TOC-demo.png)
+
+
diff --git a/vim/bundle/LaTeX-Box/after/syntax/tex.vim b/vim/bundle/LaTeX-Box/after/syntax/tex.vim
new file mode 100644
index 0000000..9f4d761
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/after/syntax/tex.vim
@@ -0,0 +1,9 @@
+" adds support for cleverref package
+" \Cref, \cref, \cpageref, \labelcref, \labelcpageref
+syn region texRefZone matchgroup=texStatement start="\\Cref{" end="}\|%stopzone\>" contains=@texRefGroup
+syn region texRefZone matchgroup=texStatement start="\\\(label\|\)c\(page\|\)ref{" end="}\|%stopzone\>" contains=@texRefGroup
+
+" adds support for listings package
+syn region texZone start="\\begin{lstlisting}" end="\\end{lstlisting}\|%stopzone\>"
+syn match texInputFile "\\lstinputlisting\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
+syn match texZone "\\lstinline\s*\(\[.*\]\)\={.\{-}}"
diff --git a/vim/bundle/LaTeX-Box/doc/latex-box.txt b/vim/bundle/LaTeX-Box/doc/latex-box.txt
new file mode 100644
index 0000000..667f11f
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/doc/latex-box.txt
@@ -0,0 +1,833 @@
+*latex-box.txt* LaTeX Box
+*latex-box*
+
+This plugin consists of a set of tools to help editing LaTeX documents.
+
+Manifesto: LaTeX Box aims to remain lightweight and stay out of the way.
+
+This plugin provides:
+- Background compilation using latexmk;
+- Completion for commands, environments, labels, bibtex entries and inline
+ maths;
+- A simple table of contents;
+- Smart indentation (activated with "set smartindent");
+- Highlighting of matching \begin/\end pairs
+- Motion between matching \begin/\end pairs with the % key;
+- Motion through brackets/braces (with user-defined keys).
+- Environment objects (e.g., select environement with "vie" or "vae")
+- Inline math objects (e.g., select inline math with "vi$" or "va$")
+
+==============================================================================
+
+|latex-box-completion| COMPLETION
+|latex-box-completion-commands| Commands
+|latex-box-completion-environments| Environments
+|latex-box-completion-labels| Labels
+|latex-box-completion-bibtex| Bibtex
+|latex-box-completion-inlineMaths| InlineMaths
+
+|latex-box-commands| COMMANDS
+|latex-box-commands-compilation| Compilation
+|latex-box-commands-viewing| Viewing
+|latex-box-commands-folding| Folding
+|latex-box-commands-motion| Motion
+
+|latex-box-motion| MOTION
+
+|latex-box-mappings| MAPPINGS
+|latex-box-mappings-compilation| Compilation
+|latex-box-mappings-insertion| Insertion
+|latex-box-mappings-viewing| Viewing
+|latex-box-mappings-folding| Folding
+|latex-box-mappings-motion| Motion
+
+|latex-box-settings| SETTINGS
+|latex-box-settings-compilation| Compilation
+|latex-box-settings-completion| Completion
+|latex-box-settings-windows| Vim Windows
+
+|latex-box-folding| FOLDING
+
+|latex-box-indent| INDENTATION
+
+|latex-box-FAQ| Frequently Asked Questions
+
+|latex-box-todo| TODO
+
+==============================================================================
+
+COMPLETION *latex-box-completion*
+
+Completion is achieved through omni completion |compl-omni|, with default
+bindings . There are five types of completion:
+
+------------------------------------------------------------------------------
+
+ *latex-box-completion-commands*
+Commands ~
+
+Command completion is triggered by the '\' character. For example, >
+ \beg
+completes to >
+ \begin{
+<
+
+Associated settings:
+ |g:LatexBox_completion_commands|
+ |g:LatexBox_completion_close_braces|
+
+------------------------------------------------------------------------------
+
+ *latex-box-completion-environments*
+Environments ~
+
+Environment completion is triggered by '\begin{'. For example, >
+ \begin{it
+completes to >
+ \begin{itemize}
+<
+
+Completion of '\end{' automatically closes the last open environment.
+
+Associated settings:
+ |g:LatexBox_completion_environments|
+ |g:LatexBox_completion_close_braces|
+
+------------------------------------------------------------------------------
+
+ *latex-box-completion-labels*
+Labels ~
+
+Label completion is triggered by '\ref{' or '\eqref{'. For example, >
+ \ref{sec:
+offers a list of all matching labels, with their associated value and page
+number. Labels are read from the aux file, so label completion works only
+after compilation.
+
+It matches:
+ 1. labels: >
+ \ref{sec:
+< 2. numbers: >
+ \eqref{2
+< 3. labels and numbers together (separated by whitespace): >
+ \eqref{eq 2
+<
+
+Associated settings:
+ |g:LatexBox_ref_pattern|
+ |g:LatexBox_completion_close_braces|
+
+------------------------------------------------------------------------------
+
+ *latex-box-completion-bibtex*
+BibTeX entries ~
+
+BibTeX completion is triggered by '\cite{', '\citep{' or '\citet{'. For
+example, assume you have in your .bib files an entry looking like: >
+
+ @book { knuth1981,
+ author = "Donald E. Knuth",
+ title = "Seminumerical Algorithms",
+ publisher = "Addison-Wesley",
+ year = "1981" }
+
+Then, try: >
+
+ \cite{Knuth 1981
+ \cite{algo
+
+You can also use regular expressions (or vim patterns) after '\cite{'.
+
+Associated settings:
+ |g:LatexBox_cite_pattern|
+ |g:LatexBox_bibtex_wild_spaces|
+ |g:LatexBox_completion_close_braces|
+
+------------------------------------------------------------------------------
+
+ *latex-box-completion-inlineMaths*
+InlineMaths ~
+
+InlineMaths completion is triggered by '$', '\(' or '\[', and can also be
+triggered by '$' that locates in math environment '\(...\)', '\[...\]', or
+'\begin{eq-env} ... \end{eq-env}'. It suggests the inline maths you write in
+'$' pairs and in '\( ... \)' and the corresponding line number.
+
+Note that an inline math with open and close symbols on different lines will
+not be suggested.
+
+For example, you type two in line maths looking like: >
+
+ $hello$, \(world\)
+
+And you save them before trying to complete elsewhere: >
+
+ :w
+
+You type '$', '\(' or '\[', and part of 'hello': >
+
+ $h
+ \(h
+ \[h
+
+They comlete to: >
+
+ $hello$
+ \(hello\)
+ \[hello\]
+
+You can still add more in line maths in '\(...\)' and '\[...\]': >
+
+ \(hello, $ w \)
+ \[hello, $ w \]
+
+The results: >
+
+ \(hello, world\)
+ \[hello, world\]
+
+Or cross lines: >
+
+ \( hello,
+ $ w
+
+ \[ hello,
+ $ w
+
+The results: >
+
+ \(hello,
+ world
+
+ \[hello,
+ world
+
+For equation environments, it's always triggered by '$': >
+
+ \begin{eq-env}
+ $h
+ $w
+ \end{eq-env}
+
+It matches: >
+
+ \begin{eq-env}
+ hello
+ world
+ \end{eq-env}
+
+
+ATTENTION: do not try to complete inline maths when
+1. '$' pair is in multi lines: >
+
+ $
+ h
+
+2. '\begin{eq-env}' and '\end{eq-env}' are in single line: >
+
+ \begin{eq-env} $ h \end{eq-env}
+
+Associated setting: >
+ g:LatexBox_complete_inlineMath
+ g:LatexBox_eq_env_patterns
+
+==============================================================================
+
+COMMANDS *latex-box-commands*
+
+------------------------------------------------------------------------------
+
+ *latex-box-commands-compilation*
+Compilation ~
+
+*:Latexmk*
+ Compile with latexmk.
+ See |g:LatexBox_latexmk_async|, |g:LatexBox_latexmk_options|, and
+ |g:LatexBox_latexmk_preview_continuously|.
+*:Latexmk!*
+ Force compilation with latexmk (runs latexmk with "-g" option).
+*:LatexmkClean*
+ Clean temporary output from LaTeX.
+*:LatexmkClean!*
+ Clean all output from LaTeX.
+*:LatexmkStatus*
+ Show the running status of latexmk for the current buffer.
+*:LatexmkStatus!*
+ Show the running status of latexmk for all buffers with process group
+ ID's or PID's.
+*:LatexmkStop*
+ Stop latexmk if it is running.
+*:LatexErrors*
+ Load the log file for the current document and jump to the first error.
+
+Note: The commands |:LatexmkStop| and |:LatexmkStatus| are only relevant when
+|g:LatexBox_latexmk_async| or |g:LatexBox_latexmk_preview_continuously| is
+set.
+
+When latexmk terminates, it reports its success or failure (with status
+number). To navigate through the errors, you can use the |:cc|, |:cn| and
+|:cp| commands, as well as the |:clist| command to list the errors.
+
+------------------------------------------------------------------------------
+
+ *latex-box-commands-viewing*
+Viewing ~
+
+*:LatexView*
+ Launch viewer on output file.
+ Takes optional arguments, separated by whitespaces, to be passed to the viewer.
+ For example, to open the viewer at a specific page and line if SyncTeX is used.
+ See the FAQ below for an application to SumatraPDF for forward searching.
+ See |g:LatexBox_output_type| and |g:LatexBox_viewer|.
+
+------------------------------------------------------------------------------
+
+ *latex-box-commands-folding*
+Folding ~
+
+*:LatexFold*
+ Recalculate the folds in the file.
+ This is especially useful if you are editing a large file with
+ automatic folding disabled for performance reasons.
+ See |g:LatexBox_fold_automatic|.
+
+------------------------------------------------------------------------------
+
+ *latex-box-commands-motion*
+Motion ~
+
+*:LatexTOC*
+ Open a table of contents.
+ Use Enter to navigate to selected entry.
+ See |g:LatexBox_split_type|.
+ See |g:LatexBox_split_length|.
+ See |g:LatexBox_split_width|.
+ See |g:LatexBox_split_side|.
+ See |g:LatexBox_split_resize|.
+*:LatexTOCToggle*
+ Toggle the display of the table of contents.
+*:LatexLabels*
+ Same as TOC but with regex-selected labels.
+
+Associated setting:
+ |g:LatexBox_plaintext_toc| (set this if UTF8 conversion does not work)
+
+==============================================================================
+
+MOTION *latex-box-motion*
+
+The function LatexBox_JumpToNextBraces({backward}) allows to jump outside of
+the current brace/bracket pair, or inside of the next opening braces/brackets.
+
+==============================================================================
+
+MAPPINGS *latex-box-mappings*
+
+------------------------------------------------------------------------------
+
+ *latex-box-mappings-compilation*
+Compilation ~
+
+ll |:Latexmk|
+ Compile with latexmk.
+lL |:Latexmk!|
+ Force compilation with latexmk.
+lc |:LatexmkClean|
+ Clean temporary output from LaTeX.
+lC |:LatexmkClean!|
+ Clean all output from LaTeX.
+lk |:LatexmkStop|
+ Stop latexmk if it is running.
+lg |:LatexmkStatus|
+ Show the running status of latexmk for the current buffer.
+lG |:LatexmkStatus!|
+ Show the running status of latexmk for all buffers with process group
+ ID's.
+le |:LatexErrors|
+ Load the log file for the current document and jump to the first error.
+
+------------------------------------------------------------------------------
+
+ *latex-box-mappings-viewing*
+Viewing ~
+
+lv |:LatexView|
+ View output file.
+
+------------------------------------------------------------------------------
+
+ *latex-box-mappings-folding*
+Folding ~
+
+lf |:LatexFold|
+ Recalculate the folds.
+
+------------------------------------------------------------------------------
+
+ *latex-box-mappings-insertion*
+Insertion ~
+
+*LatexCloseCurEnv*
+ Close the last matching open environment. Use with imap, e.g.: >
+ imap ]] LatexCloseCurEnv
+<
+
+*LatexChangeEnv*
+ Change the current environment. Use with nmap, e.g.: >
+ nmap LatexChangeEnv
+<
+
+*LatexToggleStarEnv*
+ Toggle star environments (add or remove star). Use with nmap, e.g.: >
+ nmap LatexToggleStarEnv
+<
+
+*LatexWrapSelection*
+ Wrap the current selection in a LaTeX command. Use with vmap, e.g.: >
+ vmap LatexWrapSelection
+<
+
+*LatexEnvWrapSelection*
+ Wrap the current selection in an environment. Use with vmap, e.g.: >
+ vmap LatexEnvWrapSelection
+<
+
+Suggested mappings to put in ~/.vim/ftplugin/tex.vim: >
+ imap [[ \begin{
+ imap ]] LatexCloseCurEnv
+ nmap LatexChangeEnv
+ vmap LatexWrapSelection
+ vmap LatexEnvWrapSelection
+ imap (( \eqref{
+<
+
+------------------------------------------------------------------------------
+
+ *latex-box-mappings-motion*
+Motion ~
+
+lt |:LatexTOC|
+ Open a table of contents.
+ Use Enter to navigate to selected entry.
+
+*LatexBox_JumpToMatch*
+ Jump to the matching bracket or \begin/\end pairs. Emulates |%|.
+
+*LatexBox_BackJumpToMatch*
+ Same as |LatexBox_JumpToMatch|, but the initial search is
+ backward.
+
+Suggested bindings: >
+ map ¶ :call LatexBox_JumpToNextBraces(0)
+ map § :call LatexBox_JumpToNextBraces(1)
+ imap ¶ =LatexBox_JumpToNextBraces(0)
+ imap § =LatexBox_JumpToNextBraces(1)
+<
+
+==============================================================================
+
+SETTINGS *latex-box-settings*
+
+------------------------------------------------------------------------------
+
+Mappings ~
+
+*g:LatexBox_no_mappings*
+ If this variable is defined, the default keyboard mappings will not be
+ loaded.
+
+*g:LatexBox_open_pats*
+*g:LatexBox_close_pats*
+ These variables define the patterns that LatexBox use to detect
+ matching pair of braces, parantheses, environments, and similar.
+
+ Default: >
+ let g:LatexBox_open_pats = [
+ \ '\\{','{','\\(','(','\\\[','\[',
+ \ '\\begin\s*{.\{-}}',
+ \ '\\left\s*\%([^\\]\|\\.\|\\\a*\)',
+ \ ]
+ let g:LatexBox_close_pats = [
+ \ '\\}','}','\\)',')','\\\]','\]',
+ \ '\\end\s*{.\{-}}',
+ \ '\\right\s*\%([^\\]\|\\.\|\\\a*\)',
+ \ ]
+<
+
+ *latex-box-settings-completion*
+Completion ~
+
+*g:LatexBox_completion_close_braces* Default: 1
+ If nonzero, omni completion will add closing brackets where relevant.
+ For example, if nonzero, >
+ \begin{itemize
+< completes to >
+ \begin{itemize}
+
+*g:LatexBox_bibtex_wild_spaces* Default: 1
+ If nonzero, spaces act as wildcards ('.*') in completion.
+
+ For example, if nonzero, >
+ \cite{Knuth 1981
+< is equivalent to >
+ \cite{Knuth.*1981
+
+*g:LatexBox_completion_environments*
+*g:LatexBox_completion_commands*
+ Static completion lists for environments
+ |latex-box-completion-environments| and commands
+ |latex-box-completion-commands|.
+ See |complete-items|.
+
+*g:LatexBox_cite_pattern*
+*g:LatexBox_ref_pattern*
+ Patterns to match \cite and \ref commands for BibTeX and label
+ completion. They must include the trailing '{'.
+
+ Examples: To match only the 'cite' command (case insensitive), use: >
+ let LatexBox_cite_pattern = '\c\\cite\*\?\_\s*{'
+< To match all commands that end with 'ref' (case insensitive), use: >
+ let LatexBox_ref_pattern = '\c\\\a*ref\*\?\_\s*{'
+< Both of the above examples also match commands with a trailing star.
+
+ Default values: >
+ let g:LatexBox_cite_pattern
+ \ = '\m\c\\\a*cite\a*\*\?\(\[[^\]]*\]\)\_\s*{'
+ let g:LatexBox_ref_pattern
+ \ = '\m\C\\v\?\(eq\|page\|[cC]\)\?ref\*\?\_\s*{'
+< The '\m' flag indicates that these are magic regular expressions.
+< The default settings should work for most standard LaTeX packages.
+
+*g:LatexBox_complete_inlineMath* Default: 0
+ Switch for inline math completion.
+
+*g:LatexBox_eq_env_patterns*
+ Equation environments besides '$...$', '\(...\)', and '\[...\]' that
+ support inline math completion.
+
+ Note that 'eq-env-name*' will also be supported if we add
+ 'eq-env-name' in the list.
+
+ Default: >
+ let g:LatexBox_eq_env_patterns
+ \ = 'equation\|gather\|multiline\|align'
+ \ . '\|flalign\|alignat\|eqnarray'
+<
+
+------------------------------------------------------------------------------
+
+Templates (DEPRECATED) ~
+
+*g:LatexBox_templates*
+
+ Dictionary of environment templates |latex-box-templates|.
+
+ DEPRECATED!
+ I think it is better to leave this task to plug-ins oriented to do
+ this well, like snipMate:
+ http://www.vim.org/scripts/script.php?script_id=2540
+
+------------------------------------------------------------------------------
+
+ *latex-box-settings-compilation*
+Compilation ~
+
+*g:vim_program* Default: autodetected
+ Vim program to use on command line for callbacks. If autodetect
+ fails, defaults to: >
+ '/Applications/MacVim.app/Contents/MacOS/Vim -g'
+< on MacVim, or to |v:progname| on other systems.
+
+*g:LatexBox_latexmk_async* Default: 0
+ Enable asynchronous LaTeX compilation using vimserver. This will
+ allow latexmk to run in the background and load any compilation
+ errors in a quickfix window after it finishes running.
+
+*g:LatexBox_latexmk_preview_continuously* Default: 0
+ Run latexmk in continuous mode (i.e. with the "-pvc" option).
+ Latexmk will track the currently edited file for writes and
+ recompile automatically when necessary, without hanging VIM.
+ Setting |g:LatexBox_quickfix|=2 is recommended when this is enabled,
+ to prevent the quickfix window from stealing the cursor.
+
+*g:LatexBox_latexmk_env* Default: ""
+ Additional environment options to place in front of the latexmk
+ command, e.g. >
+ let g:LatexBox_latexmk_env = "TEXINPUTS=~/mytex:"
+
+*g:LatexBox_latexmk_options* Default: ""
+ Additional options to pass to latexmk during compilation, e.g, "-d".
+
+*g:LatexBox_output_type* Default: "pdf"
+ Extension of the output file. One of "pdf", "dvi" or "ps".
+
+*g:LatexBox_viewer* Default: "xdg-open"
+ Viewer application for the output file, e.g., "xpdf".
+
+*g:LatexBox_quickfix* Default: 1
+ Adjust the behavior of the quickfix window when there are compilation
+ errors or warnings. See also |g:LatexBox_show_warnings|. Recognized
+ options are:
+
+ Value Effect ~
+ 0 The quickfix is not opened automatically.
+ 1 The quickfix window is opened automatically if not
+ empty and becomes the active window.
+ 2 The quickfix window is opened automatically if not
+ empty but the cursor stays in the current window.
+ 3 The quickfix window is opened automatically if not
+ empty and becomes the active window. Quickfix window is not
+ opened on warnings, only on errors.
+ 4 The quickfix window is opened automatically if not
+ empty but the cursor stays in the current window. Quickfix
+ window is not opened on warnings, only on errors.
+
+*g:LatexBox_autojump* Default: 0
+ Automatically jump to first error after calling latexmk.
+
+*b:main_tex_file* Default: ""
+ Path to the main LaTeX file associated to the current buffer.
+ When editing a LaTeX document consisting of multiple source files, set
+ this variable to the path of the main source file on which LaTeX must
+ be called.
+
+*g:LatexBox_show_warnings* Default: 1
+ If set to 1, warnings in compilation will be listed as errors.
+
+*g:LatexBox_ignore_warnings*
+ A list of warnings to be ignored.
+
+ Default: >
+ let g:LatexBox_ignore_warnings
+ \ = ['Underfull', 'Overfull', 'specifier changed to']
+<
+
+*g:LatexBox_build_dir* Default: ""
+ Set output directory for build files.
+
+*b:build_dir* Default: ""
+ Set output directory for build files. This overrides the global
+ setting.
+
+*g:LatexBox_jobname* Default: ""
+ Sets the name of the output build files.
+
+------------------------------------------------------------------------------
+
+ *latex-box-settings-windows*
+Vim Windows ~
+
+For different settings, change the .vimrc so that a more comfortable
+global variable is used. For example, if one prefers horizontal splits
+(non-default, featured in screenshot), consider the following lines in
+the .vimrc:
+
+>
+ if s:extfname ==? "tex"
+ ...
+ let |g:LatexBox_split_type| = "new"
+ ...
+ end if
+<
+
+*g:LatexBox_split_type* Default: "vnew"
+ The type of split for the Table of Contents. Use "new" for horizontal,
+ "vnew" for vertical. Note that these are the general commands for
+ splitting--more info can be found via :help new.
+
+*g:LatexBox_split_length* Default: 15
+ Length of horizontally split vim windows. Used for the table of contents.
+
+*g:LatexBox_split_width* Default: 30
+ Width of vertically split vim windows. Used for the table of contents.
+
+*g:LatexBox_split_side* Default: "aboveleft"
+ On which side the split windows appear. Above for horizontal splits
+ and left for vertical splits. Used for the table of contents.
+ Set to "belowright" to have it on the below/right side.
+
+*g:LatexBox_split_resize* Default: 0
+ Resize vim/gvim when opening new windows. Used for the table of
+ contents. If set to 1, it will add/remove |g:LatexBox_split_width| or
+ |g:LatexBox_split_length| to the number of columns dynamically,
+ in order to keep the latex file open with the desired dimension.
+
+*g:LatexBox_toc_hidehelp* Default: 0
+ If enabled, the help info at the bottom of the TOC window will be
+ hidden.
+
+==============================================================================
+
+FOLDING *latex-box-folding*
+
+LatexBox can fold texts according to LaTeX structure (part, chapter, section
+and subsection). Folding is off by default, and can be turned on by defining
+the |g:LatexBox_Folding| variable.
+
+The standard fold settings should suffice for most people. When folding is
+turned on and a latex document is opened, the document is parsed once in order
+to define the highest fold level based on which parts and sections should be
+folded.
+
+*g:LatexBox_Folding* Default: 0
+ Set to 1 to activate LaTeX structure folding. Please note that any
+ modeline that would set |foldmethod| to something else than
+ 'fold-expr' will disable the function. The same goes for |foldexpr|.
+ Set this variable in your .vimrc
+
+*g:LatexBox_fold_text* Default: 1
+ Turn on/off LaTeX enhenced foldtext() function. Turn on this option
+ makes LaTeX-Box override the |foldtext| option. Turn off if you want
+ to set your own |foldtext|.
+
+*g:LatexBox_fold_preamble* Default: 1
+ Turn on/off folding of preamble
+
+*g:LatexBox_fold_envs* Default: 1
+ Turn on/off folding of environments
+
+*g:LatexBox_fold_parts*
+ Define parts that should be folded. These are intended as top level
+ parts such as \frontmatter and \appendix, and if they are present in
+ a latex document they will get fold level 1.
+
+ Default: >
+ let g:LatexBox_fold_parts = [
+ \ "appendix",
+ \ "frontmatter",
+ \ "mainmatter",
+ \ "backmatter"
+ \ ]
+ <
+
+*g:LatexBox_fold_sections*
+ Define which section levels should be folded. The order of the
+ elements defines the order in which they are folded.
+
+ Default: >
+ let g:LatexBox_fold_sections = [
+ \ "part",
+ \ "chapter",
+ \ "section",
+ \ "subsection",
+ \ "subsubsection"
+ \ ]
+ <
+
+*g:LatexBox_fold_toc* Default: 0
+ Turn on/off folding of TOC (|latex-box-commands-motion|).
+
+*g:LatexBox_fold_toc_levels* Default: 1
+ Set number of section levels to fold in TOC.
+
+*g:LatexBox_fold_automatic* Default: 1
+ Turn on/off automatic calculation of folds.
+ By default LaTeX-Box recalculates the folds every time you exit insert
+ mode. However for large files this can be a rather slow process: a
+ couple of seconds to 10s of seconds.
+ If this option is set to 0 the folding code is still enabled but isn't
+ activated by default. Hence you need to manually tell vim to
+ recalculate folds every time you find it apropriate.
+ You can recalculate the folds using lf or |:LatexFold|
+
+==============================================================================
+
+INDENTATION *latex-box-indent*
+
+*g:LatexBox_custom_indent* Default: Not defined
+ The custom indent file of LaTeX-Box is ignored if this variable is
+ defined and set to 0. This will revert to the default indentation
+ file from vim.
+
+==============================================================================
+
+FREQUENTLY ASKED QUESTIONS *latex-box-FAQ*
+
+Q: How can I use SyncTeX with the Skim viewer?
+
+A: Add the following line in your ~/.latexmkrc file: >
+
+ $pdflatex = 'pdflatex -synctex=1 %O %S'
+
+< and create a "latex-search" mapping (ls) in your ~/.vimrc: >
+
+ map ls :silent
+ \ !/Applications/Skim.app/Contents/SharedSupport/displayline
+ \ =line('.') "=LatexBox_GetOutputFile()"
+ \ "%:p"
+
+< (inspired from vim-latex).
+
+ Alternatively, the option for latexmk may be given through the variable
+ |g:LatexBox_latexmk_options|, for instance as: >
+
+ let g:LatexBox_latexmk_options
+ \ = "-pdflatex='pdflatex -synctex=1 \%O \%S'"
+
+< which can be added to your .vimrc file as desired.
+
+Q: How can I use SyncTeX with the SumatraPDF viewer?
+
+A: To enable SyncTeX add the following LatexBox settings to your ~/.vimrc file: >
+
+ let g:LatexBox_latexmk_options =
+ \ '-pdflatex="pdflatex -synctex=1 %O %S"'
+
+ To enable Inverse Search, that is, jumping from a position in the PDF
+ document to the TeX file, add the following LatexBox settings to your
+ ~/.vimrc file: >
+
+ let g:LatexBox_latexmk_options =
+ \ '-pdflatex="pdflatex -synctex=1 %O %S"'
+
+ let g:LatexBox_viewer = 'SumatraPDF -reuse-instance -inverse-search '
+ \ . '"gvim --servername ' . v:servername
+ \ . ' --remote-send \"^^'
+ \ . ':drop \%f^:\%l^:normal\! zzzv^'
+ \ . ':call remote_foreground('''.v:servername.''')^\""'
+
+< The above approach inspired by remoteOpen.vim from LaTeX-suite. The naive
+ try, >
+
+ ..\ "gvim +\%l \%f"
+
+< changes the current work dir to the dir of the viewer (see
+ http://vim.1045645.n5.nabble.com/autochdir-td1140014.html) and produces
+ a lot of error messages.
+
+ To enable Forward Search, that is, jumping from a position in the TeX file
+ to the PDF document, add the following mapping to your
+ ~/.vim/ftplugin/tex.vim file: >
+
+ nnoremap ':LatexView ' . '-forward-search '
+ \ . shellescape(expand('%:p')) . ' ' . line(".") . '\'
+
+< When hitting , the viewer (SumatraPDF) will open the PDF document
+ at the page corresponding to the current cursor position in the TeX
+ document.
+
+Q: How can I use xelatex instead of pdflatex for some documents only?
+
+A: Instead of putting the settings in your ~/.latexmkrc file, put them in your
+ document's working directory, in a file named latexmkrc or .latexmkrc: >
+ $pdflatex = 'xelatex %O %S'
+
+Q: How can I specify the main TeX file for a multi-file document
+
+A: There are several ways to do this:
+
+ 1. Add a comment to the first few lines of your file to specify this: >
+ %! TEX root = main.tex
+< 2. Create an empty file called 'main.tex.latexmain' in the same directory.
+
+==============================================================================
+
+TODO *latex-box-todo*
+
+- Improve TOC jumping and filter out weird characters. Deal with multiple
+ sections with the same name.
+- Fix bugs?
+
+==============================================================================
+
+vim:tw=78:ts=8:ft=help:norl:
diff --git a/vim/bundle/LaTeX-Box/ftplugin/latex-box/common.vim b/vim/bundle/LaTeX-Box/ftplugin/latex-box/common.vim
new file mode 100644
index 0000000..f463b7e
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/ftplugin/latex-box/common.vim
@@ -0,0 +1,413 @@
+" LaTeX Box common functions
+
+" Error Format {{{
+" Note: The error formats assume we're using the -file-line-error with
+" [pdf]latex.
+" Note: See |errorformat-LaTeX| for more info.
+
+" Check for options
+if !exists("g:LatexBox_show_warnings")
+ let g:LatexBox_show_warnings=1
+endif
+if !exists("g:LatexBox_ignore_warnings")
+ let g:LatexBox_ignore_warnings =
+ \['Underfull',
+ \ 'Overfull',
+ \ 'specifier changed to']
+endif
+
+" Standard error message formats
+" Note: We consider statements that starts with "!" as errors
+setlocal efm=%E!\ LaTeX\ %trror:\ %m
+setlocal efm+=%E%f:%l:\ %m
+setlocal efm+=%E!\ %m
+
+" More info for undefined control sequences
+setlocal efm+=%Z\ %m
+
+" More info for some errors
+setlocal efm+=%Cl.%l\ %m
+
+" Show or ignore warnings
+if g:LatexBox_show_warnings
+ " Parse biblatex warnings
+ setlocal efm+=%-C(biblatex)%.%#in\ t%.%#
+ setlocal efm+=%-C(biblatex)%.%#Please\ v%.%#
+ setlocal efm+=%-C(biblatex)%.%#LaTeX\ a%.%#
+ setlocal efm+=%-Z(biblatex)%m
+
+ " Parse hyperref warnings
+ setlocal efm+=%-C(hyperref)%.%#on\ input\ line\ %l.
+
+ for w in g:LatexBox_ignore_warnings
+ let warning = escape(substitute(w, '[\,]', '%\\\\&', 'g'), ' ')
+ exe 'setlocal efm+=%-G%.%#'. warning .'%.%#'
+ endfor
+ setlocal efm+=%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#
+ setlocal efm+=%+W%.%#\ at\ lines\ %l--%*\\d
+ setlocal efm+=%+WLaTeX\ %.%#Warning:\ %m
+ setlocal efm+=%+W%.%#Warning:\ %m
+else
+ setlocal efm+=%-WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#
+ setlocal efm+=%-W%.%#\ at\ lines\ %l--%*\\d
+ setlocal efm+=%-WLaTeX\ %.%#Warning:\ %m
+ setlocal efm+=%-W%.%#Warning:\ %m
+endif
+
+" Push file to file stack
+setlocal efm+=%+P**%f
+setlocal efm+=%+P**\"%f\"
+
+" Ignore unmatched lines
+setlocal efm+=%-G%.%#
+" }}}
+
+" Vim Windows {{{
+
+" Type of split, "new" for horiz. "vnew" for vert.
+if !exists('g:LatexBox_split_type')
+ let g:LatexBox_split_type = "vnew"
+endif
+
+" Length of vertical splits
+if !exists('g:LatexBox_split_length')
+ let g:LatexBox_split_length = 15
+endif
+
+" Width of horizontal splits
+if !exists('g:LatexBox_split_width')
+ let g:LatexBox_split_width = 30
+endif
+
+" Where splits appear
+if !exists('g:LatexBox_split_side')
+ let g:LatexBox_split_side = "aboveleft"
+endif
+
+" Resize when split?
+if !exists('g:LatexBox_split_resize')
+ let g:LatexBox_split_resize = 0
+endif
+
+" Toggle help info
+if !exists('g:LatexBox_toc_hidehelp')
+ let g:LatexBox_toc_hidehelp = 0
+endif
+" }}}
+
+" Filename utilities {{{
+function! LatexBox_GetMainTexFile()
+
+ " 1. check for the b:main_tex_file variable
+ if exists('b:main_tex_file') && filereadable(b:main_tex_file)
+ return b:main_tex_file
+ endif
+
+
+ " 2. scan the first few lines of the file for root = filename
+ for linenum in range(1,5)
+ let linecontents = getline(linenum)
+ if linecontents =~ 'root\s*='
+ " Remove everything but the filename
+ let b:main_tex_file = substitute(linecontents,
+ \ '.*root\s*=\s*', "", "")
+ let b:main_tex_file = substitute(b:main_tex_file, '\s*$', "", "")
+ " Prepend current directory if this isn't an absolute path
+ if b:main_tex_file !~ '^/'
+ let b:main_tex_file = expand('%:p:h') . '/' . b:main_tex_file
+ endif
+ let b:main_tex_file = fnamemodify(b:main_tex_file, ":p")
+ if b:main_tex_file !~ '\.tex$'
+ let b:main_tex_file .= '.tex'
+ endif
+ return b:main_tex_file
+ endif
+ endfor
+
+ " 3. scan current file for "\begin{document}"
+ if &filetype == 'tex' && search('\m\C\\begin\_\s*{document}', 'nw') != 0
+ return expand('%:p')
+ endif
+
+ " 4. use 'main.tex' if it exists in the same directory (and is readable)
+ let s:main_dot_tex_file=expand('%:p:h') . '/main.tex'
+ if filereadable(s:main_dot_tex_file)
+ let b:main_tex_file=s:main_dot_tex_file
+ return b:main_tex_file
+ endif
+
+ " 5. borrow the Vim-Latex-Suite method of finding it
+ if LatexBox_GetMainFileName() != expand('%:p')
+ let b:main_tex_file = LatexBox_GetMainFileName()
+ return b:main_tex_file
+ endif
+
+ " 6. prompt for file with completion
+ let b:main_tex_file = s:PromptForMainFile()
+ return b:main_tex_file
+endfunction
+
+function! s:PromptForMainFile()
+ let saved_dir = getcwd()
+ execute 'cd ' . fnameescape(expand('%:p:h'))
+
+ " Prompt for file
+ let l:file = ''
+ while !filereadable(l:file)
+ let l:file = input('main LaTeX file: ', '', 'file')
+ if l:file !~ '\.tex$'
+ let l:file .= '.tex'
+ endif
+ endwhile
+ let l:file = fnamemodify(l:file, ':p')
+
+ " Make persistent
+ let l:persistent = ''
+ while l:persistent !~ '\v^(y|n)'
+ let l:persistent = input('make choice persistent? (y, n) ')
+ if l:persistent == 'y'
+ call writefile([], l:file . '.latexmain')
+ endif
+ endwhile
+
+ execute 'cd ' . fnameescape(saved_dir)
+ return l:file
+endfunction
+
+" Return the directory of the main tex file
+function! LatexBox_GetTexRoot()
+ return fnamemodify(LatexBox_GetMainTexFile(), ':h')
+endfunction
+
+function! LatexBox_GetBuildBasename(with_dir)
+ " 1. Check for g:LatexBox_jobname
+ if exists('g:LatexBox_jobname')
+ return g:LatexBox_jobname
+ endif
+
+ " 2. Get the basename from the main tex file
+ if a:with_dir
+ return fnamemodify(LatexBox_GetMainTexFile(), ':r')
+ else
+ return fnamemodify(LatexBox_GetMainTexFile(), ':t:r')
+ endif
+endfunction
+
+function! LatexBox_GetAuxFile()
+ " 1. check for b:build_dir variable
+ if exists('b:build_dir') && isdirectory(b:build_dir)
+ return b:build_dir . '/' . LatexBox_GetBuildBasename(0) . '.aux'
+ endif
+
+ " 2. check for g:LatexBox_build_dir variable
+ if exists('g:LatexBox_build_dir') && isdirectory(g:LatexBox_build_dir)
+ return g:LatexBox_build_dir . '/' . LatexBox_GetBuildBasename(0) . '.aux'
+ endif
+
+ " 3. use the base name of main tex file
+ return LatexBox_GetBuildBasename(1) . '.aux'
+endfunction
+
+function! LatexBox_GetLogFile()
+ " 1. check for b:build_dir variable
+ if exists('b:build_dir') && isdirectory(b:build_dir)
+ return b:build_dir . '/' . LatexBox_GetBuildBasename(0) . '.log'
+ endif
+
+ " 2. check for g:LatexBox_build_dir variable
+ if exists('g:LatexBox_build_dir') && isdirectory(g:LatexBox_build_dir)
+ return g:LatexBox_build_dir . '/' . LatexBox_GetBuildBasename(0) . '.log'
+ endif
+
+ " 3. use the base name of main tex file
+ return LatexBox_GetBuildBasename(1) . '.log'
+endfunction
+
+function! LatexBox_GetOutputFile()
+ " 1. check for b:build_dir variable
+ if exists('b:build_dir') && isdirectory(b:build_dir)
+ return b:build_dir . '/' . LatexBox_GetBuildBasename(0)
+ \ . '.' . g:LatexBox_output_type
+ endif
+
+ " 2. check for g:LatexBox_build_dir variable
+ if exists('g:LatexBox_build_dir') && isdirectory(g:LatexBox_build_dir)
+ return g:LatexBox_build_dir . '/' . LatexBox_GetBuildBasename(0)
+ \ . '.' . g:LatexBox_output_type
+ endif
+
+ " 3. use the base name of main tex file
+ return LatexBox_GetBuildBasename(1) . '.' . g:LatexBox_output_type
+endfunction
+" }}}
+
+" View Output {{{
+
+" Default pdf viewer
+if !exists('g:LatexBox_viewer')
+ " On windows, 'running' a file will open it with the default program
+ let s:viewer = ''
+ if has('unix')
+ " echo -n necessary as uname -s will append \n otherwise
+ let s:uname = system('echo -n $(uname -s)')
+ if s:uname == "Darwin"
+ let s:viewer = 'open'
+ else
+ let s:viewer = 'xdg-open'
+ endif
+ endif
+ let g:LatexBox_viewer = s:viewer
+endif
+
+function! LatexBox_View(...)
+ let lvargs = join(a:000, ' ')
+ let outfile = LatexBox_GetOutputFile()
+ if !filereadable(outfile)
+ echomsg fnamemodify(outfile, ':.') . ' is not readable'
+ return
+ endif
+ let cmd = g:LatexBox_viewer . ' ' . lvargs . ' ' . shellescape(outfile)
+ if has('win32')
+ let cmd = '!start /b ' . cmd . ' >nul'
+ else
+ let cmd = '!' . cmd . ' '
+ if fnamemodify(&shell, ':t') ==# 'fish'
+ let cmd .= ' >/dev/null ^/dev/null &'
+ else
+ let cmd .= ' &>/dev/null &'
+ endif
+ endif
+ silent execute cmd
+ if !has("gui_running")
+ redraw!
+ endif
+endfunction
+
+command! -nargs=* LatexView call LatexBox_View('')
+" }}}
+
+" In Comment {{{
+
+" LatexBox_InComment([line], [col])
+" return true if inside comment
+function! LatexBox_InComment(...)
+ let line = a:0 >= 1 ? a:1 : line('.')
+ let col = a:0 >= 2 ? a:2 : col('.')
+ return synIDattr(synID(line, col, 0), "name") =~# '^texComment'
+endfunction
+" }}}
+
+" Get Current Environment {{{
+
+" LatexBox_GetCurrentEnvironment([with_pos])
+" Returns:
+" - environment
+" if with_pos is not given
+" - [envirnoment, lnum_begin, cnum_begin, lnum_end, cnum_end]
+" if with_pos is nonzero
+function! LatexBox_GetCurrentEnvironment(...)
+ if a:0 > 0
+ let with_pos = a:1
+ else
+ let with_pos = 0
+ endif
+
+ let begin_pat = '\C\\begin\_\s*{[^}]*}\|\\\@ 1 && line[cnum - 1] != '\'
+ let cnum -= 1
+ endwhile
+ call cursor(lnum, cnum)
+
+ " match begin/end pairs but skip comments
+ let flags = 'bnW'
+ if strpart(getline('.'), col('.') - 1) =~ '^\%(' . begin_pat . '\)'
+ let flags .= 'c'
+ endif
+ let [lnum1, cnum1] = searchpairpos(begin_pat, '', end_pat, flags,
+ \ 'LatexBox_InComment()')
+
+ let env = ''
+
+ if lnum1
+ let line = strpart(getline(lnum1), cnum1 - 1)
+
+ if empty(env)
+ let env = matchstr(line, '^\C\\begin\_\s*{\zs[^}]*\ze}')
+ endif
+ if empty(env)
+ let env = matchstr(line, '^\\\[')
+ endif
+ if empty(env)
+ let env = matchstr(line, '^\\(')
+ endif
+ endif
+
+ if with_pos == 1
+ let flags = 'nW'
+ if !(lnum1 == lnum && cnum1 == cnum)
+ let flags .= 'c'
+ endif
+
+ let [lnum2, cnum2] = searchpairpos(begin_pat, '', end_pat, flags,
+ \ 'LatexBox_InComment()')
+
+ call setpos('.', saved_pos)
+ return [env, lnum1, cnum1, lnum2, cnum2]
+ else
+ call setpos('.', saved_pos)
+ return env
+ endif
+endfunction
+" }}}
+
+" Tex To Tree {{{
+" stores nested braces in a tree structure
+function! LatexBox_TexToTree(str)
+ let tree = []
+ let i1 = 0
+ let i2 = -1
+ let depth = 0
+ while i2 < len(a:str)
+ let i2 = match(a:str, '[{}]', i2 + 1)
+ if i2 < 0
+ let i2 = len(a:str)
+ endif
+ if i2 >= len(a:str) || a:str[i2] == '{'
+ if depth == 0
+ let item = substitute(strpart(a:str, i1, i2 - i1),
+ \ '^\s*\|\s*$', '', 'g')
+ if !empty(item)
+ call add(tree, item)
+ endif
+ let i1 = i2 + 1
+ endif
+ let depth += 1
+ else
+ let depth -= 1
+ if depth == 0
+ call add(tree, LatexBox_TexToTree(strpart(a:str, i1, i2 - i1)))
+ let i1 = i2 + 1
+ endif
+ endif
+ endwhile
+ return tree
+endfunction
+" }}}
+
+" Tree To Tex {{{
+function! LatexBox_TreeToTex(tree)
+ if type(a:tree) == type('')
+ return a:tree
+ else
+ return '{' . join(map(a:tree, 'LatexBox_TreeToTex(v:val)'), '') . '}'
+ endif
+endfunction
+" }}}
+
+" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
diff --git a/vim/bundle/LaTeX-Box/ftplugin/latex-box/complete.vim b/vim/bundle/LaTeX-Box/ftplugin/latex-box/complete.vim
new file mode 100644
index 0000000..fae7e4e
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/ftplugin/latex-box/complete.vim
@@ -0,0 +1,932 @@
+" LaTeX Box completion
+
+setlocal omnifunc=LatexBox_Complete
+
+" Wrap {{{
+function! s:GetSID()
+ return matchstr(expand(''), '\zs\d\+_\ze.*$')
+endfunction
+let s:SID = s:GetSID()
+function! s:SIDWrap(func)
+ return s:SID . a:func
+endfunction
+" }}}
+
+" Completion {{{
+if !exists('g:LatexBox_completion_close_braces')
+ let g:LatexBox_completion_close_braces = 1
+endif
+if !exists('g:LatexBox_bibtex_wild_spaces')
+ let g:LatexBox_bibtex_wild_spaces = 1
+endif
+
+if !exists('g:LatexBox_cite_pattern')
+ let g:LatexBox_cite_pattern = '\C\\\a*cite\a*\*\?\(\[[^\]]*\]\)*\_\s*{'
+endif
+if !exists('g:LatexBox_ref_pattern')
+ let g:LatexBox_ref_pattern = '\C\\v\?\(eq\|page\|[cC]\|labelc\|name\|auto\)\?ref\*\?\_\s*{'
+endif
+
+if !exists('g:LatexBox_completion_environments')
+ let g:LatexBox_completion_environments = [
+ \ {'word': 'itemize', 'menu': 'bullet list' },
+ \ {'word': 'enumerate', 'menu': 'numbered list' },
+ \ {'word': 'description', 'menu': 'description' },
+ \ {'word': 'center', 'menu': 'centered text' },
+ \ {'word': 'figure', 'menu': 'floating figure' },
+ \ {'word': 'table', 'menu': 'floating table' },
+ \ {'word': 'equation', 'menu': 'equation (numbered)' },
+ \ {'word': 'align', 'menu': 'aligned equations (numbered)' },
+ \ {'word': 'align*', 'menu': 'aligned equations' },
+ \ {'word': 'document' },
+ \ {'word': 'abstract' },
+ \ ]
+endif
+
+if !exists('g:LatexBox_completion_commands')
+ let g:LatexBox_completion_commands = [
+ \ {'word': '\begin{' },
+ \ {'word': '\end{' },
+ \ {'word': '\item' },
+ \ {'word': '\label{' },
+ \ {'word': '\ref{' },
+ \ {'word': '\eqref{eq:' },
+ \ {'word': '\cite{' },
+ \ {'word': '\chapter{' },
+ \ {'word': '\section{' },
+ \ {'word': '\subsection{' },
+ \ {'word': '\subsubsection{' },
+ \ {'word': '\paragraph{' },
+ \ {'word': '\nonumber' },
+ \ {'word': '\bibliography' },
+ \ {'word': '\bibliographystyle' },
+ \ ]
+endif
+
+if !exists('g:LatexBox_complete_inlineMath')
+ let g:LatexBox_complete_inlineMath = 0
+endif
+
+if !exists('g:LatexBox_eq_env_patterns')
+ let g:LatexBox_eq_env_patterns = 'equation\|gather\|multiline\|align\|flalign\|alignat\|eqnarray'
+endif
+
+" }}}
+
+"LatexBox_kpsewhich {{{
+function! LatexBox_kpsewhich(file)
+ let old_dir = getcwd()
+ execute 'lcd ' . fnameescape(LatexBox_GetTexRoot())
+ let out = system('kpsewhich "' . a:file . '"')
+
+ " If kpsewhich has found something, it returns a non-empty string with a
+ " newline at the end; otherwise the string is empty
+ if len(out)
+ " Remove the trailing newline
+ let out = fnamemodify(out[:-2], ':p')
+ endif
+
+ execute 'lcd ' . fnameescape(old_dir)
+
+ return out
+endfunction
+"}}}
+
+" Omni Completion {{{
+
+let s:completion_type = ''
+
+function! LatexBox_Complete(findstart, base)
+ if a:findstart
+ " return the starting position of the word
+ let line = getline('.')
+ let pos = col('.') - 1
+ while pos > 0 && line[pos - 1] !~ '\\\|{'
+ let pos -= 1
+ endwhile
+
+ let line_start = line[:pos-1]
+ if line_start =~ '\m\C\\begin\_\s*{$'
+ let s:completion_type = 'begin'
+ elseif line_start =~ '\m\C\\end\_\s*{$'
+ let s:completion_type = 'end'
+ elseif line_start =~ '\m' . g:LatexBox_ref_pattern . '$'
+ let s:completion_type = 'ref'
+ elseif line_start =~ '\m' . g:LatexBox_cite_pattern . '$'
+ let s:completion_type = 'bib'
+ " check for multiple citations
+ let pos = col('.') - 1
+ while pos > 0 && line[pos - 1] !~ '{\|,'
+ let pos -= 1
+ endwhile
+ elseif s:LatexBox_complete_inlineMath_or_not()
+ let s:completion_type = 'inlineMath'
+ let pos = s:eq_pos
+ else
+ let s:completion_type = 'command'
+ if line[pos - 1] == '\'
+ let pos -= 1
+ endif
+ endif
+ return pos
+ else
+ " return suggestions in an array
+ let suggestions = []
+
+ if s:completion_type == 'begin'
+ " suggest known environments
+ for entry in g:LatexBox_completion_environments
+ if entry.word =~ '^' . escape(a:base, '\')
+ if g:LatexBox_completion_close_braces && !s:NextCharsMatch('^}')
+ " add trailing '}'
+ let entry = copy(entry)
+ let entry.abbr = entry.word
+ let entry.word = entry.word . '}'
+ endif
+ call add(suggestions, entry)
+ endif
+ endfor
+ elseif s:completion_type == 'end'
+ " suggest known environments
+ let env = LatexBox_GetCurrentEnvironment()
+ if env != ''
+ if g:LatexBox_completion_close_braces && !s:NextCharsMatch('^\s*[,}]')
+ call add(suggestions, {'word': env . '}', 'abbr': env})
+ else
+ call add(suggestions, env)
+ endif
+ endif
+ elseif s:completion_type == 'command'
+ " suggest known commands
+ for entry in g:LatexBox_completion_commands
+ if entry.word =~ '^' . escape(a:base, '\')
+ " do not display trailing '{'
+ if entry.word =~ '{'
+ let entry.abbr = entry.word[0:-2]
+ endif
+ call add(suggestions, entry)
+ endif
+ endfor
+ elseif s:completion_type == 'ref'
+ let suggestions = s:CompleteLabels(a:base)
+ elseif s:completion_type == 'bib'
+ " suggest BibTeX entries
+ let suggestions = LatexBox_BibComplete(a:base)
+ elseif s:completion_type == 'inlineMath'
+ let suggestions = s:LatexBox_inlineMath_completion(a:base)
+ endif
+ if !has('gui_running')
+ redraw!
+ endif
+ return suggestions
+ endif
+endfunction
+" }}}
+
+" BibTeX search {{{
+
+" find the \bibliography{...} commands
+" the optional argument is the file name to be searched
+
+function! s:FindBibData(...)
+ if a:0 == 0
+ let file = LatexBox_GetMainTexFile()
+ else
+ let file = a:1
+ endif
+
+ if !filereadable(file)
+ return []
+ endif
+ let lines = readfile(file)
+ let bibdata_list = []
+
+ "
+ " Search for added bibliographies
+ "
+ let bibliography_cmds = [
+ \ '\\bibliography',
+ \ '\\addbibresource',
+ \ '\\addglobalbib',
+ \ '\\addsectionbib',
+ \ ]
+ for cmd in bibliography_cmds
+ let filtered = filter(copy(lines),
+ \ 'v:val =~ ''\C' . cmd . '\s*{[^}]\+}''')
+ let files = map(filtered,
+ \ 'matchstr(v:val, ''\C' . cmd . '\s*{\zs[^}]\+\ze}'')')
+ for file in files
+ let bibdata_list += map(split(file, ','),
+ \ 'fnamemodify(v:val, '':r'')')
+ endfor
+ endfor
+
+ "
+ " Also search included files
+ "
+ for input in filter(lines,
+ \ 'v:val =~ ''\C\\\%(input\|include\)\s*{[^}]\+}''')
+ let bibdata_list += s:FindBibData(LatexBox_kpsewhich(
+ \ matchstr(input,
+ \ '\C\\\%(input\|include\)\s*{\zs[^}]\+\ze}')))
+ endfor
+
+ return bibdata_list
+endfunction
+
+let s:bstfile = expand(':p:h') . '/vimcomplete'
+
+function! LatexBox_BibSearch(regexp)
+ let res = []
+
+ " Find data from bib files
+ let bibdata = join(s:FindBibData(), ',')
+ if bibdata != ''
+
+ " write temporary aux file
+ let tmpbase = LatexBox_GetTexRoot() . '/_LatexBox_BibComplete'
+ let auxfile = tmpbase . '.aux'
+ let bblfile = tmpbase . '.bbl'
+ let blgfile = tmpbase . '.blg'
+
+ call writefile(['\citation{*}', '\bibstyle{' . s:bstfile . '}',
+ \ '\bibdata{' . bibdata . '}'], auxfile)
+
+ if has('win32')
+ let l:old_shellslash = &l:shellslash
+ setlocal noshellslash
+ call system('cd ' . shellescape(LatexBox_GetTexRoot()) .
+ \ ' & bibtex -terse '
+ \ . fnamemodify(auxfile, ':t') . ' >nul')
+ let &l:shellslash = l:old_shellslash
+ else
+ call system('cd ' . shellescape(LatexBox_GetTexRoot()) .
+ \ ' ; bibtex -terse '
+ \ . fnamemodify(auxfile, ':t') . ' >/dev/null')
+ endif
+
+ let lines = split(substitute(join(readfile(bblfile), "\n"),
+ \ '\n\n\@!\(\s\=\)\s*\|{\|}', '\1', 'g'), "\n")
+
+ for line in filter(lines, 'v:val =~ a:regexp')
+ let matches = matchlist(line,
+ \ '^\(.*\)||\(.*\)||\(.*\)||\(.*\)||\(.*\)')
+ if !empty(matches) && !empty(matches[1])
+ let s:type_length = max([s:type_length,
+ \ len(matches[2]) + 3])
+ call add(res, {
+ \ 'key': matches[1],
+ \ 'type': matches[2],
+ \ 'author': matches[3],
+ \ 'year': matches[4],
+ \ 'title': matches[5],
+ \ })
+ endif
+ endfor
+
+ call delete(auxfile)
+ call delete(bblfile)
+ call delete(blgfile)
+ endif
+
+ " Find data from 'thebibliography' environments
+ let lines = readfile(LatexBox_GetMainTexFile())
+ if match(lines, '\C\\begin{thebibliography}') >= 0
+ for line in filter(filter(lines, 'v:val =~ ''\C\\bibitem'''),
+ \ 'v:val =~ a:regexp')
+ let match = matchlist(line, '\\bibitem{\([^}]*\)')[1]
+ call add(res, {
+ \ 'key': match,
+ \ 'type': '',
+ \ 'author': '',
+ \ 'year': '',
+ \ 'title': match,
+ \ })
+ endfor
+ endif
+
+ return res
+endfunction
+" }}}
+
+" BibTeX completion {{{
+let s:type_length=0
+function! LatexBox_BibComplete(regexp)
+
+ " treat spaces as '.*' if needed
+ if g:LatexBox_bibtex_wild_spaces
+ "let regexp = substitute(a:regexp, '\s\+', '.*', 'g')
+ let regexp = '.*' . substitute(a:regexp, '\s\+', '\\\&.*', 'g')
+ else
+ let regexp = a:regexp
+ endif
+
+ let res = []
+ let s:type_length = 4
+ for m in LatexBox_BibSearch(regexp)
+ let type = m['type'] == '' ? '[-]' : '[' . m['type'] . '] '
+ let type = printf('%-' . s:type_length . 's', type)
+ let auth = m['author'] == '' ? '' : m['author'][:20] . ' '
+ let auth = substitute(auth, '\~', ' ', 'g')
+ let auth = substitute(auth, ',.*\ze', ' et al. ', '')
+ let year = m['year'] == '' ? '' : '(' . m['year'] . ')'
+ let w = { 'word': m['key'],
+ \ 'abbr': type . auth . year,
+ \ 'menu': m['title'] }
+
+ " close braces if needed
+ if g:LatexBox_completion_close_braces && !s:NextCharsMatch('^\s*[,}]')
+ let w.word = w.word . '}'
+ endif
+
+ call add(res, w)
+ endfor
+ return res
+endfunction
+" }}}
+
+" ExtractLabels {{{
+" Generate list of \newlabel commands in current buffer.
+"
+" Searches the current buffer for commands of the form
+" \newlabel{name}{{number}{page}.*
+" and returns list of [ name, number, page ] tuples.
+function! s:ExtractLabels()
+ call cursor(1,1)
+
+ let matches = []
+ let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
+
+ while [lblline, lblbegin] != [0,0]
+ let [nln, nameend] = searchpairpos( '{', '', '}', 'W' )
+ if nln != lblline
+ let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
+ continue
+ endif
+ let curname = strpart( getline( lblline ), lblbegin, nameend - lblbegin - 1 )
+
+ " Ignore cref entries (because they are duplicates)
+ if curname =~# "@cref$"
+ let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
+ continue
+ endif
+
+ if 0 == search( '\m{\w*{', 'ce', lblline )
+ let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
+ continue
+ endif
+
+ let numberbegin = getpos('.')[2]
+ let [nln, numberend] = searchpairpos( '{', '', '}', 'W' )
+ if nln != lblline
+ let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
+ continue
+ endif
+ let curnumber = strpart( getline( lblline ), numberbegin, numberend - numberbegin - 1 )
+
+ if 0 == search( '\m\w*{', 'ce', lblline )
+ let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
+ continue
+ endif
+
+ let pagebegin = getpos('.')[2]
+ let [nln, pageend] = searchpairpos( '{', '', '}', 'W' )
+ if nln != lblline
+ let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
+ continue
+ endif
+ let curpage = strpart( getline( lblline ), pagebegin, pageend - pagebegin - 1 )
+
+ let matches += [ [ curname, curnumber, curpage ] ]
+
+ let [lblline, lblbegin] = searchpos( '\\newlabel{', 'ecW' )
+ endwhile
+
+ return matches
+endfunction
+"}}}
+
+" ExtractInputs {{{
+" Generate list of \@input commands in current buffer.
+"
+" Searches the current buffer for \@input{file} entries and
+" returns list of all files.
+function! s:ExtractInputs()
+ call cursor(1,1)
+
+ let matches = []
+ let [inline, inbegin] = searchpos( '\\@input{', 'ecW' )
+
+ while [inline, inbegin] != [0,0]
+ let [nln, inend] = searchpairpos( '{', '', '}', 'W' )
+ if nln != inline
+ let [inline, inbegin] = searchpos( '\\@input{', 'ecW' )
+ continue
+ endif
+ let matches += [ LatexBox_kpsewhich(strpart( getline( inline ), inbegin, inend - inbegin - 1 )) ]
+
+ let [inline, inbegin] = searchpos( '\\@input{', 'ecW' )
+ endwhile
+
+ " Remove empty strings for nonexistant .aux files
+ return filter(matches, 'v:val != ""')
+endfunction
+"}}}
+
+" LabelCache {{{
+" Cache of all labels.
+"
+" LabelCache is a dictionary mapping filenames to tuples
+" [ time, labels, inputs ]
+" where
+" * time is modification time of the cache entry
+" * labels is a list like returned by ExtractLabels
+" * inputs is a list like returned by ExtractInputs
+let s:LabelCache = {}
+"}}}
+
+" GetLabelCache {{{
+" Extract labels from LabelCache and update it.
+"
+" Compares modification time of each entry in the label
+" cache and updates it, if necessary. During traversal of
+" the LabelCache, all current labels are collected and
+" returned.
+function! s:GetLabelCache(file)
+ if !filereadable(a:file)
+ return []
+ endif
+
+ if !has_key(s:LabelCache , a:file) || s:LabelCache[a:file][0] != getftime(a:file)
+ " Open file in temporary split window for label extraction.
+ let main_tex_file = LatexBox_GetMainTexFile()
+ silent execute '1sp +let\ b:main_tex_file=main_tex_file|let\ labels=s:ExtractLabels()|let\ inputs=s:ExtractInputs()|quit! ' . fnameescape(a:file)
+ let s:LabelCache[a:file] = [ getftime(a:file), labels, inputs ]
+ endif
+
+ " We need to create a copy of s:LabelCache[fid][1], otherwise all inputs'
+ " labels would be added to the current file's label cache upon each
+ " completion call, leading to duplicates/triplicates/etc. and decreased
+ " performance.
+ " Also, because we don't anything with the list besides matching copies,
+ " we can get away with a shallow copy for now.
+ let labels = copy(s:LabelCache[a:file][1])
+
+ for input in s:LabelCache[a:file][2]
+ let labels += s:GetLabelCache(input)
+ endfor
+
+ return labels
+endfunction
+"}}}
+
+" Complete Labels {{{
+function! s:CompleteLabels(regex)
+ let labels = s:GetLabelCache(LatexBox_GetAuxFile())
+
+ let matches = filter( copy(labels), 'match(v:val[0], "' . a:regex . '") != -1' )
+ if empty(matches)
+ " also try to match label and number
+ let regex_split = split(a:regex)
+ if len(regex_split) > 1
+ let base = regex_split[0]
+ let number = escape(join(regex_split[1:], ' '), '.')
+ let matches = filter( copy(labels), 'match(v:val[0], "' . base . '") != -1 && match(v:val[1], "' . number . '") != -1' )
+ endif
+ endif
+ if empty(matches)
+ " also try to match number
+ let matches = filter( copy(labels), 'match(v:val[1], "' . a:regex . '") != -1' )
+ endif
+
+ let suggestions = []
+ for m in matches
+ let entry = {'word': m[0], 'menu': printf("%7s [p. %s]", '('.m[1].')', m[2])}
+ if g:LatexBox_completion_close_braces && !s:NextCharsMatch('^\s*[,}]')
+ " add trailing '}'
+ let entry = copy(entry)
+ let entry.abbr = entry.word
+ let entry.word = entry.word . '}'
+ endif
+ call add(suggestions, entry)
+ endfor
+
+ return suggestions
+endfunction
+" }}}
+
+" Complete Inline Math Or Not {{{
+" Return 1, when cursor is in a math env:
+" 1, there is a single $ in the current line on the left of cursor
+" 2, there is an open-eq-env on/above the current line
+" (open-eq-env : \(, \[, and \begin{eq-env} )
+" Return 0, when cursor is not in a math env
+function! s:LatexBox_complete_inlineMath_or_not()
+
+ " switch of inline math completion feature
+ if g:LatexBox_complete_inlineMath == 0
+ return 0
+ endif
+
+ " env names that can't appear in an eq env
+ if !exists('s:LatexBox_doc_structure_patterns')
+ let s:LatexBox_doc_structure_patterns = '\%(' . '\\begin\s*{document}\|' .
+ \ '\\\%(chapter\|section\|subsection\|subsubsection\)\*\?\s*{' . '\)'
+ endif
+
+ if !exists('s:LatexBox_eq_env_open_patterns')
+ let s:LatexBox_eq_env_open_patterns = ['\\(','\\\[']
+ endif
+ if !exists('s:LatexBox_eq_env_close_patterns')
+ let s:LatexBox_eq_env_close_patterns = ['\\)','\\\]']
+ endif
+
+ let notcomment = '\%(\%(\\\@= 0
+ " find the end of dollar pair
+ let cursor_dollar_pair = matchend(line_start_2_cnum_saved, '\$[^$]\+\$', cursor_dollar_pair)
+ endwhile
+ " find single $ after cursor_dollar_pair
+ let cursor_single_dollar = matchend(line_start_2_cnum_saved, '\$', cursor_dollar_pair)
+
+ " if single $ is found
+ if cursor_single_dollar >= 0
+ " check whether $ is in \(...\), \[...\], or \begin{eq}...\end{eq}
+
+ " check current line,
+ " search for LatexBox_eq_env_close_patterns: \[ and \(
+ let lnum = line('.')
+ for i in range(0, (len(s:LatexBox_eq_env_open_patterns)-1))
+ call cursor(lnum_saved, cnum_saved)
+ let cnum_close = searchpos(''. s:LatexBox_eq_env_close_patterns[i].'', 'cbW', lnum_saved)[1]
+ let cnum_open = matchend(line_start_2_cnum_saved, s:LatexBox_eq_env_open_patterns[i], cnum_close)
+ if cnum_open >= 0
+ let s:eq_dollar_parenthesis_bracket_empty = ''
+ let s:eq_pos = cursor_single_dollar - 1
+ return 1
+ end
+ endfor
+
+ " check the lines above
+ " search for s:LatexBox_doc_structure_patterns, and end-of-math-env
+ let lnum -= 1
+ while lnum > 0
+ let line = getline(lnum)
+ if line =~ notcomment . '\(' . s:LatexBox_doc_structure_patterns .
+ \ '\|' . '\\end\s*{\(' . g:LatexBox_eq_env_patterns . '\)\*\?}\)'
+ " when s:LatexBox_doc_structure_patterns or g:LatexBox_eq_env_patterns
+ " are found first, complete math, leave with $ at both sides
+ let s:eq_dollar_parenthesis_bracket_empty = '$'
+ let s:eq_pos = cursor_single_dollar
+ break
+ elseif line =~ notcomment . '\\begin\s*{\(' . g:LatexBox_eq_env_patterns . '\)\*\?}'
+ " g:LatexBox_eq_env_patterns is found, complete math, remove $
+ let s:eq_dollar_parenthesis_bracket_empty = ''
+ let s:eq_pos = cursor_single_dollar - 1
+ break
+ endif
+ let lnum -= 1
+ endwhile
+
+ return 1
+ else
+ " no $ is found, then search for \( or \[ in current line
+ " 1, whether there is \(
+ call cursor(lnum_saved, cnum_saved)
+ let cnum_parenthesis_close = searchpos('\\)', 'cbW', lnum_saved)[1]
+ let cnum_parenthesis_open = matchend(line_start_2_cnum_saved, '\\(', cnum_parenthesis_close)
+ if cnum_parenthesis_open >= 0
+ let s:eq_dollar_parenthesis_bracket_empty = '\)'
+ let s:eq_pos = cnum_parenthesis_open
+ return 1
+ end
+
+ " 2, whether there is \[
+ call cursor(lnum_saved, cnum_saved)
+ let cnum_bracket_close = searchpos('\\\]', 'cbW', lnum_saved)[1]
+ let cnum_bracket_open = matchend(line_start_2_cnum_saved, '\\\[', cnum_bracket_close)
+ if cnum_bracket_open >= 0
+ let s:eq_dollar_parenthesis_bracket_empty = '\]'
+ let s:eq_pos = cnum_bracket_open
+ return 1
+ end
+
+ " not inline math completion
+ return 0
+ endif
+
+endfunction
+" }}}
+
+" Complete inline euqation{{{
+function! s:LatexBox_inlineMath_completion(regex, ...)
+
+ if a:0 == 0
+ let file = LatexBox_GetMainTexFile()
+ else
+ let file = a:1
+ endif
+
+ if empty(glob(file, 1))
+ return ''
+ endif
+
+ if empty(s:eq_dollar_parenthesis_bracket_empty)
+ let inline_pattern1 = '\$\s*\(' . escape(substitute(a:regex[1:], '^\s\+', '', ""), '\.*^') . '[^$]*\)\s*\$'
+ let inline_pattern2 = '\\(\s*\(' . escape(substitute(a:regex[1:], '^\s\+', '', ""), '\.*^') . '.*\)\s*\\)'
+ else
+ let inline_pattern1 = '\$\s*\(' . escape(substitute(a:regex, '^\s\+', '', ""), '\.*^') . '[^$]*\)\s*\$'
+ let inline_pattern2 = '\\(\s*\(' . escape(substitute(a:regex, '^\s\+', '', ""), '\.*^') . '.*\)\s*\\)'
+ endif
+
+
+ let suggestions = []
+ let line_num = 0
+ for line in readfile(file)
+ let line_num = line_num + 1
+
+ let suggestions += s:LatexBox_inlineMath_mathlist(line,inline_pattern1 , line_num) + s:LatexBox_inlineMath_mathlist( line,inline_pattern2, line_num)
+
+ " search for included files
+ let included_file = matchstr(line, '^\\@input{\zs[^}]*\ze}')
+ if included_file != ''
+ let included_file = LatexBox_kpsewhich(included_file)
+ call extend(suggestions, s:LatexBox_inlineMath_completion(a:regex, included_file))
+ endif
+ endfor
+
+ return suggestions
+endfunction
+" }}}
+
+" Search for inline maths {{{
+" search for $ ... $ and \( ... \) in each line
+function! s:LatexBox_inlineMath_mathlist(line,inline_pattern, line_num)
+ let col_start = 0
+ let suggestions = []
+ while 1
+ let matches = matchlist(a:line, a:inline_pattern, col_start)
+ if !empty(matches)
+
+ " show line number of inline math
+ let entry = {'word': matches[1], 'menu': '[' . a:line_num . ']'}
+
+ if s:eq_dollar_parenthesis_bracket_empty != ''
+ let entry = copy(entry)
+ let entry.abbr = entry.word
+ let entry.word = entry.word . s:eq_dollar_parenthesis_bracket_empty
+ endif
+ call add(suggestions, entry)
+
+ " update col_start
+ let col_start = matchend(a:line, a:inline_pattern, col_start)
+ else
+ break
+ endif
+ endwhile
+
+ return suggestions
+endfunction
+" }}}
+
+" Close Current Environment {{{
+function! s:CloseCurEnv()
+ " first, try with \left/\right pairs
+ let [lnum, cnum] = searchpairpos('\C\\left\>', '', '\C\\right\>', 'bnW', 'LatexBox_InComment()')
+ if lnum
+ let line = strpart(getline(lnum), cnum - 1)
+ let bracket = matchstr(line, '^\\left\zs\((\|\[\|\\{\||\|\.\)\ze')
+ for [open, close] in [['(', ')'], ['\[', '\]'], ['\\{', '\\}'], ['|', '|'], ['\.', '|']]
+ let bracket = substitute(bracket, open, close, 'g')
+ endfor
+ return '\right' . bracket
+ endif
+
+ " second, try with environments
+ let env = LatexBox_GetCurrentEnvironment()
+ if env == '\['
+ return '\]'
+ elseif env == '\('
+ return '\)'
+ elseif env != ''
+ return '\end{' . env . '}'
+ endif
+ return ''
+endfunction
+" }}}
+
+" Wrap Selection {{{
+function! s:WrapSelection(wrapper)
+ keepjumps normal! `>a}
+ execute 'keepjumps normal! `o\end{' . env . '}'
+ execute 'keepjumps normal! `
+ normal! gvgq
+ endif
+ else
+ execute 'keepjumps normal! `>a\end{' . env . '}'
+ execute 'keepjumps normal! `= 0
+ if a:0 == 0
+ silent execute winnr . 'wincmd w'
+ else
+ " Supplying an argument to this function causes toggling instead
+ " of jumping to the labels window
+ if g:LatexBox_split_resize
+ silent exe "set columns-=" . g:LatexBox_split_width
+ endif
+ silent execute 'bwipeout' . bufnr('LaTeX Labels')
+ endif
+ return
+ endif
+
+ " Get label suggestions
+ let regexp = input('filter labels with regexp: ', '')
+ let labels = s:CompleteLabels(regexp)
+
+ let calling_buf = bufnr('%')
+
+ " Create labels window and set local settings
+ if g:LatexBox_split_resize
+ silent exe "set columns+=" . g:LatexBox_split_width
+ endif
+ silent exe g:LatexBox_split_side g:LatexBox_split_width . 'vnew LaTeX\ Labels'
+ let b:toc = []
+ let b:toc_numbers = 1
+ let b:calling_win = bufwinnr(calling_buf)
+ setlocal filetype=latextoc
+
+ " Add label entries and jump to the closest section
+ for entry in labels
+ let number = matchstr(entry['menu'], '^\s*(\zs[^)]\+\ze)')
+ let page = matchstr(entry['menu'], '^[^)]*)\s*\[\zs[^]]\+\ze\]')
+ let e = {'file': bufname(calling_buf),
+ \ 'level': 'label',
+ \ 'number': number,
+ \ 'text': entry['abbr'],
+ \ 'page': page}
+ call add(b:toc, e)
+ if b:toc_numbers
+ call append('$', e['number'] . "\t" . e['text'])
+ else
+ call append('$', e['text'])
+ endif
+ endfor
+ if !g:LatexBox_toc_hidehelp
+ call append('$', "")
+ call append('$', "/q: close")
+ call append('$', ": jump")
+ call append('$', ": jump and close")
+ call append('$', "s: hide numbering")
+ endif
+ 0delete _
+
+ " Lock buffer
+ setlocal nomodifiable
+endfunction
+" }}}
+
+" Change Environment {{{
+function! s:ChangeEnvPrompt()
+
+ let [env, lnum, cnum, lnum2, cnum2] = LatexBox_GetCurrentEnvironment(1)
+
+ let new_env = input('change ' . env . ' for: ', '', 'customlist,' . s:SIDWrap('GetEnvironmentList'))
+ if empty(new_env)
+ return
+ endif
+
+ if new_env == '\[' || new_env == '['
+ let begin = '\['
+ let end = '\]'
+ elseif new_env == '\(' || new_env == '('
+ let begin = '\('
+ let end = '\)'
+ else
+ let l:begin = '\begin{' . new_env . '}'
+ let l:end = '\end{' . new_env . '}'
+ endif
+
+ if env == '\[' || env == '\('
+ let line = getline(lnum2)
+ let line = strpart(line, 0, cnum2 - 1) . l:end . strpart(line, cnum2 + 1)
+ call setline(lnum2, line)
+
+ let line = getline(lnum)
+ let line = strpart(line, 0, cnum - 1) . l:begin . strpart(line, cnum + 1)
+ call setline(lnum, line)
+ else
+ let line = getline(lnum2)
+ let line = strpart(line, 0, cnum2 - 1) . l:end . strpart(line, cnum2 + len(env) + 5)
+ call setline(lnum2, line)
+
+ let line = getline(lnum)
+ let line = strpart(line, 0, cnum - 1) . l:begin . strpart(line, cnum + len(env) + 7)
+ call setline(lnum, line)
+ endif
+endfunction
+
+function! s:GetEnvironmentList(lead, cmdline, pos)
+ let suggestions = []
+ for entry in g:LatexBox_completion_environments
+ let env = entry.word
+ if env =~ '^' . a:lead
+ call add(suggestions, env)
+ endif
+ endfor
+ return suggestions
+endfunction
+
+function! s:LatexToggleStarEnv()
+ let [env, lnum, cnum, lnum2, cnum2] = LatexBox_GetCurrentEnvironment(1)
+
+ if env == '\('
+ return
+ elseif env == '\['
+ let begin = '\begin{equation}'
+ let end = '\end{equation}'
+ elseif env[-1:] == '*'
+ let begin = '\begin{' . env[:-2] . '}'
+ let end = '\end{' . env[:-2] . '}'
+ else
+ let begin = '\begin{' . env . '*}'
+ let end = '\end{' . env . '*}'
+ endif
+
+ if env == '\['
+ let line = getline(lnum2)
+ let line = strpart(line, 0, cnum2 - 1) . l:end . strpart(line, cnum2 + 1)
+ call setline(lnum2, line)
+
+ let line = getline(lnum)
+ let line = strpart(line, 0, cnum - 1) . l:begin . strpart(line, cnum + 1)
+ call setline(lnum, line)
+ else
+ let line = getline(lnum2)
+ let line = strpart(line, 0, cnum2 - 1) . l:end . strpart(line, cnum2 + len(env) + 5)
+ call setline(lnum2, line)
+
+ let line = getline(lnum)
+ let line = strpart(line, 0, cnum - 1) . l:begin . strpart(line, cnum + len(env) + 7)
+ call setline(lnum, line)
+ endif
+endfunction
+" }}}
+
+" Next Charaters Match {{{
+function! s:NextCharsMatch(regex)
+ let rest_of_line = strpart(getline('.'), col('.') - 1)
+ return rest_of_line =~ a:regex
+endfunction
+" }}}
+
+" Mappings {{{
+inoremap LatexCloseCurEnv =CloseCurEnv()
+vnoremap LatexWrapSelection :call WrapSelection('')i
+vnoremap LatexEnvWrapSelection :call PromptEnvWrapSelection()
+vnoremap LatexEnvWrapFmtSelection :call PromptEnvWrapSelection(1)
+nnoremap LatexChangeEnv :call ChangeEnvPrompt()
+nnoremap LatexToggleStarEnv :call LatexToggleStarEnv()
+" }}}
+
+" Commands {{{
+command! LatexLabels call PromptLabelList()
+" }}}
+
+" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
diff --git a/vim/bundle/LaTeX-Box/ftplugin/latex-box/findmain.vim b/vim/bundle/LaTeX-Box/ftplugin/latex-box/findmain.vim
new file mode 100644
index 0000000..b9871a6
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/ftplugin/latex-box/findmain.vim
@@ -0,0 +1,62 @@
+" LatexBox_GetMainFileName: gets the name of the main file being compiled. {{{
+" Description: returns the full path name of the main file.
+" This function checks for the existence of a .latexmain file
+" which might point to the location of a "main" latex file.
+" If .latexmain exists, then return the full path name of the
+" file being pointed to by it.
+"
+" Otherwise, return the full path name of the current buffer.
+"
+" You can supply an optional "modifier" argument to the
+" function, which will optionally modify the file name before
+" returning.
+" NOTE: From version 1.6 onwards, this function always trims
+" away the .latexmain part of the file name before applying the
+" modifier argument.
+" NOTE: This function is copied from the Latex-Suite project!
+function! LatexBox_GetMainFileName(...)
+ if a:0 > 0
+ let modifier = a:1
+ else
+ let modifier = ':p'
+ endif
+
+ let s:origdir = fnameescape(getcwd())
+
+ let dirmodifier = '%:p:h'
+ let dirLast = fnameescape(expand(dirmodifier))
+ exe 'cd '.dirLast
+
+ " move up the directory tree until we find a .latexmain file.
+ " TODO: Should we be doing this recursion by default, or should there be a
+ " setting?
+ while glob('*.latexmain',1) == ''
+ let dirmodifier = dirmodifier.':h'
+ let dirNew = fnameescape(expand(dirmodifier))
+ " break from the loop if we cannot go up any further.
+ if dirNew == dirLast
+ break
+ endif
+ let dirLast = dirNew
+ exe 'cd '.dirLast
+ endwhile
+
+ let lheadfile = glob('*.latexmain',1)
+ if lheadfile != ''
+ " Remove the trailing .latexmain part of the filename... We never want
+ " that.
+ let lheadfile = fnamemodify(substitute(lheadfile, '\.latexmain$', '', ''), modifier)
+ else
+ " If we cannot find any main file, just modify the filename of the
+ " current buffer.
+ let lheadfile = expand('%'.modifier)
+ endif
+
+ exe 'cd '.s:origdir
+
+ " NOTE: The caller of this function needs to escape the file name with
+ " fnameescape() . The reason its not done here is that escaping is not
+ " safe if this file is to be used as part of an external command on
+ " certain platforms.
+ return lheadfile
+endfunction
diff --git a/vim/bundle/LaTeX-Box/ftplugin/latex-box/folding.vim b/vim/bundle/LaTeX-Box/ftplugin/latex-box/folding.vim
new file mode 100644
index 0000000..aedca8f
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/ftplugin/latex-box/folding.vim
@@ -0,0 +1,378 @@
+" Folding support for LaTeX
+
+"
+" Options
+" g:LatexBox_Folding - Turn on/off folding
+" g:LatexBox_fold_text - Turn on/off LatexBox fold text function
+" g:LatexBox_fold_preamble - Turn on/off folding of preamble
+" g:LatexBox_fold_parts - Define parts (eq. appendix, frontmatter) to fold
+" g:LatexBox_fold_sections - Define section levels to fold
+" g:LatexBox_fold_envs - Turn on/off folding of environments
+" g:LatexBox_fold_toc - Turn on/off folding of TOC
+" g:LatexBox_fold_toc_levels - Set max TOC fold level
+"
+" {{{1 Initialize options to default values.
+if !exists('g:LatexBox_Folding')
+ let g:LatexBox_Folding=0
+endif
+if !exists('g:LatexBox_fold_text')
+ let g:LatexBox_fold_text=1
+endif
+if !exists('g:LatexBox_fold_preamble')
+ let g:LatexBox_fold_preamble=1
+endif
+if !exists('g:LatexBox_fold_envs')
+ let g:LatexBox_fold_envs=1
+endif
+if !exists('g:LatexBox_fold_envs_force')
+ let g:LatexBox_fold_envs_force = []
+endif
+if !exists('g:LatexBox_fold_parts')
+ let g:LatexBox_fold_parts=[
+ \ "appendix",
+ \ "frontmatter",
+ \ "mainmatter",
+ \ "backmatter"
+ \ ]
+endif
+if !exists('g:LatexBox_fold_sections')
+ let g:LatexBox_fold_sections=[
+ \ "part",
+ \ "chapter",
+ \ "section",
+ \ "subsection",
+ \ "subsubsection"
+ \ ]
+endif
+if !exists('g:LatexBox_fold_toc')
+ let g:LatexBox_fold_toc=0
+endif
+if !exists('g:LatexBox_fold_toc_levels')
+ let g:LatexBox_fold_toc_levels=1
+endif
+if !exists('g:LatexBox_fold_automatic')
+ let g:LatexBox_fold_automatic=1
+endif
+" }}}1
+
+if g:LatexBox_Folding == 0
+ finish
+endif
+
+" {{{1 Set folding options for vim
+setl foldexpr=LatexBox_FoldLevel(v:lnum)
+if g:LatexBox_fold_text == 1
+ setl foldtext=LatexBox_FoldText()
+endif
+if g:LatexBox_fold_automatic == 1
+ setl foldmethod=expr
+
+ "
+ " The foldexpr function returns "=" for most lines, which means it can become
+ " slow for large files. The following is a hack that is based on this reply to
+ " a discussion on the Vim Developer list:
+ " http://permalink.gmane.org/gmane.editors.vim.devel/14100
+ "
+ augroup FastFold
+ autocmd!
+ autocmd InsertEnter *.tex if !&diff | setlocal foldmethod=manual | endif
+ autocmd InsertLeave *.tex if !&diff | setlocal foldmethod=expr | endif
+ augroup end
+else
+ setl foldmethod=manual
+endif
+
+function! LatexBox_FoldOnDemand()
+ setl foldmethod=expr
+ normal! zx
+ setl foldmethod=manual
+endfunction
+
+command! LatexFold call LatexBox_FoldOnDemand()
+
+" {{{1 LatexBox_FoldLevel help functions
+
+" This function parses the tex file to find the sections that are to be folded
+" and their levels, and then predefines the patterns for optimized folding.
+function! s:FoldSectionLevels()
+ " Initialize
+ let level = 1
+ let foldsections = []
+
+ " If we use two or more of the *matter commands, we need one more foldlevel
+ let nparts = 0
+ for part in g:LatexBox_fold_parts
+ let i = 1
+ while i < line("$")
+ if getline(i) =~ '^\s*\\' . part . '\>'
+ let nparts += 1
+ break
+ endif
+ let i += 1
+ endwhile
+ if nparts > 1
+ let level = 2
+ break
+ endif
+ endfor
+
+ " Combine sections and levels, but ignore unused section commands: If we
+ " don't use the part command, then chapter should have the highest
+ " level. If we don't use the chapter command, then section should be the
+ " highest level. And so on.
+ let ignore = 1
+ for part in g:LatexBox_fold_sections
+ " For each part, check if it is used in the file. We start adding the
+ " part patterns to the fold sections array whenever we find one.
+ let partpattern = '^\s*\(\\\|% Fake\)' . part . '\>'
+ if ignore
+ let i = 1
+ while i < line("$")
+ if getline(i) =~# partpattern
+ call insert(foldsections, [partpattern, level])
+ let level += 1
+ let ignore = 0
+ break
+ endif
+ let i += 1
+ endwhile
+ else
+ call insert(foldsections, [partpattern, level])
+ let level += 1
+ endif
+ endfor
+
+ return foldsections
+endfunction
+
+" {{{1 LatexBox_FoldLevel
+
+" Parse file to dynamically set the sectioning fold levels
+let b:LatexBox_FoldSections = s:FoldSectionLevels()
+
+" Optimize by predefine common patterns
+let s:notbslash = '\%(\\\@1"
+ elseif line =~# s:notcomment . s:notbslash . '\s*\\begin\s*{\s*document\s*}'
+ return "0"
+ endif
+ endif
+
+ " Fold parts (\frontmatter, \mainmatter, \backmatter, and \appendix)
+ if line =~# s:foldparts
+ return ">1"
+ endif
+
+ " Fold chapters and sections
+ for [part, level] in b:LatexBox_FoldSections
+ if line =~# part
+ return ">" . level
+ endif
+ endfor
+
+ " Never fold \end{document}
+ if line =~# '^\s*\\end{document}'
+ return 0
+ endif
+
+ " Fold environments
+ if line =~# s:envbeginpattern && line =~# s:envendpattern
+ " If the begin and end pattern are on the same line , do not fold
+ return "="
+ else
+ if line =~# s:envbeginpattern
+ if g:LatexBox_fold_envs == 1
+ return "a1"
+ else
+ let env = matchstr(line,'\\begin\*\?{\zs\w*\*\?\ze}')
+ if index(g:LatexBox_fold_envs_force, env) >= 0
+ return "a1"
+ else
+ return "="
+ endif
+ endif
+ elseif line =~# s:envendpattern
+ if g:LatexBox_fold_envs == 1
+ return "s1"
+ else
+ let env = matchstr(line,'\\end\*\?{\zs\w*\*\?\ze}')
+ if index(g:LatexBox_fold_envs_force, env) >= 0
+ return "s1"
+ else
+ return "="
+ endif
+ endif
+ endif
+ endif
+
+ " Return foldlevel of previous line
+ return "="
+endfunction
+
+" {{{1 LatexBox_FoldText help functions
+function! s:LabelEnv()
+ let i = v:foldend
+ while i >= v:foldstart
+ if getline(i) =~ '^\s*\\label'
+ return matchstr(getline(i), '^\s*\\label{\zs.*\ze}')
+ end
+ let i -= 1
+ endwhile
+ return ""
+endfunction
+
+function! s:CaptionEnv()
+ let i = v:foldend
+ while i >= v:foldstart
+ if getline(i) =~ '^\s*\\caption'
+ return matchstr(getline(i), '^\s*\\caption\(\[.*\]\)\?{\zs.\+')
+ end
+ let i -= 1
+ endwhile
+ return ""
+endfunction
+
+function! s:CaptionTable()
+ let i = v:foldstart
+ while i <= v:foldend
+ if getline(i) =~ '^\s*\\caption'
+ return matchstr(getline(i), '^\s*\\caption\(\[.*\]\)\?{\zs.\+')
+ end
+ let i += 1
+ endwhile
+ return ""
+endfunction
+
+function! s:CaptionFrame(line)
+ " Test simple variants first
+ let caption1 = matchstr(a:line,'\\begin\*\?{.*}{\zs.\+\ze}')
+ let caption2 = matchstr(a:line,'\\begin\*\?{.*}{\zs.\+')
+
+ if len(caption1) > 0
+ return caption1
+ elseif len(caption2) > 0
+ return caption2
+ else
+ let i = v:foldstart
+ while i <= v:foldend
+ if getline(i) =~ '^\s*\\frametitle'
+ return matchstr(getline(i),
+ \ '^\s*\\frametitle\(\[.*\]\)\?{\zs.\+')
+ end
+ let i += 1
+ endwhile
+
+ return ""
+ endif
+endfunction
+
+function! LatexBox_FoldText_title()
+ let line = getline(v:foldstart)
+ let title = 'Not defined'
+
+ " Preamble
+ if line =~ '\s*\\documentclass'
+ return "Preamble"
+ endif
+
+ " Parts, sections and fakesections
+ let sections = '\(\(sub\)*\(section\|paragraph\)\|part\|chapter\)'
+ let secpat1 = '^\s*\\' . sections . '\*\?\s*{'
+ let secpat2 = '^\s*\\' . sections . '\*\?\s*\['
+ if line =~ '\\frontmatter'
+ let title = "Frontmatter"
+ elseif line =~ '\\mainmatter'
+ let title = "Mainmatter"
+ elseif line =~ '\\backmatter'
+ let title = "Backmatter"
+ elseif line =~ '\\appendix'
+ let title = "Appendix"
+ elseif line =~ secpat1 . '.*}'
+ let title = matchstr(line, secpat1 . '\zs.\{-}\ze}')
+ elseif line =~ secpat1
+ let title = matchstr(line, secpat1 . '\zs.*')
+ elseif line =~ secpat2 . '.*\]'
+ let title = matchstr(line, secpat2 . '\zs.\{-}\ze\]')
+ elseif line =~ secpat2
+ let title = matchstr(line, secpat2 . '\zs.*')
+ elseif line =~ 'Fake' . sections . ':'
+ let title = matchstr(line,'Fake' . sections . ':\s*\zs.*')
+ elseif line =~ 'Fake' . sections
+ let title = matchstr(line, 'Fake' . sections)
+ endif
+
+ " Environments
+ if line =~ '\\begin'
+ " Capture environment name
+ let env = matchstr(line,'\\begin\*\?{\zs\w*\*\?\ze}')
+
+ " Set caption based on type of environment
+ if env == 'frame'
+ let label = ''
+ let caption = s:CaptionFrame(line)
+ elseif env == 'table'
+ let label = s:LabelEnv()
+ let caption = s:CaptionTable()
+ else
+ let label = s:LabelEnv()
+ let caption = s:CaptionEnv()
+ endif
+
+ " If no caption found, check for a caption comment
+ if caption == ''
+ let caption = matchstr(line,'\\begin\*\?{.*}\s*%\s*\zs.*')
+ endif
+
+ " Create title based on caption and label
+ if caption . label == ''
+ let title = env
+ elseif label == ''
+ let title = printf('%-12s%s', env . ':',
+ \ substitute(caption, '}\s*$', '',''))
+ elseif caption == ''
+ let title = printf('%-12s%56s', env, '(' . label . ')')
+ else
+ let title = printf('%-12s%-30s %21s', env . ':',
+ \ strpart(substitute(caption, '}\s*$', '',''),0,34),
+ \ '(' . label . ')')
+ endif
+ endif
+
+ return title
+endfunction
+
+" {{{1 LatexBox_FoldText
+function! LatexBox_FoldText()
+ let nlines = v:foldend - v:foldstart + 1
+ let title = strpart(LatexBox_FoldText_title(), 0, 68)
+ let level = ''
+
+ " Fold level
+ let level = strpart(repeat('-', v:foldlevel-1) . '*',0,3)
+ if v:foldlevel > 3
+ let level = strpart(level, 1) . v:foldlevel
+ endif
+ let level = printf('%-3s', level)
+
+ return printf('%-3s %-68s #%5d', level, title, nlines)
+endfunction
+
+" {{{1 Footer
+" vim:fdm=marker:ff=unix:ts=4:sw=4
diff --git a/vim/bundle/LaTeX-Box/ftplugin/latex-box/latexmk.vim b/vim/bundle/LaTeX-Box/ftplugin/latex-box/latexmk.vim
new file mode 100644
index 0000000..7cd8ac7
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/ftplugin/latex-box/latexmk.vim
@@ -0,0 +1,554 @@
+" LaTeX Box latexmk functions
+
+" Options and variables {{{
+
+if !exists('g:LatexBox_latexmk_options')
+ let g:LatexBox_latexmk_options = ''
+endif
+if !exists('g:LatexBox_latexmk_env')
+ let g:LatexBox_latexmk_env = ''
+endif
+if !exists('g:LatexBox_latexmk_async')
+ let g:LatexBox_latexmk_async = 0
+endif
+if !exists('g:LatexBox_latexmk_preview_continuously')
+ let g:LatexBox_latexmk_preview_continuously = 0
+endif
+if !exists('g:LatexBox_output_type')
+ let g:LatexBox_output_type = 'pdf'
+endif
+if !exists('g:LatexBox_autojump')
+ let g:LatexBox_autojump = 0
+endif
+if ! exists('g:LatexBox_quickfix')
+ let g:LatexBox_quickfix = 1
+endif
+if ! exists('g:LatexBox_personal_latexmkrc')
+ let g:LatexBox_personal_latexmkrc = 0
+endif
+
+" }}}
+
+" Process ID management (used for asynchronous and continuous mode) {{{
+
+" A dictionary of latexmk PID's (basename: pid)
+if !exists('g:latexmk_running_pids')
+ let g:latexmk_running_pids = {}
+endif
+
+" Set PID {{{
+function! s:LatexmkSetPID(basename, pid)
+ let g:latexmk_running_pids[a:basename] = a:pid
+endfunction
+" }}}
+
+" kill_latexmk_process {{{
+function! s:kill_latexmk_process(pid)
+ if has('win32')
+ silent execute '!taskkill /PID ' . a:pid . ' /T /F'
+ else
+ if g:LatexBox_latexmk_async
+ " vim-server mode
+ let pids = []
+ let tmpfile = tempname()
+ silent execute '!ps x -o pgid,pid > ' . tmpfile
+ for line in readfile(tmpfile)
+ let new_pid = matchstr(line, '^\s*' . a:pid . '\s\+\zs\d\+\ze')
+ if !empty(new_pid)
+ call add(pids, new_pid)
+ endif
+ endfor
+ call delete(tmpfile)
+ if !empty(pids)
+ silent execute '!kill ' . join(pids)
+ endif
+ else
+ " single background process
+ silent execute '!kill ' . a:pid
+ endif
+ endif
+ if !has('gui_running')
+ redraw!
+ endif
+endfunction
+" }}}
+
+" kill_all_latexmk_processes {{{
+function! s:kill_all_latexmk_processes()
+ for pid in values(g:latexmk_running_pids)
+ call s:kill_latexmk_process(pid)
+ endfor
+endfunction
+" }}}
+
+" }}}
+
+" Setup for vim-server {{{
+function! s:SIDWrap(func)
+ if !exists('s:SID')
+ let s:SID = matchstr(expand(''), '\zs\d\+_\ze.*$')
+ endif
+ return s:SID . a:func
+endfunction
+
+function! s:LatexmkCallback(basename, status)
+ " Only remove the pid if not in continuous mode
+ if !g:LatexBox_latexmk_preview_continuously
+ call remove(g:latexmk_running_pids, a:basename)
+ endif
+ call LatexBox_LatexErrors(a:status, a:basename)
+endfunction
+
+function! s:setup_vim_server()
+ if !exists('g:vim_program')
+
+ " attempt autodetection of vim executable
+ let g:vim_program = ''
+ if has('win32')
+ " Just drop through to the default for windows
+ else
+ if match(&shell, '\(bash\|zsh\)$') >= 0
+ let ppid = '$PPID'
+ else
+ let ppid = '$$'
+ endif
+
+ let tmpfile = tempname()
+ silent execute '!ps -o command= -p ' . ppid . ' > ' . tmpfile
+ for line in readfile(tmpfile)
+ let line = matchstr(line, '^\S\+\>')
+ if !empty(line) && executable(line)
+ let g:vim_program = line . ' -g'
+ break
+ endif
+ endfor
+ call delete(tmpfile)
+ endif
+
+ if empty(g:vim_program)
+ if has('gui_macvim')
+ let g:vim_program
+ \ = '/Applications/MacVim.app/Contents/MacOS/Vim -g'
+ else
+ let g:vim_program = v:progname
+ endif
+ endif
+ endif
+endfunction
+" }}}
+
+" Latexmk {{{
+
+function! LatexBox_Latexmk(force)
+ " Define often used names
+ let basepath = LatexBox_GetBuildBasename(1)
+ let basename = fnamemodify(basepath, ':t')
+ let texroot = shellescape(LatexBox_GetTexRoot())
+ let mainfile = fnameescape(fnamemodify(LatexBox_GetMainTexFile(), ':t'))
+
+ " Check if latexmk is installed
+ if !executable('latexmk')
+ echomsg "Error: LaTeX-Box relies on latexmk for compilation, but it" .
+ \ " is not installed!"
+ return
+ endif
+
+ " Check if already running
+ if has_key(g:latexmk_running_pids, basepath)
+ echomsg "latexmk is already running for `" . basename . "'"
+ return
+ endif
+
+ " Set wrap width in log file
+ let max_print_line = 2000
+ if has('win32')
+ let env = 'set max_print_line=' . max_print_line . ' & '
+ elseif match(&shell, '/tcsh$') >= 0
+ let env = 'setenv max_print_line ' . max_print_line . '; '
+ else
+ if fnamemodify(&shell, ':t') ==# 'fish'
+ let env = 'set max_print_line ' . max_print_line . '; and '
+ else
+ let env = 'max_print_line=' . max_print_line
+ endif
+ endif
+
+ " Set environment options
+ let env .= ' ' . g:LatexBox_latexmk_env . ' '
+
+ " Set latexmk command with options
+ if has('win32')
+ " Make sure to switch drive as well as directory
+ let cmd = 'cd /D ' . texroot . ' && '
+ else
+ if fnamemodify(&shell, ':t') ==# 'fish'
+ let cmd = 'cd ' . texroot . '; and '
+ else
+ let cmd = 'cd ' . texroot . ' && '
+ endif
+ endif
+ let cmd .= env . ' latexmk'
+ if ! g:LatexBox_personal_latexmkrc
+ let cmd .= ' -' . g:LatexBox_output_type
+ endif
+ let cmd .= ' -quiet '
+ let cmd .= g:LatexBox_latexmk_options
+ if a:force
+ let cmd .= ' -g'
+ endif
+ if g:LatexBox_latexmk_preview_continuously
+ let cmd .= ' -pvc'
+ endif
+ let cmd .= ' -e ' . shellescape('$pdflatex =~ s/ / -file-line-error /')
+ let cmd .= ' -e ' . shellescape('$latex =~ s/ / -file-line-error /')
+ if g:LatexBox_latexmk_preview_continuously
+ let cmd .= ' -e ' . shellescape('$success_cmd = $ENV{SUCCESSCMD}')
+ let cmd .= ' -e ' . shellescape('$failure_cmd = $ENV{FAILURECMD}')
+ endif
+ let cmd .= ' ' . mainfile
+
+ " Redirect output to null
+ if has('win32')
+ let cmd .= ' >nul'
+ else
+ if fnamemodify(&shell, ':t') ==# 'fish'
+ let cmd .= ' >/dev/null ^/dev/null'
+ else
+ let cmd .= ' &>/dev/null'
+ endif
+ endif
+
+ if g:LatexBox_latexmk_async
+ " Check if VIM server exists
+ if empty(v:servername)
+ echoerr "cannot run latexmk in background without a VIM server"
+ echoerr "set g:LatexBox_latexmk_async to 0 to change compiling mode"
+ return
+ endif
+
+ " Start vim server if necessary
+ call s:setup_vim_server()
+
+ let setpidfunc = s:SIDWrap('LatexmkSetPID')
+ let callbackfunc = s:SIDWrap('LatexmkCallback')
+ if has('win32')
+ let vim_program = substitute(g:vim_program,
+ \ 'gvim\.exe$', 'vim.exe', '')
+
+ " Define callback to set the pid
+ let callsetpid = setpidfunc . '(''' . basepath . ''', %CMDPID%)'
+ let vimsetpid = vim_program . ' --servername ' . v:servername
+ \ . ' --remote-expr ' . shellescape(callsetpid)
+
+ " Define callback after latexmk is finished
+ let callback = callbackfunc . '(''' . basepath . ''', %LATEXERR%)'
+ let vimcmd = vim_program . ' --servername ' . v:servername
+ \ . ' --remote-expr ' . shellescape(callback)
+ let scallback = callbackfunc . '(''' . basepath . ''', 0)'
+ let svimcmd = vim_program . ' --servername ' . v:servername
+ \ . ' --remote-expr ' . shellescape(scallback)
+ let fcallback = callbackfunc . '(''' . basepath . ''', 1)'
+ let fvimcmd = vim_program . ' --servername ' . v:servername
+ \ . ' --remote-expr ' . shellescape(fcallback)
+
+ let asyncbat = tempname() . '.bat'
+ if g:LatexBox_latexmk_preview_continuously
+ call writefile(['setlocal',
+ \ 'set T=%TEMP%\sthUnique.tmp',
+ \ 'wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") '
+ \ . 'get ParentProcessId /value | find "ParentProcessId" >%T%',
+ \ 'set /P A=<%T%',
+ \ 'set CMDPID=%A:~16% & del %T%',
+ \ vimsetpid,
+ \ 'set SUCCESSCMD='.svimcmd,
+ \ 'set FAILURECMD='.fvimcmd,
+ \ cmd,
+ \ 'endlocal'], asyncbat)
+ else
+ call writefile(['setlocal',
+ \ 'set T=%TEMP%\sthUnique.tmp',
+ \ 'wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") '
+ \ . 'get ParentProcessId /value | find "ParentProcessId" >%T%',
+ \ 'set /P A=<%T%',
+ \ 'set CMDPID=%A:~16% & del %T%',
+ \ vimsetpid,
+ \ cmd,
+ \ 'set LATEXERR=%ERRORLEVEL%',
+ \ vimcmd,
+ \ 'endlocal'], asyncbat)
+ endif
+
+ " Define command
+ let cmd = '!start /b ' . asyncbat . ' & del ' . asyncbat
+ else
+ " Define callback to set the pid
+ let callsetpid = shellescape(setpidfunc).'"(\"'.basepath.'\",$$)"'
+ let vimsetpid = g:vim_program . ' --servername ' . v:servername
+ \ . ' --remote-expr ' . callsetpid
+
+ " Define callback after latexmk is finished
+ let callback = shellescape(callbackfunc).'"(\"'.basepath.'\",$?)"'
+ let vimcmd = g:vim_program . ' --servername ' . v:servername
+ \ . ' --remote-expr ' . callback
+ let scallback = shellescape(callbackfunc).'"(\"'.basepath.'\",0)"'
+ let svimcmd = g:vim_program . ' --servername ' . v:servername
+ \ . ' --remote-expr ' . scallback
+ let fcallback = shellescape(callbackfunc).'"(\"'.basepath.'\",1)"'
+ let fvimcmd = g:vim_program . ' --servername ' . v:servername
+ \ . ' --remote-expr ' . fcallback
+
+ " Define command
+ " Note: Here we escape '%' because it may be given as a user option
+ " through g:LatexBox_latexmk_options, for instance with
+ " g:Latex..._options = "-pdflatex='pdflatex -synctex=1 \%O \%S'"
+ if g:LatexBox_latexmk_preview_continuously
+ let cmd = vimsetpid . ' ; '
+ \ . 'export SUCCESSCMD=' . shellescape(svimcmd) . ' '
+ \ . ' FAILURECMD=' . shellescape(fvimcmd) . ' ; '
+ \ . escape(cmd, '%')
+ else
+ let cmd = vimsetpid . ' ; ' . escape(cmd, '%') . ' ; ' . vimcmd
+ endif
+ let cmd = '! (' . cmd . ') >/dev/null &'
+ endif
+
+ if g:LatexBox_latexmk_preview_continuously
+ echo 'Compiling to ' . g:LatexBox_output_type
+ \ . ' with continuous preview.'
+ else
+ echo 'Compiling to ' . g:LatexBox_output_type . ' ...'
+ endif
+ silent execute cmd
+ else
+ if g:LatexBox_latexmk_preview_continuously
+ if has('win32')
+ let cmd = '!start /b cmd /s /c "' . cmd . '"'
+ else
+ let cmd = '!' . cmd . ' &'
+ endif
+ echo 'Compiling to ' . g:LatexBox_output_type . ' ...'
+ silent execute cmd
+
+ " Save PID in order to be able to kill the process when wanted.
+ if has('win32')
+ let tmpfile = tempname()
+ let pidcmd = 'cmd /c "wmic process where '
+ \ . '(CommandLine LIKE "latexmk\%'.mainfile.'\%") '
+ \ . 'get ProcessId /value | find "ProcessId" '
+ \ . '>'.tmpfile.' "'
+ silent execute '! ' . pidcmd
+ let pids = readfile(tmpfile)
+ let pid = strpart(pids[0], 10)
+ let g:latexmk_running_pids[basepath] = pid
+ else
+ let pid = substitute(system('pgrep -f "perl.*'
+ \ . mainfile . '" | head -n 1'),'\D','','')
+ let g:latexmk_running_pids[basepath] = pid
+ endif
+ else
+ " Execute command and check for errors
+ echo 'Compiling to ' . g:LatexBox_output_type . ' ... (async off!)'
+ call system(cmd)
+ call LatexBox_LatexErrors(v:shell_error)
+ endif
+ endif
+
+ " Redraw screen if necessary
+ if !has("gui_running")
+ redraw!
+ endif
+endfunction
+" }}}
+
+" LatexmkClean {{{
+function! LatexBox_LatexmkClean(cleanall)
+ " Check if latexmk is installed
+ if !executable('latexmk')
+ echomsg "Error: LaTeX-Box relies on latexmk for compilation, but it" .
+ \ " is not installed!"
+ return
+ endif
+
+ let basename = LatexBox_GetBuildBasename(1)
+
+ if has_key(g:latexmk_running_pids, basename)
+ echomsg "don't clean when latexmk is running"
+ return
+ endif
+
+ if has('win32')
+ let cmd = 'cd /D ' . shellescape(LatexBox_GetTexRoot()) . ' & '
+ else
+ let cmd = 'cd ' . shellescape(LatexBox_GetTexRoot()) . ';'
+ endif
+ if a:cleanall
+ let cmd .= 'latexmk -C '
+ else
+ let cmd .= 'latexmk -c '
+ endif
+ let cmd .= shellescape(LatexBox_GetMainTexFile())
+ if has('win32')
+ let cmd .= ' >nul'
+ else
+ let cmd .= ' >&/dev/null'
+ endif
+
+ call system(cmd)
+ if !has('gui_running')
+ redraw!
+ endif
+
+ echomsg "latexmk clean finished"
+endfunction
+" }}}
+
+" LatexErrors {{{
+function! LatexBox_LatexErrors(status, ...)
+ if a:0 >= 1
+ let log = a:1 . '.log'
+ else
+ let log = LatexBox_GetLogFile()
+ endif
+
+ cclose
+
+ " set cwd to expand error file correctly
+ let l:cwd = fnamemodify(getcwd(), ':p')
+ execute 'lcd ' . fnameescape(LatexBox_GetTexRoot())
+ try
+ if g:LatexBox_autojump
+ execute 'cfile ' . fnameescape(log)
+ else
+ execute 'cgetfile ' . fnameescape(log)
+ endif
+ finally
+ " restore cwd
+ execute 'lcd ' . fnameescape(l:cwd)
+ endtry
+
+ " Always open window if started by LatexErrors command
+ if a:status < 0
+ botright copen
+ else
+ " Only open window when an error/warning is detected
+ if g:LatexBox_quickfix >= 3
+ \ ? s:log_contains_error(log)
+ \ : g:LatexBox_quickfix > 0
+ belowright cw
+ if g:LatexBox_quickfix == 2 || g:LatexBox_quickfix == 4
+ wincmd p
+ endif
+ endif
+ redraw
+
+ " Write status message to screen
+ if a:status > 0 || len(getqflist())>1
+ if s:log_contains_error(log)
+ let l:status_msg = ' ... failed!'
+ else
+ let l:status_msg = ' ... there were warnings!'
+ endif
+ else
+ let l:status_msg = ' ... success!'
+ endif
+ echomsg 'Compiling to ' . g:LatexBox_output_type . l:status_msg
+ endif
+endfunction
+
+" Redefine uniq() for compatibility with older Vim versions (< 7.4.218)
+function! s:uniq(list)
+ if exists('*uniq')
+ return uniq(a:list)
+ elseif len(a:list) <= 1
+ return a:list
+ endif
+
+ let last_element = get(a:list,0)
+ let uniq_list = [last_element]
+
+ for i in range(1, len(a:list)-1)
+ let next_element = get(a:list, i)
+ if last_element == next_element
+ continue
+ endif
+ let last_element = next_element
+ call add(uniq_list, next_element)
+ endfor
+ return uniq_list
+endfunction
+
+function! s:log_contains_error(file)
+ let lines = readfile(a:file)
+ let lines = filter(lines, 'v:val =~ ''^.*:\d\+: ''')
+ let lines = s:uniq(map(lines, 'matchstr(v:val, ''^.*\ze:\d\+:'')'))
+ let lines = filter(lines, 'filereadable(fnameescape(v:val))')
+ return len(lines) > 0
+endfunction
+" }}}
+
+" LatexmkStatus {{{
+function! LatexBox_LatexmkStatus(detailed)
+ if a:detailed
+ if empty(g:latexmk_running_pids)
+ echo "latexmk is not running"
+ else
+ let plist = ""
+ for [basename, pid] in items(g:latexmk_running_pids)
+ if !empty(plist)
+ let plist .= '; '
+ endif
+ let plist .= fnamemodify(basename, ':t') . ':' . pid
+ endfor
+ echo "latexmk is running (" . plist . ")"
+ endif
+ else
+ let basename = LatexBox_GetBuildBasename(1)
+ if has_key(g:latexmk_running_pids, basename)
+ echo "latexmk is running"
+ else
+ echo "latexmk is not running"
+ endif
+ endif
+endfunction
+" }}}
+
+" LatexmkStop {{{
+function! LatexBox_LatexmkStop(silent)
+ if empty(g:latexmk_running_pids)
+ if !a:silent
+ let basepath = LatexBox_GetBuildBasename(1)
+ let basename = fnamemodify(basepath, ':t')
+ echoerr "latexmk is not running for `" . basename . "'"
+ endif
+ else
+ let basepath = LatexBox_GetBuildBasename(1)
+ let basename = fnamemodify(basepath, ':t')
+ if has_key(g:latexmk_running_pids, basepath)
+ call s:kill_latexmk_process(g:latexmk_running_pids[basepath])
+ call remove(g:latexmk_running_pids, basepath)
+ if !a:silent
+ echomsg "latexmk stopped for `" . basename . "'"
+ endif
+ elseif !a:silent
+ echoerr "latexmk is not running for `" . basename . "'"
+ endif
+ endif
+endfunction
+" }}}
+
+" Commands {{{
+
+command! -bang Latexmk call LatexBox_Latexmk( == "!")
+command! -bang LatexmkClean call LatexBox_LatexmkClean( == "!")
+command! -bang LatexmkStatus call LatexBox_LatexmkStatus( == "!")
+command! LatexmkStop call LatexBox_LatexmkStop(0)
+command! LatexErrors call LatexBox_LatexErrors(-1)
+
+if g:LatexBox_latexmk_async || g:LatexBox_latexmk_preview_continuously
+ autocmd BufUnload call LatexBox_LatexmkStop(1)
+ autocmd VimLeave * call kill_all_latexmk_processes()
+endif
+
+" }}}
+
+" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
diff --git a/vim/bundle/LaTeX-Box/ftplugin/latex-box/mappings.vim b/vim/bundle/LaTeX-Box/ftplugin/latex-box/mappings.vim
new file mode 100644
index 0000000..ef6b52f
--- /dev/null
+++ b/vim/bundle/LaTeX-Box/ftplugin/latex-box/mappings.vim
@@ -0,0 +1,106 @@
+" LaTeX Box mappings
+
+if exists("g:LatexBox_no_mappings")
+ finish
+endif
+
+" latexmk {{{
+noremap ll :Latexmk
+noremap lL :Latexmk!
+noremap lc :LatexmkClean
+noremap lC :LatexmkClean!
+noremap lg :LatexmkStatus
+noremap lG :LatexmkStatus!
+noremap lk :LatexmkStop
+noremap le :LatexErrors
+" }}}
+
+" View {{{
+noremap lv :LatexView
+" }}}
+
+" TOC {{{
+noremap lt :LatexTOC
+" }}}
+
+" List of labels {{{
+noremap lj :LatexLabels
+" }}}
+
+" Folding {{{
+if g:LatexBox_Folding == 1
+ noremap lf :LatexFold
+endif
+" }}}
+
+" Jump to match {{{
+if !exists('g:LatexBox_loaded_matchparen')
+ nmap % LatexBox_JumpToMatch
+ vmap % LatexBox_JumpToMatch
+ omap % LatexBox_JumpToMatch
+endif
+" }}}
+
+" Define text objects {{{
+vmap ie LatexBox_SelectCurrentEnvInner
+vmap ae LatexBox_SelectCurrentEnvOuter
+onoremap ie :normal vie
+onoremap ae :normal vae
+vmap i$ LatexBox_SelectInlineMathInner
+vmap a$ LatexBox_SelectInlineMathOuter
+onoremap i$ :normal vi$
+onoremap a$ :normal va$
+" }}}
+
+" Jump between sections {{{
+function! s:LatexBoxNextSection(type, backwards, visual)
+ " Restore visual mode if desired
+ if a:visual
+ normal! gv
+ endif
+
+ " For the [] and ][ commands we move up or down before the search
+ if a:type == 1
+ if a:backwards
+ normal! k
+ else
+ normal! j
+ endif
+ endif
+
+ " Define search pattern and do the search while preserving "/
+ let save_search = @/
+ let flags = 'W'
+ if a:backwards
+ let flags = 'b' . flags
+ endif
+ let notcomment = '\%(\%(\\\@'
+ call search(pattern, flags)
+ let @/ = save_search
+
+ " For the [] and ][ commands we move down or up after the search
+ if a:type == 1
+ if a:backwards
+ normal! j
+ else
+ normal! k
+ endif
+ endif
+endfunction
+noremap ]] :call LatexBoxNextSection(0,0,0)
+noremap ][ :call LatexBoxNextSection(1,0,0)
+noremap [] :call LatexBoxNextSection(1,1,0)
+noremap [[ :call LatexBoxNextSection(0,1,0)
+vnoremap ]] :call LatexBoxNextSection(0,0,1)
+vnoremap ][ :call