From eee44fd998bd10ae6fdc491c184e6c7f80305592 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 1 Jul 2015 20:20:55 -0400 Subject: [PATCH 001/806] Add license --- LICENSE.md | 674 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000000..9cecc1d4669 --- /dev/null +++ b/LICENSE.md @@ -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. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +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: + + {project} Copyright (C) {year} {fullname} + 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 +. From 673193d55b10ffd39d43595a81aae17f769da09c Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 1 Jul 2015 20:19:01 -0400 Subject: [PATCH 002/806] Initial Commit --- which-key.el | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 which-key.el diff --git a/which-key.el b/which-key.el new file mode 100644 index 00000000000..29c36fc56c7 --- /dev/null +++ b/which-key.el @@ -0,0 +1,125 @@ +;;; which-key.el + +;; Copyright (C) 2015 Justin Burkett + +;; Author: Justin Burkett +;; URL: http://github.com/justbur/which-key/ +;; Version: 0.1 +;; Keywords: +;; Package-Requires: ((s "1.9.0")) + +;;; Commentary: +;; +;; Rewrite of guide-key-mode. +;; + +;;; Code: + +(defvar which-key-timer nil) +(defvar which-key-idle-delay 0.5) +(defvar which-key-max-description-length 30) +(defvar which-key-description-replacement-alist nil) +(defvar which-key-key-replacement-alist + '((">". "") ("<" . "") ("left" ."←") ("right" . "→"))) + +(defvar which-key-buffer-position 'right) +(defvar which-key-buffer-width 80) + +(define-minor-mode which-key-mode + "Toggle which key mode." + :global t + :lighter " WK" + :require 'popwin + :require 's + (funcall (if which-key-mode + 'which-key/turn-on-timer + 'which-key/turn-off-timer))) + +(defsubst which-key/truncate-description (desc) + (if (> (length desc) which-key-max-description-length) + (concat (substring desc 0 which-key-max-description-length) "..") + desc)) + +(defun which-key/format-matches (key-desc-cons max-len-key max-len-desc) + (let* ((key (car key-desc-cons)) + (desc (cdr key-desc-cons)) + (group (string-match-p "^group:" desc)) + (prefix (string-match-p "^Prefix" desc)) + (desc-face (if (or prefix group) + 'font-lock-keyword-face 'font-lock-function-name-face)) + (tmp-desc (which-key/truncate-description (if group (substring desc 6) desc))) + (key-padding (s-repeat (- max-len-key (length key)) " ")) + (padded-desc (s-pad-right max-len-desc " " tmp-desc))) + (format (concat (propertize "[" 'face 'font-lock-comment-face) "%s" + (propertize "]%s" 'face 'font-lock-comment-face) + (propertize " %s" 'face desc-face)) + key key-padding padded-desc))) + +(defun which-key/replace-strings-from-alist (replacements) + "Find and replace text in buffer according to REPLACEMENTS, +which is an alist where the car of each element is the text to +replace and the cdr is the replacement text. " + (dolist (rep replacements) + (save-excursion + (while (search-forward (car rep) nil t) + (replace-match (cdr rep) nil t))))) + +(defun which-key/insert-keys (formatted-strings) + (let ((char-count 0)) + (insert + (mapconcat + (lambda (str) + (let* ((str-len (length (substring-no-properties str))) + (new-count (+ char-count str-len))) + (if (> new-count which-key-buffer-width) + (progn (setq char-count str-len) + (concat "\n" str)) + (setq char-count new-count) + str))) formatted-strings "")))) + +(defun which-key/update-buffer-and-show () + (let ((key (this-single-command-keys))) + (when (> (length key) 0) + (let ((buf (current-buffer)) + (key-str-qt (regexp-quote (key-description key))) + unformatted formatted) + (with-current-buffer (get-buffer-create "*which-key*") + (erase-buffer) + (describe-buffer-bindings buf key) + (goto-char (point-max)) + (let ((max-len-key 0) (max-len-desc 0) key-match desc-match) + (while (re-search-backward + (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" key-str-qt) + nil t) + (setq key-match (s-replace-all which-key-key-replacement-alist (match-string 1)) + desc-match (match-string 2) + max-len-key (max max-len-key (length key-match)) + max-len-desc (max max-len-desc (length desc-match))) + (cl-pushnew (cons key-match desc-match) unformatted + :test (lambda (x y) (string-equal (car x) (car y))))) + (setq max-len-desc (if (> max-len-desc which-key-max-description-length) + (+ 2 which-key-max-description-length) + max-len-desc)) + (setq formatted (mapcar (lambda (str) + (which-key/format-matches str max-len-key max-len-desc)) + unformatted))) + (erase-buffer) + (which-key/insert-keys formatted) + (goto-char (point-min)) + (which-key/replace-strings-from-alist which-key-description-replacement-alist))) + (which-key/popup-buffer)))) + +(defun which-key/popup-buffer () + (popwin:popup-buffer (get-buffer-create "*which-key*") + :position which-key-buffer-position + :noselect t + ;; :height which-key/popup-window-size) + :width which-key-buffer-width)) + +(defun which-key/turn-on-timer () + (setq which-key-timer + (run-with-idle-timer which-key-idle-delay t 'which-key/update-buffer-and-show))) + +(defun which-key/turn-off-timer () + (cancel-timer which-key-timer)) + From 74c331e5b392e604bc0ee2667b0cea68c43ac7de Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 1 Jul 2015 20:56:18 -0400 Subject: [PATCH 003/806] Remove hardcoded variables and switch popwin method Use display-buffer with popwin:special-display-config --- which-key.el | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 29c36fc56c7..92333c33522 100644 --- a/which-key.el +++ b/which-key.el @@ -22,9 +22,13 @@ (defvar which-key-key-replacement-alist '((">". "") ("<" . "") ("left" ."←") ("right" . "→"))) +(defvar which-key-buffer nil) +(defvar which-key-buffer-name "*which-key*") (defvar which-key-buffer-position 'right) (defvar which-key-buffer-width 80) +(defvar which-key-setup-p nil) + (define-minor-mode which-key-mode "Toggle which key mode." :global t @@ -32,7 +36,9 @@ :require 'popwin :require 's (funcall (if which-key-mode - 'which-key/turn-on-timer + (progn + (unless which-key-setup-p (which-key/setup)) + 'which-key/turn-on-timer) 'which-key/turn-off-timer))) (defsubst which-key/truncate-description (desc) @@ -83,7 +89,7 @@ replace and the cdr is the replacement text. " (let ((buf (current-buffer)) (key-str-qt (regexp-quote (key-description key))) unformatted formatted) - (with-current-buffer (get-buffer-create "*which-key*") + (with-current-buffer (get-buffer which-key-buffer) (erase-buffer) (describe-buffer-bindings buf key) (goto-char (point-max)) @@ -107,7 +113,16 @@ replace and the cdr is the replacement text. " (which-key/insert-keys formatted) (goto-char (point-min)) (which-key/replace-strings-from-alist which-key-description-replacement-alist))) - (which-key/popup-buffer)))) + (display-buffer which-key-buffer)))) + +(defun which-key/setup () + (setq which-key-buffer (get-buffer-create which-key-buffer-name)) + (add-to-list 'popwin:special-display-config + `(,which-key-buffer-name + :width ,which-key-buffer-width + :noselect t + :position ,which-key-buffer-position)) + (setq which-key-setup-p t)) (defun which-key/popup-buffer () (popwin:popup-buffer (get-buffer-create "*which-key*") From 96a7bb9559d3eaec730b6e84b217c3343c88aeb8 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 1 Jul 2015 21:07:09 -0400 Subject: [PATCH 004/806] Add docstrings --- which-key.el | 71 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/which-key.el b/which-key.el index 92333c33522..03620510c41 100644 --- a/which-key.el +++ b/which-key.el @@ -15,22 +15,36 @@ ;;; Code: -(defvar which-key-timer nil) -(defvar which-key-idle-delay 0.5) -(defvar which-key-max-description-length 30) -(defvar which-key-description-replacement-alist nil) +(defvar which-key-timer nil + "Internal variable to hold reference to timer.") +(defvar which-key-idle-delay 0.5 + "Delay (in seconds) for which-key buffer to popup.") +(defvar which-key-max-description-length 30 + "Truncate the description of keys to this length (adds + \"..\")") (defvar which-key-key-replacement-alist - '((">". "") ("<" . "") ("left" ."←") ("right" . "→"))) + '((">". "") ("<" . "") ("left" ."←") ("right" . "→")) + "The strings in the car of each cons cell are replaced with the + strings in the cdr for each key.") +(defvar which-key-description-replacement-alist nil + "See `which-key-key-replacement-alist'. This is a list of cons + cells for replacing the description of keys (usually the name + of the corresponding function).") -(defvar which-key-buffer nil) -(defvar which-key-buffer-name "*which-key*") -(defvar which-key-buffer-position 'right) -(defvar which-key-buffer-width 80) +(defvar which-key-buffer nil + "Internal variable to hold reference to which-key buffer.") +(defvar which-key-buffer-name "*which-key*" + "Name of which-key buffer.") +(defvar which-key-buffer-position 'right + "Position of which-key buffer") +(defvar which-key-buffer-width 80 + "Width of which-key buffer (hardcoded for now).") -(defvar which-key-setup-p nil) +(defvar which-key-setup-p nil + "Non-nil if which-key buffer has been setup") (define-minor-mode which-key-mode - "Toggle which key mode." + "Toggle which-key-mode." :global t :lighter " WK" :require 'popwin @@ -42,11 +56,15 @@ 'which-key/turn-off-timer))) (defsubst which-key/truncate-description (desc) + "Truncate key description to `which-key-max-description-length'." (if (> (length desc) which-key-max-description-length) (concat (substring desc 0 which-key-max-description-length) "..") desc)) (defun which-key/format-matches (key-desc-cons max-len-key max-len-desc) + "Turn `key-desc-cons' into formatted strings (including text +properties), and pad with spaces so that all are a uniform +length." (let* ((key (car key-desc-cons)) (desc (cdr key-desc-cons)) (group (string-match-p "^group:" desc)) @@ -71,19 +89,20 @@ replace and the cdr is the replacement text. " (replace-match (cdr rep) nil t))))) (defun which-key/insert-keys (formatted-strings) + "Insert strings into buffer breaking after `which-key-buffer-width'." (let ((char-count 0)) - (insert - (mapconcat - (lambda (str) - (let* ((str-len (length (substring-no-properties str))) - (new-count (+ char-count str-len))) - (if (> new-count which-key-buffer-width) - (progn (setq char-count str-len) - (concat "\n" str)) - (setq char-count new-count) - str))) formatted-strings "")))) + (insert (mapconcat + (lambda (str) + (let* ((str-len (length (substring-no-properties str))) + (new-count (+ char-count str-len))) + (if (> new-count which-key-buffer-width) + (progn (setq char-count str-len) + (concat "\n" str)) + (setq char-count new-count) + str))) formatted-strings "")))) (defun which-key/update-buffer-and-show () + "Fill which-key-buffer with key descriptions and reformat. Finally, show the buffer." (let ((key (this-single-command-keys))) (when (> (length key) 0) (let ((buf (current-buffer)) @@ -116,6 +135,7 @@ replace and the cdr is the replacement text. " (display-buffer which-key-buffer)))) (defun which-key/setup () + "Create buffer for which-key and add buffer to `popwin:special-display-config'" (setq which-key-buffer (get-buffer-create which-key-buffer-name)) (add-to-list 'popwin:special-display-config `(,which-key-buffer-name @@ -124,17 +144,12 @@ replace and the cdr is the replacement text. " :position ,which-key-buffer-position)) (setq which-key-setup-p t)) -(defun which-key/popup-buffer () - (popwin:popup-buffer (get-buffer-create "*which-key*") - :position which-key-buffer-position - :noselect t - ;; :height which-key/popup-window-size) - :width which-key-buffer-width)) - (defun which-key/turn-on-timer () + "Activate idle timer." (setq which-key-timer (run-with-idle-timer which-key-idle-delay t 'which-key/update-buffer-and-show))) (defun which-key/turn-off-timer () + "Deactivate idle timer." (cancel-timer which-key-timer)) From 26e5c38cb797ffc38f76d63f22ab26121cda2b63 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 1 Jul 2015 21:10:55 -0400 Subject: [PATCH 005/806] Create README.md --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000000..64c2091b999 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# emacs-which-key +Rewrite of guide-key-mode for emacs. + +It's very, very rough right now. + +Planned features: + 1. Simplify code, especially the trigger mechanism to make it less resource + intensive than guide-key. + 2. Add option to replace descriptions of keys on the fly. + 3. Switch from using popwin to window-purpose. From 3f2a289743b960055fa4b0f7af8615d2080a9495 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 1 Jul 2015 22:01:36 -0400 Subject: [PATCH 006/806] Improve choice of buffer width and height --- which-key.el | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index 03620510c41..530493f795d 100644 --- a/which-key.el +++ b/which-key.el @@ -35,10 +35,10 @@ "Internal variable to hold reference to which-key buffer.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") -(defvar which-key-buffer-position 'right +(defvar which-key-buffer-position 'bottom "Position of which-key buffer") -(defvar which-key-buffer-width 80 - "Width of which-key buffer (hardcoded for now).") +(defvar which-key-vertical-buffer-width 80 + "Width of which-key buffer .") (defvar which-key-setup-p nil "Non-nil if which-key buffer has been setup") @@ -88,18 +88,22 @@ replace and the cdr is the replacement text. " (while (search-forward (car rep) nil t) (replace-match (cdr rep) nil t))))) -(defun which-key/insert-keys (formatted-strings) +(defun which-key/insert-keys (formatted-strings bottom-or-top) "Insert strings into buffer breaking after `which-key-buffer-width'." - (let ((char-count 0)) + (let ((char-count 0) + (line-breaks 0) + (width (if bottom-or-top (frame-width) which-key-vertical-buffer-width))) (insert (mapconcat (lambda (str) (let* ((str-len (length (substring-no-properties str))) (new-count (+ char-count str-len))) - (if (> new-count which-key-buffer-width) + (if (> new-count width) (progn (setq char-count str-len) + (cl-incf line-breaks) (concat "\n" str)) (setq char-count new-count) - str))) formatted-strings "")))) + str))) formatted-strings "")) + line-breaks)) (defun which-key/update-buffer-and-show () "Fill which-key-buffer with key descriptions and reformat. Finally, show the buffer." @@ -107,7 +111,8 @@ replace and the cdr is the replacement text. " (when (> (length key) 0) (let ((buf (current-buffer)) (key-str-qt (regexp-quote (key-description key))) - unformatted formatted) + (bottom-or-top (member which-key-buffer-position '(top bottom))) + unformatted formatted buffer-height buffer-width) (with-current-buffer (get-buffer which-key-buffer) (erase-buffer) (describe-buffer-bindings buf key) @@ -129,21 +134,27 @@ replace and the cdr is the replacement text. " (which-key/format-matches str max-len-key max-len-desc)) unformatted))) (erase-buffer) - (which-key/insert-keys formatted) + (setq buffer-line-breaks (which-key/insert-keys formatted bottom-or-top)) (goto-char (point-min)) - (which-key/replace-strings-from-alist which-key-description-replacement-alist))) - (display-buffer which-key-buffer)))) + (which-key/replace-strings-from-alist which-key-description-replacement-alist) + (if bottom-or-top + (setq buffer-height (+ 2 buffer-line-breaks)) + (setq buffer-width (* which-key-max-description-length (char-width))))) + (which-key/show-buffer buffer-height buffer-width))))) (defun which-key/setup () "Create buffer for which-key and add buffer to `popwin:special-display-config'" (setq which-key-buffer (get-buffer-create which-key-buffer-name)) - (add-to-list 'popwin:special-display-config - `(,which-key-buffer-name - :width ,which-key-buffer-width - :noselect t - :position ,which-key-buffer-position)) (setq which-key-setup-p t)) +(defun which-key/show-buffer (height width) + ;; (message "w: %s h: %s" width height) + (popwin:popup-buffer which-key-buffer-name + :width width + :height height + :noselect t + :position which-key-buffer-position)) + (defun which-key/turn-on-timer () "Activate idle timer." (setq which-key-timer From 6812f74d942f4d486d699a0da9a7d001ba42f3e8 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 1 Jul 2015 22:31:02 -0400 Subject: [PATCH 007/806] Fix vertical buffer width I think --- which-key.el | 54 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/which-key.el b/which-key.el index 530493f795d..65a7bd00cb3 100644 --- a/which-key.el +++ b/which-key.el @@ -19,6 +19,8 @@ "Internal variable to hold reference to timer.") (defvar which-key-idle-delay 0.5 "Delay (in seconds) for which-key buffer to popup.") +(defvar which-key-close-buffer-idle-delay 5 + "Delay (in seconds) for which-key buffer to show.") (defvar which-key-max-description-length 30 "Truncate the description of keys to this length (adds \"..\")") @@ -37,7 +39,7 @@ "Name of which-key buffer.") (defvar which-key-buffer-position 'bottom "Position of which-key buffer") -(defvar which-key-vertical-buffer-width 80 +(defvar which-key-vertical-buffer-width 60 "Width of which-key buffer .") (defvar which-key-setup-p nil @@ -88,11 +90,16 @@ replace and the cdr is the replacement text. " (while (search-forward (car rep) nil t) (replace-match (cdr rep) nil t))))) -(defun which-key/insert-keys (formatted-strings bottom-or-top) +(defun which-key/get-vertical-buffer-width (max-len-key max-len-desc) + (min which-key-vertical-buffer-width (+ 3 max-len-desc max-len-key))) + +(defun which-key/insert-keys (formatted-strings vertical-buffer-width) "Insert strings into buffer breaking after `which-key-buffer-width'." (let ((char-count 0) (line-breaks 0) - (width (if bottom-or-top (frame-width) which-key-vertical-buffer-width))) + (width (if vertical-buffer-width + vertical-buffer-width + (frame-width)))) (insert (mapconcat (lambda (str) (let* ((str-len (length (substring-no-properties str))) @@ -112,34 +119,37 @@ replace and the cdr is the replacement text. " (let ((buf (current-buffer)) (key-str-qt (regexp-quote (key-description key))) (bottom-or-top (member which-key-buffer-position '(top bottom))) - unformatted formatted buffer-height buffer-width) + (max-len-key 0) (max-len-desc 0) key-match desc-match + unformatted formatted buffer-height buffer-width vertical-buffer-width) (with-current-buffer (get-buffer which-key-buffer) (erase-buffer) (describe-buffer-bindings buf key) (goto-char (point-max)) - (let ((max-len-key 0) (max-len-desc 0) key-match desc-match) - (while (re-search-backward - (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" key-str-qt) - nil t) - (setq key-match (s-replace-all which-key-key-replacement-alist (match-string 1)) - desc-match (match-string 2) - max-len-key (max max-len-key (length key-match)) - max-len-desc (max max-len-desc (length desc-match))) - (cl-pushnew (cons key-match desc-match) unformatted - :test (lambda (x y) (string-equal (car x) (car y))))) - (setq max-len-desc (if (> max-len-desc which-key-max-description-length) - (+ 2 which-key-max-description-length) - max-len-desc)) - (setq formatted (mapcar (lambda (str) - (which-key/format-matches str max-len-key max-len-desc)) - unformatted))) + (while (re-search-backward + (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" key-str-qt) + nil t) + (setq key-match (s-replace-all which-key-key-replacement-alist (match-string 1)) + desc-match (match-string 2) + max-len-key (max max-len-key (length key-match)) + max-len-desc (max max-len-desc (length desc-match))) + (cl-pushnew (cons key-match desc-match) unformatted + :test (lambda (x y) (string-equal (car x) (car y))))) + (setq max-len-desc (if (> max-len-desc which-key-max-description-length) + (+ 2 which-key-max-description-length) + max-len-desc)) + (setq formatted (mapcar (lambda (str) + (which-key/format-matches str max-len-key max-len-desc)) + unformatted)) (erase-buffer) - (setq buffer-line-breaks (which-key/insert-keys formatted bottom-or-top)) + (setq vertical-buffer-width (which-key/get-vertical-buffer-width max-len-desc max-len-key)) + (setq buffer-line-breaks + (which-key/insert-keys formatted (unless bottom-or-top vertical-buffer-width))) (goto-char (point-min)) (which-key/replace-strings-from-alist which-key-description-replacement-alist) + ;; (message "%s" which-key-vertical-buffer-width) (if bottom-or-top (setq buffer-height (+ 2 buffer-line-breaks)) - (setq buffer-width (* which-key-max-description-length (char-width))))) + (setq buffer-width vertical-buffer-width))) (which-key/show-buffer buffer-height buffer-width))))) (defun which-key/setup () From 152ee1967b76c8e3d87dd2583e5bef33288c5549 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 1 Jul 2015 22:41:22 -0400 Subject: [PATCH 008/806] Add option to force buffer closed after certain amount of time --- which-key.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 65a7bd00cb3..362491425ad 100644 --- a/which-key.el +++ b/which-key.el @@ -20,7 +20,7 @@ (defvar which-key-idle-delay 0.5 "Delay (in seconds) for which-key buffer to popup.") (defvar which-key-close-buffer-idle-delay 5 - "Delay (in seconds) for which-key buffer to show.") + "Delay (in seconds) after which buffer is forced closed.") (defvar which-key-max-description-length 30 "Truncate the description of keys to this length (adds \"..\")") @@ -150,7 +150,8 @@ replace and the cdr is the replacement text. " (if bottom-or-top (setq buffer-height (+ 2 buffer-line-breaks)) (setq buffer-width vertical-buffer-width))) - (which-key/show-buffer buffer-height buffer-width))))) + (which-key/show-buffer buffer-height buffer-width) + (run-at-time which-key-close-buffer-idle-delay nil 'which-key/hide-buffer))))) (defun which-key/setup () "Create buffer for which-key and add buffer to `popwin:special-display-config'" @@ -165,6 +166,11 @@ replace and the cdr is the replacement text. " :noselect t :position which-key-buffer-position)) +(defun which-key/hide-buffer () + "Like it says :\)" + (when (eq popwin:popup-buffer (get-buffer which-key-buffer)) + (popwin:close-popup-window))) + (defun which-key/turn-on-timer () "Activate idle timer." (setq which-key-timer From 24b665c59af8dcf8ba1bbab54108fc3c5535d7a5 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 1 Jul 2015 22:42:42 -0400 Subject: [PATCH 009/806] Less rough now --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 64c2091b999..6f77947c0d8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # emacs-which-key Rewrite of guide-key-mode for emacs. -It's very, very rough right now. +It's very rough right now. Planned features: 1. Simplify code, especially the trigger mechanism to make it less resource From 8ce8558de8227b292d40d096e088b3f9abdb9b49 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 08:01:23 -0400 Subject: [PATCH 010/806] Cleanup --- which-key.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 362491425ad..c93340891b9 100644 --- a/which-key.el +++ b/which-key.el @@ -154,12 +154,11 @@ replace and the cdr is the replacement text. " (run-at-time which-key-close-buffer-idle-delay nil 'which-key/hide-buffer))))) (defun which-key/setup () - "Create buffer for which-key and add buffer to `popwin:special-display-config'" + "Create buffer for which-key." (setq which-key-buffer (get-buffer-create which-key-buffer-name)) (setq which-key-setup-p t)) (defun which-key/show-buffer (height width) - ;; (message "w: %s h: %s" width height) (popwin:popup-buffer which-key-buffer-name :width width :height height From cc95f9125f083df984143a442724ea4ac0eb092f Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 08:27:29 -0400 Subject: [PATCH 011/806] Reorganize main update function --- which-key.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index c93340891b9..b3ca76f5232 100644 --- a/which-key.el +++ b/which-key.el @@ -121,8 +121,8 @@ replace and the cdr is the replacement text. " (bottom-or-top (member which-key-buffer-position '(top bottom))) (max-len-key 0) (max-len-desc 0) key-match desc-match unformatted formatted buffer-height buffer-width vertical-buffer-width) - (with-current-buffer (get-buffer which-key-buffer) - (erase-buffer) + ;; get keybindings + (with-temp-buffer (describe-buffer-bindings buf key) (goto-char (point-max)) (while (re-search-backward @@ -135,18 +135,18 @@ replace and the cdr is the replacement text. " (cl-pushnew (cons key-match desc-match) unformatted :test (lambda (x y) (string-equal (car x) (car y))))) (setq max-len-desc (if (> max-len-desc which-key-max-description-length) - (+ 2 which-key-max-description-length) + (+ 2 which-key-max-description-length) ; for the .. max-len-desc)) (setq formatted (mapcar (lambda (str) (which-key/format-matches str max-len-key max-len-desc)) - unformatted)) + unformatted))) + (with-current-buffer (get-buffer which-key-buffer) (erase-buffer) (setq vertical-buffer-width (which-key/get-vertical-buffer-width max-len-desc max-len-key)) (setq buffer-line-breaks (which-key/insert-keys formatted (unless bottom-or-top vertical-buffer-width))) (goto-char (point-min)) (which-key/replace-strings-from-alist which-key-description-replacement-alist) - ;; (message "%s" which-key-vertical-buffer-width) (if bottom-or-top (setq buffer-height (+ 2 buffer-line-breaks)) (setq buffer-width vertical-buffer-width))) From 56bc8983e77f3ce0a30c69b012fbc96971dbed74 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 08:36:54 -0400 Subject: [PATCH 012/806] Make internal variables stand out --- which-key.el | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index b3ca76f5232..56e4a3ed322 100644 --- a/which-key.el +++ b/which-key.el @@ -15,11 +15,9 @@ ;;; Code: -(defvar which-key-timer nil - "Internal variable to hold reference to timer.") -(defvar which-key-idle-delay 0.5 +(defvar which-key-idle-delay 0.6 "Delay (in seconds) for which-key buffer to popup.") -(defvar which-key-close-buffer-idle-delay 5 +(defvar which-key-close-buffer-idle-delay 4 "Delay (in seconds) after which buffer is forced closed.") (defvar which-key-max-description-length 30 "Truncate the description of keys to this length (adds @@ -32,9 +30,6 @@ "See `which-key-key-replacement-alist'. This is a list of cons cells for replacing the description of keys (usually the name of the corresponding function).") - -(defvar which-key-buffer nil - "Internal variable to hold reference to which-key buffer.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-buffer-position 'bottom @@ -42,8 +37,13 @@ (defvar which-key-vertical-buffer-width 60 "Width of which-key buffer .") -(defvar which-key-setup-p nil - "Non-nil if which-key buffer has been setup") +;; Internal Vars +(defvar which-key--buffer nil + "Internal: Holds reference to which-key buffer.") +(defvar which-key--timer nil + "Internal: Holds reference to timer.") +(defvar which-key--setup-p nil + "Internal: Non-nil if which-key buffer has been setup") (define-minor-mode which-key-mode "Toggle which-key-mode." @@ -113,7 +113,7 @@ replace and the cdr is the replacement text. " line-breaks)) (defun which-key/update-buffer-and-show () - "Fill which-key-buffer with key descriptions and reformat. Finally, show the buffer." + "Fill which-key--buffer with key descriptions and reformat. Finally, show the buffer." (let ((key (this-single-command-keys))) (when (> (length key) 0) (let ((buf (current-buffer)) @@ -140,7 +140,7 @@ replace and the cdr is the replacement text. " (setq formatted (mapcar (lambda (str) (which-key/format-matches str max-len-key max-len-desc)) unformatted))) - (with-current-buffer (get-buffer which-key-buffer) + (with-current-buffer (get-buffer which-key--buffer) (erase-buffer) (setq vertical-buffer-width (which-key/get-vertical-buffer-width max-len-desc max-len-key)) (setq buffer-line-breaks @@ -155,7 +155,7 @@ replace and the cdr is the replacement text. " (defun which-key/setup () "Create buffer for which-key." - (setq which-key-buffer (get-buffer-create which-key-buffer-name)) + (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (setq which-key-setup-p t)) (defun which-key/show-buffer (height width) @@ -167,15 +167,15 @@ replace and the cdr is the replacement text. " (defun which-key/hide-buffer () "Like it says :\)" - (when (eq popwin:popup-buffer (get-buffer which-key-buffer)) + (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) (popwin:close-popup-window))) (defun which-key/turn-on-timer () "Activate idle timer." - (setq which-key-timer + (setq which-key--timer (run-with-idle-timer which-key-idle-delay t 'which-key/update-buffer-and-show))) (defun which-key/turn-off-timer () "Deactivate idle timer." - (cancel-timer which-key-timer)) + (cancel-timer which-key--timer)) From e2f76653de61f174202776ea18b835a8dbdcab31 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 08:55:14 -0400 Subject: [PATCH 013/806] Fix variable names --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 56e4a3ed322..0588d170086 100644 --- a/which-key.el +++ b/which-key.el @@ -53,7 +53,7 @@ :require 's (funcall (if which-key-mode (progn - (unless which-key-setup-p (which-key/setup)) + (unless which-key--setup-p (which-key/setup)) 'which-key/turn-on-timer) 'which-key/turn-off-timer))) @@ -77,7 +77,7 @@ length." (key-padding (s-repeat (- max-len-key (length key)) " ")) (padded-desc (s-pad-right max-len-desc " " tmp-desc))) (format (concat (propertize "[" 'face 'font-lock-comment-face) "%s" - (propertize "]%s" 'face 'font-lock-comment-face) + (propertize "]" 'face 'font-lock-comment-face) "%s" (propertize " %s" 'face desc-face)) key key-padding padded-desc))) @@ -156,7 +156,7 @@ replace and the cdr is the replacement text. " (defun which-key/setup () "Create buffer for which-key." (setq which-key--buffer (get-buffer-create which-key-buffer-name)) - (setq which-key-setup-p t)) + (setq which-key--setup-p t)) (defun which-key/show-buffer (height width) (popwin:popup-buffer which-key-buffer-name From a9c54a458afb5cbb150c441f5ef489d617f1f5e0 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 09:19:48 -0400 Subject: [PATCH 014/806] Add provide line --- which-key.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/which-key.el b/which-key.el index 0588d170086..968a52c7a24 100644 --- a/which-key.el +++ b/which-key.el @@ -179,3 +179,5 @@ replace and the cdr is the replacement text. " "Deactivate idle timer." (cancel-timer which-key--timer)) +(provide 'which-key) + From 04708f29d836a6621138b12ee300ddbaab13d346 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 11:41:59 -0400 Subject: [PATCH 015/806] Start working on MELPA requirements --- which-key.el | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 968a52c7a24..bec94a768e9 100644 --- a/which-key.el +++ b/which-key.el @@ -3,14 +3,20 @@ ;; Copyright (C) 2015 Justin Burkett ;; Author: Justin Burkett -;; URL: http://github.com/justbur/which-key/ +;; URL: https://github.com/justbur/which-key/ ;; Version: 0.1 ;; Keywords: -;; Package-Requires: ((s "1.9.0")) +;; Package-Requires: ((s "1.9.0") (popwin "1.0.0")) ;;; Commentary: ;; -;; Rewrite of guide-key-mode. +;; This is a rewrite of guide-key https://github.com/kai2nenobu/guide-key +;; with the following goals: +;; +;; 1. Remove polling function for performance reasons +;; 2. Try to simplify code as much as possible +;; 3. Switch away from using popwin (planned) +;; 4. Add replacement strings to create "aliases" for functions. ;; ;;; Code: @@ -181,3 +187,4 @@ replace and the cdr is the replacement text. " (provide 'which-key) +;;; which-key.el ends here From 94d5fd571c50f59938f114f52e4c43e3263b3932 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 18:14:04 -0400 Subject: [PATCH 016/806] Switch from popwin to display-buffer --- which-key.el | 106 ++++++++++++++++++++++++++++----------------------- 1 file changed, 59 insertions(+), 47 deletions(-) diff --git a/which-key.el b/which-key.el index bec94a768e9..b59b1a74c70 100644 --- a/which-key.el +++ b/which-key.el @@ -6,7 +6,7 @@ ;; URL: https://github.com/justbur/which-key/ ;; Version: 0.1 ;; Keywords: -;; Package-Requires: ((s "1.9.0") (popwin "1.0.0")) +;; Package-Requires: ((s "1.9.0")) ;;; Commentary: ;; @@ -46,6 +46,8 @@ ;; Internal Vars (defvar which-key--buffer nil "Internal: Holds reference to which-key buffer.") +(defvar which-key--window nil + "Internal: Holds reference to which-key window.") (defvar which-key--timer nil "Internal: Holds reference to timer.") (defvar which-key--setup-p nil @@ -55,7 +57,7 @@ "Toggle which-key-mode." :global t :lighter " WK" - :require 'popwin + ;; :require 'popwin :require 's (funcall (if which-key-mode (progn @@ -119,62 +121,72 @@ replace and the cdr is the replacement text. " line-breaks)) (defun which-key/update-buffer-and-show () - "Fill which-key--buffer with key descriptions and reformat. Finally, show the buffer." + "Fill which-key--buffer with key descriptions and reformat. +Finally, show the buffer." (let ((key (this-single-command-keys))) - (when (> (length key) 0) - (let ((buf (current-buffer)) - (key-str-qt (regexp-quote (key-description key))) - (bottom-or-top (member which-key-buffer-position '(top bottom))) - (max-len-key 0) (max-len-desc 0) key-match desc-match - unformatted formatted buffer-height buffer-width vertical-buffer-width) - ;; get keybindings - (with-temp-buffer - (describe-buffer-bindings buf key) - (goto-char (point-max)) - (while (re-search-backward - (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" key-str-qt) - nil t) - (setq key-match (s-replace-all which-key-key-replacement-alist (match-string 1)) - desc-match (match-string 2) - max-len-key (max max-len-key (length key-match)) - max-len-desc (max max-len-desc (length desc-match))) - (cl-pushnew (cons key-match desc-match) unformatted - :test (lambda (x y) (string-equal (car x) (car y))))) - (setq max-len-desc (if (> max-len-desc which-key-max-description-length) - (+ 2 which-key-max-description-length) ; for the .. - max-len-desc)) - (setq formatted (mapcar (lambda (str) - (which-key/format-matches str max-len-key max-len-desc)) - unformatted))) - (with-current-buffer (get-buffer which-key--buffer) - (erase-buffer) - (setq vertical-buffer-width (which-key/get-vertical-buffer-width max-len-desc max-len-key)) - (setq buffer-line-breaks - (which-key/insert-keys formatted (unless bottom-or-top vertical-buffer-width))) - (goto-char (point-min)) - (which-key/replace-strings-from-alist which-key-description-replacement-alist) - (if bottom-or-top - (setq buffer-height (+ 2 buffer-line-breaks)) - (setq buffer-width vertical-buffer-width))) - (which-key/show-buffer buffer-height buffer-width) - (run-at-time which-key-close-buffer-idle-delay nil 'which-key/hide-buffer))))) + (if (> (length key) 0) + (progn + (let ((buf (current-buffer)) + (key-str-qt (regexp-quote (key-description key))) + (bottom-or-top (member which-key-buffer-position '(top bottom))) + (max-len-key 0) (max-len-desc 0) key-match desc-match + unformatted formatted buffer-height buffer-width vertical-buffer-width) + ;; get keybindings + (with-temp-buffer + (describe-buffer-bindings buf key) + (goto-char (point-max)) + (while (re-search-backward + (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" key-str-qt) + nil t) + (setq key-match (s-replace-all which-key-key-replacement-alist (match-string 1)) + desc-match (match-string 2) + max-len-key (max max-len-key (length key-match)) + max-len-desc (max max-len-desc (length desc-match))) + (cl-pushnew (cons key-match desc-match) unformatted + :test (lambda (x y) (string-equal (car x) (car y))))) + (setq max-len-desc (if (> max-len-desc which-key-max-description-length) + (+ 2 which-key-max-description-length) ; for the .. + max-len-desc)) + (setq formatted (mapcar (lambda (str) + (which-key/format-matches str max-len-key max-len-desc)) + unformatted))) + (with-current-buffer (get-buffer which-key--buffer) + (erase-buffer) + (setq vertical-buffer-width (which-key/get-vertical-buffer-width max-len-desc max-len-key) + buffer-line-breaks + (which-key/insert-keys formatted (unless bottom-or-top vertical-buffer-width))) + (goto-char (point-min)) + (which-key/replace-strings-from-alist which-key-description-replacement-alist) + (if bottom-or-top + (setq buffer-height (+ 2 buffer-line-breaks)) + (setq buffer-width vertical-buffer-width))) + (setq which-key--window (which-key/show-buffer buffer-height buffer-width)) + (setq which-key--close-timer (run-at-time which-key-close-buffer-idle-delay nil 'which-key/hide-buffer)))) + ;; close the window + (when (window-live-p which-key--window) (which-key/hide-buffer))))) (defun which-key/setup () "Create buffer for which-key." (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (setq which-key--setup-p t)) +;; (defun which-key/show-buffer-popwin (height width) +;; (popwin:popup-buffer which-key-buffer-name +;; :width width +;; :height height +;; :noselect t +;; :position which-key-buffer-position)) + (defun which-key/show-buffer (height width) - (popwin:popup-buffer which-key-buffer-name - :width width - :height height - :noselect t - :position which-key-buffer-position)) + (setq alist (list (cons 'side which-key-buffer-position) + (when height (cons 'window-height height)) + (when width (cons 'window-width width)))) + (display-buffer "*which-key*" (cons 'display-buffer-in-side-window alist))) (defun which-key/hide-buffer () "Like it says :\)" - (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) - (popwin:close-popup-window))) + (when (window-live-p which-key--window) + (delete-window which-key--window))) (defun which-key/turn-on-timer () "Activate idle timer." From b353cd2a35d91bb5209687e1ce9e217fce34ef0a Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 19:08:15 -0400 Subject: [PATCH 017/806] Fix text replacement alist --- which-key.el | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index b59b1a74c70..d00f3c5421a 100644 --- a/which-key.el +++ b/which-key.el @@ -32,10 +32,10 @@ '((">". "") ("<" . "") ("left" ."←") ("right" . "→")) "The strings in the car of each cons cell are replaced with the strings in the cdr for each key.") -(defvar which-key-description-replacement-alist nil +(defvar which-key-general-replacement-alist nil "See `which-key-key-replacement-alist'. This is a list of cons - cells for replacing the description of keys (usually the name - of the corresponding function).") + cells for replacing any text, keys and descriptions. You can + also use elisp regexp in the car of the cells.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-buffer-position 'bottom @@ -94,9 +94,13 @@ length." which is an alist where the car of each element is the text to replace and the cdr is the replacement text. " (dolist (rep replacements) - (save-excursion - (while (search-forward (car rep) nil t) - (replace-match (cdr rep) nil t))))) + (let ((trunc-car (which-key/truncate-description (car rep))) + old-face) + (save-excursion + (while (or (search-forward (car rep) nil t) + (search-forward trunc-car nil t)) + (setq old-face (get-text-property (match-beginning 0) 'face)) + (replace-match (propertize (cdr rep) 'face old-face) nil t)))))) (defun which-key/get-vertical-buffer-width (max-len-key max-len-desc) (min which-key-vertical-buffer-width (+ 3 max-len-desc max-len-key))) @@ -152,11 +156,12 @@ Finally, show the buffer." unformatted))) (with-current-buffer (get-buffer which-key--buffer) (erase-buffer) - (setq vertical-buffer-width (which-key/get-vertical-buffer-width max-len-desc max-len-key) + (setq vertical-buffer-width + (which-key/get-vertical-buffer-width max-len-desc max-len-key) buffer-line-breaks (which-key/insert-keys formatted (unless bottom-or-top vertical-buffer-width))) (goto-char (point-min)) - (which-key/replace-strings-from-alist which-key-description-replacement-alist) + (which-key/replace-strings-from-alist which-key-general-replacement-alist) (if bottom-or-top (setq buffer-height (+ 2 buffer-line-breaks)) (setq buffer-width vertical-buffer-width))) From d57fca695d6efaaa264368f7909a134857b2e1c2 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 19:08:15 -0400 Subject: [PATCH 018/806] Fix text replacement alist Conflicts: which-key.el --- which-key.el | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index bec94a768e9..ff437e83ae8 100644 --- a/which-key.el +++ b/which-key.el @@ -32,10 +32,10 @@ '((">". "") ("<" . "") ("left" ."←") ("right" . "→")) "The strings in the car of each cons cell are replaced with the strings in the cdr for each key.") -(defvar which-key-description-replacement-alist nil +(defvar which-key-general-replacement-alist nil "See `which-key-key-replacement-alist'. This is a list of cons - cells for replacing the description of keys (usually the name - of the corresponding function).") + cells for replacing any text, keys and descriptions. You can + also use elisp regexp in the car of the cells.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-buffer-position 'bottom @@ -92,9 +92,13 @@ length." which is an alist where the car of each element is the text to replace and the cdr is the replacement text. " (dolist (rep replacements) - (save-excursion - (while (search-forward (car rep) nil t) - (replace-match (cdr rep) nil t))))) + (let ((trunc-car (which-key/truncate-description (car rep))) + old-face) + (save-excursion + (while (or (search-forward (car rep) nil t) + (search-forward trunc-car nil t)) + (setq old-face (get-text-property (match-beginning 0) 'face)) + (replace-match (propertize (cdr rep) 'face old-face) nil t)))))) (defun which-key/get-vertical-buffer-width (max-len-key max-len-desc) (min which-key-vertical-buffer-width (+ 3 max-len-desc max-len-key))) @@ -148,11 +152,12 @@ replace and the cdr is the replacement text. " unformatted))) (with-current-buffer (get-buffer which-key--buffer) (erase-buffer) - (setq vertical-buffer-width (which-key/get-vertical-buffer-width max-len-desc max-len-key)) - (setq buffer-line-breaks + (setq vertical-buffer-width + (which-key/get-vertical-buffer-width max-len-desc max-len-key) + buffer-line-breaks (which-key/insert-keys formatted (unless bottom-or-top vertical-buffer-width))) (goto-char (point-min)) - (which-key/replace-strings-from-alist which-key-description-replacement-alist) + (which-key/replace-strings-from-alist which-key-general-replacement-alist) (if bottom-or-top (setq buffer-height (+ 2 buffer-line-breaks)) (setq buffer-width vertical-buffer-width))) From 515ed1df9607c6cbd653b9b97ee04a464db59251 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 19:28:36 -0400 Subject: [PATCH 019/806] Fix close timer randomly kicking in when you take too long to decide --- which-key.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/which-key.el b/which-key.el index d00f3c5421a..968bcbce252 100644 --- a/which-key.el +++ b/which-key.el @@ -130,6 +130,8 @@ Finally, show the buffer." (let ((key (this-single-command-keys))) (if (> (length key) 0) (progn + (when which-key--close-timer (cancel-timer which-key--close-timer)) + (which-key/hide-buffer) (let ((buf (current-buffer)) (key-str-qt (regexp-quote (key-description key))) (bottom-or-top (member which-key-buffer-position '(top bottom))) From ada5cfda1cb1bbc21f67b43d4182e85282102ec1 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 20:05:01 -0400 Subject: [PATCH 020/806] Declare `which-key--close-timer' --- which-key.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/which-key.el b/which-key.el index 968bcbce252..28026641d1c 100644 --- a/which-key.el +++ b/which-key.el @@ -50,6 +50,8 @@ "Internal: Holds reference to which-key window.") (defvar which-key--timer nil "Internal: Holds reference to timer.") +(defvar which-key--close-timer nil + "Internal: Holds reference to close window timer.") (defvar which-key--setup-p nil "Internal: Non-nil if which-key buffer has been setup") From 41d0d60c3d131ef58e52213b0e86ae91c5baa7f8 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 21:28:48 -0400 Subject: [PATCH 021/806] Add option to select display-buffer function. Only 2 are implemented at the moment. --- which-key.el | 132 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 89 insertions(+), 43 deletions(-) diff --git a/which-key.el b/which-key.el index 28026641d1c..d7745ddb8fb 100644 --- a/which-key.el +++ b/which-key.el @@ -40,6 +40,13 @@ "Name of which-key buffer.") (defvar which-key-buffer-position 'bottom "Position of which-key buffer") +(defvar which-key-buffer-display-function + 'display-buffer-in-side-window + "Controls where the buffer is displayed. Current options are + the default which is also controlled by + `which-key-buffer-position', and + `display-buffer-below-selected' which displays which-key only + under the currently selected window.") (defvar which-key-vertical-buffer-width 60 "Width of which-key buffer .") @@ -55,6 +62,7 @@ (defvar which-key--setup-p nil "Internal: Non-nil if which-key buffer has been setup") + (define-minor-mode which-key-mode "Toggle which-key-mode." :global t @@ -73,23 +81,26 @@ (concat (substring desc 0 which-key-max-description-length) "..") desc)) -(defun which-key/format-matches (key-desc-cons max-len-key max-len-desc) +(defun which-key/format-matches (unformatted max-len-key max-len-desc) "Turn `key-desc-cons' into formatted strings (including text properties), and pad with spaces so that all are a uniform length." - (let* ((key (car key-desc-cons)) - (desc (cdr key-desc-cons)) - (group (string-match-p "^group:" desc)) - (prefix (string-match-p "^Prefix" desc)) - (desc-face (if (or prefix group) - 'font-lock-keyword-face 'font-lock-function-name-face)) - (tmp-desc (which-key/truncate-description (if group (substring desc 6) desc))) - (key-padding (s-repeat (- max-len-key (length key)) " ")) - (padded-desc (s-pad-right max-len-desc " " tmp-desc))) - (format (concat (propertize "[" 'face 'font-lock-comment-face) "%s" - (propertize "]" 'face 'font-lock-comment-face) "%s" - (propertize " %s" 'face desc-face)) - key key-padding padded-desc))) + (mapcar + (lambda (key-desc-cons) + (let* ((key (car key-desc-cons)) + (desc (cdr key-desc-cons)) + (group (string-match-p "^group:" desc)) + (prefix (string-match-p "^Prefix" desc)) + (desc-face (if (or prefix group) + 'font-lock-keyword-face 'font-lock-function-name-face)) + (tmp-desc (which-key/truncate-description (if group (substring desc 6) desc))) + (key-padding (s-repeat (- max-len-key (length key)) " ")) + (padded-desc (s-pad-right max-len-desc " " tmp-desc))) + (format (concat (propertize "[" 'face 'font-lock-comment-face) "%s" + (propertize "]" 'face 'font-lock-comment-face) "%s" + (propertize " %s" 'face desc-face)) + key key-padding padded-desc))) + unformatted)) (defun which-key/replace-strings-from-alist (replacements) "Find and replace text in buffer according to REPLACEMENTS, @@ -104,16 +115,45 @@ replace and the cdr is the replacement text. " (setq old-face (get-text-property (match-beginning 0) 'face)) (replace-match (propertize (cdr rep) 'face old-face) nil t)))))) -(defun which-key/get-vertical-buffer-width (max-len-key max-len-desc) - (min which-key-vertical-buffer-width (+ 3 max-len-desc max-len-key))) +(defun which-key/buffer-width (max-len-key max-len-desc sel-window-width) + (cond ((and (eq which-key-buffer-display-function 'display-buffer-in-side-window) + (member which-key-buffer-position '(left right))) + (min which-key-vertical-buffer-width (+ 3 max-len-desc max-len-key))) + ((eq which-key-buffer-display-function 'display-buffer-in-side-window) + (frame-width)) + ((eq which-key-buffer-display-function 'display-buffer-below-selected) + sel-window-width) + (t nil))) -(defun which-key/insert-keys (formatted-strings vertical-buffer-width) +(defsubst which-key/buffer-height (line-breaks) (+ 2 line-breaks)) + +;; (defun which-key/window-params-alist (max-len-key max-len-desc line-breaks selected-buf) +;; (let ((disp-func which-key-buffer-display-function) +;; (position which-key-buffer-position) +;; (selected-window (buffer-w)) +;; width height side) +;; (cond +;; ((and (eq disp-func 'display-buffer-in-side-window) +;; (member position '(left right))) +;; (setq width (which-key/vertical-buffer-width max-len-desc max-len-key) +;; height (frame-height) +;; side position)) +;; ((eq disp-func 'display-buffer-in-side-window) +;; (setq width (frame-width) +;; height (+ 2 line-breaks) +;; side position)) +;; ((eq disp-func 'display-buffer-below-selected) +;; (setq height (+ 2 line-breaks))) +;; (t (error "error: Using unsupported buffer display function"))) +;; (list (when width (cons 'window-width width)) +;; (cons 'window-height height) +;; (when side (cons 'side side))))) + +(defun which-key/insert-keys (formatted-strings buffer-width) "Insert strings into buffer breaking after `which-key-buffer-width'." (let ((char-count 0) (line-breaks 0) - (width (if vertical-buffer-width - vertical-buffer-width - (frame-width)))) + (width (if buffer-width buffer-width (frame-width)))) (insert (mapconcat (lambda (str) (let* ((str-len (length (substring-no-properties str))) @@ -134,19 +174,22 @@ Finally, show the buffer." (progn (when which-key--close-timer (cancel-timer which-key--close-timer)) (which-key/hide-buffer) - (let ((buf (current-buffer)) + (let ((buf (current-buffer)) (win-width (window-width)) (key-str-qt (regexp-quote (key-description key))) (bottom-or-top (member which-key-buffer-position '(top bottom))) - (max-len-key 0) (max-len-desc 0) key-match desc-match - unformatted formatted buffer-height buffer-width vertical-buffer-width) + (max-len-key 0) (max-len-desc 0) + key-match desc-match unformatted formatted buffer-width + line-breaks) ;; get keybindings (with-temp-buffer (describe-buffer-bindings buf key) (goto-char (point-max)) (while (re-search-backward - (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" key-str-qt) + (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" + key-str-qt) nil t) - (setq key-match (s-replace-all which-key-key-replacement-alist (match-string 1)) + (setq key-match (s-replace-all + which-key-key-replacement-alist (match-string 1)) desc-match (match-string 2) max-len-key (max max-len-key (length key-match)) max-len-desc (max max-len-desc (length desc-match))) @@ -154,23 +197,24 @@ Finally, show the buffer." :test (lambda (x y) (string-equal (car x) (car y))))) (setq max-len-desc (if (> max-len-desc which-key-max-description-length) (+ 2 which-key-max-description-length) ; for the .. - max-len-desc)) - (setq formatted (mapcar (lambda (str) - (which-key/format-matches str max-len-key max-len-desc)) - unformatted))) + max-len-desc) + formatted (which-key/format-matches + unformatted max-len-key max-len-desc))) (with-current-buffer (get-buffer which-key--buffer) (erase-buffer) - (setq vertical-buffer-width - (which-key/get-vertical-buffer-width max-len-desc max-len-key) - buffer-line-breaks - (which-key/insert-keys formatted (unless bottom-or-top vertical-buffer-width))) + (setq buffer-width (which-key/buffer-width + max-len-key max-len-desc win-width) + line-breaks (which-key/insert-keys + formatted buffer-width)) (goto-char (point-min)) - (which-key/replace-strings-from-alist which-key-general-replacement-alist) - (if bottom-or-top - (setq buffer-height (+ 2 buffer-line-breaks)) - (setq buffer-width vertical-buffer-width))) - (setq which-key--window (which-key/show-buffer buffer-height buffer-width)) - (setq which-key--close-timer (run-at-time which-key-close-buffer-idle-delay nil 'which-key/hide-buffer)))) + (which-key/replace-strings-from-alist + which-key-general-replacement-alist)) + (setq which-key--window (which-key/show-buffer + (which-key/buffer-height line-breaks) + buffer-width)) + (setq which-key--close-timer (run-at-time + which-key-close-buffer-idle-delay + nil 'which-key/hide-buffer)))) ;; close the window (when (window-live-p which-key--window) (which-key/hide-buffer))))) @@ -187,10 +231,12 @@ Finally, show the buffer." ;; :position which-key-buffer-position)) (defun which-key/show-buffer (height width) - (setq alist (list (cons 'side which-key-buffer-position) - (when height (cons 'window-height height)) - (when width (cons 'window-width width)))) - (display-buffer "*which-key*" (cons 'display-buffer-in-side-window alist))) + (let ((side which-key-buffer-position) alist) + (setq alist (list (when side (cons 'side side)) + (when height (cons 'window-height height)) + (when width (cons 'window-width width)))) + (message "h: %s w: %s s: %s" height width side) + (display-buffer "*which-key*" (cons which-key-buffer-display-function alist)))) (defun which-key/hide-buffer () "Like it says :\)" From 5614be0e7d3df3bbc9870b9c81be125ebf22ad18 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 2 Jul 2015 21:33:35 -0400 Subject: [PATCH 022/806] Remove commented funcs and messages --- which-key.el | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/which-key.el b/which-key.el index d7745ddb8fb..95a5f76f9b6 100644 --- a/which-key.el +++ b/which-key.el @@ -67,7 +67,6 @@ "Toggle which-key-mode." :global t :lighter " WK" - ;; :require 'popwin :require 's (funcall (if which-key-mode (progn @@ -127,28 +126,6 @@ replace and the cdr is the replacement text. " (defsubst which-key/buffer-height (line-breaks) (+ 2 line-breaks)) -;; (defun which-key/window-params-alist (max-len-key max-len-desc line-breaks selected-buf) -;; (let ((disp-func which-key-buffer-display-function) -;; (position which-key-buffer-position) -;; (selected-window (buffer-w)) -;; width height side) -;; (cond -;; ((and (eq disp-func 'display-buffer-in-side-window) -;; (member position '(left right))) -;; (setq width (which-key/vertical-buffer-width max-len-desc max-len-key) -;; height (frame-height) -;; side position)) -;; ((eq disp-func 'display-buffer-in-side-window) -;; (setq width (frame-width) -;; height (+ 2 line-breaks) -;; side position)) -;; ((eq disp-func 'display-buffer-below-selected) -;; (setq height (+ 2 line-breaks))) -;; (t (error "error: Using unsupported buffer display function"))) -;; (list (when width (cons 'window-width width)) -;; (cons 'window-height height) -;; (when side (cons 'side side))))) - (defun which-key/insert-keys (formatted-strings buffer-width) "Insert strings into buffer breaking after `which-key-buffer-width'." (let ((char-count 0) @@ -223,19 +200,11 @@ Finally, show the buffer." (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (setq which-key--setup-p t)) -;; (defun which-key/show-buffer-popwin (height width) -;; (popwin:popup-buffer which-key-buffer-name -;; :width width -;; :height height -;; :noselect t -;; :position which-key-buffer-position)) - (defun which-key/show-buffer (height width) (let ((side which-key-buffer-position) alist) (setq alist (list (when side (cons 'side side)) (when height (cons 'window-height height)) (when width (cons 'window-width width)))) - (message "h: %s w: %s s: %s" height width side) (display-buffer "*which-key*" (cons which-key-buffer-display-function alist)))) (defun which-key/hide-buffer () From 230ffc306f59897638eb7bd634f0c4329d03f84e Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 08:09:27 -0400 Subject: [PATCH 023/806] Save popwin functions as comments --- which-key.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/which-key.el b/which-key.el index 95a5f76f9b6..4f2220436d1 100644 --- a/which-key.el +++ b/which-key.el @@ -212,6 +212,18 @@ Finally, show the buffer." (when (window-live-p which-key--window) (delete-window which-key--window))) +;; (defun which-key/show-buffer (height width) +;; (popwin:popup-buffer which-key-buffer-name +;; :width width +;; :height height +;; :noselect t +;; :position which-key-buffer-position)) + +;; (defun which-key/hide-buffer () +;; "Like it says :\)" +;; (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) +;; (popwin:close-popup-window))) + (defun which-key/turn-on-timer () "Activate idle timer." (setq which-key--timer From 63fde0d3f28be500c0111a1cc2c3515b8377e92f Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 08:12:10 -0400 Subject: [PATCH 024/806] Remove unnecessary checks --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 4f2220436d1..f87c040db5a 100644 --- a/which-key.el +++ b/which-key.el @@ -193,7 +193,7 @@ Finally, show the buffer." which-key-close-buffer-idle-delay nil 'which-key/hide-buffer)))) ;; close the window - (when (window-live-p which-key--window) (which-key/hide-buffer))))) + (which-key/hide-buffer))) (defun which-key/setup () "Create buffer for which-key." From c77a6efccb008f2b810e4b74f9b1f0f8cc86f6db Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 08:32:40 -0400 Subject: [PATCH 025/806] Switch back to popwin for now --- which-key.el | 65 ++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/which-key.el b/which-key.el index f87c040db5a..4bb33922526 100644 --- a/which-key.el +++ b/which-key.el @@ -6,7 +6,7 @@ ;; URL: https://github.com/justbur/which-key/ ;; Version: 0.1 ;; Keywords: -;; Package-Requires: ((s "1.9.0")) +;; Package-Requires: ((s "1.9.0" popwin "1.0.0")) ;;; Commentary: ;; @@ -21,6 +21,7 @@ ;;; Code: + (defvar which-key-idle-delay 0.6 "Delay (in seconds) for which-key buffer to popup.") (defvar which-key-close-buffer-idle-delay 4 @@ -40,16 +41,16 @@ "Name of which-key buffer.") (defvar which-key-buffer-position 'bottom "Position of which-key buffer") -(defvar which-key-buffer-display-function - 'display-buffer-in-side-window - "Controls where the buffer is displayed. Current options are - the default which is also controlled by - `which-key-buffer-position', and - `display-buffer-below-selected' which displays which-key only - under the currently selected window.") (defvar which-key-vertical-buffer-width 60 "Width of which-key buffer .") +(defconst which-key-buffer-display-function + 'display-buffer-in-side-window + "Controls where the buffer is displayed. + The current default is also controlled by + `which-key-buffer-position'. Other options are currently + disabled.") + ;; Internal Vars (defvar which-key--buffer nil "Internal: Holds reference to which-key buffer.") @@ -62,12 +63,10 @@ (defvar which-key--setup-p nil "Internal: Non-nil if which-key buffer has been setup") - (define-minor-mode which-key-mode "Toggle which-key-mode." :global t :lighter " WK" - :require 's (funcall (if which-key-mode (progn (unless which-key--setup-p (which-key/setup)) @@ -120,8 +119,8 @@ replace and the cdr is the replacement text. " (min which-key-vertical-buffer-width (+ 3 max-len-desc max-len-key))) ((eq which-key-buffer-display-function 'display-buffer-in-side-window) (frame-width)) - ((eq which-key-buffer-display-function 'display-buffer-below-selected) - sel-window-width) + ;; ((eq which-key-buffer-display-function 'display-buffer-below-selected) + ;; sel-window-width) (t nil))) (defsubst which-key/buffer-height (line-breaks) (+ 2 line-breaks)) @@ -193,36 +192,38 @@ Finally, show the buffer." which-key-close-buffer-idle-delay nil 'which-key/hide-buffer)))) ;; close the window - (which-key/hide-buffer))) + (which-key/hide-buffer)))) (defun which-key/setup () "Create buffer for which-key." + (require 's) + (require 'popwin) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (setq which-key--setup-p t)) -(defun which-key/show-buffer (height width) - (let ((side which-key-buffer-position) alist) - (setq alist (list (when side (cons 'side side)) - (when height (cons 'window-height height)) - (when width (cons 'window-width width)))) - (display-buffer "*which-key*" (cons which-key-buffer-display-function alist)))) - -(defun which-key/hide-buffer () - "Like it says :\)" - (when (window-live-p which-key--window) - (delete-window which-key--window))) - ;; (defun which-key/show-buffer (height width) -;; (popwin:popup-buffer which-key-buffer-name -;; :width width -;; :height height -;; :noselect t -;; :position which-key-buffer-position)) +;; (let ((side which-key-buffer-position) alist) +;; (setq alist (list (when side (cons 'side side)) +;; (when height (cons 'window-height height)) +;; (when width (cons 'window-width width)))) +;; (display-buffer "*which-key*" (cons which-key-buffer-display-function alist)))) ;; (defun which-key/hide-buffer () ;; "Like it says :\)" -;; (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) -;; (popwin:close-popup-window))) +;; (when (window-live-p which-key--window) +;; (delete-window which-key--window))) + +(defun which-key/show-buffer (height width) + (popwin:popup-buffer which-key-buffer-name + :width width + :height height + :noselect t + :position which-key-buffer-position)) + +(defun which-key/hide-buffer () + "Like it says :\)" + (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) + (popwin:close-popup-window))) (defun which-key/turn-on-timer () "Activate idle timer." From 5039c93d8626f20f0fda17058cb64cd6e35ebe87 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 08:39:26 -0400 Subject: [PATCH 026/806] Switch readme to org-mode --- README.md | 10 ---------- README.org | 12 ++++++++++++ 2 files changed, 12 insertions(+), 10 deletions(-) delete mode 100644 README.md create mode 100644 README.org diff --git a/README.md b/README.md deleted file mode 100644 index 6f77947c0d8..00000000000 --- a/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# emacs-which-key -Rewrite of guide-key-mode for emacs. - -It's very rough right now. - -Planned features: - 1. Simplify code, especially the trigger mechanism to make it less resource - intensive than guide-key. - 2. Add option to replace descriptions of keys on the fly. - 3. Switch from using popwin to window-purpose. diff --git a/README.org b/README.org new file mode 100644 index 00000000000..3fa356d27d3 --- /dev/null +++ b/README.org @@ -0,0 +1,12 @@ +Rewrite of guide-key-mode for emacs. + +* Status +It is somewhat stable for me at the moment, but expect to see potentially weird +behavior (then to report it to me!). +** Completed +1. Use idle timers to trigger window popup instead of guide-key's constant + polling. +2. Add support for replacement lists to modify key descriptions on the fly. +** Ongoing/Planned +1. Explore alternatives to popwin like window-pupose and using display-buffer + directly From 5185467c6b193f58b01b84c1f8cf6b7b38c3ed9c Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 12:00:07 -0400 Subject: [PATCH 027/806] Arrows are more fun Also add padding between entries --- which-key.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 4bb33922526..54831b52829 100644 --- a/which-key.el +++ b/which-key.el @@ -91,13 +91,14 @@ length." (prefix (string-match-p "^Prefix" desc)) (desc-face (if (or prefix group) 'font-lock-keyword-face 'font-lock-function-name-face)) + (sign (if (or prefix group) "▶" "→")) (tmp-desc (which-key/truncate-description (if group (substring desc 6) desc))) (key-padding (s-repeat (- max-len-key (length key)) " ")) (padded-desc (s-pad-right max-len-desc " " tmp-desc))) - (format (concat (propertize "[" 'face 'font-lock-comment-face) "%s" - (propertize "]" 'face 'font-lock-comment-face) "%s" + (format (concat (propertize "%s%s" 'face 'font-lock-constant-face) " " + (propertize sign 'face 'font-lock-comment-face) (propertize " %s" 'face desc-face)) - key key-padding padded-desc))) + key-padding key padded-desc))) unformatted)) (defun which-key/replace-strings-from-alist (replacements) @@ -174,6 +175,7 @@ Finally, show the buffer." (setq max-len-desc (if (> max-len-desc which-key-max-description-length) (+ 2 which-key-max-description-length) ; for the .. max-len-desc) + max-len-desc (1+ max-len-desc) ; pad with one character formatted (which-key/format-matches unformatted max-len-key max-len-desc))) (with-current-buffer (get-buffer which-key--buffer) From beaba56f365fded06d2a63b77f99c5c475773e34 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 12:50:37 -0400 Subject: [PATCH 028/806] Add picture to readme --- README.org | 4 ++++ img/which-key-right.png | Bin 0 -> 103284 bytes 2 files changed, 4 insertions(+) create mode 100644 img/which-key-right.png diff --git a/README.org b/README.org index 3fa356d27d3..0b8320cc852 100644 --- a/README.org +++ b/README.org @@ -1,5 +1,9 @@ Rewrite of guide-key-mode for emacs. +Here's a recent picture showing what it does: + +[[./img/which-key-right.png]] + * Status It is somewhat stable for me at the moment, but expect to see potentially weird behavior (then to report it to me!). diff --git a/img/which-key-right.png b/img/which-key-right.png new file mode 100644 index 0000000000000000000000000000000000000000..a207d5a82e58ef995a3c4ae4ed5091d18f7d3c49 GIT binary patch literal 103284 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 Date: Fri, 3 Jul 2015 12:51:05 -0400 Subject: [PATCH 029/806] Get the cursor out of the way --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 54831b52829..451b7f0886f 100644 --- a/which-key.el +++ b/which-key.el @@ -186,7 +186,8 @@ Finally, show the buffer." formatted buffer-width)) (goto-char (point-min)) (which-key/replace-strings-from-alist - which-key-general-replacement-alist)) + which-key-general-replacement-alist) + (goto-char (point-max))) (setq which-key--window (which-key/show-buffer (which-key/buffer-height line-breaks) buffer-width)) From 31dff26dadc492e4d9e1c66dff98674544a361fb Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 13:06:43 -0400 Subject: [PATCH 030/806] Better picture --- README.org | 2 +- img/which-key-bottom.png | Bin 0 -> 59650 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 img/which-key-bottom.png diff --git a/README.org b/README.org index 0b8320cc852..93cbaad6010 100644 --- a/README.org +++ b/README.org @@ -2,7 +2,7 @@ Rewrite of guide-key-mode for emacs. Here's a recent picture showing what it does: -[[./img/which-key-right.png]] +[[./img/which-key-bottom.png]] * Status It is somewhat stable for me at the moment, but expect to see potentially weird diff --git a/img/which-key-bottom.png b/img/which-key-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..f096981300118faa66e2414089650e9476838c3f GIT binary patch literal 59650 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

4s{hGz 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 Xlr;CF{=1yMAoDz3{an^LB{Ts5hu3@5 literal 0 HcmV?d00001 From 5af44458b77cfcb089084a6658281d27698bde6e Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 13:07:07 -0400 Subject: [PATCH 031/806] Try to hide cursor --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 451b7f0886f..cc0c772d692 100644 --- a/which-key.el +++ b/which-key.el @@ -26,7 +26,7 @@ "Delay (in seconds) for which-key buffer to popup.") (defvar which-key-close-buffer-idle-delay 4 "Delay (in seconds) after which buffer is forced closed.") -(defvar which-key-max-description-length 30 +(defvar which-key-max-description-length 27 "Truncate the description of keys to this length (adds \"..\")") (defvar which-key-key-replacement-alist @@ -187,7 +187,8 @@ Finally, show the buffer." (goto-char (point-min)) (which-key/replace-strings-from-alist which-key-general-replacement-alist) - (goto-char (point-max))) + (setq-local cursor-type nil) + (setq-local cursor-in-non-selected-windows nil)) (setq which-key--window (which-key/show-buffer (which-key/buffer-height line-breaks) buffer-width)) From 6875c207b8d8f2e73a75feb7a750780bd99bda59 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 13:25:26 -0400 Subject: [PATCH 032/806] Move cursor code to setup --- which-key.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index cc0c772d692..c5ff68ab2dd 100644 --- a/which-key.el +++ b/which-key.el @@ -178,6 +178,7 @@ Finally, show the buffer." max-len-desc (1+ max-len-desc) ; pad with one character formatted (which-key/format-matches unformatted max-len-key max-len-desc))) + ;; populate buffer (with-current-buffer (get-buffer which-key--buffer) (erase-buffer) (setq buffer-width (which-key/buffer-width @@ -186,9 +187,8 @@ Finally, show the buffer." formatted buffer-width)) (goto-char (point-min)) (which-key/replace-strings-from-alist - which-key-general-replacement-alist) - (setq-local cursor-type nil) - (setq-local cursor-in-non-selected-windows nil)) + which-key-general-replacement-alist)) + ;; show buffer (setq which-key--window (which-key/show-buffer (which-key/buffer-height line-breaks) buffer-width)) @@ -203,6 +203,9 @@ Finally, show the buffer." (require 's) (require 'popwin) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) + (with-current-buffer which-key--buffer + (setq-local cursor-type nil) + (setq-local cursor-in-non-selected-windows nil)) (setq which-key--setup-p t)) ;; (defun which-key/show-buffer (height width) From 3e704213fb01925a5c1c25b22ea740e57b8c419c Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 15:36:55 -0400 Subject: [PATCH 033/806] Update docstrings and fix packaging --- which-key.el | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/which-key.el b/which-key.el index c5ff68ab2dd..00106c38416 100644 --- a/which-key.el +++ b/which-key.el @@ -1,4 +1,4 @@ -;;; which-key.el +;;; which-key.el --- Display available keybindings in popup ;; Copyright (C) 2015 Justin Burkett @@ -6,7 +6,7 @@ ;; URL: https://github.com/justbur/which-key/ ;; Version: 0.1 ;; Keywords: -;; Package-Requires: ((s "1.9.0" popwin "1.0.0")) +;; Package-Requires: ((s "1.9.0") (popwin "1.0.0")) ;;; Commentary: ;; @@ -21,37 +21,36 @@ ;;; Code: - (defvar which-key-idle-delay 0.6 "Delay (in seconds) for which-key buffer to popup.") (defvar which-key-close-buffer-idle-delay 4 "Delay (in seconds) after which buffer is forced closed.") (defvar which-key-max-description-length 27 - "Truncate the description of keys to this length (adds - \"..\")") + "Truncate the description of keys to this length. Also adds +\"..\".") (defvar which-key-key-replacement-alist '((">". "") ("<" . "") ("left" ."←") ("right" . "→")) "The strings in the car of each cons cell are replaced with the - strings in the cdr for each key.") +strings in the cdr for each key.") (defvar which-key-general-replacement-alist nil - "See `which-key-key-replacement-alist'. This is a list of cons - cells for replacing any text, keys and descriptions. You can - also use elisp regexp in the car of the cells.") + "See `which-key-key-replacement-alist'. This is a list of cons +cells for replacing any text, keys and descriptions. You can +also use elisp regexp in the car of the cells.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-buffer-position 'bottom - "Position of which-key buffer") + "Position of which-key buffer.") (defvar which-key-vertical-buffer-width 60 "Width of which-key buffer .") (defconst which-key-buffer-display-function 'display-buffer-in-side-window - "Controls where the buffer is displayed. - The current default is also controlled by - `which-key-buffer-position'. Other options are currently - disabled.") + "Controls where the buffer is displayed. The current default is +also controlled by `which-key-buffer-position'. Other options are +currently disabled.") ;; Internal Vars +(defvar popwin:popup-buffer nil) (defvar which-key--buffer nil "Internal: Holds reference to which-key buffer.") (defvar which-key--window nil @@ -61,8 +60,9 @@ (defvar which-key--close-timer nil "Internal: Holds reference to close window timer.") (defvar which-key--setup-p nil - "Internal: Non-nil if which-key buffer has been setup") + "Internal: Non-nil if which-key buffer has been setup.") +;;;###autoload (define-minor-mode which-key-mode "Toggle which-key-mode." :global t @@ -74,15 +74,16 @@ 'which-key/turn-off-timer))) (defsubst which-key/truncate-description (desc) - "Truncate key description to `which-key-max-description-length'." + "Truncate DESC description to `which-key-max-description-length'." (if (> (length desc) which-key-max-description-length) (concat (substring desc 0 which-key-max-description-length) "..") desc)) (defun which-key/format-matches (unformatted max-len-key max-len-desc) - "Turn `key-desc-cons' into formatted strings (including text -properties), and pad with spaces so that all are a uniform -length." + "Turn each key-desc-cons in UNFORMATTED into formatted +strings (including text properties), and pad with spaces so that +all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the +longest key and description in the buffer, respectively." (mapcar (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) @@ -104,7 +105,7 @@ length." (defun which-key/replace-strings-from-alist (replacements) "Find and replace text in buffer according to REPLACEMENTS, which is an alist where the car of each element is the text to -replace and the cdr is the replacement text. " +replace and the cdr is the replacement text." (dolist (rep replacements) (let ((trunc-car (which-key/truncate-description (car rep))) old-face) @@ -127,7 +128,7 @@ replace and the cdr is the replacement text. " (defsubst which-key/buffer-height (line-breaks) (+ 2 line-breaks)) (defun which-key/insert-keys (formatted-strings buffer-width) - "Insert strings into buffer breaking after `which-key-buffer-width'." + "Insert FORMATTED-STRINGS into buffer, breaking after BUFFER-WIDTH." (let ((char-count 0) (line-breaks 0) (width (if buffer-width buffer-width (frame-width)))) @@ -221,6 +222,7 @@ Finally, show the buffer." ;; (delete-window which-key--window))) (defun which-key/show-buffer (height width) + "Usign popwin popup buffer with dimensions HEIGHT and WIDTH." (popwin:popup-buffer which-key-buffer-name :width width :height height @@ -228,7 +230,7 @@ Finally, show the buffer." :position which-key-buffer-position)) (defun which-key/hide-buffer () - "Like it says :\)" + "Hide popwin buffer." (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) (popwin:close-popup-window))) From 558090e1198398f512cee09f926786a1e194e0b6 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 22:10:34 -0400 Subject: [PATCH 034/806] Switch default to minibuffer There are a lot of changes here. 1. Reorganized and factored a bunch of code. 2. Rewrote the logic to calculate line breaks (much cleaner). 3. Switched to using the minibuffer by default, which seems more foolproof and saves line space (I'm sure there's something wrong with this). --- which-key.el | 200 ++++++++++++++++++++++++++++----------------------- 1 file changed, 109 insertions(+), 91 deletions(-) diff --git a/which-key.el b/which-key.el index 00106c38416..ddd5d009128 100644 --- a/which-key.el +++ b/which-key.el @@ -34,14 +34,16 @@ strings in the cdr for each key.") (defvar which-key-general-replacement-alist nil "See `which-key-key-replacement-alist'. This is a list of cons -cells for replacing any text, keys and descriptions. You can -also use elisp regexp in the car of the cells.") +cells for replacing any text, keys and descriptions.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-buffer-position 'bottom "Position of which-key buffer.") (defvar which-key-vertical-buffer-width 60 "Width of which-key buffer .") +(defvar which-key-use-minibuffer t + "Use the minibuffer to display the keybindings. This seems to +be the most foolproof, so it's the default for now") (defconst which-key-buffer-display-function 'display-buffer-in-side-window @@ -79,6 +81,42 @@ currently disabled.") (concat (substring desc 0 which-key-max-description-length) "..") desc)) +(defun which-key/available-lines () + "Only works for minibuffer right now." + (when which-key-use-minibuffer + (if (floatp max-mini-window-height) + (floor (* (frame-text-lines) + max-mini-window-height)) + max-mini-window-height))) + +(defun which-key/replace-strings-from-alist (replacements) + "Find and replace text in buffer according to REPLACEMENTS, +which is an alist where the car of each element is the text to +replace and the cdr is the replacement text." + (dolist (rep replacements) + (let ((trunc-car (which-key/truncate-description (car rep))) + old-face) + (save-excursion + (goto-char (point-min)) + (while (or (search-forward (car rep) nil t) + (search-forward trunc-car nil t)) + (setq old-face (get-text-property (match-beginning 0) 'face)) + (replace-match (propertize (cdr rep) 'face old-face) nil t)))))) + +;; in case I decide to add padding +;; (defsubst which-key/buffer-height (line-breaks) line-breaks) + +(defun which-key/buffer-width (column-width sel-window-width) + (cond (which-key-use-minibuffer (frame-text-cols)) + ((and (eq which-key-buffer-display-function 'display-buffer-in-side-window) + (member which-key-buffer-position '(left right))) + (min which-key-vertical-buffer-width column-width)) + ((eq which-key-buffer-display-function 'display-buffer-in-side-window) + (frame-text-width)) + ;; ((eq which-key-buffer-display-function 'display-buffer-below-selected) + ;; sel-window-width) + (t nil))) + (defun which-key/format-matches (unformatted max-len-key max-len-desc) "Turn each key-desc-cons in UNFORMATTED into formatted strings (including text properties), and pad with spaces so that @@ -94,55 +132,61 @@ longest key and description in the buffer, respectively." 'font-lock-keyword-face 'font-lock-function-name-face)) (sign (if (or prefix group) "▶" "→")) (tmp-desc (which-key/truncate-description (if group (substring desc 6) desc))) - (key-padding (s-repeat (- max-len-key (length key)) " ")) + ;; pad keys to max-len-key + (padded-key (s-pad-left max-len-key " " key)) (padded-desc (s-pad-right max-len-desc " " tmp-desc))) - (format (concat (propertize "%s%s" 'face 'font-lock-constant-face) " " - (propertize sign 'face 'font-lock-comment-face) - (propertize " %s" 'face desc-face)) - key-padding key padded-desc))) + (format (concat (propertize "%s" 'face 'font-lock-constant-face) " " + (propertize sign 'face 'font-lock-comment-face) " " + (propertize "%s" 'face desc-face) " ") + padded-key padded-desc))) unformatted)) -(defun which-key/replace-strings-from-alist (replacements) - "Find and replace text in buffer according to REPLACEMENTS, -which is an alist where the car of each element is the text to -replace and the cdr is the replacement text." - (dolist (rep replacements) - (let ((trunc-car (which-key/truncate-description (car rep))) - old-face) - (save-excursion - (while (or (search-forward (car rep) nil t) - (search-forward trunc-car nil t)) - (setq old-face (get-text-property (match-beginning 0) 'face)) - (replace-match (propertize (cdr rep) 'face old-face) nil t)))))) +(defun which-key/get-formatted-key-bindings (buffer key) + (let ((max-len-key 0) (max-len-desc 0) + (key-str-qt (regexp-quote (key-description key))) + key-match desc-match unformatted formatted) + (with-temp-buffer + (describe-buffer-bindings buffer key) + (which-key/replace-strings-from-alist which-key-general-replacement-alist) + (goto-char (point-max)) ; want to put last keys in first + (while (re-search-backward + (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" + key-str-qt) + nil t) + (setq key-match (s-replace-all + which-key-key-replacement-alist (match-string 1)) + desc-match (match-string 2) + max-len-key (max max-len-key (length key-match)) + max-len-desc (max max-len-desc (length desc-match))) + (cl-pushnew (cons key-match desc-match) unformatted + :test (lambda (x y) (string-equal (car x) (car y))))) + (setq max-len-desc (if (> max-len-desc which-key-max-description-length) + (+ 2 which-key-max-description-length) ; for the .. + max-len-desc) + formatted (which-key/format-matches + unformatted max-len-key max-len-desc))) + (cons formatted (+ 4 max-len-key max-len-desc)))) -(defun which-key/buffer-width (max-len-key max-len-desc sel-window-width) - (cond ((and (eq which-key-buffer-display-function 'display-buffer-in-side-window) - (member which-key-buffer-position '(left right))) - (min which-key-vertical-buffer-width (+ 3 max-len-desc max-len-key))) - ((eq which-key-buffer-display-function 'display-buffer-in-side-window) - (frame-width)) - ;; ((eq which-key-buffer-display-function 'display-buffer-below-selected) - ;; sel-window-width) - (t nil))) - -(defsubst which-key/buffer-height (line-breaks) (+ 2 line-breaks)) - -(defun which-key/insert-keys (formatted-strings buffer-width) +(defun which-key/populate-buffer (formatted-keys column-width buffer-width) "Insert FORMATTED-STRINGS into buffer, breaking after BUFFER-WIDTH." - (let ((char-count 0) - (line-breaks 0) - (width (if buffer-width buffer-width (frame-width)))) - (insert (mapconcat - (lambda (str) - (let* ((str-len (length (substring-no-properties str))) - (new-count (+ char-count str-len))) - (if (> new-count width) - (progn (setq char-count str-len) - (cl-incf line-breaks) - (concat "\n" str)) - (setq char-count new-count) - str))) formatted-strings "")) - line-breaks)) + (let* ((char-count 0) (line-breaks 0) (this-column 1) + (width (if buffer-width buffer-width (frame-text-width))) + (n-keys (length formatted-keys)) + (n-columns (/ width column-width)) ;; integer division + (n-lines (which-key/available-lines)) + (max-lines (ceiling (/ (float n-keys) n-columns))) + (n-lines (if n-lines (min n-lines max-lines) max-lines)) + lines str-to-insert start end) + (message "n-lines: %s" n-lines) + (when (> n-columns 0) + (dotimes (i n-lines) + (setq lines (push (subseq formatted-keys (* i n-columns) (* (1+ i) n-columns)) lines))) + (setq lns lines nlns n-lines) + (setq str-to-insert (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n")) + (if which-key-use-minibuffer + (let (message-log-max) (message "%s" str-to-insert)) + (insert str-to-insert))) + n-lines)) (defun which-key/update-buffer-and-show () "Fill which-key--buffer with key descriptions and reformat. @@ -152,51 +196,24 @@ Finally, show the buffer." (progn (when which-key--close-timer (cancel-timer which-key--close-timer)) (which-key/hide-buffer) - (let ((buf (current-buffer)) (win-width (window-width)) - (key-str-qt (regexp-quote (key-description key))) - (bottom-or-top (member which-key-buffer-position '(top bottom))) - (max-len-key 0) (max-len-desc 0) - key-match desc-match unformatted formatted buffer-width - line-breaks) - ;; get keybindings - (with-temp-buffer - (describe-buffer-bindings buf key) - (goto-char (point-max)) - (while (re-search-backward - (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" - key-str-qt) - nil t) - (setq key-match (s-replace-all - which-key-key-replacement-alist (match-string 1)) - desc-match (match-string 2) - max-len-key (max max-len-key (length key-match)) - max-len-desc (max max-len-desc (length desc-match))) - (cl-pushnew (cons key-match desc-match) unformatted - :test (lambda (x y) (string-equal (car x) (car y))))) - (setq max-len-desc (if (> max-len-desc which-key-max-description-length) - (+ 2 which-key-max-description-length) ; for the .. - max-len-desc) - max-len-desc (1+ max-len-desc) ; pad with one character - formatted (which-key/format-matches - unformatted max-len-key max-len-desc))) - ;; populate buffer - (with-current-buffer (get-buffer which-key--buffer) - (erase-buffer) - (setq buffer-width (which-key/buffer-width - max-len-key max-len-desc win-width) - line-breaks (which-key/insert-keys - formatted buffer-width)) - (goto-char (point-min)) - (which-key/replace-strings-from-alist - which-key-general-replacement-alist)) - ;; show buffer - (setq which-key--window (which-key/show-buffer - (which-key/buffer-height line-breaks) - buffer-width)) - (setq which-key--close-timer (run-at-time + (let* ((buf (current-buffer)) + (bottom-or-top (member which-key-buffer-position '(top bottom))) + ;; get formatted key bindings + (fmt-width-cons (which-key/get-formatted-key-bindings buf key)) + (formatted-keys (car fmt-width-cons)) + (column-width (cdr fmt-width-cons)) + (buffer-width (which-key/buffer-width column-width (window-width))) + n-lines) + ;; populate target buffer + (setq n-lines (which-key/populate-buffer + formatted-keys column-width buffer-width))) + ;; maybe show buffer + (unless which-key-use-minibuffer + (setq which-key--window (which-key/show-buffer n-lines buffer-width) + which-key--close-timer (run-at-time which-key-close-buffer-idle-delay nil 'which-key/hide-buffer)))) - ;; close the window + ;; command finished maybe close the window (which-key/hide-buffer)))) (defun which-key/setup () @@ -222,7 +239,7 @@ Finally, show the buffer." ;; (delete-window which-key--window))) (defun which-key/show-buffer (height width) - "Usign popwin popup buffer with dimensions HEIGHT and WIDTH." + "Using popwin popup buffer with dimensions HEIGHT and WIDTH." (popwin:popup-buffer which-key-buffer-name :width width :height height @@ -231,7 +248,8 @@ Finally, show the buffer." (defun which-key/hide-buffer () "Hide popwin buffer." - (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) + (when (and (not which-key-use-minibuffer) + (eq popwin:popup-buffer (get-buffer which-key--buffer))) (popwin:close-popup-window))) (defun which-key/turn-on-timer () From fa368fc61105ebb733af1e3619e9f01e22ee1689 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 22:19:50 -0400 Subject: [PATCH 035/806] Fix index error for subseq --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index ddd5d009128..968999791ea 100644 --- a/which-key.el +++ b/which-key.el @@ -177,11 +177,11 @@ longest key and description in the buffer, respectively." (max-lines (ceiling (/ (float n-keys) n-columns))) (n-lines (if n-lines (min n-lines max-lines) max-lines)) lines str-to-insert start end) - (message "n-lines: %s" n-lines) (when (> n-columns 0) (dotimes (i n-lines) - (setq lines (push (subseq formatted-keys (* i n-columns) (* (1+ i) n-columns)) lines))) - (setq lns lines nlns n-lines) + (setq lines + (push (subseq formatted-keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) + lines))) (setq str-to-insert (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n")) (if which-key-use-minibuffer (let (message-log-max) (message "%s" str-to-insert)) From 8d9f79ac14d74895d905880e1fc28266c06ff123 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 23:01:17 -0400 Subject: [PATCH 036/806] Toggle timer on frame focus --- which-key.el | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index 968999791ea..c9f61ed12fc 100644 --- a/which-key.el +++ b/which-key.el @@ -57,8 +57,8 @@ currently disabled.") "Internal: Holds reference to which-key buffer.") (defvar which-key--window nil "Internal: Holds reference to which-key window.") -(defvar which-key--timer nil - "Internal: Holds reference to timer.") +(defvar which-key--open-timer nil + "Internal: Holds reference to open window timer.") (defvar which-key--close-timer nil "Internal: Holds reference to close window timer.") (defvar which-key--setup-p nil @@ -69,11 +69,15 @@ currently disabled.") "Toggle which-key-mode." :global t :lighter " WK" - (funcall (if which-key-mode - (progn - (unless which-key--setup-p (which-key/setup)) - 'which-key/turn-on-timer) - 'which-key/turn-off-timer))) + (if which-key-mode + (progn + (unless which-key--setup-p (which-key/setup)) + (add-hook 'focus-out-hook 'which-key/turn-off-timer) + (add-hook 'focus-in-hook 'which-key/turn-on-timer) + (which-key/turn-on-timer)) + (remove-hook 'focus-out-hook 'which-key/turn-off-timer) + (remove-hook 'focus-in-hook 'which-key/turn-on-timer) + (which-key/turn-off-timer))) (defsubst which-key/truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." @@ -254,12 +258,12 @@ Finally, show the buffer." (defun which-key/turn-on-timer () "Activate idle timer." - (setq which-key--timer + (setq which-key--open-timer (run-with-idle-timer which-key-idle-delay t 'which-key/update-buffer-and-show))) (defun which-key/turn-off-timer () "Deactivate idle timer." - (cancel-timer which-key--timer)) + (cancel-timer which-key--open-timer)) (provide 'which-key) From add8fca39f57a6ec7535a688bb374d6d37f2bab6 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 23:29:07 -0400 Subject: [PATCH 037/806] Change formatting of groups --- which-key.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index c9f61ed12fc..0efd1aabd1d 100644 --- a/which-key.el +++ b/which-key.el @@ -32,7 +32,8 @@ '((">". "") ("<" . "") ("left" ."←") ("right" . "→")) "The strings in the car of each cons cell are replaced with the strings in the cdr for each key.") -(defvar which-key-general-replacement-alist nil +(defvar which-key-general-replacement-alist + '(("Prefix Command" . "prefix")) "See `which-key-key-replacement-alist'. This is a list of cons cells for replacing any text, keys and descriptions.") (defvar which-key-buffer-name "*which-key*" @@ -98,14 +99,10 @@ currently disabled.") which is an alist where the car of each element is the text to replace and the cdr is the replacement text." (dolist (rep replacements) - (let ((trunc-car (which-key/truncate-description (car rep))) - old-face) (save-excursion (goto-char (point-min)) - (while (or (search-forward (car rep) nil t) - (search-forward trunc-car nil t)) - (setq old-face (get-text-property (match-beginning 0) 'face)) - (replace-match (propertize (cdr rep) 'face old-face) nil t)))))) + (while (or (search-forward (car rep) nil t)) + (replace-match (cdr rep) t t))))) ;; in case I decide to add padding ;; (defsubst which-key/buffer-height (line-breaks) line-breaks) @@ -131,14 +128,17 @@ longest key and description in the buffer, respectively." (let* ((key (car key-desc-cons)) (desc (cdr key-desc-cons)) (group (string-match-p "^group:" desc)) + (desc (if group (substring desc 6) desc)) (prefix (string-match-p "^Prefix" desc)) + (desc (if (or prefix group) (concat "+" desc) desc)) (desc-face (if (or prefix group) 'font-lock-keyword-face 'font-lock-function-name-face)) - (sign (if (or prefix group) "▶" "→")) - (tmp-desc (which-key/truncate-description (if group (substring desc 6) desc))) + ;; (sign (if (or prefix group) "▶" "→")) + (sign "→") + (desc (which-key/truncate-description desc)) ;; pad keys to max-len-key (padded-key (s-pad-left max-len-key " " key)) - (padded-desc (s-pad-right max-len-desc " " tmp-desc))) + (padded-desc (s-pad-right max-len-desc " " desc))) (format (concat (propertize "%s" 'face 'font-lock-constant-face) " " (propertize sign 'face 'font-lock-comment-face) " " (propertize "%s" 'face desc-face) " ") From 17b5f3dfd9144ad32ad96290ca1af11d5f2495f7 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 4 Jul 2015 11:06:07 -0400 Subject: [PATCH 038/806] Factor out display functions To add customization options later --- which-key.el | 114 +++++++++++++++++++++++++++++---------------------- 1 file changed, 65 insertions(+), 49 deletions(-) diff --git a/which-key.el b/which-key.el index 0efd1aabd1d..ec20b6ca49d 100644 --- a/which-key.el +++ b/which-key.el @@ -42,9 +42,11 @@ cells for replacing any text, keys and descriptions.") "Position of which-key buffer.") (defvar which-key-vertical-buffer-width 60 "Width of which-key buffer .") -(defvar which-key-use-minibuffer t - "Use the minibuffer to display the keybindings. This seems to -be the most foolproof, so it's the default for now") +(defvar which-key-display-method 'minibuffer + "Controls the method used to display the keys. The default is +minibuffer, but other possibilities are 'popwin and +'display-buffer. You will also be able write your own display +function (not implemented yet).") (defconst which-key-buffer-display-function 'display-buffer-in-side-window @@ -73,12 +75,23 @@ currently disabled.") (if which-key-mode (progn (unless which-key--setup-p (which-key/setup)) - (add-hook 'focus-out-hook 'which-key/turn-off-timer) - (add-hook 'focus-in-hook 'which-key/turn-on-timer) - (which-key/turn-on-timer)) - (remove-hook 'focus-out-hook 'which-key/turn-off-timer) - (remove-hook 'focus-in-hook 'which-key/turn-on-timer) - (which-key/turn-off-timer))) + (add-hook 'focus-out-hook 'which-key/stop-open-timer) + (add-hook 'focus-in-hook 'which-key/start-open-timer) + (which-key/make-display-method-aliases which-key-display-method) + (which-key/start-open-timer)) + (remove-hook 'focus-out-hook 'which-key/stop-open-timer) + (remove-hook 'focus-in-hook 'which-key/start-open-timer) + (which-key/stop-open-timer))) + +(defun which-key/setup () + "Create buffer for which-key." + (require 's) + (require 'popwin) + (setq which-key--buffer (get-buffer-create which-key-buffer-name)) + (with-current-buffer which-key--buffer + (setq-local cursor-type nil) + (setq-local cursor-in-non-selected-windows nil)) + (setq which-key--setup-p t)) (defsubst which-key/truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." @@ -88,7 +101,7 @@ currently disabled.") (defun which-key/available-lines () "Only works for minibuffer right now." - (when which-key-use-minibuffer + (when (eq which-key-display-method 'minibuffer) (if (floatp max-mini-window-height) (floor (* (frame-text-lines) max-mini-window-height)) @@ -108,7 +121,8 @@ replace and the cdr is the replacement text." ;; (defsubst which-key/buffer-height (line-breaks) line-breaks) (defun which-key/buffer-width (column-width sel-window-width) - (cond (which-key-use-minibuffer (frame-text-cols)) + (cond ((eq which-key-display-method 'minibuffer) + (frame-text-cols)) ((and (eq which-key-buffer-display-function 'display-buffer-in-side-window) (member which-key-buffer-position '(left right))) (min which-key-vertical-buffer-width column-width)) @@ -187,12 +201,12 @@ longest key and description in the buffer, respectively." (push (subseq formatted-keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) lines))) (setq str-to-insert (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n")) - (if which-key-use-minibuffer + (if (eq which-key-display-method 'minibuffer) (let (message-log-max) (message "%s" str-to-insert)) (insert str-to-insert))) n-lines)) -(defun which-key/update-buffer-and-show () +(defun which-key/update () "Fill which-key--buffer with key descriptions and reformat. Finally, show the buffer." (let ((key (this-single-command-keys))) @@ -210,58 +224,60 @@ Finally, show the buffer." n-lines) ;; populate target buffer (setq n-lines (which-key/populate-buffer - formatted-keys column-width buffer-width))) - ;; maybe show buffer - (unless which-key-use-minibuffer - (setq which-key--window (which-key/show-buffer n-lines buffer-width) - which-key--close-timer (run-at-time - which-key-close-buffer-idle-delay - nil 'which-key/hide-buffer)))) + formatted-keys column-width buffer-width)) + ;; show buffer + (unless (eq which-key-display-method 'minibuffer) + (setq which-key--window (which-key/show-buffer n-lines buffer-width) + which-key--close-timer (run-at-time + which-key-close-buffer-idle-delay + nil 'which-key/hide-buffer))))) ;; command finished maybe close the window (which-key/hide-buffer)))) -(defun which-key/setup () - "Create buffer for which-key." - (require 's) - (require 'popwin) - (setq which-key--buffer (get-buffer-create which-key-buffer-name)) - (with-current-buffer which-key--buffer - (setq-local cursor-type nil) - (setq-local cursor-in-non-selected-windows nil)) - (setq which-key--setup-p t)) +;; Display functions -;; (defun which-key/show-buffer (height width) -;; (let ((side which-key-buffer-position) alist) -;; (setq alist (list (when side (cons 'side side)) -;; (when height (cons 'window-height height)) -;; (when width (cons 'window-width width)))) -;; (display-buffer "*which-key*" (cons which-key-buffer-display-function alist)))) +(defun which-key/show-buffer-display-buffer (height width) + (let ((side which-key-buffer-position) alist) + (setq alist (list (when side (cons 'side side)) + (when height (cons 'window-height height)) + (when width (cons 'window-width width)))) + (display-buffer "*which-key*" (cons which-key-buffer-display-function alist)))) -;; (defun which-key/hide-buffer () -;; "Like it says :\)" -;; (when (window-live-p which-key--window) -;; (delete-window which-key--window))) +(defun which-key/hide-buffer-display-buffer () + (when (window-live-p which-key--window) + (delete-window which-key--window))) -(defun which-key/show-buffer (height width) +(defun which-key/show-buffer-popwin (height width) "Using popwin popup buffer with dimensions HEIGHT and WIDTH." (popwin:popup-buffer which-key-buffer-name - :width width :height height + :width width :noselect t :position which-key-buffer-position)) -(defun which-key/hide-buffer () +(defun which-key/hide-buffer-popwin () "Hide popwin buffer." - (when (and (not which-key-use-minibuffer) - (eq popwin:popup-buffer (get-buffer which-key--buffer))) + (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) (popwin:close-popup-window))) -(defun which-key/turn-on-timer () - "Activate idle timer." - (setq which-key--open-timer - (run-with-idle-timer which-key-idle-delay t 'which-key/update-buffer-and-show))) +(defun which-key/make-display-method-aliases (method) + (cond + ((eq method 'minibuffer) + (defun which-key/hide-buffer ())) + ((member method '(popwin display-buffer)) + (defalias 'which-key/show-buffer + (intern (concat "which-key/show-buffer-" (symbol-name method)))) + (defalias 'which-key/hide-buffer + (intern (concat "which-key/hide-buffer-" (symbol-name method))))) + (t (error "error: Invalid choice for which-key-display-method")))) -(defun which-key/turn-off-timer () +(defun which-key/start-open-timer () + "Activate idle timer." + (when which-key--open-timer (cancel-timer which-key--open-timer)); start over + (setq which-key--open-timer + (run-with-idle-timer which-key-idle-delay t 'which-key/update))) + +(defun which-key/stop-open-timer () "Deactivate idle timer." (cancel-timer which-key--open-timer)) From ffbdc2a3ca00d137fc60a1b2607c67023456f4e1 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 4 Jul 2015 11:10:20 -0400 Subject: [PATCH 039/806] Reorganize code a little --- which-key.el | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index ec20b6ca49d..898c12e52d0 100644 --- a/which-key.el +++ b/which-key.el @@ -93,6 +93,8 @@ currently disabled.") (setq-local cursor-in-non-selected-windows nil)) (setq which-key--setup-p t)) +;; Helper functions + (defsubst which-key/truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." (if (> (length desc) which-key-max-description-length) @@ -159,6 +161,8 @@ longest key and description in the buffer, respectively." padded-key padded-desc))) unformatted)) +;; "Core" functions + (defun which-key/get-formatted-key-bindings (buffer key) (let ((max-len-key 0) (max-len-desc 0) (key-str-qt (regexp-quote (key-description key))) @@ -234,6 +238,18 @@ Finally, show the buffer." ;; command finished maybe close the window (which-key/hide-buffer)))) +;; Timers + +(defun which-key/start-open-timer () + "Activate idle timer." + (when which-key--open-timer (cancel-timer which-key--open-timer)); start over + (setq which-key--open-timer + (run-with-idle-timer which-key-idle-delay t 'which-key/update))) + +(defun which-key/stop-open-timer () + "Deactivate idle timer." + (cancel-timer which-key--open-timer)) + ;; Display functions (defun which-key/show-buffer-display-buffer (height width) @@ -271,16 +287,6 @@ Finally, show the buffer." (intern (concat "which-key/hide-buffer-" (symbol-name method))))) (t (error "error: Invalid choice for which-key-display-method")))) -(defun which-key/start-open-timer () - "Activate idle timer." - (when which-key--open-timer (cancel-timer which-key--open-timer)); start over - (setq which-key--open-timer - (run-with-idle-timer which-key-idle-delay t 'which-key/update))) - -(defun which-key/stop-open-timer () - "Deactivate idle timer." - (cancel-timer which-key--open-timer)) - (provide 'which-key) ;;; which-key.el ends here From 67065197d340a24280b97cf7f6d49899f7ef42d8 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Sun, 5 Jul 2015 23:10:01 +0300 Subject: [PATCH 040/806] Refactor before work on window display Wanted to add support for using display-buffer or popwin, ran into some bugs, had to make changes to the code so future work will be easier. Details below: - separate between code to display window and code to populate buffer contents - add `which-key-horizontal-buffer-height` similar to `which-key-vertical-buffer-width` - abstract handling of different display methods into `which-key/show-buffer` and `which-key/hide-buffer`, instead of mixed in other functions - remove `which-key/make-display-method-aliases` - support two display methods: `minibuffer` and `side-window`, will add popwin later - create start/stop functions for which-key--close-timer - a few other changes --- which-key.el | 303 ++++++++++++++++++++++++++------------------------- 1 file changed, 152 insertions(+), 151 deletions(-) diff --git a/which-key.el b/which-key.el index 898c12e52d0..59caa12ca51 100644 --- a/which-key.el +++ b/which-key.el @@ -41,7 +41,9 @@ cells for replacing any text, keys and descriptions.") (defvar which-key-buffer-position 'bottom "Position of which-key buffer.") (defvar which-key-vertical-buffer-width 60 - "Width of which-key buffer .") + "Width of which-key buffer.") +(defvar which-key-horizontal-buffer-height 20 + "Height of which-key buffer.") (defvar which-key-display-method 'minibuffer "Controls the method used to display the keys. The default is minibuffer, but other possibilities are 'popwin and @@ -72,16 +74,15 @@ currently disabled.") "Toggle which-key-mode." :global t :lighter " WK" - (if which-key-mode - (progn - (unless which-key--setup-p (which-key/setup)) - (add-hook 'focus-out-hook 'which-key/stop-open-timer) - (add-hook 'focus-in-hook 'which-key/start-open-timer) - (which-key/make-display-method-aliases which-key-display-method) - (which-key/start-open-timer)) - (remove-hook 'focus-out-hook 'which-key/stop-open-timer) - (remove-hook 'focus-in-hook 'which-key/start-open-timer) - (which-key/stop-open-timer))) + (if which-key-mode + (progn + (unless which-key--setup-p (which-key/setup)) + (add-hook 'focus-out-hook 'which-key/stop-open-timer) + (add-hook 'focus-in-hook 'which-key/start-open-timer) + (which-key/start-open-timer)) + (remove-hook 'focus-out-hook 'which-key/stop-open-timer) + (remove-hook 'focus-in-hook 'which-key/start-open-timer) + (which-key/stop-open-timer))) (defun which-key/setup () "Create buffer for which-key." @@ -93,75 +94,112 @@ currently disabled.") (setq-local cursor-in-non-selected-windows nil)) (setq which-key--setup-p t)) -;; Helper functions +;; Timers -(defsubst which-key/truncate-description (desc) - "Truncate DESC description to `which-key-max-description-length'." - (if (> (length desc) which-key-max-description-length) - (concat (substring desc 0 which-key-max-description-length) "..") - desc)) +(defun which-key/start-open-timer () + "Activate idle timer." + (which-key/stop-open-timer) ; start over + (setq which-key--open-timer + (run-with-idle-timer which-key-idle-delay t 'which-key/update))) -(defun which-key/available-lines () - "Only works for minibuffer right now." - (when (eq which-key-display-method 'minibuffer) - (if (floatp max-mini-window-height) - (floor (* (frame-text-lines) - max-mini-window-height)) - max-mini-window-height))) +(defun which-key/stop-open-timer () + "Deactivate idle timer." + (when which-key--open-timer (cancel-timer which-key--open-timer))) -(defun which-key/replace-strings-from-alist (replacements) - "Find and replace text in buffer according to REPLACEMENTS, -which is an alist where the car of each element is the text to -replace and the cdr is the replacement text." - (dolist (rep replacements) - (save-excursion - (goto-char (point-min)) - (while (or (search-forward (car rep) nil t)) - (replace-match (cdr rep) t t))))) +(defun which-key/start-close-timer () + "Activate idle timer." + (which-key/stop-close-timer) ; start over + (setq which-key--close-timer + (run-at-time which-key-close-buffer-idle-delay + nil 'which-key/hide-buffer))) -;; in case I decide to add padding -;; (defsubst which-key/buffer-height (line-breaks) line-breaks) +(defun which-key/stop-close-timer () + "Deactivate idle timer." + (when which-key--close-timer (cancel-timer which-key--close-timer))) + +;; Update + +(defun which-key/update () + "Fill which-key--buffer with key descriptions and reformat. +Finally, show the buffer." + (let ((key (this-single-command-keys))) + (if (> (length key) 0) + (progn + (which-key/stop-close-timer) + (which-key/hide-buffer) + (let* ((buf (current-buffer)) + ;; (bottom-or-top (member which-key-buffer-position '(top bottom))) + ;; get formatted key bindings + (fmt-width-cons (which-key/get-formatted-key-bindings buf key)) + (formatted-keys (car fmt-width-cons)) + (column-width (cdr fmt-width-cons)) + (buffer-width (which-key/buffer-width column-width (window-width))) + ;; populate target buffer + (n-lines (which-key/populate-buffer formatted-keys column-width buffer-width))) + ;; show buffer + (when (which-key/show-buffer n-lines buffer-width) + (which-key/start-close-timer)))) + ;; command finished maybe close the window + (which-key/hide-buffer)))) + +;; Show/hide guide buffer + +(defun which-key/hide-buffer () + (when (buffer-live-p which-key--buffer) + (delete-windows-on which-key--buffer))) + +(defun which-key/show-buffer (height width) + "Show guide window. +Return nil if no window is shown, or if there is no need to start the +closing timer." + (cl-case which-key-display-method + (minibuffer (which-key/show-buffer-minibuf height width)) + (side-window (which-key/show-buffer-db height width)))) + +(defun which-key/show-buffer-minibuf (height width) + nil) + +(defun which-key/show-buffer-db (height width) + (let* ((side which-key-buffer-position) + (alist (delq nil (list (when side (cons 'side side)) + (when height (cons 'window-height height)) + (when width (cons 'window-width width)))))) + (display-buffer which-key--buffer (cons 'display-buffer-in-side-window alist)))) + +;; Size functions (defun which-key/buffer-width (column-width sel-window-width) - (cond ((eq which-key-display-method 'minibuffer) - (frame-text-cols)) - ((and (eq which-key-buffer-display-function 'display-buffer-in-side-window) - (member which-key-buffer-position '(left right))) - (min which-key-vertical-buffer-width column-width)) - ((eq which-key-buffer-display-function 'display-buffer-in-side-window) - (frame-text-width)) - ;; ((eq which-key-buffer-display-function 'display-buffer-below-selected) - ;; sel-window-width) - (t nil))) + (cl-case which-key-display-method + (minibuffer (which-key/buffer-width-minibuf column-width sel-window-width)) + (side-window (which-key/buffer-width-db column-width sel-window-width)))) -(defun which-key/format-matches (unformatted max-len-key max-len-desc) - "Turn each key-desc-cons in UNFORMATTED into formatted -strings (including text properties), and pad with spaces so that -all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the -longest key and description in the buffer, respectively." - (mapcar - (lambda (key-desc-cons) - (let* ((key (car key-desc-cons)) - (desc (cdr key-desc-cons)) - (group (string-match-p "^group:" desc)) - (desc (if group (substring desc 6) desc)) - (prefix (string-match-p "^Prefix" desc)) - (desc (if (or prefix group) (concat "+" desc) desc)) - (desc-face (if (or prefix group) - 'font-lock-keyword-face 'font-lock-function-name-face)) - ;; (sign (if (or prefix group) "▶" "→")) - (sign "→") - (desc (which-key/truncate-description desc)) - ;; pad keys to max-len-key - (padded-key (s-pad-left max-len-key " " key)) - (padded-desc (s-pad-right max-len-desc " " desc))) - (format (concat (propertize "%s" 'face 'font-lock-constant-face) " " - (propertize sign 'face 'font-lock-comment-face) " " - (propertize "%s" 'face desc-face) " ") - padded-key padded-desc))) - unformatted)) +(defun which-key/buffer-width-minibuf (column-width sel-window-width) + (frame-text-cols)) -;; "Core" functions +(defun which-key/buffer-width-db (column-width sel-window-width) + (if (member which-key-buffer-position '(left right)) + (min which-key-vertical-buffer-width column-width) + (frame-width))) + +(defun which-key/available-lines () + (cl-case which-key-display-method + (minibuffer (which-key/available-lines-minibuf)) + (side-window (which-key/available-lines-db)))) + +(defun which-key/available-lines-minibuf () + "Only works for minibuffer right now." + (if (floatp max-mini-window-height) + (floor (* (frame-text-lines) + max-mini-window-height)) + max-mini-window-height)) + +(defun which-key/available-lines-db () + (if (member which-key-buffer-position '(left right)) + (frame-height) + ;; FIXME: change to something like (min which-*-height (calculate-max-height)) + which-key-horizontal-buffer-height)) + +;; Buffer contents functions (defun which-key/get-formatted-key-bindings (buffer key) (let ((max-len-key 0) (max-len-desc 0) @@ -207,86 +245,49 @@ longest key and description in the buffer, respectively." (setq str-to-insert (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n")) (if (eq which-key-display-method 'minibuffer) (let (message-log-max) (message "%s" str-to-insert)) - (insert str-to-insert))) + (with-current-buffer which-key--buffer + (insert str-to-insert)))) n-lines)) -(defun which-key/update () - "Fill which-key--buffer with key descriptions and reformat. -Finally, show the buffer." - (let ((key (this-single-command-keys))) - (if (> (length key) 0) - (progn - (when which-key--close-timer (cancel-timer which-key--close-timer)) - (which-key/hide-buffer) - (let* ((buf (current-buffer)) - (bottom-or-top (member which-key-buffer-position '(top bottom))) - ;; get formatted key bindings - (fmt-width-cons (which-key/get-formatted-key-bindings buf key)) - (formatted-keys (car fmt-width-cons)) - (column-width (cdr fmt-width-cons)) - (buffer-width (which-key/buffer-width column-width (window-width))) - n-lines) - ;; populate target buffer - (setq n-lines (which-key/populate-buffer - formatted-keys column-width buffer-width)) - ;; show buffer - (unless (eq which-key-display-method 'minibuffer) - (setq which-key--window (which-key/show-buffer n-lines buffer-width) - which-key--close-timer (run-at-time - which-key-close-buffer-idle-delay - nil 'which-key/hide-buffer))))) - ;; command finished maybe close the window - (which-key/hide-buffer)))) +(defun which-key/replace-strings-from-alist (replacements) + "Find and replace text in buffer according to REPLACEMENTS, +which is an alist where the car of each element is the text to +replace and the cdr is the replacement text." + (dolist (rep replacements) + (save-excursion + (goto-char (point-min)) + (while (or (search-forward (car rep) nil t)) + (replace-match (cdr rep) t t))))) -;; Timers +(defun which-key/format-matches (unformatted max-len-key max-len-desc) + "Turn each key-desc-cons in UNFORMATTED into formatted +strings (including text properties), and pad with spaces so that +all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the +longest key and description in the buffer, respectively." + (mapcar + (lambda (key-desc-cons) + (let* ((key (car key-desc-cons)) + (desc (cdr key-desc-cons)) + (group (string-match-p "^group:" desc)) + (desc (if group (substring desc 6) desc)) + (prefix (string-match-p "^Prefix" desc)) + (desc (if (or prefix group) (concat "+" desc) desc)) + (desc-face (if (or prefix group) + 'font-lock-keyword-face 'font-lock-function-name-face)) + ;; (sign (if (or prefix group) "▶" "→")) + (sign "→") + (desc (which-key/truncate-description desc)) + ;; pad keys to max-len-key + (padded-key (s-pad-left max-len-key " " key)) + (padded-desc (s-pad-right max-len-desc " " desc))) + (format (concat (propertize "%s" 'face 'font-lock-constant-face) " " + (propertize sign 'face 'font-lock-comment-face) " " + (propertize "%s" 'face desc-face) " ") + padded-key padded-desc))) + unformatted)) -(defun which-key/start-open-timer () - "Activate idle timer." - (when which-key--open-timer (cancel-timer which-key--open-timer)); start over - (setq which-key--open-timer - (run-with-idle-timer which-key-idle-delay t 'which-key/update))) - -(defun which-key/stop-open-timer () - "Deactivate idle timer." - (cancel-timer which-key--open-timer)) - -;; Display functions - -(defun which-key/show-buffer-display-buffer (height width) - (let ((side which-key-buffer-position) alist) - (setq alist (list (when side (cons 'side side)) - (when height (cons 'window-height height)) - (when width (cons 'window-width width)))) - (display-buffer "*which-key*" (cons which-key-buffer-display-function alist)))) - -(defun which-key/hide-buffer-display-buffer () - (when (window-live-p which-key--window) - (delete-window which-key--window))) - -(defun which-key/show-buffer-popwin (height width) - "Using popwin popup buffer with dimensions HEIGHT and WIDTH." - (popwin:popup-buffer which-key-buffer-name - :height height - :width width - :noselect t - :position which-key-buffer-position)) - -(defun which-key/hide-buffer-popwin () - "Hide popwin buffer." - (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) - (popwin:close-popup-window))) - -(defun which-key/make-display-method-aliases (method) - (cond - ((eq method 'minibuffer) - (defun which-key/hide-buffer ())) - ((member method '(popwin display-buffer)) - (defalias 'which-key/show-buffer - (intern (concat "which-key/show-buffer-" (symbol-name method)))) - (defalias 'which-key/hide-buffer - (intern (concat "which-key/hide-buffer-" (symbol-name method))))) - (t (error "error: Invalid choice for which-key-display-method")))) - -(provide 'which-key) - -;;; which-key.el ends here +(defsubst which-key/truncate-description (desc) + "Truncate DESC description to `which-key-max-description-length'." + (if (> (length desc) which-key-max-description-length) + (concat (substring desc 0 which-key-max-description-length) "..") + desc)) From 1812df66954e9190e9615c7a752f929404fc5eaf Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Sun, 5 Jul 2015 23:24:31 +0300 Subject: [PATCH 041/806] Undo unintentional delete of provide line --- which-key.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/which-key.el b/which-key.el index 59caa12ca51..30a83b50604 100644 --- a/which-key.el +++ b/which-key.el @@ -291,3 +291,5 @@ longest key and description in the buffer, respectively." (if (> (length desc) which-key-max-description-length) (concat (substring desc 0 which-key-max-description-length) "..") desc)) + +(provide 'which-key) From 963944cbf60c79a450559489c38d1ba0abba197d Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Sun, 5 Jul 2015 23:26:47 +0300 Subject: [PATCH 042/806] Undo unintentional delete of end-of-file comment --- which-key.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/which-key.el b/which-key.el index 30a83b50604..c41af8b6a65 100644 --- a/which-key.el +++ b/which-key.el @@ -293,3 +293,5 @@ longest key and description in the buffer, respectively." desc)) (provide 'which-key) + +;;; which-key.el ends here From da0f7e1cd1d0ab6d070a4f3c7248a779c682ffb6 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 5 Jul 2015 13:55:19 -0400 Subject: [PATCH 043/806] Organize keys by pages --- which-key.el | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index 898c12e52d0..b8b77dada90 100644 --- a/which-key.el +++ b/which-key.el @@ -101,7 +101,7 @@ currently disabled.") (concat (substring desc 0 which-key-max-description-length) "..") desc)) -(defun which-key/available-lines () +(defun which-key/available-lines-per-page () "Only works for minibuffer right now." (when (eq which-key-display-method 'minibuffer) (if (floatp max-mini-window-height) @@ -189,25 +189,37 @@ longest key and description in the buffer, respectively." unformatted max-len-key max-len-desc))) (cons formatted (+ 4 max-len-key max-len-desc)))) +(defun which-key/create-page (avl-lines n-columns keys) + (let (lines + (n-keys (length keys)) + (n-lines (min (ceiling (/ (float n-keys) n-columns)) avl-lines))) + (dotimes (i n-lines) + (setq lines + (push + (subseq keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) + lines))) + (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n"))) + (defun which-key/populate-buffer (formatted-keys column-width buffer-width) - "Insert FORMATTED-STRINGS into buffer, breaking after BUFFER-WIDTH." - (let* ((char-count 0) (line-breaks 0) (this-column 1) - (width (if buffer-width buffer-width (frame-text-width))) + "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." + (let* ((width (if buffer-width buffer-width (frame-text-width))) (n-keys (length formatted-keys)) (n-columns (/ width column-width)) ;; integer division - (n-lines (which-key/available-lines)) - (max-lines (ceiling (/ (float n-keys) n-columns))) - (n-lines (if n-lines (min n-lines max-lines) max-lines)) - lines str-to-insert start end) + (avl-lines/page (which-key/available-lines-per-page)) + (n-keys/page (when avl-lines/page (* n-columns avl-lines/page))) + (n-pages (if n-keys/page + (ceiling (/ (float n-keys) n-keys/page)) 1)) + lines pages n-lines ) (when (> n-columns 0) - (dotimes (i n-lines) - (setq lines - (push (subseq formatted-keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) - lines))) - (setq str-to-insert (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n")) + (dotimes (p n-pages) + (setq pages + (push (which-key/create-page avl-lines/page n-columns + (subseq formatted-keys (* p n-keys/page) + (min (* (1+ p) n-keys/page) n-keys))) pages))) + (setq pages (reverse pages)) (if (eq which-key-display-method 'minibuffer) - (let (message-log-max) (message "%s" str-to-insert)) - (insert str-to-insert))) + (let (message-log-max) (message "%s" (car pages))) + (insert (car pages)))) n-lines)) (defun which-key/update () @@ -250,6 +262,9 @@ Finally, show the buffer." "Deactivate idle timer." (cancel-timer which-key--open-timer)) +;; placeholder for page flipping +;; (defun which-key/start-next-page-timer ()) + ;; Display functions (defun which-key/show-buffer-display-buffer (height width) From 20353a292366d5bbd16f90fe0480f00b26f1fdc7 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 5 Jul 2015 23:02:31 -0400 Subject: [PATCH 044/806] Rename config variables, simplifying interface The primary config variable is now which-key-popup-type, which supports 'minibuffer and 'side-window. 'side-window has further associated options, primarily which-key-side-window-location --- which-key.el | 194 ++++++++++++++++++++++++++------------------------- 1 file changed, 98 insertions(+), 96 deletions(-) diff --git a/which-key.el b/which-key.el index 7f6af2a10b3..5a03fcbc846 100644 --- a/which-key.el +++ b/which-key.el @@ -38,23 +38,28 @@ strings in the cdr for each key.") cells for replacing any text, keys and descriptions.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") -(defvar which-key-buffer-position 'bottom - "Position of which-key buffer.") -(defvar which-key-vertical-buffer-width 60 - "Width of which-key buffer.") -(defvar which-key-horizontal-buffer-height 20 - "Height of which-key buffer.") -(defvar which-key-display-method 'minibuffer - "Controls the method used to display the keys. The default is -minibuffer, but other possibilities are 'popwin and -'display-buffer. You will also be able write your own display -function (not implemented yet).") +(defvar which-key-popup-type 'minibuffer + "Supported types are minibuffer and side-window.") +(defvar which-key-side-window-location 'bottom + "Location of which-key popup when `which-key-popup-type' is +side-window. Should be one of top, bottom, left or right.") +(defvar which-key-side-window-max-width 60 + "Maximum width of which-key popup when type is side-window and +location is left or right.") +(defvar which-key-side-window-max-height 20 + "Maximum height of which-key popup when type is side-window and +location is top or bottom.") +;; (defvar which-key-display-method 'minibuffer +;; "Controls the method used to display the keys. The default is +;; minibuffer, but other possibilities are 'popwin and +;; 'display-buffer. You will also be able write your own display +;; function (not implemented yet).") -(defconst which-key-buffer-display-function - 'display-buffer-in-side-window - "Controls where the buffer is displayed. The current default is -also controlled by `which-key-buffer-position'. Other options are -currently disabled.") +;; (defconst which-key-buffer-display-function +;; 'display-buffer-in-side-window +;; "Controls where the buffer is displayed. The current default is +;; also controlled by `which-key-side-window-location'. Other options are +;; currently disabled.") ;; Internal Vars (defvar popwin:popup-buffer nil) @@ -111,7 +116,7 @@ currently disabled.") (which-key/stop-close-timer) ; start over (setq which-key--close-timer (run-at-time which-key-close-buffer-idle-delay - nil 'which-key/hide-buffer))) + nil 'which-key/hide-popup))) (defun which-key/stop-close-timer () "Deactivate idle timer." @@ -126,21 +131,20 @@ Finally, show the buffer." (if (> (length key) 0) (progn (which-key/stop-close-timer) - (which-key/hide-buffer) + (which-key/hide-popup) (let* ((buf (current-buffer)) - ;; (bottom-or-top (member which-key-buffer-position '(top bottom))) ;; get formatted key bindings (fmt-width-cons (which-key/get-formatted-key-bindings buf key)) (formatted-keys (car fmt-width-cons)) (column-width (cdr fmt-width-cons)) - (buffer-width (which-key/buffer-width column-width (window-width))) ;; populate target buffer - (n-lines (which-key/populate-buffer formatted-keys column-width buffer-width))) + (popup-act-dim + (which-key/populate-buffer formatted-keys column-width (window-width)))) ;; show buffer - (when (which-key/show-buffer n-lines buffer-width) + (when (which-key/show-popup popup-act-dim) (which-key/start-close-timer)))) ;; command finished maybe close the window - (which-key/hide-buffer)))) + (which-key/hide-popup)))) ;; Show/hide guide buffer @@ -149,23 +153,26 @@ Finally, show the buffer." ;; (when (window-live-p which-key--window) ;; (delete-window which-key--window))) -(defun which-key/hide-buffer () +(defun which-key/hide-popup () (when (buffer-live-p which-key--buffer) (delete-windows-on which-key--buffer))) -(defun which-key/show-buffer (height width) - "Show guide window. -Return nil if no window is shown, or if there is no need to start the -closing timer." - (cl-case which-key-display-method - (minibuffer (which-key/show-buffer-minibuffer height width)) - (side-window (which-key/show-buffer-side-window height width)))) +(defun which-key/show-popup (act-popup-dim) + "Show guide window. ACT-POPUP-DIM includes the +dimensions, (height . width) of the buffer text to be displayed +in the popup. Return nil if no window is shown, or if there is no +need to start the closing timer." + (cl-case which-key-popup-type + (minibuffer (which-key/show-buffer-minibuffer act-popup-dim)) + (side-window (which-key/show-buffer-side-window act-popup-dim)))) -(defun which-key/show-buffer-minibuffer (height width) +(defun which-key/show-buffer-minibuffer (act-popup-dim) nil) -(defun which-key/show-buffer-side-window (height width) - (let* ((side which-key-buffer-position) +(defun which-key/show-buffer-side-window (act-popup-dim) + (let* ((height (car act-popup-dim)) + (width (cdr act-popup-dim)) + (side which-key-side-window-location) (alist (delq nil (list (when side (cons 'side side)) (when height (cons 'window-height height)) (when width (cons 'window-width width)))))) @@ -178,7 +185,7 @@ closing timer." ;; :height height ;; :width width ;; :noselect t -;; :position which-key-buffer-position)) +;; :position which-key-side-window-location)) ;; (defun which-key/hide-buffer-popwin () ;; "Hide popwin buffer." @@ -187,44 +194,34 @@ closing timer." ;; Size functions -(defun which-key/buffer-width (column-width sel-window-width) - (cl-case which-key-display-method - (minibuffer (which-key/buffer-width-minibuffer column-width sel-window-width)) - (side-window (which-key/buffer-width-side-window column-width sel-window-width)))) +(defun which-key/popup-max-dimensions (column-width selected-window-width) + "Dimesion functions should return the maximum possible (height . width) +of the intended popup." + (cl-case which-key-popup-type + (minibuffer (which-key/minibuffer-max-dimensions)) + (side-window (which-key/side-window-max-dimensions column-width)))) -(defun which-key/buffer-width-minibuffer (column-width sel-window-width) - (frame-text-cols)) +(defun which-key/minibuffer-max-dimensions () + (cons + ;; height + (if (floatp max-mini-window-height) + (floor (* (frame-text-lines) + max-mini-window-height)) + max-mini-window-height) + ;; width + (frame-text-cols))) -(defun which-key/buffer-width-side-window (column-width sel-window-width) - (if (member which-key-buffer-position '(left right)) - (min which-key-vertical-buffer-width column-width) - (frame-width))) - -;; (defun which-key/available-lines () -;; "Only works for minibuffer right now." -;; (when (eq which-key-display-method 'minibuffer) -;; (if (floatp max-mini-window-height) -;; (floor (* (frame-text-lines) -;; max-mini-window-height)) -;; max-mini-window-height))) - -(defun which-key/available-lines () - (cl-case which-key-display-method - (minibuffer (which-key/available-lines-minibuffer)) - (side-window (which-key/available-lines-side-window)))) - -(defun which-key/available-lines-minibuffer () - "Only works for minibuffer right now." - (if (floatp max-mini-window-height) - (floor (* (frame-text-lines) - max-mini-window-height)) - max-mini-window-height)) - -(defun which-key/available-lines-side-window () - (if (member which-key-buffer-position '(left right)) - (frame-height) - ;; FIXME: change to something like (min which-*-height (calculate-max-height)) - which-key-horizontal-buffer-height)) +(defun which-key/side-window-max-dimensions (column-width) + (cons + ;; height + (if (member which-key-side-window-location '(left right)) + (frame-height) + ;; FIXME: change to something like (min which-*-height (calculate-max-height)) + which-key-side-window-max-height) + ;; width + (if (member which-key-side-window-location '(left right)) + (min which-key-side-window-max-width column-width) + (frame-width)))) ;; Buffer contents functions @@ -254,10 +251,10 @@ closing timer." unformatted max-len-key max-len-desc))) (cons formatted (+ 4 max-len-key max-len-desc)))) -(defun which-key/create-page (avl-lines n-columns keys) - (let (lines - (n-keys (length keys)) - (n-lines (min (ceiling (/ (float n-keys) n-columns)) avl-lines))) +(defun which-key/create-page (max-lines n-columns keys) + (let* ((n-keys (length keys)) + (n-lines (min (ceiling (/ (float n-keys) n-columns)) max-lines)) + lines) (dotimes (i n-lines) (setq lines (push @@ -265,28 +262,33 @@ closing timer." lines))) (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n"))) -(defun which-key/populate-buffer (formatted-keys column-width buffer-width) +(defun which-key/populate-buffer (formatted-keys column-width sel-win-width) "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." - (let* ((width (if buffer-width buffer-width (frame-text-width))) - (n-keys (length formatted-keys)) - (n-columns (/ width column-width)) ;; integer division - (avl-lines/page (which-key/available-lines)) - (n-keys/page (when avl-lines/page (* n-columns avl-lines/page))) - (n-pages (if n-keys/page - (ceiling (/ (float n-keys) n-keys/page)) 1)) - lines pages n-lines ) + (let* ((n-keys (length formatted-keys)) + (max-dims (which-key/popup-max-dimensions column-width sel-win-width)) + (max-height (when (car max-dims) (car max-dims))) + (max-width (when (cdr max-dims) (cdr max-dims))) + (n-columns (/ max-width column-width)) ;; integer division + (act-width (* n-columns column-width)) + ;; (avl-lines/page (which-key/available-lines)) + (max-keys/page (when max-height (* n-columns max-height))) + (n-pages (if max-keys/page + (ceiling (/ (float n-keys) max-keys/page)) 1)) + pages act-height) (when (> n-columns 0) (dotimes (p n-pages) (setq pages - (push (which-key/create-page avl-lines/page n-columns - (subseq formatted-keys (* p n-keys/page) - (min (* (1+ p) n-keys/page) n-keys))) pages))) - (setq pages (reverse pages)) - (if (eq which-key-display-method 'minibuffer) + (push (which-key/create-page max-height n-columns + (subseq formatted-keys (* p max-keys/page) + (min (* (1+ p) max-keys/page) n-keys))) pages))) + ;; not doing anything with other pages for now + (setq pages (reverse pages) + act-height (1+ (s-count-matches "\n" (car pages)))) + (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" (car pages))) (with-current-buffer which-key--buffer (insert (car pages))))) - n-lines)) + (cons act-height act-width))) (defun which-key/replace-strings-from-alist (replacements) "Find and replace text in buffer according to REPLACEMENTS, @@ -298,6 +300,12 @@ replace and the cdr is the replacement text." (while (or (search-forward (car rep) nil t)) (replace-match (cdr rep) t t))))) +(defsubst which-key/truncate-description (desc) + "Truncate DESC description to `which-key-max-description-length'." + (if (> (length desc) which-key-max-description-length) + (concat (substring desc 0 which-key-max-description-length) "..") + desc)) + (defun which-key/format-matches (unformatted max-len-key max-len-desc) "Turn each key-desc-cons in UNFORMATTED into formatted strings (including text properties), and pad with spaces so that @@ -325,12 +333,6 @@ longest key and description in the buffer, respectively." padded-key padded-desc))) unformatted)) -(defsubst which-key/truncate-description (desc) - "Truncate DESC description to `which-key-max-description-length'." - (if (> (length desc) which-key-max-description-length) - (concat (substring desc 0 which-key-max-description-length) "..") - desc)) - (provide 'which-key) ;;; which-key.el ends here From 02140265c42cc3f4793bfcd05ee6c5165ecd4b2c Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Mon, 6 Jul 2015 13:46:46 +0300 Subject: [PATCH 045/806] Frame popup support and some small fixes Summary of changes: - add emacs 24.3 as a dependency, because `display-buffer-in-major-side-window` doesn't exist in older emacsen - add option to show which-key buffer in a popup frame `(setq which-key-popup-type 'frame)` - stop close timer when disabling which-key-mode - don't hide which-key buffer before showing it. instead, show methods handle the case that the buffer is already shown - `which-key/hide-popup` calls function depending on popup type (similar to `which-key/show-popup`) - use `display-buffer-in-major-side-window` instead of `display-buffer-in-side-window`, for popup type side-window. ensures new side window is created properly even if other side windows already exist. - erase previous contents of which-key buffer before inserting new contents, and adjust buffer display in window by moving point to the buffer's beginning --- which-key.el | 95 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 5a03fcbc846..0230aad242d 100644 --- a/which-key.el +++ b/which-key.el @@ -6,7 +6,7 @@ ;; URL: https://github.com/justbur/which-key/ ;; Version: 0.1 ;; Keywords: -;; Package-Requires: ((s "1.9.0") (popwin "1.0.0")) +;; Package-Requires: ((emacs "24.3") (s "1.9.0") (popwin "1.0.0")) ;;; Commentary: ;; @@ -49,6 +49,10 @@ location is left or right.") (defvar which-key-side-window-max-height 20 "Maximum height of which-key popup when type is side-window and location is top or bottom.") +(defvar which-key-frame-max-width 60 + "Maximum width of which-key popup when type is frame.") +(defvar which-key-frame-max-height 20 + "Maximum height of which-key popup when type is frame.") ;; (defvar which-key-display-method 'minibuffer ;; "Controls the method used to display the keys. The default is ;; minibuffer, but other possibilities are 'popwin and @@ -73,6 +77,9 @@ location is top or bottom.") "Internal: Holds reference to close window timer.") (defvar which-key--setup-p nil "Internal: Non-nil if which-key buffer has been setup.") +(defvar which-key--frame nil + "Internal: Holds reference to which-key frame. +Used when `which-key-popup-type' is 'popup.") ;;;###autoload (define-minor-mode which-key-mode @@ -87,7 +94,8 @@ location is top or bottom.") (which-key/start-open-timer)) (remove-hook 'focus-out-hook 'which-key/stop-open-timer) (remove-hook 'focus-in-hook 'which-key/start-open-timer) - (which-key/stop-open-timer))) + (which-key/stop-open-timer) + (which-key/stop-close-timer))) (defun which-key/setup () "Create buffer for which-key." @@ -131,7 +139,9 @@ Finally, show the buffer." (if (> (length key) 0) (progn (which-key/stop-close-timer) - (which-key/hide-popup) + ;; remove this because `which-key/show-popup' should be able to + ;; handle the case where which-key buffer is already displayed + ;; (which-key/hide-popup) (let* ((buf (current-buffer)) ;; get formatted key bindings (fmt-width-cons (which-key/get-formatted-key-bindings buf key)) @@ -154,8 +164,23 @@ Finally, show the buffer." ;; (delete-window which-key--window))) (defun which-key/hide-popup () + (cl-case which-key-popup-type + (minibuffer (which-key/hide-buffer-minibuffer)) + (side-window (which-key/hide-buffer-side-window)) + (frame (which-key/hide-buffer-frame)))) + +(defun which-key/hide-buffer-minibuffer () + nil) + +(defun which-key/hide-buffer-side-window () (when (buffer-live-p which-key--buffer) - (delete-windows-on which-key--buffer))) + ;; in case which-key buffer was shown in an existing window, `quit-window' + ;; will re-show the previous buffer, instead of closing the window + (quit-windows-on which-key--buffer))) + +(defun which-key/hide-buffer-frame () + (when (frame-live-p which-key--frame) + (delete-frame which-key--frame))) (defun which-key/show-popup (act-popup-dim) "Show guide window. ACT-POPUP-DIM includes the @@ -164,7 +189,8 @@ in the popup. Return nil if no window is shown, or if there is no need to start the closing timer." (cl-case which-key-popup-type (minibuffer (which-key/show-buffer-minibuffer act-popup-dim)) - (side-window (which-key/show-buffer-side-window act-popup-dim)))) + (side-window (which-key/show-buffer-side-window act-popup-dim)) + (frame (which-key/show-buffer-frame act-popup-dim)))) (defun which-key/show-buffer-minibuffer (act-popup-dim) nil) @@ -173,10 +199,53 @@ need to start the closing timer." (let* ((height (car act-popup-dim)) (width (cdr act-popup-dim)) (side which-key-side-window-location) - (alist (delq nil (list (when side (cons 'side side)) - (when height (cons 'window-height height)) + (alist (delq nil (list (when height (cons 'window-height height)) (when width (cons 'window-width width)))))) - (display-buffer which-key--buffer (cons 'display-buffer-in-side-window alist)))) + ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' + ;; were added in Emacs 24.3 + + ;; If two side windows exist in the same side, `display-buffer-in-side-window' + ;; will use on of them, which isn't desirable. `display-buffer-in-major-side-window' + ;; will pop a new window, so we use that. + ;; +-------------------------+ +-------------------------+ + ;; | regular window | | regular window | + ;; | | +------------+------------+ + ;; +------------+------------+ --> | side-win 1 | side-win 2 | + ;; | side-win 1 | side-win 2 | |------------+------------| + ;; | | | | which-key window | + ;; +------------+------------+ +------------+------------+ + ;; (display-buffer which-key--buffer (cons 'display-buffer-in-side-window alist)) + ;; side defaults to bottom + (if (get-buffer-window which-key--buffer) + (display-buffer-reuse-window which-key--buffer alist) + (display-buffer-in-major-side-window which-key--buffer side 0 alist)))) + +(defun which-key/show-buffer-frame (act-popup-dim) + (let ((orig-window (selected-window)) + (new-window (if (and (frame-live-p which-key--frame) + (eq which-key--buffer + (window-buffer (frame-root-window which-key--frame)))) + (which-key/show-buffer-reuse-frame) + (which-key/show-buffer-new-frame act-popup-dim)))) + (fit-frame-to-buffer (window-frame new-window)) + (select-frame-set-input-focus (window-frame orig-window)) + (select-window orig-window) + (setq which-key--frame (window-frame new-window)) + new-window)) + +(defun which-key/show-buffer-new-frame (act-popup-dim) + (let* ((height (car act-popup-dim)) + (width (cdr act-popup-dim)) + (frame-params (delq nil (list (when (and height width) (cons 'window-height height)) + (when (and height width) (cons 'window-width width)) + (cons 'minibuffer nil) + (cons 'name "which-key")))) + (alist (list (cons 'pop-up-frame-parameters frame-params) + (cons 'inhibit-switch-frame t)))) + (display-buffer-pop-up-frame which-key--buffer alist))) + +(defun which-key/show-buffer-reuse-frame () + (display-buffer-reuse-window which-key--buffer `((reusable-frames . ,which-key--frame)))) ;; Keep for popwin maybe (Used to work) ;; (defun which-key/show-buffer-popwin (height width) @@ -199,7 +268,8 @@ need to start the closing timer." of the intended popup." (cl-case which-key-popup-type (minibuffer (which-key/minibuffer-max-dimensions)) - (side-window (which-key/side-window-max-dimensions column-width)))) + (side-window (which-key/side-window-max-dimensions column-width)) + (frame (which-key/frame-max-dimensions)))) (defun which-key/minibuffer-max-dimensions () (cons @@ -223,6 +293,9 @@ of the intended popup." (min which-key-side-window-max-width column-width) (frame-width)))) +(defun which-key/frame-max-dimensions () + (cons which-key-frame-max-height which-key-frame-max-width)) + ;; Buffer contents functions (defun which-key/get-formatted-key-bindings (buffer key) @@ -287,7 +360,9 @@ of the intended popup." (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" (car pages))) (with-current-buffer which-key--buffer - (insert (car pages))))) + (erase-buffer) + (insert (car pages)) + (goto-char (point-min))))) (cons act-height act-width))) (defun which-key/replace-strings-from-alist (replacements) From 44450f60c7f855ceb23529eb449db299b59b8755 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Mon, 6 Jul 2015 14:51:31 +0300 Subject: [PATCH 046/806] Fix doc, new frame parameters --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 0230aad242d..6583664a2d9 100644 --- a/which-key.el +++ b/which-key.el @@ -79,7 +79,7 @@ location is top or bottom.") "Internal: Non-nil if which-key buffer has been setup.") (defvar which-key--frame nil "Internal: Holds reference to which-key frame. -Used when `which-key-popup-type' is 'popup.") +Used when `which-key-popup-type' is frame.") ;;;###autoload (define-minor-mode which-key-mode @@ -236,8 +236,8 @@ need to start the closing timer." (defun which-key/show-buffer-new-frame (act-popup-dim) (let* ((height (car act-popup-dim)) (width (cdr act-popup-dim)) - (frame-params (delq nil (list (when (and height width) (cons 'window-height height)) - (when (and height width) (cons 'window-width width)) + (frame-params (delq nil (list (when (and height width) (cons 'height height)) + (when (and height width) (cons 'width width)) (cons 'minibuffer nil) (cons 'name "which-key")))) (alist (list (cons 'pop-up-frame-parameters frame-params) From a1aa345111fafc3bd78ff4b19bb3cd279e51f835 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 08:03:59 -0400 Subject: [PATCH 047/806] Delete old defvars and minor docstring cleanup --- which-key.el | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index 0230aad242d..d0cd142fbff 100644 --- a/which-key.el +++ b/which-key.el @@ -39,7 +39,7 @@ cells for replacing any text, keys and descriptions.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-popup-type 'minibuffer - "Supported types are minibuffer and side-window.") + "Supported types are minibuffer, side-window and frame.") (defvar which-key-side-window-location 'bottom "Location of which-key popup when `which-key-popup-type' is side-window. Should be one of top, bottom, left or right.") @@ -53,17 +53,6 @@ location is top or bottom.") "Maximum width of which-key popup when type is frame.") (defvar which-key-frame-max-height 20 "Maximum height of which-key popup when type is frame.") -;; (defvar which-key-display-method 'minibuffer -;; "Controls the method used to display the keys. The default is -;; minibuffer, but other possibilities are 'popwin and -;; 'display-buffer. You will also be able write your own display -;; function (not implemented yet).") - -;; (defconst which-key-buffer-display-function -;; 'display-buffer-in-side-window -;; "Controls where the buffer is displayed. The current default is -;; also controlled by `which-key-side-window-location'. Other options are -;; currently disabled.") ;; Internal Vars (defvar popwin:popup-buffer nil) @@ -79,7 +68,7 @@ location is top or bottom.") "Internal: Non-nil if which-key buffer has been setup.") (defvar which-key--frame nil "Internal: Holds reference to which-key frame. -Used when `which-key-popup-type' is 'popup.") +Used when `which-key-popup-type' is frame.") ;;;###autoload (define-minor-mode which-key-mode From c551775370435ad59d7539f3c9816339235054d2 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 09:48:56 -0400 Subject: [PATCH 048/806] Remove popwin requirement; Add require cl --- which-key.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 06bf29815e4..97393af9c0b 100644 --- a/which-key.el +++ b/which-key.el @@ -6,7 +6,7 @@ ;; URL: https://github.com/justbur/which-key/ ;; Version: 0.1 ;; Keywords: -;; Package-Requires: ((emacs "24.3") (s "1.9.0") (popwin "1.0.0")) +;; Package-Requires: ((emacs "24.3") (s "1.9.0")) ;;; Commentary: ;; @@ -55,7 +55,7 @@ location is top or bottom.") "Maximum height of which-key popup when type is frame.") ;; Internal Vars -(defvar popwin:popup-buffer nil) +;; (defvar popwin:popup-buffer nil) (defvar which-key--buffer nil "Internal: Holds reference to which-key buffer.") (defvar which-key--window nil @@ -88,8 +88,9 @@ Used when `which-key-popup-type' is frame.") (defun which-key/setup () "Create buffer for which-key." + (require 'cl) (require 's) - (require 'popwin) +;; (require 'popwin) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer (setq-local cursor-type nil) From a760c589db0f4ed13dd4efefaa641f836cfc64b9 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 10:54:24 -0400 Subject: [PATCH 049/806] Fix problem with echo-keystrokes and minibuffer If the echo-keystrokes delay is too long, it clobbers which-key in the minibuffer --- which-key.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/which-key.el b/which-key.el index 97393af9c0b..37a6e234496 100644 --- a/which-key.el +++ b/which-key.el @@ -69,6 +69,8 @@ location is top or bottom.") (defvar which-key--frame nil "Internal: Holds reference to which-key frame. Used when `which-key-popup-type' is frame.") +(defvar which-key--echo-keystrokes-backup echo-keystrokes + "Internal: Backup the initial value of echo-keystrokes.") ;;;###autoload (define-minor-mode which-key-mode @@ -78,9 +80,13 @@ Used when `which-key-popup-type' is frame.") (if which-key-mode (progn (unless which-key--setup-p (which-key/setup)) + ;; turn off echo-keytrokes for minibuffer (it can interfer) + (when (eq which-key-popup-type 'minibuffer) (setq echo-keystrokes 0)) (add-hook 'focus-out-hook 'which-key/stop-open-timer) (add-hook 'focus-in-hook 'which-key/start-open-timer) (which-key/start-open-timer)) + ;; make sure echo-keystrokes returns to original value + (setq echo-keystrokes which-key--echo-keystrokes-backup) (remove-hook 'focus-out-hook 'which-key/stop-open-timer) (remove-hook 'focus-in-hook 'which-key/start-open-timer) (which-key/stop-open-timer) From 3119e80c3e6294ee9990b8aa00fb4251c58ef70e Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 11:03:00 -0400 Subject: [PATCH 050/806] Add .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..3853c61a77d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Used to setup library paths for emacs -Q +private-test-setup.el \ No newline at end of file From 163eacfa9d78bdebec83337031a56acc57dea168 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 11:18:55 -0400 Subject: [PATCH 051/806] Allow echo-keystrokes but make it quick --- .gitignore | 3 ++- which-key.el | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 3853c61a77d..34da34edea6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +*~ # Used to setup library paths for emacs -Q -private-test-setup.el \ No newline at end of file +private-test-setup.el diff --git a/which-key.el b/which-key.el index 37a6e234496..7c7e16753ba 100644 --- a/which-key.el +++ b/which-key.el @@ -80,8 +80,11 @@ Used when `which-key-popup-type' is frame.") (if which-key-mode (progn (unless which-key--setup-p (which-key/setup)) - ;; turn off echo-keytrokes for minibuffer (it can interfer) - (when (eq which-key-popup-type 'minibuffer) (setq echo-keystrokes 0)) + ;; make echo-keytrokes fast for minibuffer popup + ;; (it can interfer if it's too slow) + (when (and (> echo-keystrokes 0) + (eq which-key-popup-type 'minibuffer)) + (setq echo-keystrokes 0.1)) (add-hook 'focus-out-hook 'which-key/stop-open-timer) (add-hook 'focus-in-hook 'which-key/start-open-timer) (which-key/start-open-timer)) @@ -344,7 +347,7 @@ of the intended popup." (n-pages (if max-keys/page (ceiling (/ (float n-keys) max-keys/page)) 1)) pages act-height) - (when (> n-columns 0) + (when (and (> n-keys 0) (> n-columns 0)) (dotimes (p n-pages) (setq pages (push (which-key/create-page max-height n-columns From 35a171ef7dc72f33460988fa0c64ae8106bbb717 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Mon, 6 Jul 2015 19:22:40 +0300 Subject: [PATCH 052/806] Try to fix focus problems with popup frame #7 --- which-key.el | 67 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/which-key.el b/which-key.el index 7c7e16753ba..efc536f46f9 100644 --- a/which-key.el +++ b/which-key.el @@ -220,31 +220,58 @@ need to start the closing timer." (display-buffer-in-major-side-window which-key--buffer side 0 alist)))) (defun which-key/show-buffer-frame (act-popup-dim) - (let ((orig-window (selected-window)) + (let* ((orig-window (selected-window)) + (frame-height (+ (car act-popup-dim) + (if (with-current-buffer which-key--buffer + mode-line-format) + 1 + 0))) + ;; without adding 2, frame sometimes isn't wide enough for the buffer. + ;; this is probably because of the fringes. however, setting fringes + ;; sizes to 0 (instead of adding 2) didn't always make the frame wide + ;; enough. don't know why it is so. + (frame-width (+ (cdr act-popup-dim) 2)) (new-window (if (and (frame-live-p which-key--frame) (eq which-key--buffer (window-buffer (frame-root-window which-key--frame)))) - (which-key/show-buffer-reuse-frame) - (which-key/show-buffer-new-frame act-popup-dim)))) - (fit-frame-to-buffer (window-frame new-window)) - (select-frame-set-input-focus (window-frame orig-window)) - (select-window orig-window) - (setq which-key--frame (window-frame new-window)) - new-window)) + (which-key/show-buffer-reuse-frame frame-height frame-width) + (which-key/show-buffer-new-frame frame-height frame-width)))) + (when new-window + ;; display successful + (setq which-key--frame (window-frame new-window)) + new-window))) -(defun which-key/show-buffer-new-frame (act-popup-dim) - (let* ((height (car act-popup-dim)) - (width (cdr act-popup-dim)) - (frame-params (delq nil (list (when (and height width) (cons 'height height)) - (when (and height width) (cons 'width width)) - (cons 'minibuffer nil) - (cons 'name "which-key")))) - (alist (list (cons 'pop-up-frame-parameters frame-params) - (cons 'inhibit-switch-frame t)))) - (display-buffer-pop-up-frame which-key--buffer alist))) +(defun which-key/show-buffer-new-frame (frame-height frame-width) + (let* ((frame-params `((height . ,frame-height) + (width . ,frame-width) + ;; tell the window manager to respect the given sizes + (user-size . t) + ;; which-key frame doesn't need a minibuffer + (minibuffer . nil) + (name . "which-key") + ;; no need for scroll bars in which-key frame + (vertical-scroll-bars . nil) + ;; (left-fringe . 0) + ;; (right-fringe . 0) + ;; (right-divider-width . 0) + ;; make sure frame is visible + (visibility . t))) + (alist `((pop-up-frame-parameters . ,frame-params))) + (orig-frame (selected-frame)) + (new-window (display-buffer-pop-up-frame which-key--buffer alist))) + (when new-window + ;; display successful + (redirect-frame-focus (window-frame new-window) orig-frame) + new-window))) -(defun which-key/show-buffer-reuse-frame () - (display-buffer-reuse-window which-key--buffer `((reusable-frames . ,which-key--frame)))) +(defun which-key/show-buffer-reuse-frame (frame-height frame-width) + (let ((window + (display-buffer-reuse-window which-key--buffer + `((reusable-frames . ,which-key--frame))))) + (when window + ;; display successful + (set-frame-size (window-frame window) frame-width frame-height) + window))) ;; Keep for popwin maybe (Used to work) ;; (defun which-key/show-buffer-popwin (height width) From 1cbad4b774bd25f3b19b96d3639434490c9b4261 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Mon, 6 Jul 2015 19:34:31 +0300 Subject: [PATCH 053/806] Hide buffer right before command execution Fixes #9, this is also what guide-key uses. When quoting functions, using "#'" tells the compiler that you're quoting a function, and allows it to catch void function errors. --- which-key.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 7c7e16753ba..4f1e8c23440 100644 --- a/which-key.el +++ b/which-key.el @@ -81,17 +81,19 @@ Used when `which-key-popup-type' is frame.") (progn (unless which-key--setup-p (which-key/setup)) ;; make echo-keytrokes fast for minibuffer popup - ;; (it can interfer if it's too slow) + ;; (it can interfer if it's too slow) (when (and (> echo-keystrokes 0) - (eq which-key-popup-type 'minibuffer)) - (setq echo-keystrokes 0.1)) - (add-hook 'focus-out-hook 'which-key/stop-open-timer) - (add-hook 'focus-in-hook 'which-key/start-open-timer) + (eq which-key-popup-type 'minibuffer)) + (setq echo-keystrokes 0.1)) + (add-hook 'pre-command-hook #'which-key/hide-popup) + (add-hook 'focus-out-hook #'which-key/stop-open-timer) + (add-hook 'focus-in-hook #'which-key/start-open-timer) (which-key/start-open-timer)) ;; make sure echo-keystrokes returns to original value (setq echo-keystrokes which-key--echo-keystrokes-backup) - (remove-hook 'focus-out-hook 'which-key/stop-open-timer) - (remove-hook 'focus-in-hook 'which-key/start-open-timer) + (remove-hook 'pre-command-hook #'which-key/hide-popup) + (remove-hook 'focus-out-hook #'which-key/stop-open-timer) + (remove-hook 'focus-in-hook #'which-key/start-open-timer) (which-key/stop-open-timer) (which-key/stop-close-timer))) From 9cec7b8e1d7738898c027850f70fe70d0862eaca Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 13:23:19 -0400 Subject: [PATCH 054/806] Refactor replacement alists --- which-key.el | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index 7c7e16753ba..7571f7242c3 100644 --- a/which-key.el +++ b/which-key.el @@ -29,13 +29,14 @@ "Truncate the description of keys to this length. Also adds \"..\".") (defvar which-key-key-replacement-alist - '((">". "") ("<" . "") ("left" ."←") ("right" . "→")) - "The strings in the car of each cons cell are replaced with the + '(("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") ("\\(left\\)" ."←") + ("\\(right\\)" . "→")) + "The strings in the car of each cons cell are replaced with the strings in the cdr for each key.") -(defvar which-key-general-replacement-alist +(defvar which-key-description-replacement-alist '(("Prefix Command" . "prefix")) "See `which-key-key-replacement-alist'. This is a list of cons -cells for replacing any text, keys and descriptions.") +cells for replacing descriptions.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-popup-type 'minibuffer @@ -303,14 +304,12 @@ of the intended popup." key-match desc-match unformatted formatted) (with-temp-buffer (describe-buffer-bindings buffer key) - (which-key/replace-strings-from-alist which-key-general-replacement-alist) (goto-char (point-max)) ; want to put last keys in first (while (re-search-backward (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" key-str-qt) nil t) - (setq key-match (s-replace-all - which-key-key-replacement-alist (match-string 1)) + (setq key-match (match-string 1) desc-match (match-string 2) max-len-key (max max-len-key (length key-match)) max-len-desc (max max-len-desc (length desc-match))) @@ -364,15 +363,24 @@ of the intended popup." (goto-char (point-min))))) (cons act-height act-width))) -(defun which-key/replace-strings-from-alist (replacements) +(defun which-key/perform-replacements (key-desc-cons-list key-reps desc-reps &optional literal) "Find and replace text in buffer according to REPLACEMENTS, which is an alist where the car of each element is the text to replace and the cdr is the replacement text." - (dolist (rep replacements) - (save-excursion - (goto-char (point-min)) - (while (or (search-forward (car rep) nil t)) - (replace-match (cdr rep) t t))))) + (mapcar + (lambda (el) + (let ((key (car el)) (desc (cdr el))) + (dolist (key-rep key-reps) + (setq key + (if (string-match (car key-rep) key) + (replace-match (cdr key-rep) t literal key) + key))) + (dolist (desc-rep desc-reps) + (setq desc + (if (string-match (car desc-rep) desc) + (replace-match (cdr desc-rep) t literal desc) + desc))) + (cons key desc))) key-desc-cons-list)) (defsubst which-key/truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." @@ -385,6 +393,9 @@ replace and the cdr is the replacement text." strings (including text properties), and pad with spaces so that all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the longest key and description in the buffer, respectively." + (setq unformatted (which-key/perform-replacements + unformatted which-key-key-replacement-alist + which-key-description-replacement-alist nil)) (mapcar (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) From eb6f52a0cbb1939d6294c1da9d5d37365e7779d3 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 13:40:49 -0400 Subject: [PATCH 055/806] Make arrow separator into variable --- which-key.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 7571f7242c3..5ae013d467f 100644 --- a/which-key.el +++ b/which-key.el @@ -28,6 +28,8 @@ (defvar which-key-max-description-length 27 "Truncate the description of keys to this length. Also adds \"..\".") +(defvar which-key-separator "→" + "Separator to use between key and description.") (defvar which-key-key-replacement-alist '(("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") ("\\(left\\)" ."←") ("\\(right\\)" . "→")) @@ -406,14 +408,13 @@ longest key and description in the buffer, respectively." (desc (if (or prefix group) (concat "+" desc) desc)) (desc-face (if (or prefix group) 'font-lock-keyword-face 'font-lock-function-name-face)) - ;; (sign (if (or prefix group) "▶" "→")) - (sign "→") + (separator which-key-separator) (desc (which-key/truncate-description desc)) ;; pad keys to max-len-key (padded-key (s-pad-left max-len-key " " key)) (padded-desc (s-pad-right max-len-desc " " desc))) (format (concat (propertize "%s" 'face 'font-lock-constant-face) " " - (propertize sign 'face 'font-lock-comment-face) " " + (propertize separator 'face 'font-lock-comment-face) " " (propertize "%s" 'face desc-face) " ") padded-key padded-desc))) unformatted)) From c8bf18a49bbe9c1afa262437391e4ec0549444c7 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 13:53:10 -0400 Subject: [PATCH 056/806] Redo replacement logic --- which-key.el | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/which-key.el b/which-key.el index 5ae013d467f..a9149151f70 100644 --- a/which-key.el +++ b/which-key.el @@ -365,24 +365,16 @@ of the intended popup." (goto-char (point-min))))) (cons act-height act-width))) -(defun which-key/perform-replacements (key-desc-cons-list key-reps desc-reps &optional literal) +(defun which-key/maybe-replace (text repl-alist &optional literal) "Find and replace text in buffer according to REPLACEMENTS, which is an alist where the car of each element is the text to replace and the cdr is the replacement text." - (mapcar - (lambda (el) - (let ((key (car el)) (desc (cdr el))) - (dolist (key-rep key-reps) - (setq key - (if (string-match (car key-rep) key) - (replace-match (cdr key-rep) t literal key) - key))) - (dolist (desc-rep desc-reps) - (setq desc - (if (string-match (car desc-rep) desc) - (replace-match (cdr desc-rep) t literal desc) - desc))) - (cons key desc))) key-desc-cons-list)) + (dolist (repl repl-alist) + (setq text + (if (string-match (car repl) text) + (replace-match (cdr repl) t literal text) + text))) + text) (defsubst which-key/truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." @@ -395,13 +387,12 @@ replace and the cdr is the replacement text." strings (including text properties), and pad with spaces so that all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the longest key and description in the buffer, respectively." - (setq unformatted (which-key/perform-replacements - unformatted which-key-key-replacement-alist - which-key-description-replacement-alist nil)) (mapcar (lambda (key-desc-cons) - (let* ((key (car key-desc-cons)) - (desc (cdr key-desc-cons)) + (let* ((key (which-key/maybe-replace (car key-desc-cons) + which-key-key-replacement-alist)) + (desc (which-key/maybe-replace (cdr key-desc-cons) + which-key-description-replacement-alist)) (group (string-match-p "^group:" desc)) (desc (if group (substring desc 6) desc)) (prefix (string-match-p "^Prefix" desc)) From 85f65a910da32c34e5f4c1c96ed155a30a4ecad0 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 14:22:08 -0400 Subject: [PATCH 057/806] Work on docstrings --- which-key.el | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index a9149151f70..a3ba139e6d0 100644 --- a/which-key.el +++ b/which-key.el @@ -325,6 +325,9 @@ of the intended popup." (cons formatted (+ 4 max-len-key max-len-desc)))) (defun which-key/create-page (max-lines n-columns keys) + "Format KEYS into string representing a single page of text. +N-COLUMNS is the number of text columns to use and MAX-LINES is +the maximum number of lines availabel in the target buffer." (let* ((n-keys (length keys)) (n-lines (min (ceiling (/ (float n-keys) n-columns)) max-lines)) lines) @@ -366,9 +369,10 @@ of the intended popup." (cons act-height act-width))) (defun which-key/maybe-replace (text repl-alist &optional literal) - "Find and replace text in buffer according to REPLACEMENTS, -which is an alist where the car of each element is the text to -replace and the cdr is the replacement text." + "Perform replacements on TEXT. +REPL-ALIST is an alist where the car of each element is the text +to replace and the cdr is the replacement text. Unless LITERAL is +non-nil regexp is used in the replacements." (dolist (repl repl-alist) (setq text (if (string-match (car repl) text) @@ -385,8 +389,10 @@ replace and the cdr is the replacement text." (defun which-key/format-matches (unformatted max-len-key max-len-desc) "Turn each key-desc-cons in UNFORMATTED into formatted strings (including text properties), and pad with spaces so that -all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the -longest key and description in the buffer, respectively." +all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the +longest key and description in the buffer, respectively. +Replacements are performed using the key and description +replacement alists." (mapcar (lambda (key-desc-cons) (let* ((key (which-key/maybe-replace (car key-desc-cons) From b2ea6227c3c1ed3433a58a41518a3017ee5c8304 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 14:37:27 -0400 Subject: [PATCH 058/806] Try without close timer --- which-key.el | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index c191d9137de..28f579c4e0d 100644 --- a/which-key.el +++ b/which-key.el @@ -23,8 +23,8 @@ (defvar which-key-idle-delay 0.6 "Delay (in seconds) for which-key buffer to popup.") -(defvar which-key-close-buffer-idle-delay 4 - "Delay (in seconds) after which buffer is forced closed.") +;; (defvar which-key-close-buffer-idle-delay 4 +;; "Delay (in seconds) after which buffer is forced closed.") (defvar which-key-max-description-length 27 "Truncate the description of keys to this length. Also adds \"..\".") @@ -65,8 +65,8 @@ location is top or bottom.") "Internal: Holds reference to which-key window.") (defvar which-key--open-timer nil "Internal: Holds reference to open window timer.") -(defvar which-key--close-timer nil - "Internal: Holds reference to close window timer.") +;; (defvar which-key--close-timer nil +;; "Internal: Holds reference to close window timer.") (defvar which-key--setup-p nil "Internal: Non-nil if which-key buffer has been setup.") (defvar which-key--frame nil @@ -123,16 +123,16 @@ Used when `which-key-popup-type' is frame.") "Deactivate idle timer." (when which-key--open-timer (cancel-timer which-key--open-timer))) -(defun which-key/start-close-timer () - "Activate idle timer." - (which-key/stop-close-timer) ; start over - (setq which-key--close-timer - (run-at-time which-key-close-buffer-idle-delay - nil 'which-key/hide-popup))) +;; (defun which-key/start-close-timer () +;; "Activate idle timer." +;; (which-key/stop-close-timer) ; start over +;; (setq which-key--close-timer +;; (run-at-time which-key-close-buffer-idle-delay +;; nil 'which-key/hide-popup))) -(defun which-key/stop-close-timer () - "Deactivate idle timer." - (when which-key--close-timer (cancel-timer which-key--close-timer))) +;; (defun which-key/stop-close-timer () +;; "Deactivate idle timer." +;; (when which-key--close-timer (cancel-timer which-key--close-timer))) ;; Update @@ -142,7 +142,7 @@ Finally, show the buffer." (let ((key (this-single-command-keys))) (if (> (length key) 0) (progn - (which-key/stop-close-timer) + ;; (which-key/stop-close-timer) ;; remove this because `which-key/show-popup' should be able to ;; handle the case where which-key buffer is already displayed ;; (which-key/hide-popup) @@ -155,8 +155,9 @@ Finally, show the buffer." (popup-act-dim (which-key/populate-buffer formatted-keys column-width (window-width)))) ;; show buffer - (when (which-key/show-popup popup-act-dim) - (which-key/start-close-timer)))) + (which-key/show-popup popup-act-dim))) + ;; (when (which-key/show-popup popup-act-dim) + ;; (which-key/start-close-timer)))) ;; command finished maybe close the window (which-key/hide-popup)))) From a657ea8fafe5000719f8ef0cdfc35d6294559cd7 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 14:40:07 -0400 Subject: [PATCH 059/806] Change side-window default position to right --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 28f579c4e0d..728fdb138bc 100644 --- a/which-key.el +++ b/which-key.el @@ -43,7 +43,7 @@ cells for replacing descriptions.") "Name of which-key buffer.") (defvar which-key-popup-type 'minibuffer "Supported types are minibuffer, side-window and frame.") -(defvar which-key-side-window-location 'bottom +(defvar which-key-side-window-location 'right "Location of which-key popup when `which-key-popup-type' is side-window. Should be one of top, bottom, left or right.") (defvar which-key-side-window-max-width 60 From 2e9ec6bae2a5233848fcd626d4b1687875e60f41 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 15:25:49 -0400 Subject: [PATCH 060/806] Fix compiler warnings --- .gitignore | 1 + which-key.el | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 34da34edea6..77633d2fc83 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *~ +*.elc # Used to setup library paths for emacs -Q private-test-setup.el diff --git a/which-key.el b/which-key.el index 728fdb138bc..7f5229d3f08 100644 --- a/which-key.el +++ b/which-key.el @@ -21,6 +21,8 @@ ;;; Code: +(require 's) + (defvar which-key-idle-delay 0.6 "Delay (in seconds) for which-key buffer to popup.") ;; (defvar which-key-close-buffer-idle-delay 4 @@ -97,14 +99,11 @@ Used when `which-key-popup-type' is frame.") (remove-hook 'pre-command-hook #'which-key/hide-popup) (remove-hook 'focus-out-hook #'which-key/stop-open-timer) (remove-hook 'focus-in-hook #'which-key/start-open-timer) - (which-key/stop-open-timer) - (which-key/stop-close-timer))) + (which-key/stop-open-timer))) + ;; (which-key/stop-close-timer))) (defun which-key/setup () "Create buffer for which-key." - (require 'cl) - (require 's) -;; (require 'popwin) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer (setq-local cursor-type nil) @@ -364,7 +363,7 @@ the maximum number of lines availabel in the target buffer." (dotimes (i n-lines) (setq lines (push - (subseq keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) + (seq-subseq keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) lines))) (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n"))) @@ -385,7 +384,7 @@ the maximum number of lines availabel in the target buffer." (dotimes (p n-pages) (setq pages (push (which-key/create-page max-height n-columns - (subseq formatted-keys (* p max-keys/page) + (seq-subseq formatted-keys (* p max-keys/page) (min (* (1+ p) max-keys/page) n-keys))) pages))) ;; not doing anything with other pages for now (setq pages (reverse pages) From 9e09f05f614c378c31979da67c9a72cf06bd5e00 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 6 Jul 2015 15:50:42 -0400 Subject: [PATCH 061/806] Need cl for emacs < 25 --- which-key.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 7f5229d3f08..13b313dedd7 100644 --- a/which-key.el +++ b/which-key.el @@ -21,6 +21,8 @@ ;;; Code: +(require 'cl-macs) +(require 'cl-extra) (require 's) (defvar which-key-idle-delay 0.6 @@ -363,7 +365,7 @@ the maximum number of lines availabel in the target buffer." (dotimes (i n-lines) (setq lines (push - (seq-subseq keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) + (cl-subseq keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) lines))) (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n"))) @@ -384,7 +386,7 @@ the maximum number of lines availabel in the target buffer." (dotimes (p n-pages) (setq pages (push (which-key/create-page max-height n-columns - (seq-subseq formatted-keys (* p max-keys/page) + (cl-subseq formatted-keys (* p max-keys/page) (min (* (1+ p) max-keys/page) n-keys))) pages))) ;; not doing anything with other pages for now (setq pages (reverse pages) From 50962765d1cd27ce0dc5697e2ea63e5488a1532b Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 10:58:13 -0400 Subject: [PATCH 062/806] Pull out faces and add special key face Special keys (SPC, TAB, RET and ESC) are now truncated to one character and shown in inverse-video to distinguish them from S, T, R and E --- which-key.el | 142 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 53 deletions(-) diff --git a/which-key.el b/which-key.el index 13b313dedd7..8ae01e55079 100644 --- a/which-key.el +++ b/which-key.el @@ -43,6 +43,7 @@ strings in the cdr for each key.") '(("Prefix Command" . "prefix")) "See `which-key-key-replacement-alist'. This is a list of cons cells for replacing descriptions.") +(defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC")) (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-popup-type 'minibuffer @@ -61,6 +62,15 @@ location is top or bottom.") (defvar which-key-frame-max-height 20 "Maximum height of which-key popup when type is frame.") +;; Faces +(defvar which-key-key-face 'font-lock-constant-face) +(defvar which-key-separator-face 'font-lock-comment-face) +(defvar which-key-group-description-face 'font-lock-keyword-face) +(defvar which-key-command-description-face 'font-lock-function-name-face) +(defface which-key-special-key-face + `((t . (:inherit ,which-key-key-face :inverse-video t)) ) + "Face for special keys (SPC, TAB, RET)") + ;; Internal Vars ;; (defvar popwin:popup-buffer nil) (defvar which-key--buffer nil @@ -102,7 +112,7 @@ Used when `which-key-popup-type' is frame.") (remove-hook 'focus-out-hook #'which-key/stop-open-timer) (remove-hook 'focus-in-hook #'which-key/start-open-timer) (which-key/stop-open-timer))) - ;; (which-key/stop-close-timer))) +;; (which-key/stop-close-timer))) (defun which-key/setup () "Create buffer for which-key." @@ -157,8 +167,8 @@ Finally, show the buffer." (which-key/populate-buffer formatted-keys column-width (window-width)))) ;; show buffer (which-key/show-popup popup-act-dim))) - ;; (when (which-key/show-popup popup-act-dim) - ;; (which-key/start-close-timer)))) + ;; (when (which-key/show-popup popup-act-dim) + ;; (which-key/start-close-timer)))) ;; command finished maybe close the window (which-key/hide-popup)))) @@ -238,11 +248,11 @@ need to start the closing timer." ;; sizes to 0 (instead of adding 2) didn't always make the frame wide ;; enough. don't know why it is so. (frame-width (+ (cdr act-popup-dim) 2)) - (new-window (if (and (frame-live-p which-key--frame) - (eq which-key--buffer - (window-buffer (frame-root-window which-key--frame)))) - (which-key/show-buffer-reuse-frame frame-height frame-width) - (which-key/show-buffer-new-frame frame-height frame-width)))) + (new-window (if (and (frame-live-p which-key--frame) + (eq which-key--buffer + (window-buffer (frame-root-window which-key--frame)))) + (which-key/show-buffer-reuse-frame frame-height frame-width) + (which-key/show-buffer-new-frame frame-height frame-width)))) (when new-window ;; display successful (setq which-key--frame (window-frame new-window)) @@ -332,9 +342,9 @@ of the intended popup." ;; Buffer contents functions (defun which-key/get-formatted-key-bindings (buffer key) - (let ((max-len-key 0) (max-len-desc 0) - (key-str-qt (regexp-quote (key-description key))) - key-match desc-match unformatted formatted) + (let ((key-str-qt (regexp-quote (key-description key))) + key-match desc-match unformatted format-res + formatted column-width) (with-temp-buffer (describe-buffer-bindings buffer key) (goto-char (point-max)) ; want to put last keys in first @@ -343,17 +353,13 @@ of the intended popup." key-str-qt) nil t) (setq key-match (match-string 1) - desc-match (match-string 2) - max-len-key (max max-len-key (length key-match)) - max-len-desc (max max-len-desc (length desc-match))) + desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted :test (lambda (x y) (string-equal (car x) (car y))))) - (setq max-len-desc (if (> max-len-desc which-key-max-description-length) - (+ 2 which-key-max-description-length) ; for the .. - max-len-desc) - formatted (which-key/format-matches - unformatted max-len-key max-len-desc))) - (cons formatted (+ 4 max-len-key max-len-desc)))) + (setq format-res (which-key/format-matches unformatted) + formatted (car format-res) + column-width (cdr format-res))) + (cons formatted column-width))) (defun which-key/create-page (max-lines n-columns keys) "Format KEYS into string representing a single page of text. @@ -386,8 +392,8 @@ the maximum number of lines availabel in the target buffer." (dotimes (p n-pages) (setq pages (push (which-key/create-page max-height n-columns - (cl-subseq formatted-keys (* p max-keys/page) - (min (* (1+ p) max-keys/page) n-keys))) pages))) + (cl-subseq formatted-keys (* p max-keys/page) + (min (* (1+ p) max-keys/page) n-keys))) pages))) ;; not doing anything with other pages for now (setq pages (reverse pages) act-height (1+ (s-count-matches "\n" (car pages)))) @@ -399,17 +405,31 @@ the maximum number of lines availabel in the target buffer." (goto-char (point-min))))) (cons act-height act-width))) -(defun which-key/maybe-replace (text repl-alist &optional literal) - "Perform replacements on TEXT. +(defun which-key/maybe-replace (string repl-alist &optional literal) + "Perform replacements on STRING. REPL-ALIST is an alist where the car of each element is the text to replace and the cdr is the replacement text. Unless LITERAL is non-nil regexp is used in the replacements." - (dolist (repl repl-alist) - (setq text - (if (string-match (car repl) text) - (replace-match (cdr repl) t literal text) - text))) - text) + (let ((new-string string)) + (dolist (repl repl-alist) + (setq new-string + (if (string-match (car repl) new-string) + (replace-match (cdr repl) t literal new-string) + new-string))) + new-string)) + +(defun which-key/propertize-key (key) + (let ((key-w-face (propertize key 'face which-key-key-face))) + (dolist (special-key which-key-special-keys) + (when (string-match special-key key) + (setq key-w-face + (concat (substring key-w-face 0 (match-beginning 0)) + (propertize + (substring key-w-face (match-beginning 0) (1+ (match-beginning 0))) + 'face 'which-key-special-key-face) + (when (< (match-end 0) (length key-w-face)) + (substring key-w-face (1+ (match-end 0)) (length key-w-face))))))) + key-w-face)) (defsubst which-key/truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." @@ -417,35 +437,51 @@ non-nil regexp is used in the replacements." (concat (substring desc 0 which-key-max-description-length) "..") desc)) -(defun which-key/format-matches (unformatted max-len-key max-len-desc) +(defun which-key/format-matches (unformatted) "Turn each key-desc-cons in UNFORMATTED into formatted strings (including text properties), and pad with spaces so that all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the longest key and description in the buffer, respectively. Replacements are performed using the key and description replacement alists." - (mapcar - (lambda (key-desc-cons) - (let* ((key (which-key/maybe-replace (car key-desc-cons) - which-key-key-replacement-alist)) - (desc (which-key/maybe-replace (cdr key-desc-cons) - which-key-description-replacement-alist)) - (group (string-match-p "^group:" desc)) - (desc (if group (substring desc 6) desc)) - (prefix (string-match-p "^Prefix" desc)) - (desc (if (or prefix group) (concat "+" desc) desc)) - (desc-face (if (or prefix group) - 'font-lock-keyword-face 'font-lock-function-name-face)) - (separator which-key-separator) - (desc (which-key/truncate-description desc)) - ;; pad keys to max-len-key - (padded-key (s-pad-left max-len-key " " key)) - (padded-desc (s-pad-right max-len-desc " " desc))) - (format (concat (propertize "%s" 'face 'font-lock-constant-face) " " - (propertize separator 'face 'font-lock-comment-face) " " - (propertize "%s" 'face desc-face) " ") - padded-key padded-desc))) - unformatted)) + (let ((max-key-width 0) + (max-desc-width 0) + (sep-w-face (propertize which-key-separator 'face which-key-separator-face)) + (sep-width (length which-key-separator)) + after-replacements) + ;; first replace and apply faces + (setq after-replacements + (mapcar + (lambda (key-desc-cons) + (let* ((key (which-key/maybe-replace + (car key-desc-cons) which-key-key-replacement-alist)) + (desc (which-key/maybe-replace + (cdr key-desc-cons) which-key-description-replacement-alist)) + (group (string-match-p "^group:" desc)) + (desc (if group (substring desc 6) desc)) + (prefix (string-match-p "^Prefix" desc)) + (desc (if (or prefix group) (concat "+" desc) desc)) + (desc-face (if (or prefix group) + which-key-group-description-face + which-key-command-description-face)) + (desc (which-key/truncate-description desc)) + (key-w-face (which-key/propertize-key key)) + (desc-w-face (propertize desc 'face desc-face)) + (key-width (length (substring-no-properties key-w-face))) + (desc-width (length (substring-no-properties desc-w-face)))) + (setq max-key-width (max key-width max-key-width)) + (setq max-desc-width (max desc-width max-desc-width)) + (cons key-w-face desc-w-face))) + unformatted)) + ;; pad to max key-width and max desc-width + (cons + (mapcar (lambda (x) + (concat (s-pad-left max-key-width " " (car x)) + " " sep-w-face " " + (s-pad-right max-desc-width " " (cdr x)) + " ")) + after-replacements) + (+ 3 max-key-width sep-width max-desc-width )))) (provide 'which-key) From 2393a70a1ceb7b28eeb510a53ef9cd976e796c45 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 11:08:11 -0400 Subject: [PATCH 063/806] Add small indication of more pages --- which-key.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 8ae01e55079..d2b06cfb0f4 100644 --- a/which-key.el +++ b/which-key.el @@ -387,7 +387,7 @@ the maximum number of lines availabel in the target buffer." (max-keys/page (when max-height (* n-columns max-height))) (n-pages (if max-keys/page (ceiling (/ (float n-keys) max-keys/page)) 1)) - pages act-height) + pages act-height first-page) (when (and (> n-keys 0) (> n-columns 0)) (dotimes (p n-pages) (setq pages @@ -397,11 +397,13 @@ the maximum number of lines availabel in the target buffer." ;; not doing anything with other pages for now (setq pages (reverse pages) act-height (1+ (s-count-matches "\n" (car pages)))) + (setq first-page (car pages)) + (when (> (length pages) 1) (setq first-page (concat first-page "..."))) (if (eq which-key-popup-type 'minibuffer) - (let (message-log-max) (message "%s" (car pages))) + (let (message-log-max) (message "%s" first-page)) (with-current-buffer which-key--buffer (erase-buffer) - (insert (car pages)) + (insert first-page) (goto-char (point-min))))) (cons act-height act-width))) From 2e904d29308e9dc0865c4ba3392614ae930e7341 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 13:24:39 -0400 Subject: [PATCH 064/806] Add DEL to special keys --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d2b06cfb0f4..9a45cf18830 100644 --- a/which-key.el +++ b/which-key.el @@ -43,7 +43,7 @@ strings in the cdr for each key.") '(("Prefix Command" . "prefix")) "See `which-key-key-replacement-alist'. This is a list of cons cells for replacing descriptions.") -(defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC")) +(defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-popup-type 'minibuffer From bfdae2557fabc3be3cb262e4ae61e924a1808108 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 13:27:08 -0400 Subject: [PATCH 065/806] Maek special keys bold --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 9a45cf18830..b42279b2458 100644 --- a/which-key.el +++ b/which-key.el @@ -68,7 +68,7 @@ location is top or bottom.") (defvar which-key-group-description-face 'font-lock-keyword-face) (defvar which-key-command-description-face 'font-lock-function-name-face) (defface which-key-special-key-face - `((t . (:inherit ,which-key-key-face :inverse-video t)) ) + `((t . (:inherit ,which-key-key-face :inverse-video t :weight bold)) ) "Face for special keys (SPC, TAB, RET)") ;; Internal Vars From f122d3d42e5b5c0775826247f8d6622bc63e9d94 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 15:00:10 -0400 Subject: [PATCH 066/806] Make default delay less aggressive. Also avoids touching echo-keystrokes if it is already low. --- which-key.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index b42279b2458..1a25433c67a 100644 --- a/which-key.el +++ b/which-key.el @@ -25,7 +25,7 @@ (require 'cl-extra) (require 's) -(defvar which-key-idle-delay 0.6 +(defvar which-key-idle-delay 1 "Delay (in seconds) for which-key buffer to popup.") ;; (defvar which-key-close-buffer-idle-delay 4 ;; "Delay (in seconds) after which buffer is forced closed.") @@ -97,11 +97,14 @@ Used when `which-key-popup-type' is frame.") (if which-key-mode (progn (unless which-key--setup-p (which-key/setup)) - ;; make echo-keytrokes fast for minibuffer popup + ;; reduce echo-keytrokes for minibuffer popup ;; (it can interfer if it's too slow) (when (and (> echo-keystrokes 0) (eq which-key-popup-type 'minibuffer)) - (setq echo-keystrokes 0.1)) + (setq echo-keystrokes + (min echo-keystrokes (/ (float which-key-idle-delay) 2))) + (message "Which-key-mode enabled (note echo-keystrokes changed from %s to %s)" + which-key--echo-keystrokes-backup echo-keystrokes)) (add-hook 'pre-command-hook #'which-key/hide-popup) (add-hook 'focus-out-hook #'which-key/stop-open-timer) (add-hook 'focus-in-hook #'which-key/start-open-timer) From a09f70c5879b0341a838504ed5c2903c7e7f50c9 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 15:06:06 -0400 Subject: [PATCH 067/806] Be consistent in defining faces. --- which-key.el | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 1a25433c67a..1d2c7586ca8 100644 --- a/which-key.el +++ b/which-key.el @@ -43,7 +43,9 @@ strings in the cdr for each key.") '(("Prefix Command" . "prefix")) "See `which-key-key-replacement-alist'. This is a list of cons cells for replacing descriptions.") -(defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) +(defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL") + "These keys will automatically be truncated to one character +and have `which-key-special-key-face' applied to them.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") (defvar which-key-popup-type 'minibuffer @@ -63,12 +65,20 @@ location is top or bottom.") "Maximum height of which-key popup when type is frame.") ;; Faces -(defvar which-key-key-face 'font-lock-constant-face) -(defvar which-key-separator-face 'font-lock-comment-face) -(defvar which-key-group-description-face 'font-lock-keyword-face) -(defvar which-key-command-description-face 'font-lock-function-name-face) +(defface which-key-key-face + '((t . (:inherit font-lock-constant-face))) + "Face for which-key keys") +(defface which-key-separator-face + '((t . (:inherit font-lock-comment-face))) + "Face for the separator (default separator is an arrow)") +(defface which-key-command-description-face + '((t . (:inherit font-lock-function-name-face))) + "Face for the key description when it is a command") +(defface which-key-group-description-face + '((t . (:inherit font-lock-keyword-face))) + "Face for the key description when it is a group or prefix") (defface which-key-special-key-face - `((t . (:inherit ,which-key-key-face :inverse-video t :weight bold)) ) + '((t . (:inherit which-key-key-face :inverse-video t :weight bold))) "Face for special keys (SPC, TAB, RET)") ;; Internal Vars @@ -424,7 +434,7 @@ non-nil regexp is used in the replacements." new-string)) (defun which-key/propertize-key (key) - (let ((key-w-face (propertize key 'face which-key-key-face))) + (let ((key-w-face (propertize key 'face 'which-key-key-face))) (dolist (special-key which-key-special-keys) (when (string-match special-key key) (setq key-w-face @@ -451,7 +461,7 @@ Replacements are performed using the key and description replacement alists." (let ((max-key-width 0) (max-desc-width 0) - (sep-w-face (propertize which-key-separator 'face which-key-separator-face)) + (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face)) (sep-width (length which-key-separator)) after-replacements) ;; first replace and apply faces @@ -467,8 +477,8 @@ replacement alists." (prefix (string-match-p "^Prefix" desc)) (desc (if (or prefix group) (concat "+" desc) desc)) (desc-face (if (or prefix group) - which-key-group-description-face - which-key-command-description-face)) + 'which-key-group-description-face + 'which-key-command-description-face)) (desc (which-key/truncate-description desc)) (key-w-face (which-key/propertize-key key)) (desc-w-face (propertize desc 'face desc-face)) From c6c50bbe4c7c2856380796b1b7e042f342a7afee Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 15:11:46 -0400 Subject: [PATCH 068/806] Make echo-keystrokes a variable and speed it up. --- which-key.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 1d2c7586ca8..8c4317e25a0 100644 --- a/which-key.el +++ b/which-key.el @@ -29,6 +29,12 @@ "Delay (in seconds) for which-key buffer to popup.") ;; (defvar which-key-close-buffer-idle-delay 4 ;; "Delay (in seconds) after which buffer is forced closed.") +(defvar which-key-echo-keystrokes + (min echo-keystrokes (/ (float which-key-idle-delay) 4)) + "Value to use for echo-keystrokes. This only applies when +`which-key-popup-type' is minibuffer. It needs to be less than +`which-key-idle-delay' or else the echo will erase the which-key +popup.") (defvar which-key-max-description-length 27 "Truncate the description of keys to this length. Also adds \"..\".") @@ -107,12 +113,11 @@ Used when `which-key-popup-type' is frame.") (if which-key-mode (progn (unless which-key--setup-p (which-key/setup)) - ;; reduce echo-keytrokes for minibuffer popup + ;; reduce echo-keystrokes for minibuffer popup ;; (it can interfer if it's too slow) (when (and (> echo-keystrokes 0) (eq which-key-popup-type 'minibuffer)) - (setq echo-keystrokes - (min echo-keystrokes (/ (float which-key-idle-delay) 2))) + (setq echo-keystrokes which-key-echo-keystrokes) (message "Which-key-mode enabled (note echo-keystrokes changed from %s to %s)" which-key--echo-keystrokes-backup echo-keystrokes)) (add-hook 'pre-command-hook #'which-key/hide-popup) From be7f2c9f5fb7a1ec2262245d68e7936ab4fad2bb Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 15:21:57 -0400 Subject: [PATCH 069/806] Remove commented out close timer stuff Closes #10 --- which-key.el | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/which-key.el b/which-key.el index 8c4317e25a0..344974ac644 100644 --- a/which-key.el +++ b/which-key.el @@ -27,8 +27,6 @@ (defvar which-key-idle-delay 1 "Delay (in seconds) for which-key buffer to popup.") -;; (defvar which-key-close-buffer-idle-delay 4 -;; "Delay (in seconds) after which buffer is forced closed.") (defvar which-key-echo-keystrokes (min echo-keystrokes (/ (float which-key-idle-delay) 4)) "Value to use for echo-keystrokes. This only applies when @@ -95,8 +93,6 @@ location is top or bottom.") "Internal: Holds reference to which-key window.") (defvar which-key--open-timer nil "Internal: Holds reference to open window timer.") -;; (defvar which-key--close-timer nil -;; "Internal: Holds reference to close window timer.") (defvar which-key--setup-p nil "Internal: Non-nil if which-key buffer has been setup.") (defvar which-key--frame nil @@ -130,7 +126,6 @@ Used when `which-key-popup-type' is frame.") (remove-hook 'focus-out-hook #'which-key/stop-open-timer) (remove-hook 'focus-in-hook #'which-key/start-open-timer) (which-key/stop-open-timer))) -;; (which-key/stop-close-timer))) (defun which-key/setup () "Create buffer for which-key." @@ -152,17 +147,6 @@ Used when `which-key-popup-type' is frame.") "Deactivate idle timer." (when which-key--open-timer (cancel-timer which-key--open-timer))) -;; (defun which-key/start-close-timer () -;; "Activate idle timer." -;; (which-key/stop-close-timer) ; start over -;; (setq which-key--close-timer -;; (run-at-time which-key-close-buffer-idle-delay -;; nil 'which-key/hide-popup))) - -;; (defun which-key/stop-close-timer () -;; "Deactivate idle timer." -;; (when which-key--close-timer (cancel-timer which-key--close-timer))) - ;; Update (defun which-key/update () @@ -171,10 +155,6 @@ Finally, show the buffer." (let ((key (this-single-command-keys))) (if (> (length key) 0) (progn - ;; (which-key/stop-close-timer) - ;; remove this because `which-key/show-popup' should be able to - ;; handle the case where which-key buffer is already displayed - ;; (which-key/hide-popup) (let* ((buf (current-buffer)) ;; get formatted key bindings (fmt-width-cons (which-key/get-formatted-key-bindings buf key)) @@ -185,8 +165,6 @@ Finally, show the buffer." (which-key/populate-buffer formatted-keys column-width (window-width)))) ;; show buffer (which-key/show-popup popup-act-dim))) - ;; (when (which-key/show-popup popup-act-dim) - ;; (which-key/start-close-timer)))) ;; command finished maybe close the window (which-key/hide-popup)))) From 40ac541bc7a9c933503f99c2fee3f569cf13611f Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 16:19:45 -0400 Subject: [PATCH 070/806] Show prefix in popup --- which-key.el | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/which-key.el b/which-key.el index 344974ac644..c01159d5538 100644 --- a/which-key.el +++ b/which-key.el @@ -152,17 +152,18 @@ Used when `which-key-popup-type' is frame.") (defun which-key/update () "Fill which-key--buffer with key descriptions and reformat. Finally, show the buffer." - (let ((key (this-single-command-keys))) - (if (> (length key) 0) + (let ((prefix-keys (this-single-command-keys))) + (if (> (length prefix-keys) 0) (progn (let* ((buf (current-buffer)) ;; get formatted key bindings - (fmt-width-cons (which-key/get-formatted-key-bindings buf key)) + (fmt-width-cons (which-key/get-formatted-key-bindings buf prefix-keys)) (formatted-keys (car fmt-width-cons)) (column-width (cdr fmt-width-cons)) ;; populate target buffer (popup-act-dim - (which-key/populate-buffer formatted-keys column-width (window-width)))) + (which-key/populate-buffer (key-description prefix-keys) + formatted-keys column-width (window-width)))) ;; show buffer (which-key/show-popup popup-act-dim))) ;; command finished maybe close the window @@ -357,27 +358,31 @@ of the intended popup." column-width (cdr format-res))) (cons formatted column-width))) -(defun which-key/create-page (max-lines n-columns keys) +(defun which-key/create-page (prefix-len max-lines n-columns keys) "Format KEYS into string representing a single page of text. N-COLUMNS is the number of text columns to use and MAX-LINES is the maximum number of lines availabel in the target buffer." (let* ((n-keys (length keys)) (n-lines (min (ceiling (/ (float n-keys) n-columns)) max-lines)) + (line-padding (s-repeat prefix-len " ")) lines) (dotimes (i n-lines) (setq lines (push (cl-subseq keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) lines))) - (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) "\n"))) + (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) (concat "\n" line-padding)))) -(defun which-key/populate-buffer (formatted-keys column-width sel-win-width) +(defun which-key/populate-buffer (prefix-keys formatted-keys column-width sel-win-width) "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." - (let* ((n-keys (length formatted-keys)) + (let* ((prefix-w-face (which-key/propertize-key prefix-keys)) + (prefix-len (+ 2 (length (substring-no-properties prefix-w-face)))) + (n-keys (length formatted-keys)) (max-dims (which-key/popup-max-dimensions column-width sel-win-width)) (max-height (when (car max-dims) (car max-dims))) (max-width (when (cdr max-dims) (cdr max-dims))) - (n-columns (/ max-width column-width)) ;; integer division + ;; the 3 leaves room for the ... possibly on the first page + (n-columns (/ (- max-width prefix-len 3) column-width)) ;; integer division (act-width (* n-columns column-width)) ;; (avl-lines/page (which-key/available-lines)) (max-keys/page (when max-height (* n-columns max-height))) @@ -387,13 +392,13 @@ the maximum number of lines availabel in the target buffer." (when (and (> n-keys 0) (> n-columns 0)) (dotimes (p n-pages) (setq pages - (push (which-key/create-page max-height n-columns + (push (which-key/create-page prefix-len max-height n-columns (cl-subseq formatted-keys (* p max-keys/page) (min (* (1+ p) max-keys/page) n-keys))) pages))) ;; not doing anything with other pages for now (setq pages (reverse pages) act-height (1+ (s-count-matches "\n" (car pages)))) - (setq first-page (car pages)) + (setq first-page (concat prefix-w-face " " (car pages))) (when (> (length pages) 1) (setq first-page (concat first-page "..."))) (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" first-page)) @@ -420,13 +425,13 @@ non-nil regexp is used in the replacements." (let ((key-w-face (propertize key 'face 'which-key-key-face))) (dolist (special-key which-key-special-keys) (when (string-match special-key key) - (setq key-w-face - (concat (substring key-w-face 0 (match-beginning 0)) - (propertize - (substring key-w-face (match-beginning 0) (1+ (match-beginning 0))) - 'face 'which-key-special-key-face) - (when (< (match-end 0) (length key-w-face)) - (substring key-w-face (1+ (match-end 0)) (length key-w-face))))))) + (let ((beg (match-beginning 0)) (end (match-end 0))) + (setq key-w-face + (concat (substring key-w-face 0 beg) + (propertize (substring key-w-face beg (1+ beg)) + 'face 'which-key-special-key-face) + (when (< end (length key-w-face)) + (substring key-w-face end (length key-w-face)))))))) key-w-face)) (defsubst which-key/truncate-description (desc) From 9838d3b8d40b23cb4aeb5edb3e354bfc717aa1b9 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 19:25:57 -0400 Subject: [PATCH 071/806] Remove column-width from max-dimensions It's not needed --- which-key.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index c01159d5538..07d0388b215 100644 --- a/which-key.el +++ b/which-key.el @@ -303,12 +303,12 @@ need to start the closing timer." ;; Size functions -(defun which-key/popup-max-dimensions (column-width selected-window-width) +(defun which-key/popup-max-dimensions (selected-window-width) "Dimesion functions should return the maximum possible (height . width) of the intended popup." (cl-case which-key-popup-type (minibuffer (which-key/minibuffer-max-dimensions)) - (side-window (which-key/side-window-max-dimensions column-width)) + (side-window (which-key/side-window-max-dimensions)) (frame (which-key/frame-max-dimensions)))) (defun which-key/minibuffer-max-dimensions () @@ -321,7 +321,7 @@ of the intended popup." ;; width (frame-text-cols))) -(defun which-key/side-window-max-dimensions (column-width) +(defun which-key/side-window-max-dimensions () (cons ;; height (if (member which-key-side-window-location '(left right)) @@ -330,7 +330,7 @@ of the intended popup." which-key-side-window-max-height) ;; width (if (member which-key-side-window-location '(left right)) - (min which-key-side-window-max-width column-width) + which-key-side-window-max-width (frame-width)))) (defun which-key/frame-max-dimensions () @@ -378,7 +378,7 @@ the maximum number of lines availabel in the target buffer." (let* ((prefix-w-face (which-key/propertize-key prefix-keys)) (prefix-len (+ 2 (length (substring-no-properties prefix-w-face)))) (n-keys (length formatted-keys)) - (max-dims (which-key/popup-max-dimensions column-width sel-win-width)) + (max-dims (which-key/popup-max-dimensions sel-win-width)) (max-height (when (car max-dims) (car max-dims))) (max-width (when (cdr max-dims) (cdr max-dims))) ;; the 3 leaves room for the ... possibly on the first page From dc4391e73d1323ee011c465ab3744af9272f546d Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 19:39:38 -0400 Subject: [PATCH 072/806] Add regexp to remove namespace (w minor cleanup) --- which-key.el | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 07d0388b215..acf441a5858 100644 --- a/which-key.el +++ b/which-key.el @@ -44,9 +44,12 @@ popup.") "The strings in the car of each cons cell are replaced with the strings in the cdr for each key.") (defvar which-key-description-replacement-alist - '(("Prefix Command" . "prefix")) - "See `which-key-key-replacement-alist'. This is a list of cons -cells for replacing descriptions.") + '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1")) + "See `which-key-key-replacement-alist'. This is a list of cons +cells for replacing descriptions. The second one removes +\"namespace/\" from \"namespace/function\". This is a convention +for naming functions but not a rule, so remove this replacement +if it becomes problematic.") (defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL") "These keys will automatically be truncated to one character and have `which-key-special-key-face' applied to them.") @@ -171,11 +174,6 @@ Finally, show the buffer." ;; Show/hide guide buffer -;; Should this be used instead? -;; (defun which-key/hide-buffer-display-buffer () -;; (when (window-live-p which-key--window) -;; (delete-window which-key--window))) - (defun which-key/hide-popup () (cl-case which-key-popup-type (minibuffer (which-key/hide-buffer-minibuffer)) @@ -392,9 +390,10 @@ the maximum number of lines availabel in the target buffer." (when (and (> n-keys 0) (> n-columns 0)) (dotimes (p n-pages) (setq pages - (push (which-key/create-page prefix-len max-height n-columns - (cl-subseq formatted-keys (* p max-keys/page) - (min (* (1+ p) max-keys/page) n-keys))) pages))) + (push (which-key/create-page + prefix-len max-height n-columns + (cl-subseq formatted-keys (* p max-keys/page) + (min (* (1+ p) max-keys/page) n-keys))) pages))) ;; not doing anything with other pages for now (setq pages (reverse pages) act-height (1+ (s-count-matches "\n" (car pages)))) From c3586da3d294822afc78a758acb42753479624b1 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 7 Jul 2015 20:12:01 -0400 Subject: [PATCH 073/806] Add key-based replacement list --- which-key.el | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index acf441a5858..47566ce642e 100644 --- a/which-key.el +++ b/which-key.el @@ -50,6 +50,9 @@ cells for replacing descriptions. The second one removes \"namespace/\" from \"namespace/function\". This is a convention for naming functions but not a rule, so remove this replacement if it becomes problematic.") +(defvar which-key-key-based-description-replacement-alist + '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1") + ("SPC f f" "find files" t))) (defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL") "These keys will automatically be truncated to one character and have `which-key-special-key-face' applied to them.") @@ -351,7 +354,7 @@ of the intended popup." desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted :test (lambda (x y) (string-equal (car x) (car y))))) - (setq format-res (which-key/format-matches unformatted) + (setq format-res (which-key/format-matches unformatted (key-description key)) formatted (car format-res) column-width (cdr format-res))) (cons formatted column-width))) @@ -407,18 +410,21 @@ the maximum number of lines availabel in the target buffer." (goto-char (point-min))))) (cons act-height act-width))) -(defun which-key/maybe-replace (string repl-alist &optional literal) +(defun which-key/maybe-replace (string repl-alist &optional keys literal) "Perform replacements on STRING. REPL-ALIST is an alist where the car of each element is the text to replace and the cdr is the replacement text. Unless LITERAL is non-nil regexp is used in the replacements." (let ((new-string string)) - (dolist (repl repl-alist) - (setq new-string - (if (string-match (car repl) new-string) - (replace-match (cdr repl) t literal new-string) - new-string))) - new-string)) + (if keys + (dolist (repl repl-alist) + (when (and (string-equal (nth 0 repl) keys)) + (setq new-string (nth 1 repl)))) + (dolist (repl repl-alist) + (when (string-match (car repl) new-string) + (setq new-string + (replace-match (cdr repl) t literal new-string))))) + new-string)) (defun which-key/propertize-key (key) (let ((key-w-face (propertize key 'face 'which-key-key-face))) @@ -428,7 +434,7 @@ non-nil regexp is used in the replacements." (setq key-w-face (concat (substring key-w-face 0 beg) (propertize (substring key-w-face beg (1+ beg)) - 'face 'which-key-special-key-face) + 'face 'which-key-special-key-face) (when (< end (length key-w-face)) (substring key-w-face end (length key-w-face)))))))) key-w-face)) @@ -439,7 +445,7 @@ non-nil regexp is used in the replacements." (concat (substring desc 0 which-key-max-description-length) "..") desc)) -(defun which-key/format-matches (unformatted) +(defun which-key/format-matches (unformatted prefix-keys) "Turn each key-desc-cons in UNFORMATTED into formatted strings (including text properties), and pad with spaces so that all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the @@ -455,10 +461,14 @@ replacement alists." (setq after-replacements (mapcar (lambda (key-desc-cons) - (let* ((key (which-key/maybe-replace + (let* ((keys (concat prefix-keys " " (car key-desc-cons))) + (key (which-key/maybe-replace (car key-desc-cons) which-key-key-replacement-alist)) (desc (which-key/maybe-replace (cdr key-desc-cons) which-key-description-replacement-alist)) + (desc (which-key/maybe-replace + (cdr key-desc-cons) which-key-key-based-description-replacement-alist + keys)) (group (string-match-p "^group:" desc)) (desc (if group (substring desc 6) desc)) (prefix (string-match-p "^Prefix" desc)) From 78c3759f07768dfb94954ae879bfc29cb5b7adee Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 07:37:41 -0400 Subject: [PATCH 074/806] Require cl-lib Addresses #15 --- which-key.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 47566ce642e..e872f08a978 100644 --- a/which-key.el +++ b/which-key.el @@ -21,8 +21,7 @@ ;;; Code: -(require 'cl-macs) -(require 'cl-extra) +(require 'cl-lib) (require 's) (defvar which-key-idle-delay 1 From bafd48048e92ef8987b9804d214e6c457179f433 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 07:40:17 -0400 Subject: [PATCH 075/806] Add :group to faces --- which-key.el | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index e872f08a978..58a674f546f 100644 --- a/which-key.el +++ b/which-key.el @@ -76,19 +76,24 @@ location is top or bottom.") ;; Faces (defface which-key-key-face '((t . (:inherit font-lock-constant-face))) - "Face for which-key keys") + "Face for which-key keys" + :group 'which-key) (defface which-key-separator-face '((t . (:inherit font-lock-comment-face))) - "Face for the separator (default separator is an arrow)") + "Face for the separator (default separator is an arrow)" + :group 'which-key) (defface which-key-command-description-face '((t . (:inherit font-lock-function-name-face))) - "Face for the key description when it is a command") + "Face for the key description when it is a command" + :group 'which-key) (defface which-key-group-description-face '((t . (:inherit font-lock-keyword-face))) - "Face for the key description when it is a group or prefix") + "Face for the key description when it is a group or prefix" + :group 'which-key) (defface which-key-special-key-face '((t . (:inherit which-key-key-face :inverse-video t :weight bold))) - "Face for special keys (SPC, TAB, RET)") + "Face for special keys (SPC, TAB, RET)" + :group 'which-key) ;; Internal Vars ;; (defvar popwin:popup-buffer nil) From 721c015ba909c319eba52c831f45b953b441dbe8 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 08:29:16 -0400 Subject: [PATCH 076/806] Fix #17 errors when not enough room is available. Also gives more control over whether and where to show prefix keys. When the buffer is vertical showing in first line seems to make more sense. --- which-key.el | 74 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/which-key.el b/which-key.el index 58a674f546f..f86248f1f0b 100644 --- a/which-key.el +++ b/which-key.el @@ -57,6 +57,10 @@ if it becomes problematic.") and have `which-key-special-key-face' applied to them.") (defvar which-key-buffer-name "*which-key*" "Name of which-key buffer.") +(defvar which-key-show-prefix 'left + "Whether to and where to display the current prfix sequence. +Possible choices are left (the default), top and nil. Nil turns +the feature off.") (defvar which-key-popup-type 'minibuffer "Supported types are minibuffer, side-window and frame.") (defvar which-key-side-window-location 'right @@ -205,10 +209,11 @@ Finally, show the buffer." dimensions, (height . width) of the buffer text to be displayed in the popup. Return nil if no window is shown, or if there is no need to start the closing timer." - (cl-case which-key-popup-type - (minibuffer (which-key/show-buffer-minibuffer act-popup-dim)) - (side-window (which-key/show-buffer-side-window act-popup-dim)) - (frame (which-key/show-buffer-frame act-popup-dim)))) + (when (and (> (car act-popup-dim) 0) (> (cdr act-popup-dim) 0)) + (cl-case which-key-popup-type + (minibuffer (which-key/show-buffer-minibuffer act-popup-dim)) + (side-window (which-key/show-buffer-side-window act-popup-dim)) + (frame (which-key/show-buffer-frame act-popup-dim))))) (defun which-key/show-buffer-minibuffer (act-popup-dim) nil) @@ -369,7 +374,7 @@ N-COLUMNS is the number of text columns to use and MAX-LINES is the maximum number of lines availabel in the target buffer." (let* ((n-keys (length keys)) (n-lines (min (ceiling (/ (float n-keys) n-columns)) max-lines)) - (line-padding (s-repeat prefix-len " ")) + (line-padding (when (eq which-key-show-prefix 'left) (s-repeat prefix-len " "))) lines) (dotimes (i n-lines) (setq lines @@ -382,37 +387,50 @@ the maximum number of lines availabel in the target buffer." "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." (let* ((prefix-w-face (which-key/propertize-key prefix-keys)) (prefix-len (+ 2 (length (substring-no-properties prefix-w-face)))) + (prefix-string (when which-key-show-prefix + (if (eq which-key-show-prefix 'left) + (concat prefix-w-face " ") + (concat prefix-w-face "-\n")))) (n-keys (length formatted-keys)) (max-dims (which-key/popup-max-dimensions sel-win-width)) (max-height (when (car max-dims) (car max-dims))) - (max-width (when (cdr max-dims) (cdr max-dims))) - ;; the 3 leaves room for the ... possibly on the first page - (n-columns (/ (- max-width prefix-len 3) column-width)) ;; integer division + (max-width (if (cdr max-dims) + (if (eq which-key-show-prefix 'left) + (- (cdr max-dims) prefix-len) + (cdr max-dims)) 0)) + ;; the 3 leaves room for the ... possibly on the first page (remove for now) + (n-columns (/ max-width column-width)) ;; integer division (act-width (* n-columns column-width)) ;; (avl-lines/page (which-key/available-lines)) (max-keys/page (when max-height (* n-columns max-height))) - (n-pages (if max-keys/page + (n-pages (if (> max-keys/page 0) (ceiling (/ (float n-keys) max-keys/page)) 1)) pages act-height first-page) - (when (and (> n-keys 0) (> n-columns 0)) - (dotimes (p n-pages) - (setq pages - (push (which-key/create-page - prefix-len max-height n-columns - (cl-subseq formatted-keys (* p max-keys/page) - (min (* (1+ p) max-keys/page) n-keys))) pages))) - ;; not doing anything with other pages for now - (setq pages (reverse pages) - act-height (1+ (s-count-matches "\n" (car pages)))) - (setq first-page (concat prefix-w-face " " (car pages))) - (when (> (length pages) 1) (setq first-page (concat first-page "..."))) - (if (eq which-key-popup-type 'minibuffer) - (let (message-log-max) (message "%s" first-page)) - (with-current-buffer which-key--buffer - (erase-buffer) - (insert first-page) - (goto-char (point-min))))) - (cons act-height act-width))) + (if (and (> n-keys 0) (> act-width 0)) + (progn + (dotimes (p n-pages) + (setq pages + (push (which-key/create-page + prefix-len max-height n-columns + (cl-subseq formatted-keys (* p max-keys/page) + (min (* (1+ p) max-keys/page) n-keys))) pages))) + ;; not doing anything with other pages for now + (setq pages (reverse pages) + first-page (concat prefix-string (car pages)) + act-height (s-count-matches "\n" first-page)) + ;; (when (> (length pages) 1) (setq first-page (concat first-page "..."))) + (if (eq which-key-popup-type 'minibuffer) + (let (message-log-max) (message "%s" first-page)) + (with-current-buffer which-key--buffer + (erase-buffer) + (insert first-page) + (goto-char (point-min)))) + (cons act-height act-width)) + (if (<= n-keys 0) + (message "Can't display which-key buffer: There are no keys to show.") + (message "Can't display which-key buffer: A minimum width of %s chars is required, but your settings only allow for %s chars." column-width max-width) + ) + (cons 0 act-width)))) (defun which-key/maybe-replace (string repl-alist &optional keys literal) "Perform replacements on STRING. From e5279fb8bd0d5fa61b6c376996081b84723e2064 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 08:52:28 -0400 Subject: [PATCH 077/806] Revert unintended change to act-height calc --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f86248f1f0b..3af32b891c8 100644 --- a/which-key.el +++ b/which-key.el @@ -417,7 +417,7 @@ the maximum number of lines availabel in the target buffer." ;; not doing anything with other pages for now (setq pages (reverse pages) first-page (concat prefix-string (car pages)) - act-height (s-count-matches "\n" first-page)) + act-height (1+ (s-count-matches "\n" first-page))) ;; (when (> (length pages) 1) (setq first-page (concat first-page "..."))) (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" first-page)) From fe5b1ee62e14bcc1e0f9719916463fec7cfb2dae Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 10:36:57 -0400 Subject: [PATCH 078/806] Add option to specify major-mode in replacements Note all replacements need to be proper lists instead of cons cells now to add the option to check the third argument. If the third argument is missing it defaults to replacing in all major modes --- which-key.el | 56 +++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/which-key.el b/which-key.el index 3af32b891c8..86a633e08f6 100644 --- a/which-key.el +++ b/which-key.el @@ -38,20 +38,21 @@ popup.") (defvar which-key-separator "→" "Separator to use between key and description.") (defvar which-key-key-replacement-alist - '(("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") ("\\(left\\)" ."←") - ("\\(right\\)" . "→")) - "The strings in the car of each cons cell are replaced with the -strings in the cdr for each key.") + '(("<\\(\\(C-\\|M-\\)*.+\\)>" "\\1") ("left" "←") ("right" "→")) + "The strings in the first element of each list are replaced +with the strings in the second for each key. Elisp regexp can be +used as in the first example. The third element of each list may +specify a value for `major-mode'. In this case the replacement +will only apply in case that major-mode is active.") (defvar which-key-description-replacement-alist - '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1")) - "See `which-key-key-replacement-alist'. This is a list of cons -cells for replacing descriptions. The second one removes -\"namespace/\" from \"namespace/function\". This is a convention -for naming functions but not a rule, so remove this replacement -if it becomes problematic.") + '(("Prefix Command" "prefix") (".+/\\(.+\\)" "\\1")) + "See `which-key-key-replacement-alist'. This is a list of lists +for replacing descriptions. The second one removes \"namespace/\" +from \"namespace/function\". This is a convention for naming +functions but not a rule, so remove this replacement if it +becomes problematic.") (defvar which-key-key-based-description-replacement-alist - '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1") - ("SPC f f" "find files" t))) + '(("SPC f f" "find files"))) (defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL") "These keys will automatically be truncated to one character and have `which-key-special-key-face' applied to them.") @@ -362,11 +363,8 @@ of the intended popup." (setq key-match (match-string 1) desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted - :test (lambda (x y) (string-equal (car x) (car y))))) - (setq format-res (which-key/format-matches unformatted (key-description key)) - formatted (car format-res) - column-width (cdr format-res))) - (cons formatted column-width))) + :test (lambda (x y) (string-equal (car x) (car y)))))) + (which-key/format-matches unformatted (key-description key)))) (defun which-key/create-page (prefix-len max-lines n-columns keys) "Format KEYS into string representing a single page of text. @@ -438,15 +436,23 @@ REPL-ALIST is an alist where the car of each element is the text to replace and the cdr is the replacement text. Unless LITERAL is non-nil regexp is used in the replacements." (let ((new-string string)) - (if keys + (if keys ;; use key-based replacement (dolist (repl repl-alist) - (when (and (string-equal (nth 0 repl) keys)) - (setq new-string (nth 1 repl)))) - (dolist (repl repl-alist) - (when (string-match (car repl) new-string) - (setq new-string - (replace-match (cdr repl) t literal new-string))))) - new-string)) + (if (nth 2 repl) ;; major-mode option + (when (and (eq major-mode (nth 2 repl)) + (string-equal (nth 0 repl) keys)) + (setq new-string (nth 1 repl))) + (when (string-equal (nth 0 repl) keys) + (setq new-string (nth 1 repl))))) + (dolist (repl repl-alist) + (if (nth 2 repl) ;; major-mode option + (when (and (eq major-mode (nth 2 repl)) + (string-match (nth 0 repl) new-string)) + (replace-match (nth 1 repl) t literal new-string)) + (when (string-match (nth 0 repl) new-string) + (setq new-string + (replace-match (nth 1 repl) t literal new-string)))))) + new-string)) (defun which-key/propertize-key (key) (let ((key-w-face (propertize key 'face 'which-key-key-face))) From 68e5f8155f62b7c6cd12531002ea618a093166e3 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 10:43:50 -0400 Subject: [PATCH 079/806] Fix bug in format-matches --- which-key.el | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/which-key.el b/which-key.el index 86a633e08f6..ce539253a7d 100644 --- a/which-key.el +++ b/which-key.el @@ -476,10 +476,8 @@ non-nil regexp is used in the replacements." (defun which-key/format-matches (unformatted prefix-keys) "Turn each key-desc-cons in UNFORMATTED into formatted strings (including text properties), and pad with spaces so that -all are a uniform length. MAX-LEN-KEY and MAX-LEN-DESC are the -longest key and description in the buffer, respectively. -Replacements are performed using the key and description -replacement alists." +all are a uniform length. Replacements are performed using the +key and description replacement alists." (let ((max-key-width 0) (max-desc-width 0) (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face)) @@ -489,14 +487,13 @@ replacement alists." (setq after-replacements (mapcar (lambda (key-desc-cons) - (let* ((keys (concat prefix-keys " " (car key-desc-cons))) - (key (which-key/maybe-replace - (car key-desc-cons) which-key-key-replacement-alist)) - (desc (which-key/maybe-replace - (cdr key-desc-cons) which-key-description-replacement-alist)) - (desc (which-key/maybe-replace - (cdr key-desc-cons) which-key-key-based-description-replacement-alist - keys)) + (let* ((key (car key-desc-cons)) + (desc (cdr key-desc-cons)) + (keys (concat prefix-keys " " key)) + (key (which-key/maybe-replace key which-key-key-replacement-alist)) + (desc (which-key/maybe-replace desc which-key-description-replacement-alist)) + (desc (which-key/maybe-replace desc + which-key-key-based-description-replacement-alist keys)) (group (string-match-p "^group:" desc)) (desc (if group (substring desc 6) desc)) (prefix (string-match-p "^Prefix" desc)) From 52574e5e94e8d1381a7e5572fb96d149b688be48 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 11:35:40 -0400 Subject: [PATCH 080/806] Remove hide-popup call from update function Doesn't seem to be needed anymore after adding hide-popup to the pre-command-hook. --- which-key.el | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index ce539253a7d..252aa2bda75 100644 --- a/which-key.el +++ b/which-key.el @@ -168,21 +168,20 @@ Used when `which-key-popup-type' is frame.") "Fill which-key--buffer with key descriptions and reformat. Finally, show the buffer." (let ((prefix-keys (this-single-command-keys))) - (if (> (length prefix-keys) 0) - (progn - (let* ((buf (current-buffer)) - ;; get formatted key bindings - (fmt-width-cons (which-key/get-formatted-key-bindings buf prefix-keys)) - (formatted-keys (car fmt-width-cons)) - (column-width (cdr fmt-width-cons)) - ;; populate target buffer - (popup-act-dim - (which-key/populate-buffer (key-description prefix-keys) - formatted-keys column-width (window-width)))) - ;; show buffer - (which-key/show-popup popup-act-dim))) - ;; command finished maybe close the window - (which-key/hide-popup)))) + (when (> (length prefix-keys) 0) + (let* ((buf (current-buffer)) + ;; get formatted key bindings + (fmt-width-cons (which-key/get-formatted-key-bindings buf prefix-keys)) + (formatted-keys (car fmt-width-cons)) + (column-width (cdr fmt-width-cons)) + ;; populate target buffer + (popup-act-dim + (which-key/populate-buffer (key-description prefix-keys) + formatted-keys column-width (window-width)))) + ;; show buffer + (which-key/show-popup popup-act-dim))))) +;; command finished maybe close the window +;; (which-key/hide-popup)))) ;; Show/hide guide buffer From 91916c129e7f1a6045fa5766d680f1cca39d1ade Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 11:41:10 -0400 Subject: [PATCH 081/806] Fixes #19 Kind of a hack, but seems a lot easier than trying to get an exact calculation of the width --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 252aa2bda75..a908c7c6ca7 100644 --- a/which-key.el +++ b/which-key.el @@ -241,7 +241,9 @@ need to start the closing timer." ;; side defaults to bottom (if (get-buffer-window which-key--buffer) (display-buffer-reuse-window which-key--buffer alist) - (display-buffer-in-major-side-window which-key--buffer side 0 alist)))) + (display-buffer-in-major-side-window which-key--buffer side 0 alist)) + (let ((fit-window-to-buffer-horizontally t)) + (fit-window-to-buffer (get-buffer-window which-key--buffer))))) (defun which-key/show-buffer-frame (act-popup-dim) (let* ((orig-window (selected-window)) From a27658524d328486be7bb67659f49d37028b7458 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 13:20:27 -0400 Subject: [PATCH 082/806] Break out key-based replacement function. Seems simpler to use `assoc-string` in this case. --- which-key.el | 58 +++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/which-key.el b/which-key.el index a908c7c6ca7..921301ea0e7 100644 --- a/which-key.el +++ b/which-key.el @@ -38,21 +38,26 @@ popup.") (defvar which-key-separator "→" "Separator to use between key and description.") (defvar which-key-key-replacement-alist - '(("<\\(\\(C-\\|M-\\)*.+\\)>" "\\1") ("left" "←") ("right" "→")) - "The strings in the first element of each list are replaced -with the strings in the second for each key. Elisp regexp can be -used as in the first example. The third element of each list may -specify a value for `major-mode'. In this case the replacement -will only apply in case that major-mode is active.") + '(("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") ("left" . "←") ("right" . "→")) + "The strings in the car of each cons are replaced with the +strings in the cdr for each key. Elisp regexp can be used as +in the first example.") (defvar which-key-description-replacement-alist - '(("Prefix Command" "prefix") (".+/\\(.+\\)" "\\1")) + '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1")) "See `which-key-key-replacement-alist'. This is a list of lists for replacing descriptions. The second one removes \"namespace/\" from \"namespace/function\". This is a convention for naming functions but not a rule, so remove this replacement if it becomes problematic.") (defvar which-key-key-based-description-replacement-alist - '(("SPC f f" "find files"))) + '(("SPC f f" "find files")) + "Like `which-key-key-replacement-alist', but the first element +of each list matches on the key sequence. When there is a match +the description of that key sequence is overwritten with the +second element of the list. An optional third element of each +list may specify a value for `major-mode'. In this case the +replacement will only apply in case that major-mode is +active.") (defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL") "These keys will automatically be truncated to one character and have `which-key-special-key-face' applied to them.") @@ -431,29 +436,26 @@ the maximum number of lines availabel in the target buffer." ) (cons 0 act-width)))) -(defun which-key/maybe-replace (string repl-alist &optional keys literal) +(defun which-key/maybe-replace-key-based (string keys repl-alist) + (let ((ret-val (assoc-string keys repl-alist))) + (cond ((and ret-val (eq major-mode (nth 2 ret-val))) + (nth 1 ret-val)) + ((and ret-val (not (nth 2 ret-val))) + (nth 1 ret-val)) + (t string)))) + +(defun which-key/maybe-replace (string repl-alist &optional literal) "Perform replacements on STRING. REPL-ALIST is an alist where the car of each element is the text to replace and the cdr is the replacement text. Unless LITERAL is non-nil regexp is used in the replacements." - (let ((new-string string)) - (if keys ;; use key-based replacement - (dolist (repl repl-alist) - (if (nth 2 repl) ;; major-mode option - (when (and (eq major-mode (nth 2 repl)) - (string-equal (nth 0 repl) keys)) - (setq new-string (nth 1 repl))) - (when (string-equal (nth 0 repl) keys) - (setq new-string (nth 1 repl))))) + (save-match-data + (let ((new-string string)) (dolist (repl repl-alist) - (if (nth 2 repl) ;; major-mode option - (when (and (eq major-mode (nth 2 repl)) - (string-match (nth 0 repl) new-string)) - (replace-match (nth 1 repl) t literal new-string)) - (when (string-match (nth 0 repl) new-string) - (setq new-string - (replace-match (nth 1 repl) t literal new-string)))))) - new-string)) + (when (string-match (nth 0 repl) new-string) + (setq new-string + (replace-match (nth 1 repl) t literal new-string)))) + new-string))) (defun which-key/propertize-key (key) (let ((key-w-face (propertize key 'face 'which-key-key-face))) @@ -493,8 +495,8 @@ key and description replacement alists." (keys (concat prefix-keys " " key)) (key (which-key/maybe-replace key which-key-key-replacement-alist)) (desc (which-key/maybe-replace desc which-key-description-replacement-alist)) - (desc (which-key/maybe-replace desc - which-key-key-based-description-replacement-alist keys)) + (desc (which-key/maybe-replace-key-based desc keys + which-key-key-based-description-replacement-alist)) (group (string-match-p "^group:" desc)) (desc (if group (substring desc 6) desc)) (prefix (string-match-p "^Prefix" desc)) From 0fd81d309e44980f626d5cd40e003606f3369265 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 13:32:27 -0400 Subject: [PATCH 083/806] Fix replace-match and rewrite propertize-key --- which-key.el | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index 921301ea0e7..c63ec294ed4 100644 --- a/which-key.el +++ b/which-key.el @@ -399,9 +399,9 @@ the maximum number of lines availabel in the target buffer." (max-dims (which-key/popup-max-dimensions sel-win-width)) (max-height (when (car max-dims) (car max-dims))) (max-width (if (cdr max-dims) - (if (eq which-key-show-prefix 'left) - (- (cdr max-dims) prefix-len) - (cdr max-dims)) 0)) + (if (eq which-key-show-prefix 'left) + (- (cdr max-dims) prefix-len) + (cdr max-dims)) 0)) ;; the 3 leaves room for the ... possibly on the first page (remove for now) (n-columns (/ max-width column-width)) ;; integer division (act-width (* n-columns column-width)) @@ -452,23 +452,22 @@ non-nil regexp is used in the replacements." (save-match-data (let ((new-string string)) (dolist (repl repl-alist) - (when (string-match (nth 0 repl) new-string) + (when (string-match (car repl) new-string) (setq new-string - (replace-match (nth 1 repl) t literal new-string)))) + (replace-match (cdr repl) t literal new-string)))) new-string))) (defun which-key/propertize-key (key) - (let ((key-w-face (propertize key 'face 'which-key-key-face))) - (dolist (special-key which-key-special-keys) - (when (string-match special-key key) - (let ((beg (match-beginning 0)) (end (match-end 0))) - (setq key-w-face - (concat (substring key-w-face 0 beg) - (propertize (substring key-w-face beg (1+ beg)) - 'face 'which-key-special-key-face) - (when (< end (length key-w-face)) - (substring key-w-face end (length key-w-face)))))))) - key-w-face)) + (let ((key-w-face (propertize key 'face 'which-key-key-face)) + (regexp (concat "\\(" (mapconcat 'identity which-key-special-keys "\\|") "\\)"))) + (save-match-data + (if (string-match regexp key) + (let ((beg (match-beginning 0)) (end (match-end 0))) + (concat (substring key-w-face 0 beg) + (propertize (substring key-w-face beg (1+ beg)) + 'face 'which-key-special-key-face) + (substring key-w-face end (length key-w-face)))) + key-w-face)))) (defsubst which-key/truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." From 3ce0c3e56f59ab0c0e92e99425b89bd7b01a6a50 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 13:55:53 -0400 Subject: [PATCH 084/806] Rework key-based replacement Previous implementation didn't work for multiple major-mode bindings --- which-key.el | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/which-key.el b/which-key.el index c63ec294ed4..d56f9f2ce1c 100644 --- a/which-key.el +++ b/which-key.el @@ -49,15 +49,19 @@ for replacing descriptions. The second one removes \"namespace/\" from \"namespace/function\". This is a convention for naming functions but not a rule, so remove this replacement if it becomes problematic.") -(defvar which-key-key-based-description-replacement-alist - '(("SPC f f" "find files")) - "Like `which-key-key-replacement-alist', but the first element -of each list matches on the key sequence. When there is a match -the description of that key sequence is overwritten with the -second element of the list. An optional third element of each -list may specify a value for `major-mode'. In this case the -replacement will only apply in case that major-mode is -active.") +(defvar which-key-key-based-description-replacement-alist '() + "Each item in the list is a cons cell. The car of each cons +cell is either a string like \"C-c\", in which case it's +interpreted as a key sequence or a value of `major-mode'. Here +are two examples: + +(\"SPC f f\" . \"find files\") +(emacs-lisp-mode . ((\"SPC m d\" . \"debug\"))) + +In the first case the description of the key sequence \"SPC f f\" +is overwritten with \"find files\". The second case works the +same way using the alist matched when `major-mode' is +emacs-lisp-mode.") (defvar which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL") "These keys will automatically be truncated to one character and have `which-key-special-key-face' applied to them.") @@ -436,12 +440,13 @@ the maximum number of lines availabel in the target buffer." ) (cons 0 act-width)))) -(defun which-key/maybe-replace-key-based (string keys repl-alist) - (let ((ret-val (assoc-string keys repl-alist))) - (cond ((and ret-val (eq major-mode (nth 2 ret-val))) - (nth 1 ret-val)) - ((and ret-val (not (nth 2 ret-val))) - (nth 1 ret-val)) +(defun which-key/maybe-replace-key-based (string keys) + (let* ((alist which-key-key-based-description-replacement-alist) + (str-res (assoc-string keys alist)) + (mode-alist (assq major-mode alist)) + (mode-res (when mode-alist (assoc-string keys mode-alist)))) + (cond (mode-res (cdr mode-res)) + (str-res (cdr str-res)) (t string)))) (defun which-key/maybe-replace (string repl-alist &optional literal) @@ -494,8 +499,7 @@ key and description replacement alists." (keys (concat prefix-keys " " key)) (key (which-key/maybe-replace key which-key-key-replacement-alist)) (desc (which-key/maybe-replace desc which-key-description-replacement-alist)) - (desc (which-key/maybe-replace-key-based desc keys - which-key-key-based-description-replacement-alist)) + (desc (which-key/maybe-replace-key-based desc keys)) (group (string-match-p "^group:" desc)) (desc (if group (substring desc 6) desc)) (prefix (string-match-p "^Prefix" desc)) From 3c5f1ba686a59a0490c8f491f3b9b020fa00ac98 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 15:35:53 -0400 Subject: [PATCH 085/806] Fix act-width in populate-buffer --- which-key.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index d56f9f2ce1c..b8be10f1a23 100644 --- a/which-key.el +++ b/which-key.el @@ -402,19 +402,20 @@ the maximum number of lines availabel in the target buffer." (n-keys (length formatted-keys)) (max-dims (which-key/popup-max-dimensions sel-win-width)) (max-height (when (car max-dims) (car max-dims))) - (max-width (if (cdr max-dims) - (if (eq which-key-show-prefix 'left) - (- (cdr max-dims) prefix-len) - (cdr max-dims)) 0)) + (max-width-for-columns (if (cdr max-dims) + (if (eq which-key-show-prefix 'left) + (- (cdr max-dims) prefix-len) + (cdr max-dims)) 0)) ;; the 3 leaves room for the ... possibly on the first page (remove for now) - (n-columns (/ max-width column-width)) ;; integer division - (act-width (* n-columns column-width)) + (n-columns (/ max-width-for-columns column-width)) ;; integer division + (act-width (+ (* n-columns column-width) + (if (eq which-key-show-prefix 'left) prefix-len 0))) ;; (avl-lines/page (which-key/available-lines)) (max-keys/page (when max-height (* n-columns max-height))) (n-pages (if (> max-keys/page 0) (ceiling (/ (float n-keys) max-keys/page)) 1)) pages act-height first-page) - (if (and (> n-keys 0) (> act-width 0)) + (if (and (> n-keys 0) (> n-columns 0)) (progn (dotimes (p n-pages) (setq pages @@ -436,7 +437,7 @@ the maximum number of lines availabel in the target buffer." (cons act-height act-width)) (if (<= n-keys 0) (message "Can't display which-key buffer: There are no keys to show.") - (message "Can't display which-key buffer: A minimum width of %s chars is required, but your settings only allow for %s chars." column-width max-width) + (message "Can't display which-key buffer: A minimum width of %s chars is required, but your settings only allow for %s chars." column-width max-width-for-columns) ) (cons 0 act-width)))) From a7c7862e47a88382bcf97bd1e7f04de8b28aad2f Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 16:08:03 -0400 Subject: [PATCH 086/806] Fix #21 --- which-key.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index b8be10f1a23..1d93066c9ed 100644 --- a/which-key.el +++ b/which-key.el @@ -393,7 +393,8 @@ the maximum number of lines availabel in the target buffer." (defun which-key/populate-buffer (prefix-keys formatted-keys column-width sel-win-width) "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." - (let* ((prefix-w-face (which-key/propertize-key prefix-keys)) + (let* ((vertical-mode (member which-key-side-window-location '(left right))) + (prefix-w-face (which-key/propertize-key prefix-keys)) (prefix-len (+ 2 (length (substring-no-properties prefix-w-face)))) (prefix-string (when which-key-show-prefix (if (eq which-key-show-prefix 'left) @@ -406,8 +407,11 @@ the maximum number of lines availabel in the target buffer." (if (eq which-key-show-prefix 'left) (- (cdr max-dims) prefix-len) (cdr max-dims)) 0)) - ;; the 3 leaves room for the ... possibly on the first page (remove for now) (n-columns (/ max-width-for-columns column-width)) ;; integer division + (n-columns (if vertical-mode + ;; use up vertical space first if possible + (min n-columns (ceiling (/ (float n-keys) max-height))) + n-columns)) (act-width (+ (* n-columns column-width) (if (eq which-key-show-prefix 'left) prefix-len 0))) ;; (avl-lines/page (which-key/available-lines)) From 82f252fdad74c0bc51c5209105d6d0ef22f01cc8 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 20:39:27 -0400 Subject: [PATCH 087/806] Possible fix for #18 --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 1d93066c9ed..46961a014f4 100644 --- a/which-key.el +++ b/which-key.el @@ -177,7 +177,8 @@ Used when `which-key-popup-type' is frame.") "Fill which-key--buffer with key descriptions and reformat. Finally, show the buffer." (let ((prefix-keys (this-single-command-keys))) - (when (> (length prefix-keys) 0) + (when (and (> (length prefix-keys) 0) + (not (symbolp (key-binding prefix-keys)))) (let* ((buf (current-buffer)) ;; get formatted key bindings (fmt-width-cons (which-key/get-formatted-key-bindings buf prefix-keys)) From e63acf1e5d16cce9be3f9e25e82056e1797a8ff3 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 22:16:21 -0400 Subject: [PATCH 088/806] Update readme --- README.org | 75 +++++++++++++++++++++++++++++++++------ img/which-key-bottom.png | Bin 59650 -> 33722 bytes img/which-key-right.png | Bin 103284 -> 43274 bytes 3 files changed, 65 insertions(+), 10 deletions(-) diff --git a/README.org b/README.org index 93cbaad6010..4113a1ed108 100644 --- a/README.org +++ b/README.org @@ -1,16 +1,71 @@ Rewrite of guide-key-mode for emacs. -Here's a recent picture showing what it does: +* Install +Add which-key.el to your load-path and require. Some thing like -[[./img/which-key-bottom.png]] +#+BEGIN_SRC emacs-lisp +(add-to-list 'load-path "path/to/which-key.el") +(require 'which-key) +(which-key-mode) +#+END_SRC -* Status -It is somewhat stable for me at the moment, but expect to see potentially weird -behavior (then to report it to me!). -** Completed +There are 3 choices of default configs for you to try (then customize to your +liking). The main choice is where you want the which-key buffer to display. +Screenshots of the default options are shown in the next sections. + +In each case, we show as many key bindings as we can fit in the buffer within +the constraints. The constraints are determined by several factors, including +your emacs settings, the size of the current emacs frame, and the which-key +settings (which are configurable but not well documented at the moment). + +By default which-key makes substitutions for text all with the aim of saving +space. The most noticeable are the "special keys" like SPC, TAB, RET, etc. This +can be turned off, but the default is to truncate these keys to one character +and display them using inverse-video (flips foreground and background colors). +You can see the effect in the screenshots. + +There are other substitution abilities included, which are quite flexible +(ability to use regexp for example). This makes which-key very customizable. +This functionality is targeting [[https://github.com/syl20bnr/spacemacs][spacemacs]]. + +** Minibuffer Option +Take over the minibuffer. Setup by default, but you can also use + +#+BEGIN_SRC emacs-lisp +(which-key/setup-minibuffer) +#+END_SRC + +[[./img/which-key-minibuffer.png]] + +Note the maximum height of the minibuffer is controlled through the built-in +variable max-mini-window-height. + +** Side Window Right Option +Popup side window on right. For defaults use + +#+BEGIN_SRC emacs-lisp +(which-key/setup-side-window-right) +#+END_SRC + +[[./img/which-key-right.png]] + + +* Status/Goals +** Stability +- It's very much a work in progress, so expect weird things to happen from time + to time. That being said, the default configuration works well for me. +** Completed Goals 1. Use idle timers to trigger window popup instead of guide-key's constant polling. -2. Add support for replacement lists to modify key descriptions on the fly. -** Ongoing/Planned -1. Explore alternatives to popwin like window-pupose and using display-buffer - directly +2. Remove popwin as a "hard" dependency, prefering built-in display commands + where possible. +3. Add support for replacement lists to modify key descriptions on the fly. + Currently you can replace in the key or description field using regexp, and + using a key sequence (like "C-x 1") to fully replace the description (the + latter can target major modes, too). +** Incomplete and Planned +1. Come up with creative ways to fit more keys in buffer while still maintaining + nice alignment and formatting. Such as + 1. Automatic text scaling + 2. Paging functionality + diff --git a/img/which-key-bottom.png b/img/which-key-bottom.png index f096981300118faa66e2414089650e9476838c3f..9ed2bf1090ac35d444468cc2b350722f08c2629c 100644 GIT binary patch literal 33722 zcmeAS@N?(olHy`uVBq!ia0y~yU@Br@U^>si#=yYvtV-98fq{XsILO_JVcj{ImkbOH zEa{HEjtmSN`?>!lvNA9*a29w(7BevL9R^{>t}=hpLQp9)!Wv5Y&2b~ z{{Pa~&+E&+eO5ob{r}%@Cw>>_&;I@E=RxuMr+u&a%jK?{-j@6QV)lNyeSf{HZ&jZB z_xtt3?~8YRe|CKTufre8_y4*uhmFB>&7P%m^-jdr+y1$0Uu*j(V*j@2^^STI7EF16 z*!})IBZs9m8Na_RzOyCx>tmzlIef}O5_SL2`k(pPms~$%V%^^lNB5g7-+Jr*vwd}a zzq891RB}1$ZD9U*ZKKN!<^mp&KSiF{$-MjblK=4C(mON%_K81v^6CbEe9Y|2w`A=V zwtf%(HHq7Fy8M$je=o^Bsrxd0yEBXi(hNM zo382dsSJ{^3{z4MgNKEKQA&-m?R>SpXu`~5m~=aa7o*e7cGysTXF zV8t&Jt!+N?1*e&<}`%xQp&3ykl zr_hY_JxSZL=gu@sZ&fhgI-mP)%v9zA4ek6)kl#NRso&2p-EmRzFnhPfoi{VLo!z%6 zd23{GtNZu63U6H<^JKT#{W6Q&_qXegNY%?@qhDEyGT#w45Rb3==i0-UP%8w zHTCYYchim8mcBJxy0%c#{Qq{n6Rq>>C4O&PKmYWf)7h)F13%l{y}2xrv*=~rG_%KM zB`>blq#Gum0QPD%CogXZNe~FwC2}eamFlo%`!Hzw4PG{JE$#)#~T0gXvZa zr!Vten2_ne)$(jUTVv?#brto}hmMua4tvlc@%I0V#p`RMXKK5@bzFDkMS9`wzyDX? zU;M~!^3PN6J9q9ov*+F}-CaWx&Q3yoOqNJ{y>6ZT@86T!x0Zpset{E2bpXZElb1lP6A2nYZ}T1R}P+^po?Pp_$E57$#jP{&J#@-#f;Q`c{(U=2 z|9*6QuWUa5{pm9MQt8vXqMKu8o_YR%h10F@+%?zcM_rq_`_#@&Hh8CTXG*?op&|VAk+B!*GF=m^MkHkUHwAarF@ZR zQ~TZX&XIq0a(DY=SN40=M68aVpZ5bar4#lBOJELFD}*oInDq2mWj(}*Mp(AeAZ2? z{h+`2-w*9V`CYl*-)GO?w(r)q#b-?d!XA`AVURfm&W$n8)`uORT=awMEbCnTeZI{H zP0qH?dy(azc}q=R<anD(>Ex4q9W#CN^-h960#M~|~N z8T9kBNhi8BO%%0A3!D9E7k}}?uNpF!+W8xIT|1Tb)gFiZ9eY`B1XP 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

+|8y{*|tNoUN)qm+Te! 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

4s{hGz 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 Xlr;CF{=1yMAoDz3{an^LB{Ts5hu3@5 diff --git a/img/which-key-right.png b/img/which-key-right.png index a207d5a82e58ef995a3c4ae4ed5091d18f7d3c49..f01a40bc453067209de53552e6fd301b69c1ad06 100644 GIT binary patch literal 43274 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 literal 103284 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 Date: Wed, 8 Jul 2015 22:18:02 -0400 Subject: [PATCH 089/806] Add config setup functions and more Fix a problem where the frame-height was not accouting for the minibuffer. Also, set the buffer to hidden-mode-line-mode to hide the mode-line for now (#16). --- which-key.el | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 46961a014f4..e248a255b26 100644 --- a/which-key.el +++ b/which-key.el @@ -156,9 +156,28 @@ Used when `which-key-popup-type' is frame.") (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer (setq-local cursor-type nil) - (setq-local cursor-in-non-selected-windows nil)) + (setq-local cursor-in-non-selected-windows nil) + (hidden-mode-line-mode t)) (setq which-key--setup-p t)) +(defun which-key/setup-side-window-right () + "Apply suggested settings for side-window that opens on right." + (setq which-key-popup-type 'side-window + which-key-side-window-location 'right + which-key-show-prefix 'top)) + +(defun which-key/setup-side-window-bottom () + "Apply suggested settings for side-window that opens on +bottom." + (setq which-key-popup-type 'side-window + which-key-side-window-location 'bottom + which-key-show-prefix nil)) + +(defun which-key/setup-minibuffer () + "Apply suggested settings for minibuffer." + (setq which-key-popup-type 'minibuffer + which-key-show-prefix 'left)) + ;; Timers (defun which-key/start-open-timer () @@ -250,7 +269,8 @@ need to start the closing timer." ;; (display-buffer which-key--buffer (cons 'display-buffer-in-side-window alist)) ;; side defaults to bottom (if (get-buffer-window which-key--buffer) - (display-buffer-reuse-window which-key--buffer alist) + (progn + (display-buffer-reuse-window which-key--buffer alist)) (display-buffer-in-major-side-window which-key--buffer side 0 alist)) (let ((fit-window-to-buffer-horizontally t)) (fit-window-to-buffer (get-buffer-window which-key--buffer))))) @@ -347,7 +367,9 @@ of the intended popup." (cons ;; height (if (member which-key-side-window-location '(left right)) - (frame-height) + (- (frame-height) 1) ; 1 is for minibuffer + ;; (window-height (minibuffer-window)) + ;; (window-mode-line-height which-key--window)) ;; FIXME: change to something like (min which-*-height (calculate-max-height)) which-key-side-window-max-height) ;; width @@ -383,16 +405,19 @@ N-COLUMNS is the number of text columns to use and MAX-LINES is the maximum number of lines availabel in the target buffer." (let* ((n-keys (length keys)) (n-lines (min (ceiling (/ (float n-keys) n-columns)) max-lines)) - (line-padding (when (eq which-key-show-prefix 'left) (s-repeat prefix-len " "))) + (line-padding (when (eq which-key-show-prefix 'left) + (s-repeat prefix-len " "))) lines) (dotimes (i n-lines) (setq lines - (push - (cl-subseq keys (* i n-columns) (min n-keys (* (1+ i) n-columns))) + (push (cl-subseq keys (* i n-columns) + (min n-keys (* (1+ i) n-columns))) lines))) - (mapconcat (lambda (x) (apply 'concat x)) (reverse lines) (concat "\n" line-padding)))) + (mapconcat (lambda (x) (apply 'concat x)) + (reverse lines) (concat "\n" line-padding)))) -(defun which-key/populate-buffer (prefix-keys formatted-keys column-width sel-win-width) +(defun which-key/populate-buffer (prefix-keys formatted-keys + column-width sel-win-width) "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." (let* ((vertical-mode (member which-key-side-window-location '(left right))) (prefix-w-face (which-key/propertize-key prefix-keys)) From 25d29cddaf53230be326722f128f1cad83cf9d0c Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 22:20:03 -0400 Subject: [PATCH 090/806] Add minibuffer picture --- img/which-key-minibuffer.PNG | Bin 0 -> 22679 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/which-key-minibuffer.PNG diff --git a/img/which-key-minibuffer.PNG b/img/which-key-minibuffer.PNG new file mode 100644 index 0000000000000000000000000000000000000000..640f5378a07ca9ec01f32f457fde86e11f2b3554 GIT binary patch literal 22679 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 Date: Wed, 8 Jul 2015 22:25:00 -0400 Subject: [PATCH 091/806] Add bottom section and picture to readme --- README.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.org b/README.org index 4113a1ed108..f785ceb5474 100644 --- a/README.org +++ b/README.org @@ -50,6 +50,16 @@ Popup side window on right. For defaults use [[./img/which-key-right.png]] +** Side Window Bottom Option +Popup side window on bottom. For defaults use + +#+BEGIN_SRC emacs-lisp +(which-key/setup-side-window-bottom) +#+END_SRC + +[[./img/which-key-bottom.png]] + + * Status/Goals ** Stability - It's very much a work in progress, so expect weird things to happen from time From 6c40180271d5803abda1c2a73de75cbe714b5c7f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 8 Jul 2015 22:28:25 -0400 Subject: [PATCH 092/806] Delete which-key-minibuffer.PNG --- img/which-key-minibuffer.PNG | Bin 22679 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img/which-key-minibuffer.PNG diff --git a/img/which-key-minibuffer.PNG b/img/which-key-minibuffer.PNG deleted file mode 100644 index 640f5378a07ca9ec01f32f457fde86e11f2b3554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22679 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 Date: Wed, 8 Jul 2015 22:36:07 -0400 Subject: [PATCH 093/806] Add minibuffer picture --- img/which-key-minibuffer.png | Bin 0 -> 64067 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/which-key-minibuffer.png diff --git a/img/which-key-minibuffer.png b/img/which-key-minibuffer.png new file mode 100644 index 0000000000000000000000000000000000000000..586920aed44bee403326e7a748509d0503e44d44 GIT binary patch literal 64067 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