From eee44fd998bd10ae6fdc491c184e6c7f80305592 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 1 Jul 2015 20:20:55 -0400 Subject: [PATCH 001/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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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 literal 0 HcmV?d00001 From 79ec100fb4d502a3e84700b28cf5e8013617449a Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 3 Jul 2015 12:51:05 -0400 Subject: [PATCH 029/816] 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/816] 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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

%B;>ki^`$)o6vu9bay+&B0WFotnJA+9B$x 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 V-rkws>7l6j$<6a0B$vzS{{e^Bd(;2` 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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/816] 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 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 literal 59650 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

%B;>ki^`$)o6vu9bay+&B0WFotnJA+9B$x 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 V-rkws>7l6j$<6a0B$vzS{{e^Bd(;2` 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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 From 0e564fc2f598fa5bf866af9b85e080e4c5a97d3a Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 22:18:02 -0400 Subject: [PATCH 089/816] 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/816] 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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 FV1ily(1QQ~ literal 0 HcmV?d00001 From 041bc9d2813867bfe72f2145ac4a074f91223263 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 22:25:00 -0400 Subject: [PATCH 091/816] 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/816] 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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 FV1ily(1QQ~ From dfbefe4c827be081f4d82c62268c4a8745335a0c Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 8 Jul 2015 22:36:07 -0400 Subject: [PATCH 093/816] 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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�uEkxXrkX~9H8d(D;v+8V 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 Date: Thu, 9 Jul 2015 07:25:47 -0400 Subject: [PATCH 094/816] Remove hidden-mode-line-mode --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e248a255b26..c3e06f9a796 100644 --- a/which-key.el +++ b/which-key.el @@ -157,7 +157,7 @@ Used when `which-key-popup-type' is frame.") (with-current-buffer which-key--buffer (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) - (hidden-mode-line-mode t)) + (setq-local mode-line-format "")) (setq which-key--setup-p t)) (defun which-key/setup-side-window-right () From 7f96e4d86b623c71ddb9d01ebfa9a4a58524d659 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 07:44:36 -0400 Subject: [PATCH 095/816] Fix #22 Check for keymap instead of not a symbol. --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index c3e06f9a796..6d08ad384f3 100644 --- a/which-key.el +++ b/which-key.el @@ -196,8 +196,10 @@ bottom." "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) (message "key: %s" (key-description prefix-keys))) +;; (when (> (length prefix-keys) 0) (message "key binding: %s" (key-binding prefix-keys))) (when (and (> (length prefix-keys) 0) - (not (symbolp (key-binding prefix-keys)))) + (keymapp (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 bd2daa7f1b750e8dc60a548a91c769c583508267 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 07:55:48 -0400 Subject: [PATCH 096/816] Make user setup functions interactive and autoload --- which-key.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/which-key.el b/which-key.el index 6d08ad384f3..35147934208 100644 --- a/which-key.el +++ b/which-key.el @@ -160,21 +160,27 @@ Used when `which-key-popup-type' is frame.") (setq-local mode-line-format "")) (setq which-key--setup-p t)) +;;;###autoload (defun which-key/setup-side-window-right () "Apply suggested settings for side-window that opens on right." + (interactive) (setq which-key-popup-type 'side-window which-key-side-window-location 'right which-key-show-prefix 'top)) +;;;###autoload (defun which-key/setup-side-window-bottom () "Apply suggested settings for side-window that opens on bottom." + (interactive) (setq which-key-popup-type 'side-window which-key-side-window-location 'bottom which-key-show-prefix nil)) +;;;###autoload (defun which-key/setup-minibuffer () "Apply suggested settings for minibuffer." + (interactive) (setq which-key-popup-type 'minibuffer which-key-show-prefix 'left)) From 69d6b46be7641938ce2c50e050b1271cababd3e4 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 08:22:56 -0400 Subject: [PATCH 097/816] Remove mode-line and tweak max-height max-height for side-window could still be more precise, but this seems to work --- which-key.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 35147934208..49f1f4f6b0b 100644 --- a/which-key.el +++ b/which-key.el @@ -157,7 +157,7 @@ Used when `which-key-popup-type' is frame.") (with-current-buffer which-key--buffer (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) - (setq-local mode-line-format "")) + (setq-local mode-line-format nil)) (setq which-key--setup-p t)) ;;;###autoload @@ -375,8 +375,7 @@ of the intended popup." (cons ;; height (if (member which-key-side-window-location '(left right)) - (- (frame-height) 1) ; 1 is for minibuffer - ;; (window-height (minibuffer-window)) + (- (frame-height) (window-text-height (minibuffer-window)) 1) ;; 1 is a kludge to make sure there is no overlap ;; (window-mode-line-height which-key--window)) ;; FIXME: change to something like (min which-*-height (calculate-max-height)) which-key-side-window-max-height) From 688ba7ee95e9e07e4991e647184e95e8e43be829 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Thu, 9 Jul 2015 16:22:27 +0300 Subject: [PATCH 098/816] Fix text vs. total window width handling #22 --- which-key.el | 49 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 35147934208..8675aba6e72 100644 --- a/which-key.el +++ b/which-key.el @@ -220,6 +220,42 @@ Finally, show the buffer." ;; command finished maybe close the window ;; (which-key/hide-popup)))) +;; window-size utilities + +(defun which-key/text-width-to-total (text-width) + "Convert window text-width to window total-width. +TEXT-WIDTH is the desired text width of the window. The function calculates what +total width is required for a window in the selected to have a text-width of +TEXT-WIDTH columns. The calculation considers possible fringes and scroll bars. +This function assumes that the desired window has the same character width as +the frame." + (let ((char-width (frame-char-width))) + (+ text-width + (/ (frame-fringe-width) char-width) + (/ (frame-scroll-bar-width) char-width) + (if (which-key/char-enlarged-p) 1 0)))) + +(defun which-key/total-width-to-text (total-width) + "Convert window total-width to window text-width. +TOTAL-WIDTH is the desired total width of the window. The function calculates +what text width fits such a window. The calculation considers possible fringes +and scroll bars. This function assumes that the desired window has the same +character width as the frame." + (let ((char-width (frame-char-width))) + (- total-width + (/ (frame-fringe-width) char-width) + (/ (frame-scroll-bar-width) char-width) + (if (which-key/char-enlarged-p) 1 0)))) + +(defun which-key/char-enlarged-p (&optional frame) + (> (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) + +(defun which-key/char-reduced-p (&optional frame) + (< (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) + +(defun which-key/char-exact-p (&optional frame) + (= (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) + ;; Show/hide guide buffer (defun which-key/hide-popup () @@ -257,7 +293,7 @@ need to start the closing timer." (defun which-key/show-buffer-side-window (act-popup-dim) (let* ((height (car act-popup-dim)) - (width (cdr act-popup-dim)) + (width (which-key/text-width-to-total (cdr act-popup-dim))) (side which-key-side-window-location) (alist (delq nil (list (when height (cons 'window-height height)) (when width (cons 'window-width width)))))) @@ -277,11 +313,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) - (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))))) + (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)) @@ -382,8 +415,8 @@ of the intended popup." which-key-side-window-max-height) ;; width (if (member which-key-side-window-location '(left right)) - which-key-side-window-max-width - (frame-width)))) + (which-key/total-width-to-text which-key-side-window-max-width) + (window-width (frame-root-window))))) (defun which-key/frame-max-dimensions () (cons which-key-frame-max-height which-key-frame-max-width)) From e6911fe0b210506a9665242977fa803b5c8fc021 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 09:38:45 -0400 Subject: [PATCH 099/816] Add functions for adding to replacement alists --- which-key.el | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/which-key.el b/which-key.el index 49f1f4f6b0b..5c3f4214c4a 100644 --- a/which-key.el +++ b/which-key.el @@ -160,6 +160,9 @@ Used when `which-key-popup-type' is frame.") (setq-local mode-line-format nil)) (setq which-key--setup-p t)) +;; Default configuration functions for use by users. Should be the "best" +;; configurations + ;;;###autoload (defun which-key/setup-side-window-right () "Apply suggested settings for side-window that opens on right." @@ -196,6 +199,37 @@ bottom." "Deactivate idle timer." (when which-key--open-timer (cancel-timer which-key--open-timer))) +;; Helper functions to modify replacement lists. + +(defun which-key//add-key-based-replacements (alist key repl &rest more) + (while key + (when (or (not (stringp key)) (not (stringp repl))) + (error "KEY and REPL should be strings")) + (cl-pushnew (cons key repl) alist + :test (lambda (x y) (string-equal (car x) (car y)))) + (setq key (pop more) + repl (pop more))) + alist) + +(defun which-key/add-key-based-replacements (key repl &rest more) + ;; TODO: Make interactive + (setq which-key-key-based-description-replacement-alist + (which-key//add-key-based-replacements + which-key-key-based-description-replacement-alist key repl more))) + +(defun which-key/add-major-mode-key-based-replacements (mode key repl &rest more) + ;; TODO: Make interactive + (when (not (symbolp mode)) + (error "MODE should be a symbol corresponding to a value of major-mode")) + (let ((mode-alist (car (assq which-key-key-based-description-replacement-alist)))) + (setq mode-alist (which-key//add-key-based-replacements + mode-alist key repl more) + which-key-key-based-description-replacement-alist + (delq mode which-key-key-based-description-replacement-alist) + which-key-key-based-description-replacement-alist + (push mode-alist + which-key-key-based-description-replacement-alist)))) + ;; Update (defun which-key/update () From d9a9bd5ae6172d6cc8a6f1bdf6d2608ad3c885b8 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Thu, 9 Jul 2015 17:27:11 +0300 Subject: [PATCH 100/816] Allow percentages for side-window max sizes #19 --- which-key.el | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 8675aba6e72..aa4a2897605 100644 --- a/which-key.el +++ b/which-key.el @@ -78,10 +78,14 @@ the feature off.") 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.") +location is left or right. +This variable can also be a number between 0 and 1. In that case, it denotes +a percentage out of the frame's width.") (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.") +location is top or bottom. +This variable can also be a number between 0 and 1. In that case, it denotes +a percentage out of the frame's height.") (defvar which-key-frame-max-width 60 "Maximum width of which-key popup when type is frame.") (defvar which-key-frame-max-height 20 @@ -256,6 +260,26 @@ character width as the frame." (defun which-key/char-exact-p (&optional frame) (= (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) +(defun which-key/width-or-percentage-to-width (width-or-percentage) + "Return window total width. +If WIDTH-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it +should be a percentage (a number between 0 and 1) out of the frame's width. +More precisely, it should be a percentage out of the frame's root window's +total width." + (if (wholenump width-or-percentage) + width-or-percentage + (round (* width-or-percentage (window-total-width (frame-root-window)))))) + +(defun which-key/height-or-percentage-to-height (height-or-percentage) + "Return window total height. +If HEIGHT-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it +should be a percentage (a number between 0 and 1) out of the frame's height. +More precisely, it should be a percentage out of the frame's root window's +total height." + (if (wholenump height-or-percentage) + height-or-percentage + (round (* height-or-percentage (window-total-height (frame-root-window)))))) + ;; Show/hide guide buffer (defun which-key/hide-popup () @@ -412,10 +436,11 @@ of the intended popup." ;; (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) + (which-key/height-or-percentage-to-height which-key-side-window-max-height)) ;; width (if (member which-key-side-window-location '(left right)) - (which-key/total-width-to-text which-key-side-window-max-width) + (which-key/total-width-to-text (which-key/width-or-percentage-to-width + which-key-side-window-max-width)) (window-width (frame-root-window))))) (defun which-key/frame-max-dimensions () From 315eeca54dbceeb240f7056ddc034a0c1b82f870 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Thu, 9 Jul 2015 18:56:36 +0300 Subject: [PATCH 101/816] Use fit-window-to-buffer again --- which-key.el | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index aa4a2897605..a95d2cef00a 100644 --- a/which-key.el +++ b/which-key.el @@ -237,7 +237,9 @@ the frame." (+ text-width (/ (frame-fringe-width) char-width) (/ (frame-scroll-bar-width) char-width) - (if (which-key/char-enlarged-p) 1 0)))) + (if (which-key/char-enlarged-p) 1 0) + ;; add padding to account for possible wide (unicode) characters + 3))) (defun which-key/total-width-to-text (total-width) "Convert window total-width to window text-width. @@ -249,7 +251,9 @@ character width as the frame." (- total-width (/ (frame-fringe-width) char-width) (/ (frame-scroll-bar-width) char-width) - (if (which-key/char-enlarged-p) 1 0)))) + (if (which-key/char-enlarged-p) 1 0) + ;; add padding to account for possible wide (unicode) characters + 3))) (defun which-key/char-enlarged-p (&optional frame) (> (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) @@ -315,12 +319,16 @@ need to start the closing timer." (defun which-key/show-buffer-minibuffer (act-popup-dim) nil) -(defun which-key/show-buffer-side-window (act-popup-dim) - (let* ((height (car act-popup-dim)) - (width (which-key/text-width-to-total (cdr act-popup-dim))) - (side which-key-side-window-location) - (alist (delq nil (list (when height (cons 'window-height height)) - (when width (cons 'window-width width)))))) +;; &rest params because `fit-buffer-to-window' has a different call signature +;; in different emacs versions +(defun which-key/fit-buffer-to-window-horizontally (&optional window &rest params) + (let ((fit-window-to-buffer-horizontally t)) + (apply #'fit-window-to-buffer window params))) + +(defun which-key/show-buffer-side-window (_act-popup-dim) + (let* ((side which-key-side-window-location) + (alist '((window-width . which-key/fit-buffer-to-window-horizontally) + (window-height . fit-window-to-buffer)))) ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' ;; were added in Emacs 24.3 From d0a9cc0c10773fe6c579ac4864f467a13742e550 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 11:12:19 -0400 Subject: [PATCH 102/816] Change side-window params to percentages --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index aa4a2897605..ace968ac4bf 100644 --- a/which-key.el +++ b/which-key.el @@ -76,12 +76,12 @@ the feature off.") (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 +(defvar which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window and location is left or right. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's width.") -(defvar which-key-side-window-max-height 20 +(defvar which-key-side-window-max-height 0.25 "Maximum height of which-key popup when type is side-window and location is top or bottom. This variable can also be a number between 0 and 1. In that case, it denotes From a73d8b8fadc505a7e3bc6d7373ad2a118d9a4b28 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 12:24:19 -0400 Subject: [PATCH 103/816] remove mode-line --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 8a810633085..e36fcc60454 100644 --- a/which-key.el +++ b/which-key.el @@ -161,7 +161,7 @@ Used when `which-key-popup-type' is frame.") (with-current-buffer which-key--buffer (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) - (setq-local mode-line-format "")) + (setq-local mode-line-format nil)) (setq which-key--setup-p t)) ;;;###autoload From 01ce08761e7c9b61b4f9ad7244312e8c18f52cf5 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 12:32:13 -0400 Subject: [PATCH 104/816] Typo in add-major-mode-key-based-... --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 66f940ccf1e..bdbf9c70d4e 100644 --- a/which-key.el +++ b/which-key.el @@ -225,7 +225,7 @@ bottom." ;; TODO: Make interactive (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) - (let ((mode-alist (car (assq which-key-key-based-description-replacement-alist)))) + (let ((mode-alist (cdr (assq which-key-key-based-description-replacement-alist)))) (setq mode-alist (which-key//add-key-based-replacements mode-alist key repl more) which-key-key-based-description-replacement-alist From beafeb59b577e3b17ec81780649f4374e5c3d02d Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 12:33:36 -0400 Subject: [PATCH 105/816] Another typo --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index bdbf9c70d4e..094f3324891 100644 --- a/which-key.el +++ b/which-key.el @@ -225,7 +225,7 @@ bottom." ;; TODO: Make interactive (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) - (let ((mode-alist (cdr (assq which-key-key-based-description-replacement-alist)))) + (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) (setq mode-alist (which-key//add-key-based-replacements mode-alist key repl more) which-key-key-based-description-replacement-alist From f60e6d979d3033b4183360f30e0836f3102deb89 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 12:58:45 -0400 Subject: [PATCH 106/816] Fix add replacement functions --- which-key.el | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index 094f3324891..282d9f76880 100644 --- a/which-key.el +++ b/which-key.el @@ -205,33 +205,37 @@ bottom." ;; Helper functions to modify replacement lists. -(defun which-key//add-key-based-replacements (alist key repl &rest more) - (while key - (when (or (not (stringp key)) (not (stringp repl))) - (error "KEY and REPL should be strings")) - (cl-pushnew (cons key repl) alist - :test (lambda (x y) (string-equal (car x) (car y)))) - (setq key (pop more) - repl (pop more))) +(defun which-key//add-key-based-replacements (alist key repl) + (when (or (not (stringp key)) (not (stringp repl))) + (error "KEY and REPL should be strings")) + (cl-pushnew (cons key repl) alist + :test (lambda (x y) + (let ((cx (car x)) (cy (car y))) + (or (and (stringp cx) (stringp cy) (string-equal cx cy)) + (and (symbolp cx) (symbolp cy) (eq cx cy)))))) alist) (defun which-key/add-key-based-replacements (key repl &rest more) ;; TODO: Make interactive - (setq which-key-key-based-description-replacement-alist - (which-key//add-key-based-replacements - which-key-key-based-description-replacement-alist key repl more))) + (while key + (setq which-key-key-based-description-replacement-alist + (which-key//add-key-based-replacements + which-key-key-based-description-replacement-alist key repl)) + (setq key (pop more) repl (pop more)))) (defun which-key/add-major-mode-key-based-replacements (mode key repl &rest more) ;; TODO: Make interactive (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) - (setq mode-alist (which-key//add-key-based-replacements - mode-alist key repl more) + (while key + (setq mode-alist (which-key//add-key-based-replacements + mode-alist key repl)) + (setq key (pop more) repl (pop more))) + (setq which-key-key-based-description-replacement-alist + (assq-delete-all mode which-key-key-based-description-replacement-alist) which-key-key-based-description-replacement-alist - (delq mode which-key-key-based-description-replacement-alist) - which-key-key-based-description-replacement-alist - (push mode-alist + (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) ;; Update From 62f409a1025b8e15b44a2b2141af92bd6196ba5b Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 13:11:05 -0400 Subject: [PATCH 107/816] Make variables stand-out in readme --- README.org | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.org b/README.org index f785ceb5474..e523a33327d 100644 --- a/README.org +++ b/README.org @@ -1,7 +1,7 @@ Rewrite of guide-key-mode for emacs. * Install -Add which-key.el to your load-path and require. Some thing like +Add which-key.el to your =load-path= and require. Something like #+BEGIN_SRC emacs-lisp (add-to-list 'load-path "path/to/which-key.el") @@ -21,8 +21,8 @@ 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. +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. @@ -38,7 +38,7 @@ Take over the minibuffer. Setup by default, but you can also use [[./img/which-key-minibuffer.png]] Note the maximum height of the minibuffer is controlled through the built-in -variable max-mini-window-height. +variable =max-mini-window-height=. ** Side Window Right Option Popup side window on right. For defaults use @@ -71,7 +71,7 @@ Popup side window on bottom. For defaults use 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 + 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 From 9ada9d09e34ef03cde184b32af42834e833b85b4 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 16:22:16 -0400 Subject: [PATCH 108/816] Fix #6: TODO for defcustom --- which-key.el | 107 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 34 deletions(-) diff --git a/which-key.el b/which-key.el index 282d9f76880..cbc3a2b87b1 100644 --- a/which-key.el +++ b/which-key.el @@ -24,32 +24,45 @@ (require 'cl-lib) (require 's) -(defvar which-key-idle-delay 1 - "Delay (in seconds) for which-key buffer to popup.") -(defvar which-key-echo-keystrokes +(defgroup which-key nil "Customization options for which-key-mode") +(defcustom which-key-idle-delay 1 + "Delay (in seconds) for which-key buffer to popup." + :group 'which-key + :type 'float) +(defcustom 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 +popup." + :group 'which-key + :type 'float) +(defcustom 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 +\"..\"." + :group 'which-key + :type 'integer) +(defcustom which-key-separator "→" + "Separator to use between key and description." + :group 'which-key + :type 'string) +(defcustom which-key-key-replacement-alist '(("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") ("left" . "←") ("right" . "→")) - "The strings in the car of each cons are replaced with the + "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 +in the first example." + :group 'which-key + :type '(alist :key-type regexp :value-type string)) +(defcustom which-key-description-replacement-alist '(("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 '() +becomes problematic." + :group 'which-key + :type '(alist :key-type regexp :value-type string)) +(defcustom 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 @@ -61,35 +74,61 @@ are two examples: 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") +emacs-lisp-mode." +:group 'which-key) +(defcustom 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-show-prefix 'left - "Whether to and where to display the current prfix sequence. +and have `which-key-special-key-face' applied to them." + :group 'which-key + :type '(list string)) +(defcustom which-key-buffer-name "*which-key*" + "Name of which-key buffer." + :group 'which-key + :type 'string) +(defcustom which-key-show-prefix 'left + "Whether to and where to display the current prefix 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 +the feature off." + :group 'which-key + :type '(radio (symbol :tag "Left of keys" left) + (symbol :tag "In first line" top) + (const :tag "Hide" nil))) +(defcustom which-key-popup-type 'minibuffer + "Supported types are minibuffer, side-window and frame." + :group 'which-key + :type '(radio (symbol :tag "Show in minibuffer" minibuffer) + (symbol :tag "Show in side window" side-window) + (symbol :tag "Show in popup frame" frame))) +(defcustom 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 0.333 +side-window. Should be one of top, bottom, left or right." + :group 'which-key + :type '(radio (symbol right) + (symbol bottom) + (symbol left) + (symbol top))) +(defcustom which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window and location is left or right. This variable can also be a number between 0 and 1. In that case, it denotes -a percentage out of the frame's width.") -(defvar which-key-side-window-max-height 0.25 +a percentage out of the frame's width." + :group 'which-key + :type 'float) +(defcustom which-key-side-window-max-height 0.25 "Maximum height of which-key popup when type is side-window and location is top or bottom. This variable can also be a number between 0 and 1. In that case, it denotes -a percentage out of the frame's height.") -(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.") +a percentage out of the frame's height." + :group 'which-key + :type 'float) +(defcustom which-key-frame-max-width 60 + "Maximum width of which-key popup when type is frame." + :group 'which-key + :type 'integer) +(defcustom which-key-frame-max-height 20 + "Maximum height of which-key popup when type is frame." + :group 'which-key + :type 'integer) ;; Faces (defface which-key-key-face From 732b0c32c93771ebd075d051e81a40af2fd219b1 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 20:46:49 -0400 Subject: [PATCH 109/816] Try out status-key option --- which-key.el | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index cbc3a2b87b1..c0395451800 100644 --- a/which-key.el +++ b/which-key.el @@ -569,14 +569,17 @@ 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* ((vertical-mode (member which-key-side-window-location '(left right))) + (let* ((vertical-mode (and (eq which-key-popup-type 'side-window) + (member which-key-side-window-location '(left right)))) + (n-status-key 1) + (which-key-show-prefix nil) (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)) + (n-keys (+ n-status-key (length formatted-keys))) (max-dims (which-key/popup-max-dimensions sel-win-width)) (max-height (when (car max-dims) (car max-dims))) (max-width-for-columns (if (cdr max-dims) @@ -590,11 +593,18 @@ the maximum number of lines availabel in the target buffer." 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)) (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)) + (n-keys-pg1 (- (if (= 1 n-pages) n-keys max-keys/page) n-status-key)) + (count (format "- [%s/%s]" n-keys-pg1 (- n-keys n-status-key))) + ;; (count-len (length count)) + (status-key (concat prefix-keys count)) + (status-key (s-pad-right column-width " " status-key)) + (status-key (propertize status-key 'face 'font-lock-comment-face)) + (fmtd-keys (if (= 1 n-status-key) (push status-key formatted-keys) formatted-keys)) pages act-height first-page) + (message "%s" status-key) (if (and (> n-keys 0) (> n-columns 0)) (progn (dotimes (p n-pages) From 654afeb8597607ceedd40085360b2595c17381e2 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jul 2015 20:49:37 -0400 Subject: [PATCH 110/816] Fix bug in populate buffer --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index cbc3a2b87b1..4605e73cc1c 100644 --- a/which-key.el +++ b/which-key.el @@ -569,7 +569,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* ((vertical-mode (member which-key-side-window-location '(left right))) + (let* ((vertical-mode (and (eq which-key-popup-type 'side-window) + (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 From 5f5fc22acfbd56d998efd4b73648ccd53d694da4 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 10:41:30 -0400 Subject: [PATCH 111/816] Fill columns first with variable column width Allows for more compact layout --- which-key.el | 265 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 157 insertions(+), 108 deletions(-) diff --git a/which-key.el b/which-key.el index 4605e73cc1c..f15bcc18fe3 100644 --- a/which-key.el +++ b/which-key.el @@ -289,13 +289,11 @@ Finally, show the buffer." (keymapp (key-binding prefix-keys))) (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)) + (formatted-keys (which-key/get-formatted-key-bindings buf prefix-keys)) ;; populate target buffer (popup-act-dim (which-key/populate-buffer (key-description prefix-keys) - formatted-keys column-width (window-width)))) + formatted-keys (window-width)))) ;; show buffer (which-key/show-popup popup-act-dim))))) ;; command finished maybe close the window @@ -547,80 +545,144 @@ 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)))))) - (which-key/format-matches unformatted (key-description key)))) + (which-key/format-and-replace unformatted (key-description key)))) -(defun which-key/create-page (prefix-len max-lines n-columns keys) +(defun which-key/create-page-vertical (max-lines max-width key-cns) "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 (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))) - lines))) - (mapconcat (lambda (x) (apply 'concat x)) - (reverse lines) (concat "\n" line-padding)))) + (let* ((n-keys (length key-cns)) + ;; (line-padding (when (eq which-key-show-prefix 'left) + ;; (s-repeat prefix-len " "))) + (avl-lines max-lines) + (avl-width max-width) + (rem-key-cns key-cns) + (n-col-lines (min avl-lines n-keys)) + (act-n-lines n-col-lines) ; n-col-lines in first column + (act-width 0) + (col-i 0) + (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face)) + col-key-cns col-key-width col-desc-width col-width col-split done + all-columns new-column page) + (while (not done) + (setq col-split (-split-at n-col-lines rem-key-cns) + col-key-cns (car col-split) + rem-key-cns (cadr col-split) + n-col-lines (min avl-lines (length rem-key-cns)) + col-key-width (reduce (lambda (x y) + (max x (length (substring-no-properties (car y))))) + col-key-cns :initial-value 0) + col-desc-width (reduce (lambda (x y) + (max x (length (substring-no-properties (cdr y))))) + col-key-cns :initial-value 0) + col-width (+ 4 (length (substring-no-properties sep-w-face)) + col-key-width col-desc-width) + new-column (mapcar + (lambda (k) + (concat (s-repeat (- col-key-width (length (substring-no-properties (car k)))) " ") + (car k) " " sep-w-face " " (cdr k) + (s-repeat (- col-desc-width (length (substring-no-properties (cdr k)))) " ") + " ")) + col-key-cns)) + (if (<= col-width avl-width) + (setq all-columns (push new-column all-columns) + act-width (+ act-width col-width) + avl-width (- avl-width col-width)) + (setq done t)) + (when (<= (length rem-key-cns) 0) (setq done t))) + (setq all-columns (reverse all-columns)) + (dotimes (i act-n-lines) + (dotimes (j (length all-columns)) + (setq page (concat page (nth i (nth j all-columns)) + (when (and (not (= i (- act-n-lines 1))) + (= j (- (length all-columns) 1))) "\n"))))) + (list page act-n-lines act-width rem-key-cns))) -(defun which-key/populate-buffer (prefix-keys formatted-keys - column-width sel-win-width) +(defun which-key/create-page (vertical max-lines max-width key-cns) + (let* ((first-try (which-key/create-page-vertical max-lines max-width key-cns)) + (n-rem-keys (length (nth 3 first-try))) + (next-try-lines max-lines) + prev-try prev-n-rem-keys next-try found) + (if (or vertical (> n-rem-keys 0) (= max-lines 1)) + first-try + ;; do a simple search for now (TODO: Implement binary search) + (while (not found) + (setq prev-try next-try + next-try-lines (- next-try-lines 1) + next-try (which-key/create-page-vertical next-try-lines max-width key-cns) + n-rem-keys (length (nth 3 next-try)) + found (or (= next-try-lines 1) (> n-rem-keys 0)))) + prev-try))) + +;; start on binary search (not correct yet) +;; n-rem-keys is 0, try to get a better fit +;; (while (not found) +;; (setq next-try-lines (/ (+ minline maxline) 2) +;; next-try (which-key/create-page-vertical next-try-lines max-width key-cns) +;; n-rem-keys (length (nth 3 next-try))) +;; (if (= n-rem-keys 0) +;; ;; not far enough +;; (setq maxline (- next-try-lines 1)) +;; ;; too far +;; (setq minline (+ next-try-lines 1)) +;; ) +;; next-try-lines (if (= n-rem-keys 0) +;; (/ (+ next-try-lines 1) 2) +;; (/ (+ max-lines next-try-lines) 2))) + + +(defun which-key/populate-buffer (prefix-keys formatted-keys sel-win-width) "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." - (let* ((vertical-mode (and (eq which-key-popup-type 'side-window) - (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) - (concat prefix-w-face " ") - (concat prefix-w-face "-\n")))) + (let* ((vertical (and (eq which-key-popup-type 'side-window) + (member which-key-side-window-location '(left right)))) + (which-key-show-prefix nil) ; kill prefix for now + ;; (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")))) + (prefix-string nil) (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-for-columns (if (cdr max-dims) - (if (eq which-key-show-prefix 'left) - (- (cdr max-dims) prefix-len) - (cdr max-dims)) 0)) - (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-width (if (cdr max-dims) + (if (eq which-key-show-prefix 'left) + (- (cdr max-dims) prefix-len) + (cdr max-dims)) 0)) + ;; (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) (> n-columns 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 (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)) - (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-for-columns) - ) - (cons 0 act-width)))) + ;; (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)) + (keys-rem formatted-keys) + (act-height 0) + (act-width 0) + pages first-page first-page-str page-res) + (while keys-rem + (setq page-res (which-key/create-page vertical max-height avl-width keys-rem) + pages (push page-res pages) + keys-rem (nth 3 page-res))) + ;; not doing anything with other pages for now + (setq pages (reverse pages) + first-page (car pages) + first-page-str (concat prefix-string (car first-page)) + act-height (nth 1 first-page) + act-width (nth 2 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-str)) + (with-current-buffer which-key--buffer + (erase-buffer) + (insert first-page-str) + (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 avl-width) +;; ) +;; (cons 0 act-width))) (defun which-key/maybe-replace-key-based (string keys) (let* ((alist which-key-key-based-description-replacement-alist) @@ -662,51 +724,38 @@ non-nil regexp is used in the replacements." (concat (substring desc 0 which-key-max-description-length) "..") desc)) -(defun which-key/format-matches (unformatted prefix-keys) +(defun which-key/format-and-replace (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. 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-width (length which-key-separator)) - after-replacements) + (let ((max-key-width 0)) ;(max-desc-width 0) ;; first replace and apply faces - (setq after-replacements - (mapcar - (lambda (key-desc-cons) - (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-key-based desc keys)) - (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 )))) + (mapcar + (lambda (key-desc-cons) + (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-key-based desc keys)) + (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 (provide 'which-key) From ea115fc5dd84d1b28351661ad9b31bbc852bb662 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 11:56:15 -0400 Subject: [PATCH 112/816] Fix bug (layout wasn't going to 1 line) --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f15bcc18fe3..088f55436bd 100644 --- a/which-key.el +++ b/which-key.el @@ -611,7 +611,7 @@ the maximum number of lines availabel in the target buffer." next-try-lines (- next-try-lines 1) next-try (which-key/create-page-vertical next-try-lines max-width key-cns) n-rem-keys (length (nth 3 next-try)) - found (or (= next-try-lines 1) (> n-rem-keys 0)))) + found (or (= next-try-lines 0) (> n-rem-keys 0)))) prev-try))) ;; start on binary search (not correct yet) From 0526b8b16750a09d48e5257575706db11bc96c7c Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 12:13:50 -0400 Subject: [PATCH 113/816] Bring back error message for too small of a frame --- which-key.el | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index 088f55436bd..a684756c7c0 100644 --- a/which-key.el +++ b/which-key.el @@ -283,8 +283,8 @@ bottom." "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) (message "key: %s" (key-description prefix-keys))) -;; (when (> (length prefix-keys) 0) (message "key binding: %s" (key-binding prefix-keys))) + ;; (when (> (length prefix-keys) 0) (message "key: %s" (key-description prefix-keys))) + ;; (when (> (length prefix-keys) 0) (message "key binding: %s" (key-binding prefix-keys))) (when (and (> (length prefix-keys) 0) (keymapp (key-binding prefix-keys))) (let* ((buf (current-buffer)) @@ -516,7 +516,7 @@ of the intended popup." ;; height (if (member which-key-side-window-location '(left right)) (- (frame-height) (window-text-height (minibuffer-window)) 1) ;; 1 is a kludge to make sure there is no overlap - ;; (window-mode-line-height which-key--window)) + ;; (window-mode-line-height which-key--window)) ;; FIXME: change to something like (min which-*-height (calculate-max-height)) (which-key/height-or-percentage-to-height which-key-side-window-max-height)) ;; width @@ -657,8 +657,6 @@ the maximum number of lines availabel in the target buffer." ;; (n-pages (if (> max-keys/page 0) ;; (ceiling (/ (float n-keys) max-keys/page)) 1)) (keys-rem formatted-keys) - (act-height 0) - (act-width 0) pages first-page first-page-str page-res) (while keys-rem (setq page-res (which-key/create-page vertical max-height avl-width keys-rem) @@ -667,17 +665,19 @@ the maximum number of lines availabel in the target buffer." ;; not doing anything with other pages for now (setq pages (reverse pages) first-page (car pages) - first-page-str (concat prefix-string (car first-page)) - act-height (nth 1 first-page) - act-width (nth 2 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-str)) - (with-current-buffer which-key--buffer - (erase-buffer) - (insert first-page-str) - (goto-char (point-min)))) - (cons act-height act-width))) + first-page-str (concat prefix-string (car first-page))) + (if (= 0 (length first-page-str)) + (progn + (message "which-key can't show keys: The settings and/or frame size are too restrictive.") + (cons 0 0)) + ;; (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-str)) + (with-current-buffer which-key--buffer + (erase-buffer) + (insert first-page-str) + (goto-char (point-min)))) + (cons (nth 1 first-page) (nth 2 first-page))))) ;; (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 avl-width) From b399f3e02ef97cf8a07e6f89ca4cc4135f921111 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Fri, 10 Jul 2015 20:30:30 +0300 Subject: [PATCH 114/816] Use toggle-truncate-lines; reduce -> cl-reduce Enabling toggle-truncate-lines in which-key--buffer, to avoid empty lines when the window is just a bit too narrow. --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index a684756c7c0..e0f335a4b8d 100644 --- a/which-key.el +++ b/which-key.el @@ -198,6 +198,7 @@ Used when `which-key-popup-type' is frame.") "Create buffer for which-key." (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer + (toggle-truncate-lines 1) (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) (setq-local mode-line-format nil)) @@ -569,10 +570,10 @@ the maximum number of lines availabel in the target buffer." col-key-cns (car col-split) rem-key-cns (cadr col-split) n-col-lines (min avl-lines (length rem-key-cns)) - col-key-width (reduce (lambda (x y) + col-key-width (cl-reduce (lambda (x y) (max x (length (substring-no-properties (car y))))) col-key-cns :initial-value 0) - col-desc-width (reduce (lambda (x y) + col-desc-width (cl-reduce (lambda (x y) (max x (length (substring-no-properties (cdr y))))) col-key-cns :initial-value 0) col-width (+ 4 (length (substring-no-properties sep-w-face)) From 5ed3e543665b1a25e47d1c72f4ad6ac497d734b7 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Fri, 10 Jul 2015 20:57:34 +0300 Subject: [PATCH 115/816] Check frame width in a non-buggy way `(window-width (frame-root-window))` throws an error when the frame is split (frame's root window is not live). --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e0f335a4b8d..6ff81dfc2e0 100644 --- a/which-key.el +++ b/which-key.el @@ -524,7 +524,7 @@ of the intended popup." (if (member which-key-side-window-location '(left right)) (which-key/total-width-to-text (which-key/width-or-percentage-to-width which-key-side-window-max-width)) - (window-width (frame-root-window))))) + (frame-width)))) (defun which-key/frame-max-dimensions () (cons which-key-frame-max-height which-key-frame-max-width)) From 2df42e2da4db0235e826a4f4c29af9d906d86d71 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Fri, 10 Jul 2015 21:29:58 +0300 Subject: [PATCH 116/816] Fix some defcustoms --- which-key.el | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 4605e73cc1c..0efae1cd8cc 100644 --- a/which-key.el +++ b/which-key.el @@ -25,7 +25,7 @@ (require 's) (defgroup which-key nil "Customization options for which-key-mode") -(defcustom which-key-idle-delay 1 +(defcustom which-key-idle-delay 1.0 "Delay (in seconds) for which-key buffer to popup." :group 'which-key :type 'float) @@ -80,7 +80,7 @@ emacs-lisp-mode." "These keys will automatically be truncated to one character and have `which-key-special-key-face' applied to them." :group 'which-key - :type '(list string)) + :type '(repeat string)) (defcustom which-key-buffer-name "*which-key*" "Name of which-key buffer." :group 'which-key @@ -90,23 +90,23 @@ and have `which-key-special-key-face' applied to them." Possible choices are left (the default), top and nil. Nil turns the feature off." :group 'which-key - :type '(radio (symbol :tag "Left of keys" left) - (symbol :tag "In first line" top) + :type '(radio (const :tag "Left of keys" left) + (const :tag "In first line" top) (const :tag "Hide" nil))) (defcustom which-key-popup-type 'minibuffer "Supported types are minibuffer, side-window and frame." :group 'which-key - :type '(radio (symbol :tag "Show in minibuffer" minibuffer) - (symbol :tag "Show in side window" side-window) - (symbol :tag "Show in popup frame" frame))) + :type '(radio (const :tag "Show in minibuffer" minibuffer) + (const :tag "Show in side window" side-window) + (const :tag "Show in popup frame" frame))) (defcustom 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." :group 'which-key - :type '(radio (symbol right) - (symbol bottom) - (symbol left) - (symbol top))) + :type '(radio (const right) + (const bottom) + (const left) + (const top))) (defcustom which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window and location is left or right. From 1797db7255b25d7aac4449f22ca1a52a3cb0ebae Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 14:51:45 -0400 Subject: [PATCH 117/816] Require dash --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 6ff81dfc2e0..01e2920f72d 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")) +;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) ;;; Commentary: ;; @@ -23,6 +23,7 @@ (require 'cl-lib) (require 's) +(require 'dash) (defgroup which-key nil "Customization options for which-key-mode") (defcustom which-key-idle-delay 1 From 8d8e09e80972cd4001ec7efc411ecdc3b548d7b9 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 16:56:32 -0400 Subject: [PATCH 118/816] Re-enable the prefix option --- which-key.el | 92 +++++++++++++++++----------------------------------- 1 file changed, 30 insertions(+), 62 deletions(-) diff --git a/which-key.el b/which-key.el index 01e2920f72d..1d27aa2803a 100644 --- a/which-key.el +++ b/which-key.el @@ -549,42 +549,41 @@ of the intended popup." :test (lambda (x y) (string-equal (car x) (car y)))))) (which-key/format-and-replace unformatted (key-description key)))) -(defun which-key/create-page-vertical (max-lines max-width key-cns) +(defun which-key/create-page-vertical (max-lines max-width prefix-width key-cns) "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 key-cns)) - ;; (line-padding (when (eq which-key-show-prefix 'left) - ;; (s-repeat prefix-len " "))) (avl-lines max-lines) - (avl-width max-width) + (avl-width (- (+ 1 max-width) prefix-width)); we get 1 back for not putting a space after the last column (rem-key-cns key-cns) (n-col-lines (min avl-lines n-keys)) (act-n-lines n-col-lines) ; n-col-lines in first column - (act-width 0) - (col-i 0) + (all-columns (list (mapcar (lambda (i) (if (> i 1) (s-repeat prefix-width " ") "")) + (number-sequence 1 n-col-lines)))) + (act-width prefix-width) (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face)) col-key-cns col-key-width col-desc-width col-width col-split done - all-columns new-column page) + n-columns new-column page) + (message "ok") (while (not done) (setq col-split (-split-at n-col-lines rem-key-cns) col-key-cns (car col-split) rem-key-cns (cadr col-split) n-col-lines (min avl-lines (length rem-key-cns)) col-key-width (cl-reduce (lambda (x y) - (max x (length (substring-no-properties (car y))))) - col-key-cns :initial-value 0) + (max x (length (substring-no-properties (car y))))) + col-key-cns :initial-value 0) col-desc-width (cl-reduce (lambda (x y) - (max x (length (substring-no-properties (cdr y))))) - col-key-cns :initial-value 0) - col-width (+ 4 (length (substring-no-properties sep-w-face)) + (max x (length (substring-no-properties (cdr y))))) + col-key-cns :initial-value 0) + col-width (+ 3 (length (substring-no-properties sep-w-face)) col-key-width col-desc-width) new-column (mapcar (lambda (k) (concat (s-repeat (- col-key-width (length (substring-no-properties (car k)))) " ") (car k) " " sep-w-face " " (cdr k) - (s-repeat (- col-desc-width (length (substring-no-properties (cdr k)))) " ") - " ")) + (s-repeat (- col-desc-width (length (substring-no-properties (cdr k)))) " "))) col-key-cns)) (if (<= col-width avl-width) (setq all-columns (push new-column all-columns) @@ -592,16 +591,17 @@ the maximum number of lines availabel in the target buffer." avl-width (- avl-width col-width)) (setq done t)) (when (<= (length rem-key-cns) 0) (setq done t))) - (setq all-columns (reverse all-columns)) + (setq all-columns (reverse all-columns) + n-columns (length all-columns)) (dotimes (i act-n-lines) - (dotimes (j (length all-columns)) + (dotimes (j n-columns) (setq page (concat page (nth i (nth j all-columns)) - (when (and (not (= i (- act-n-lines 1))) - (= j (- (length all-columns) 1))) "\n"))))) + (if (not (= j (- n-columns 1))) " " + (when (not (= i (- act-n-lines 1))) "\n")))))) (list page act-n-lines act-width rem-key-cns))) -(defun which-key/create-page (vertical max-lines max-width key-cns) - (let* ((first-try (which-key/create-page-vertical max-lines max-width key-cns)) +(defun which-key/create-page (vertical max-lines max-width prefix-width key-cns) + (let* ((first-try (which-key/create-page-vertical max-lines max-width prefix-width key-cns)) (n-rem-keys (length (nth 3 first-try))) (next-try-lines max-lines) prev-try prev-n-rem-keys next-try found) @@ -611,57 +611,30 @@ the maximum number of lines availabel in the target buffer." (while (not found) (setq prev-try next-try next-try-lines (- next-try-lines 1) - next-try (which-key/create-page-vertical next-try-lines max-width key-cns) + next-try (which-key/create-page-vertical next-try-lines max-width prefix-width key-cns) n-rem-keys (length (nth 3 next-try)) found (or (= next-try-lines 0) (> n-rem-keys 0)))) prev-try))) -;; start on binary search (not correct yet) -;; n-rem-keys is 0, try to get a better fit -;; (while (not found) -;; (setq next-try-lines (/ (+ minline maxline) 2) -;; next-try (which-key/create-page-vertical next-try-lines max-width key-cns) -;; n-rem-keys (length (nth 3 next-try))) -;; (if (= n-rem-keys 0) -;; ;; not far enough -;; (setq maxline (- next-try-lines 1)) -;; ;; too far -;; (setq minline (+ next-try-lines 1)) -;; ) -;; next-try-lines (if (= n-rem-keys 0) -;; (/ (+ next-try-lines 1) 2) -;; (/ (+ max-lines next-try-lines) 2))) - - (defun which-key/populate-buffer (prefix-keys formatted-keys sel-win-width) "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." (let* ((vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) - (which-key-show-prefix nil) ; kill prefix for now - ;; (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")))) - (prefix-string nil) + (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))) - (avl-width (if (cdr max-dims) - (if (eq which-key-show-prefix 'left) - (- (cdr max-dims) prefix-len) - (cdr max-dims)) 0)) - ;; (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)) + (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) + (avl-width (when (cdr max-dims) (- (cdr max-dims) prefix-width))) (keys-rem formatted-keys) pages first-page first-page-str page-res) (while keys-rem - (setq page-res (which-key/create-page vertical max-height avl-width keys-rem) + (setq page-res (which-key/create-page vertical max-height avl-width prefix-width keys-rem) pages (push page-res pages) keys-rem (nth 3 page-res))) ;; not doing anything with other pages for now @@ -680,11 +653,6 @@ the maximum number of lines availabel in the target buffer." (insert first-page-str) (goto-char (point-min)))) (cons (nth 1 first-page) (nth 2 first-page))))) -;; (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 avl-width) -;; ) -;; (cons 0 act-width))) (defun which-key/maybe-replace-key-based (string keys) (let* ((alist which-key-key-based-description-replacement-alist) From 062f98489af421c2420a69d94b6ca1ef1e16121b Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 17:12:27 -0400 Subject: [PATCH 119/816] Reorganize code and clean-up comments a little --- which-key.el | 230 +++++++++++++++++++++++++++------------------------ 1 file changed, 123 insertions(+), 107 deletions(-) diff --git a/which-key.el b/which-key.el index 1d27aa2803a..55779bfff0d 100644 --- a/which-key.el +++ b/which-key.el @@ -232,17 +232,6 @@ bottom." (setq which-key-popup-type 'minibuffer which-key-show-prefix 'left)) -;; Timers - -(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/stop-open-timer () - "Deactivate idle timer." - (when which-key--open-timer (cancel-timer which-key--open-timer))) ;; Helper functions to modify replacement lists. @@ -279,29 +268,8 @@ bottom." (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) -;; Update - -(defun which-key/update () - "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) (message "key: %s" (key-description prefix-keys))) - ;; (when (> (length prefix-keys) 0) (message "key binding: %s" (key-binding prefix-keys))) - (when (and (> (length prefix-keys) 0) - (keymapp (key-binding prefix-keys))) - (let* ((buf (current-buffer)) - ;; get formatted key bindings - (formatted-keys (which-key/get-formatted-key-bindings buf prefix-keys)) - ;; populate target buffer - (popup-act-dim - (which-key/populate-buffer (key-description prefix-keys) - formatted-keys (window-width)))) - ;; show buffer - (which-key/show-popup popup-act-dim))))) -;; command finished maybe close the window -;; (which-key/hide-popup)))) - -;; window-size utilities +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Functions for computing window sizes (defun which-key/text-width-to-total (text-width) "Convert window text-width to window total-width. @@ -361,6 +329,7 @@ total height." height-or-percentage (round (* height-or-percentage (window-total-height (frame-root-window)))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Show/hide guide buffer (defun which-key/hide-popup () @@ -493,7 +462,8 @@ need to start the closing timer." ;; (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) ;; (popwin:close-popup-window))) -;; Size functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Max dimension of available window functions (defun which-key/popup-max-dimensions (selected-window-width) "Dimesion functions should return the maximum possible (height . width) @@ -530,7 +500,85 @@ of the intended popup." (defun which-key/frame-max-dimensions () (cons which-key-frame-max-height which-key-frame-max-width)) -;; Buffer contents functions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Functions for retrieving and formatting keys + +(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." + (save-match-data + (let ((new-string string)) + (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/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/propertize-key (key) + (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'." + (if (> (length desc) which-key-max-description-length) + (concat (substring desc 0 which-key-max-description-length) "..") + desc)) + +(defun which-key/format-and-replace (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. Replacements are performed using the +key and description replacement alists." + (let ((max-key-width 0)) ;(max-desc-width 0) + ;; first replace and apply faces + (mapcar + (lambda (key-desc-cons) + (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-key-based desc keys)) + (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 (defun which-key/get-formatted-key-bindings (buffer key) (let ((key-str-qt (regexp-quote (key-description key))) @@ -549,6 +597,9 @@ of the intended popup." :test (lambda (x y) (string-equal (car x) (car y)))))) (which-key/format-and-replace unformatted (key-description key)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Functions for laying out which-key buffer pages + (defun which-key/create-page-vertical (max-lines max-width prefix-width key-cns) "Format KEYS into string representing a single page of text. N-COLUMNS is the number of text columns to use and MAX-LINES is @@ -559,10 +610,13 @@ the maximum number of lines availabel in the target buffer." (rem-key-cns key-cns) (n-col-lines (min avl-lines n-keys)) (act-n-lines n-col-lines) ; n-col-lines in first column - (all-columns (list (mapcar (lambda (i) (if (> i 1) (s-repeat prefix-width " ") "")) + (all-columns (list + (mapcar (lambda (i) + (if (> i 1) (s-repeat prefix-width " ") "")) (number-sequence 1 n-col-lines)))) (act-width prefix-width) - (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face)) + (sep-w-face (propertize which-key-separator + 'face 'which-key-separator-face)) col-key-cns col-key-width col-desc-width col-width col-split done n-columns new-column page) (message "ok") @@ -654,79 +708,41 @@ the maximum number of lines availabel in the target buffer." (goto-char (point-min)))) (cons (nth 1 first-page) (nth 2 first-page))))) -(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)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Update -(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." - (save-match-data - (let ((new-string string)) - (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/update () + "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) + ;; (message "key: %s" (key-description prefix-keys))) + ;; (when (> (length prefix-keys) 0) + ;; (message "key binding: %s" (key-binding prefix-keys))) + (when (and (> (length prefix-keys) 0) + (keymapp (key-binding prefix-keys))) + (let* ((buf (current-buffer)) + ;; get formatted key bindings + (formatted-keys (which-key/get-formatted-key-bindings + buf prefix-keys)) + ;; populate target buffer + (popup-act-dim (which-key/populate-buffer + (key-description prefix-keys) + formatted-keys (window-width)))) + ;; show buffer + (which-key/show-popup popup-act-dim))))) -(defun which-key/propertize-key (key) - (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)))) +;; 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/format-and-replace (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. Replacements are performed using the -key and description replacement alists." - (let ((max-key-width 0)) ;(max-desc-width 0) - ;; first replace and apply faces - (mapcar - (lambda (key-desc-cons) - (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-key-based desc keys)) - (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 +(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/stop-open-timer () + "Deactivate idle timer." + (when which-key--open-timer (cancel-timer which-key--open-timer))) (provide 'which-key) ;;; which-key.el ends here From 96e424db23920c8610e23b74196c034f9fa9a36c Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 17:28:14 -0400 Subject: [PATCH 120/816] Remove message --- which-key.el | 1 - 1 file changed, 1 deletion(-) diff --git a/which-key.el b/which-key.el index b3b525a6b4f..e262567fe70 100644 --- a/which-key.el +++ b/which-key.el @@ -619,7 +619,6 @@ the maximum number of lines availabel in the target buffer." 'face 'which-key-separator-face)) col-key-cns col-key-width col-desc-width col-width col-split done n-columns new-column page) - (message "ok") (while (not done) (setq col-split (-split-at n-col-lines rem-key-cns) col-key-cns (car col-split) From f8311cdcdb61df744310bd4bcbc543bbedc233a9 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 17:43:01 -0400 Subject: [PATCH 121/816] Fix bug when frame too small --- which-key.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index e262567fe70..7ef63287544 100644 --- a/which-key.el +++ b/which-key.el @@ -651,7 +651,7 @@ the maximum number of lines availabel in the target buffer." (setq page (concat page (nth i (nth j all-columns)) (if (not (= j (- n-columns 1))) " " (when (not (= i (- act-n-lines 1))) "\n")))))) - (list page act-n-lines act-width rem-key-cns))) + (list page act-n-lines act-width rem-key-cns (- (length key-cns) (length rem-key-cns))))) (defun which-key/create-page (vertical max-lines max-width prefix-width key-cns) (let* ((first-try (which-key/create-page-vertical max-lines max-width prefix-width key-cns)) @@ -685,16 +685,18 @@ the maximum number of lines availabel in the target buffer." (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) (avl-width (when (cdr max-dims) (- (cdr max-dims) prefix-width))) (keys-rem formatted-keys) - pages first-page first-page-str page-res) + keys-per-page pages first-page first-page-str page-res) (while keys-rem (setq page-res (which-key/create-page vertical max-height avl-width prefix-width keys-rem) pages (push page-res pages) + keys-per-page (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) keys-rem (nth 3 page-res))) ;; not doing anything with other pages for now - (setq pages (reverse pages) + (setq keys-per-page (reverse keys-per-page) + pages (reverse pages) first-page (car pages) first-page-str (concat prefix-string (car first-page))) - (if (= 0 (length first-page-str)) + (if (or (<= n-keys 0) (<= (car keys-per-page) 0)) (progn (message "which-key can't show keys: The settings and/or frame size are too restrictive.") (cons 0 0)) From 76a0199eb36bb46c08bc40e57cf324393bbb499b Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 10 Jul 2015 22:00:14 -0400 Subject: [PATCH 122/816] Start to fix lock up on small vertical window --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d0703b6a975..35143d567ff 100644 --- a/which-key.el +++ b/which-key.el @@ -674,7 +674,7 @@ the maximum number of lines availabel in the target buffer." 'face 'font-lock-comment-face))) (which-key/create-page-vertical (-insert-at status-key-i status-key keys) max-lines max-width prefix-width)) - ((or (> n-rem-keys 0) (= 1 max-lines)) first-try) + ((or vertical (> n-rem-keys 0) (= 1 max-lines)) first-try) ;; do a simple search for now (TODO: Implement binary search) (t (while (not found) (setq prev-try next-try From 5590a80eaff9874033cd1e11e61b63345a13882f Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 06:22:36 -0400 Subject: [PATCH 123/816] Protect against infinite loops --- which-key.el | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 7ef63287544..b03140a9ba1 100644 --- a/which-key.el +++ b/which-key.el @@ -617,10 +617,13 @@ the maximum number of lines availabel in the target buffer." (act-width prefix-width) (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face)) + (max-iter 100) + (iter-n 0) col-key-cns col-key-width col-desc-width col-width col-split done n-columns new-column page) - (while (not done) - (setq col-split (-split-at n-col-lines rem-key-cns) + (while (and (<= iter-n max-iter) (not done)) + (setq iter-n (1+ iter-n) + col-split (-split-at n-col-lines rem-key-cns) col-key-cns (car col-split) rem-key-cns (cadr col-split) n-col-lines (min avl-lines (length rem-key-cns)) @@ -657,12 +660,15 @@ the maximum number of lines availabel in the target buffer." (let* ((first-try (which-key/create-page-vertical max-lines max-width prefix-width key-cns)) (n-rem-keys (length (nth 3 first-try))) (next-try-lines max-lines) + (iter-n 0) + (max-iter max-lines) prev-try prev-n-rem-keys next-try found) (if (or vertical (> n-rem-keys 0) (= max-lines 1)) first-try ;; do a simple search for now (TODO: Implement binary search) - (while (not found) - (setq prev-try next-try + (while (and (<= iter-n max-iter) (not found)) + (setq iter-n (1+ iter-n) + prev-try next-try next-try-lines (- next-try-lines 1) next-try (which-key/create-page-vertical next-try-lines max-width prefix-width key-cns) n-rem-keys (length (nth 3 next-try)) @@ -685,9 +691,12 @@ the maximum number of lines availabel in the target buffer." (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) (avl-width (when (cdr max-dims) (- (cdr max-dims) prefix-width))) (keys-rem formatted-keys) + (max-iter (+ 1 n-keys)) + (iter-n 0) keys-per-page pages first-page first-page-str page-res) - (while keys-rem - (setq page-res (which-key/create-page vertical max-height avl-width prefix-width keys-rem) + (while (and (<= iter-n max-iter) keys-rem) + (setq iter-n (1+ iter-n) + page-res (which-key/create-page vertical max-height avl-width prefix-width keys-rem) pages (push page-res pages) keys-per-page (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) keys-rem (nth 3 page-res))) From db8d4da7adff2ded8a7e1aa78edee8ac21590000 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 06:22:36 -0400 Subject: [PATCH 124/816] Protect against infinite loops --- which-key.el | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 35143d567ff..96c4537ecb9 100644 --- a/which-key.el +++ b/which-key.el @@ -622,10 +622,13 @@ the maximum number of lines availabel in the target buffer." (if (> i 1) (s-repeat prefix-width " ") "")) (number-sequence 1 n-col-lines)))) (act-width prefix-width) + (max-iter 100) + (iter-n 0) col-keys col-key-width col-desc-width col-width col-split done n-columns new-column page col-sep-width prev-rem-keys) - (while (not done) - (setq col-split (-split-at n-col-lines rem-keys) + (while (and (<= iter-n max-iter) (not done)) + (setq iter-n (1+ iter-n) + col-split (-split-at n-col-lines rem-keys) col-keys (car col-split) prev-rem-keys rem-keys rem-keys (cadr col-split) @@ -666,6 +669,8 @@ the maximum number of lines availabel in the target buffer." (n-rem-keys (length (nth 3 first-try))) (status-key-i (- n-keys n-rem-keys 1)) (next-try-lines max-lines) + (iter-n 0) + (max-iter max-lines) prev-try prev-n-rem-keys next-try found status-key) (cond ((and (> n-rem-keys 0) use-status-key) (setq status-key @@ -676,8 +681,9 @@ the maximum number of lines availabel in the target buffer." max-lines max-width prefix-width)) ((or vertical (> n-rem-keys 0) (= 1 max-lines)) first-try) ;; do a simple search for now (TODO: Implement binary search) - (t (while (not found) - (setq prev-try next-try + (t (while (and (<= iter-n max-iter) (not found)) + (setq iter-n (1+ iter-n) + prev-try next-try next-try-lines (- next-try-lines 1) next-try (which-key/create-page-vertical keys next-try-lines max-width prefix-width) @@ -701,9 +707,10 @@ the maximum number of lines availabel in the target buffer." (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) (avl-width (when (cdr max-dims) (- (cdr max-dims) prefix-width))) (keys-rem formatted-keys) + (max-pages (+ 1 (length keys-rem))) (page-n 0) keys-per-page pages first-page first-page-str page-res) - (while keys-rem + (while (and (<= page-n max-pages) keys-rem) (setq page-n (1+ page-n) page-res (which-key/create-page keys-rem max-lines avl-width prefix-width From 22d957e8f6ff4f8e1f97b8bdf4f0e3de09b84c98 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 06:53:46 -0400 Subject: [PATCH 125/816] Add better check for no room in frame --- which-key.el | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index 96c4537ecb9..80789f65224 100644 --- a/which-key.el +++ b/which-key.el @@ -620,7 +620,7 @@ the maximum number of lines availabel in the target buffer." (all-columns (list (mapcar (lambda (i) (if (> i 1) (s-repeat prefix-width " ") "")) - (number-sequence 1 n-col-lines)))) + (number-sequence 1 n-col-lines)))) (act-width prefix-width) (max-iter 100) (iter-n 0) @@ -709,32 +709,40 @@ the maximum number of lines availabel in the target buffer." (keys-rem formatted-keys) (max-pages (+ 1 (length keys-rem))) (page-n 0) - keys-per-page pages first-page first-page-str page-res) - (while (and (<= page-n max-pages) keys-rem) + keys-per-page pages first-page first-page-str page-res no-room + max-pages-reached) + (while (and keys-rem (not max-pages-reached) (not no-room)) (setq page-n (1+ page-n) page-res (which-key/create-page keys-rem max-lines avl-width prefix-width vertical use-status-key page-n) pages (push page-res pages) keys-per-page (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) - keys-rem (nth 3 page-res))) + keys-rem (nth 3 page-res) + no-room (and (= page-n 1) (= (car keys-per-page) 0)) + max-pages-reached (>= page-n max-pages))) ;; not doing anything with other pages for now (setq keys-per-page (reverse keys-per-page) pages (reverse pages) first-page (car pages) first-page-str (concat prefix-string (car first-page))) - (if (or (= (length formatted-keys) 0) (<= (car keys-per-page) 0)) - (progn - (message "which-key can't show keys: The settings and/or frame size are too restrictive.") - (cons 0 0)) - ;; (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-str)) - (with-current-buffer which-key--buffer - (erase-buffer) - (insert first-page-str) - (goto-char (point-min)))) - (cons (nth 1 first-page) (nth 2 first-page))))) + (cond (no-room + (message "which-key can't show keys: The settings and/or frame size are too restrictive.") + (cons 0 0)) + (max-pages-reached + (error "which-key reached the maximum number of pages") + (cons 0 0)) + ((<= (length formatted-keys) 0) + (message "No keys to display") + (cons 0 0)) + (t + (if (eq which-key-popup-type 'minibuffer) + (let (message-log-max) (message "%s" first-page-str)) + (with-current-buffer which-key--buffer + (erase-buffer) + (insert first-page-str) + (goto-char (point-min)))) + (cons (nth 1 first-page) (nth 2 first-page)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update From 58a11404554d51592439bee50f1effe1ae0f8376 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Sat, 11 Jul 2015 18:47:54 +0300 Subject: [PATCH 126/816] Start special-features section in readme #29 --- README.org | 35 +++++++++++++++++++++++++++++---- img/which-key-bottom-split.png | Bin 0 -> 135022 bytes img/which-key-right-split.png | Bin 0 -> 185058 bytes 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 img/which-key-bottom-split.png create mode 100644 img/which-key-right-split.png diff --git a/README.org b/README.org index e523a33327d..b472cb540fb 100644 --- a/README.org +++ b/README.org @@ -1,5 +1,21 @@ +* which-key Rewrite of guide-key-mode for emacs. +* Table of Contents :TOC@4: + - [[#which-key][which-key]] + - [[#install][Install]] + - [[#minibuffer-option][Minibuffer Option]] + - [[#side-window-right-option][Side Window Right Option]] + - [[#side-window-bottom-option][Side Window Bottom Option]] + - [[#statusgoals][Status/Goals]] + - [[#stability][Stability]] + - [[#completed-goals][Completed Goals]] + - [[#incomplete-and-planned][Incomplete and Planned]] + - [[#special-features][Special Features]] + - [[#several-popup-types][Several Popup Types]] + - [[#custom-string-replacement][Custom String Replacement]] + - [[#nice-display-with-split-frame][Nice Display with Split Frame]] + * Install Add which-key.el to your =load-path= and require. Something like @@ -49,7 +65,6 @@ 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 @@ -59,7 +74,6 @@ Popup side window on bottom. For defaults use [[./img/which-key-bottom.png]] - * Status/Goals ** Stability - It's very much a work in progress, so expect weird things to happen from time @@ -71,11 +85,24 @@ Popup side window on bottom. For defaults use 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 + 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 + 2. Paging functionality +* Special Features +** Several Popup Types +TODO... +** Custom String Replacement +TODO... +** Nice Display with Split Frame +Unlike guide-key, which-key looks good even if the frame is split into several +windows. +#+CAPTION: which-key in a frame with 3 horizontal splits +[[./img/which-key-right-split.png]] + +#+CAPTION: which-key in a frame with 2 vertical splits +[[./img/which-key-bottom-split.png]] diff --git a/img/which-key-bottom-split.png b/img/which-key-bottom-split.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d1de9f2c77a5b444180aa48480b155da5c956d GIT binary patch literal 135022 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 z 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

yW%f2SW8NJ=Wd29%EAj4TIP& z`t%2w(ON!@aYL_De04AO30pqN?ogP|y(8CG21|oaWc3Z$QO#_L(nV*|T7#b-wMdoR z!wrO3PHo3&KI=Br>|r4_^C8T{n)y6?=#H;oN;@>Xym)i0MeR>W-($5_!)=$$|^oDRPW;nW&X_2(vX1?Qv)#jfM?GCx88b%_Gd*lIM^o z>5?bG54a_P4o|d{Hy?@sq9P#$;9b`(4&G97z2l{x`+ccc z*63nlW`?7QigXh1pSEj$0RHtjejx z0MMt!PQ+Bd9+HMqSQ0m3*K#sNC)_)pV$2&M;?EHg6w$YP1rjKkD;gE&vyA>9901-Q zf>r}y2B7U@QYZKa=Kt0Ii|~B&kFGbvU^Zd@qsU(znu1{qEu^7i75g42TR*L@_Zl($ zH+|h_0+8m&c;on!9t}AyT#!{H)){!=-ZzdFYz`L`r%kF@j7eP{csEQMgUpe>+_l$b zB2zu%sa4Jr`-AE)DDMg1zQ8NYpZ3On{~3;I!db{LeNL$36&=zUo?W|mSXE%XpX$L{ z6Im_mzKw)!H}~$Haz~MDj9_2=O8+>LdWlU$Ja!vs5Rox~Vch2NbqFcr{*wQP;7$Te z5ru-YM5F?yrqDo!ShL%6kW$9`pL&kO=om~4f$v7G$XF$h@}mb>JRky_2~a|#821`- zKfwJzZvM+UfG`22&_IUJ)nZAbV)K>-5)ILQlO;PNd(CudVPs=|g<&U>Z_OIgt>HFH zi%0bzWPFJN_%Q%zm>sV!yE0xT37YSARz5mZg?h~RR1Pg+##!m0-TP&;VM?=8?tHU* zZ7tjsx+zxhNmnT4E}+oHPzGsjaU4q920r|Tl>y25mKi*_lngi0&h6)S>z<)`7P(kSFzx*{)Xvo8P{?SepDb2sthw*Lb zUQ*zmLa23Rc*cKlwksS^4=AmnC-D2X^NmpHda~kKN5KAVcQaSQOIDG(Ls+-HV*=p1 NfRweAN)@fb{|jv9syF}u literal 0 HcmV?d00001 diff --git a/img/which-key-right-split.png b/img/which-key-right-split.png new file mode 100644 index 0000000000000000000000000000000000000000..944293fd93990aaf3f6a6df473f17d33419d4a24 GIT binary patch literal 185058 zcmZ^}WmH|uwl%tN3xN>a-7RPcF2UX1-GbYKg}b|ZaCZyt?ykYzT_1a&o4xP-+Ihcd zP?MTfqxz`PN1r`dR$2rR9vdD203eEq3dsWiP|5%R_%1B?`(Mb}RNLNvK-de2DZ;|S zF8`L<000O9VnY0iF51WGFlo5G@#i{@G8v;BX1TRf(0TE-Lu#VnqWos0C4Kp5@sdz?~H#&!AJq{a;V(8g=JO)9NICNCPifjOsP|0@9W>U+M!B9*!syU{B0d{bRO+{LXAd%TsUbSFOF6q ze_2%pb^*u#nLMDrA(>|>#)8F;**HI}jy#+Dzfb1H33d<;&^i6;e9zY+KL`bFj_>Yr z`Lp)?)LKHMr7E|3X3n^@;wU2?Z+b4}a`y;>gt)G%O77H6&Ij_p#@2=Wd|2l-#^}Dl z^O0hFQJ7juAC1q$V{1(du@t;cJzM$8Eq!QRCr{qihp>7Fu+;~3=nzs)Z*TNnLnhK_ zdCsSxonY)1HY|?65axek*g+?hm7V>&%O8P`jt)DVoS0buaHhzu^%cFEKj!R_kc43?E@;0{RcE*kd{pZ-*a}UnWHeUiv+sVGv+eM42n; z|BQ=nC{t`$z;;Y(v+a8R_Q$}@^t>t2;oxymCi?_V*-~5?|Fa|i<$KA(lK%bn)^mIb z#Yh@ji>D41kil!v^yIK!RZU)ny}RYjzA7pAc8P31|9;Liygo0yxM>+9>c*WH8t z1NcS|cw0n~=kpf9+v9w@@lAEK=bOoGyvJ>6h=YSeW71QX{Zn%@tt95B?9?wbY(!s@ ztRQu1!1cGllg_VX5U#GUzkLg1MN9{QjW%J>^WJO=MuO~bZyK;z3I8Y68~tG`zdT!1 zwDx__Zm?brL8DoKVbf>F{16ciICdQ&1|J(06BWHbb#5=2HBYvAx;+8j9v{dUEuUn# z?k3xA^?eaDF`-a6(!9+8o~pIFIcjJu6TIDv)SqRwqlR*F-OMP^;&zap&Q{q7z5zWK z_kMUjEz{C7h83%nso(VB{HR3c^K8Y!!Yb9?%l~ci=d_$rz1N?2+3ikVCL=+liQBYy zS>8rCIVcI!-^XR)FW;WW-;VV+F)|Z_h|{^qF8w{V2aI30wjfA|UmU&}IVa}TOrxR} z($QE@l~`UOWfw%8jHlHSlPmLj2(QR41-t&qw-q+Xg_YMTgZ_mukM~mn0y%LWV4$F? zuv|nSA_;iMe2yh!($mXiDb+PJ)bQEDGMS9vhdXw!)cD!RO=7Ps)iXR;vBNEuGs#+C zZkKy|dyl(?o_dAPBob)hU}0UZM%ihosa5mrcSrOTE=m;@6clW1Y&6qOJ{=cE&|&F* zew9>mc4kin)1`q*f=-B??M;BF^m&KH=<|=&=6E#2PcZo_>+6|i;JUxVmUnsd1^+Dk zUYwAELZm!s%Zw&*iQzpuJ6P}0u|HjDdMSQC366@J>JKP5VApO&8mVTlU67uhtiy8d zc@OCg3^O(9Z;(RX)i-bHT76lRqfN0oq!c5vC64CdV^`w7*$dwPhDRN8LHB-;BGY{@ z-Fac*HRvTIBxI>l4+4kij=hISPiIl+ac4MjvC|ug=bjMZb7eG#217@}X^rRNc?RO{ z;x!L2shSMX)YL@#_RIB(&1z|;B2YYY!teh6{^_j! zZ780`^Km*;)fk;~U}VJ5d@&LN9oB}c)T1nAahK8eL{0aLf6G~0>IqNB-fP*c%B1># zK!d3UKF;%0n$|_cL!8d~{Ek?Ir8F`@#V&D

JUiCqF!oIx9iGWZLkUc)5B+UN683 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

xz1k>r2<2(A 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%0DN%fJqo347R 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 eDdqe0B0Xn93*zo*xb* zGs?SSWr#LUb~&j^m|qHqj0OVl+p(uw^Ii8~V`ATtZRX=XY-}^A(avSZKI{{(x=;5m z1ip@TQNt)z4h6VP5$d&=1iG=}6oG1pqD=V0b zR^PMmv}(uLc^AUxAz~eAYK(kTK++q=2Qoix9vb}Y&s;u_lzv(eJj%c2S@f_Bw+rHW z`3R26?5$Q_R--uNFnSwxOCDj^tKkbweR-@z$F&rnJfEqR-&njAk3OXBhZfkHcD@O| zesVC%=L`*p0ZoCQQax5U0M2bgI9L=&%djXlQq#~DWC7-o{-&9}fj_)&v6h~BhzFA) z7Yp1<*PX4WX5Lb}euS_tPXJiMbXb@51~# z(+;QOI-xcn*cdE3jLr^y#_KTc?(L^q#7x~YAu9#*1c>-r;sMrkCJzS+J~R%Q(~=a-j^If@H?T}b+uil|y#Sb~xrmyr zxBuDO4@#|daFdS8EGe9$sAN~5!Ezi7{=(nYIRj;}x>65*TZJ|QIPer-dI89P_h}-B zF|9lwD~j3yZDYDqZ#&@#DnN3s4!CwLK$f#ABwlPhf%pA3__Y3kGkX>@1snHy@V4@n zw_=Y-r1QG{-Gr1Bt+H{NjQ)M-uf{R~U2s1(i9k0Daxe}=xqVYNl9JH>fng6S3@W4k zts-!@0zT@T6(#0TqpMxZdMqH}rMoe_(*V@eZbx-*rz0Qrd3f!xUf`0XvZo`D(wRwi zZ(z@q%}TT+6!8m;L$U$JXNDk6BKXp`o>yT28+{fO7(FCqVx|%)lb%Y!KZO1^Li8Io_|&DJ3T01OP?etO)Z-dtsC;qbNGFFiDsRnrCiJLdfXZ7ogN8WBY98wz9I<;kFCA# zfHFWOeGy{d5T$^p!9^r$>ki-VQHis)7zVL?1pVu`+%9HdIx+on4risv=EguhXrvKI zw>v}5gD079vWJ8YgWo`VsEO`eTVT28MI1GxQq{p5qvdL`v5iHg^hNR=kNd z7Qhz%*;-w~&|&dik~A0$hzMJxigz#m)<1Uo{)lVN^{!yPpTQg3Mf}2xgV!&Z znWaZwJN3Uam3Yz~q?`z56FXAwSV$@;FcvGhlm_x%>L{Yt7y|di?@#P-W|h0rUdNP} z#Mrvq+hsK01l!y?>*mvvu;~(FYQGnBKTvAl5e1LlPr^*e$${qch=(5NiMEXZCUAcm zHDVR<^TA-sZ)p1Xg}VKm_?VtIv~Wx~o}lO!JiPRQpS`3svA)GP@zH=LIW)GV@ceHkc%!Oi=&Fu^Ry> zISOeH;wKBphx}E|nG~TNes_Bg%1%hK4Y+vcm+241W ze4V{!?e*;OCMQu}Pol$gy?tGdC_E%k98e%YN^(@eeK|-MPy+ZQ4sbakW{T$1f&J{f zvNh#t>(pb*StJ&l)7rMZkIFVaR9+#5PLqX20(+&tH<8%!J_<+PGR4_-jzoyj67@J$nHiwTPdXg*nYje@W=91y6H8MBQ z5|ZqUtWe6O;3H5=hZ|~iDmXvNdl^~Ru)JRqkrzrY z>#sWQ&*>0nSvm%hofMnpOvavMh|PSQ6Z>{IPj2`y%=9yCbl6Os_1hCRq-H<;+4WJ= z9B}&K>P=%WBY4m>bP3D-GP>4U6*v^R&BbxP+`&onZQquG`{uX!Q2Ch(TIY4Ec%ZlpE)sw(D*T+!vZPn7|*iKXwu302#%p>cB_T{b(y*Jw9K+u%#W5`?EILW`M z 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 K^3}3dk^cp_=-Uhc literal 0 HcmV?d00001 From d0a5ac43a5ee7787709ccf346520c747f5ae5a82 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Sat, 11 Jul 2015 19:25:43 +0300 Subject: [PATCH 127/816] readme: explain different popup types --- README.org | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index b472cb540fb..96a66b35793 100644 --- a/README.org +++ b/README.org @@ -13,6 +13,9 @@ Rewrite of guide-key-mode for emacs. - [[#incomplete-and-planned][Incomplete and Planned]] - [[#special-features][Special Features]] - [[#several-popup-types][Several Popup Types]] + - [[#minibuffer][minibuffer]] + - [[#side-window][side window]] + - [[#frame][frame]] - [[#custom-string-replacement][Custom String Replacement]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] @@ -95,7 +98,46 @@ Popup side window on bottom. For defaults use * Special Features ** Several Popup Types -TODO... +There are three different popup types that which-key can use to display the +available keys. The variable =which-key-popup-type= decides which one is used. +*** minibuffer +#+BEGIN_SRC emacs-lisp +(setq which-key-popup-type 'minibuffer) +#+END_SRC +Show keys in the minibuffer. +*** side window +#+BEGIN_SRC emacs-lisp +(setq which-key-popup-type 'side-window) +#+END_SRC +Show keys in a side window. This popup type has further options: +#+BEGIN_SRC emacs-lisp +;; location of which-key window. valid values: top, bottom, left, right +(setq which-key-side-window-location 'bottom) + +;; max width of which-key window, when displayed at left or right. +;; valid values: number of columns (integer), or percentage out of current +;; frame's width (float larger than 0 and smaller than 1) +(setq which-key-side-window-max-width 0.33) + +;; max height of which-key window, when displayed at top or bottom. +;; valid values: number of lines (integer), or percentage out of current +;; frame's height (float larger than 0 and smaller than 1) +(setq which-key-side-window-max-height 0.25) +#+END_SRC +*** frame +#+BEGIN_SRC emacs-lisp +(setq which-key-popup-type 'frame) +#+END_SRC +Show keys in a popup frame. This popup won't work very well in a terminal, +where only one frame can be shown at any given moment. This popup type has +further options: +#+BEGIN_SRC emacs-lisp +;; max width of which-key frame: number of columns (an integer) +(setq which-key-frame-max-width 60) + +;; max height of which-key frame: number of lines (an integer) +(setq which-key-frame-max-height 20) +#+END_SRC ** Custom String Replacement TODO... ** Nice Display with Split Frame From 3c4f30dfd4d9a61ec4269a852ded65c652c63430 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 12:42:06 -0400 Subject: [PATCH 128/816] Add status defcustom and clean-up layout funcs --- which-key.el | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 80789f65224..9b150aca206 100644 --- a/which-key.el +++ b/which-key.el @@ -130,6 +130,12 @@ a percentage out of the frame's height." "Maximum height of which-key popup when type is frame." :group 'which-key :type 'integer) +(defcustom which-key-show-page-number t + "Show page number and remaining keys in last slot, when keys +are hidden?" + :group 'which-key + :type '(radio (const :tag "Yes" t) + (const :tag "No" nil))) ;; Faces (defface which-key-key-face @@ -632,7 +638,7 @@ the maximum number of lines availabel in the target buffer." col-keys (car col-split) prev-rem-keys rem-keys rem-keys (cadr col-split) - n-col-lines (min avl-lines (length col-keys)) + n-col-lines (min avl-lines (length rem-keys)) col-key-width (which-key//max-len col-keys 0) col-sep-width (which-key//max-len col-keys 1) col-desc-width (which-key//max-len col-keys 2) @@ -670,17 +676,18 @@ the maximum number of lines availabel in the target buffer." (status-key-i (- n-keys n-rem-keys 1)) (next-try-lines max-lines) (iter-n 0) - (max-iter max-lines) + (max-iter (+ 1 max-lines)) prev-try prev-n-rem-keys next-try found status-key) (cond ((and (> n-rem-keys 0) use-status-key) (setq status-key (cons 'status (propertize - (format "Page %s (%s not shown)" page-n (1+ n-rem-keys)) + (format "%s keys not shown" (1+ n-rem-keys)) 'face 'font-lock-comment-face))) (which-key/create-page-vertical (-insert-at status-key-i status-key keys) max-lines max-width prefix-width)) - ((or vertical (> n-rem-keys 0) (= 1 max-lines)) first-try) - ;; do a simple search for now (TODO: Implement binary search) + ((or vertical (> n-rem-keys 0) (= 1 max-lines)) + first-try) + ;; do a simple search for the smallest number of lines (TODO: Implement binary search) (t (while (and (<= iter-n max-iter) (not found)) (setq iter-n (1+ iter-n) prev-try next-try @@ -695,7 +702,6 @@ the maximum number of lines availabel in the target buffer." "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." (let* ((vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) - (use-status-key t) (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 @@ -715,11 +721,11 @@ the maximum number of lines availabel in the target buffer." (setq page-n (1+ page-n) page-res (which-key/create-page keys-rem max-lines avl-width prefix-width - vertical use-status-key page-n) + vertical which-key-show-page-number page-n) pages (push page-res pages) keys-per-page (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) keys-rem (nth 3 page-res) - no-room (and (= page-n 1) (= (car keys-per-page) 0)) + no-room (<= (car keys-per-page) 0) max-pages-reached (>= page-n max-pages))) ;; not doing anything with other pages for now (setq keys-per-page (reverse keys-per-page) @@ -730,10 +736,10 @@ the maximum number of lines availabel in the target buffer." (message "which-key can't show keys: The settings and/or frame size are too restrictive.") (cons 0 0)) (max-pages-reached - (error "which-key reached the maximum number of pages") + (error "error: which-key reached the maximum number of pages") (cons 0 0)) ((<= (length formatted-keys) 0) - (message "No keys to display") + (error "error: which-key: no keys to display") (cons 0 0)) (t (if (eq which-key-popup-type 'minibuffer) From 7e6e379dbf961f3b398bde5b64f837d595da8358 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 12:52:35 -0400 Subject: [PATCH 129/816] Show prefix in can't show messages --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index b71498c3b04..20594797c8a 100644 --- a/which-key.el +++ b/which-key.el @@ -733,13 +733,13 @@ the maximum number of lines availabel in the target buffer." first-page (car pages) first-page-str (concat prefix-string (car first-page))) (cond (no-room - (message "which-key can't show keys: The settings and/or frame size are too restrictive.") + (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." prefix-keys) (cons 0 0)) (max-pages-reached (error "error: which-key reached the maximum number of pages") (cons 0 0)) ((<= (length formatted-keys) 0) - (message "which-key: no keys to display") + (message "%s- which-key: no keys to display" prefix-keys) (cons 0 0)) (t (if (eq which-key-popup-type 'minibuffer) From 3e64a54d1b5080a9d2d03aa813077131135770c0 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 13:25:49 -0400 Subject: [PATCH 130/816] Add replacement descriptions to readme. Also move status list to end --- README.org | 110 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 84 insertions(+), 26 deletions(-) diff --git a/README.org b/README.org index 96a66b35793..6744fb44a8d 100644 --- a/README.org +++ b/README.org @@ -7,17 +7,19 @@ Rewrite of guide-key-mode for emacs. - [[#minibuffer-option][Minibuffer Option]] - [[#side-window-right-option][Side Window Right Option]] - [[#side-window-bottom-option][Side Window Bottom Option]] - - [[#statusgoals][Status/Goals]] - - [[#stability][Stability]] - - [[#completed-goals][Completed Goals]] - - [[#incomplete-and-planned][Incomplete and Planned]] - - [[#special-features][Special Features]] + - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - [[#several-popup-types][Several Popup Types]] - [[#minibuffer][minibuffer]] - [[#side-window][side window]] - [[#frame][frame]] - [[#custom-string-replacement][Custom String Replacement]] + - [[#key-based-replacement]["Key-Based" replacement]] + - [[#key-and-description-replacement][Key and Description replacement]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] + - [[#statusgoals][Status/Goals]] + - [[#stability][Stability]] + - [[#completed-goals][Completed Goals]] + - [[#incomplete-and-planned][Incomplete and Planned]] * Install Add which-key.el to your =load-path= and require. Something like @@ -77,26 +79,7 @@ Popup side window on bottom. For defaults use [[./img/which-key-bottom.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. 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 - -* Special Features +* Special Features and Configuration Options ** Several Popup Types There are three different popup types that which-key can use to display the available keys. The variable =which-key-popup-type= decides which one is used. @@ -139,7 +122,63 @@ further options: (setq which-key-frame-max-height 20) #+END_SRC ** Custom String Replacement -TODO... +You can customize the way the keys show in the buffer using three different +replacement methods, each of which corresponds replacement alist. The basic idea +of behind each alist is that you specify a selection string in the =car= of each +cons cell and the replacement string in the =cdr=. + +*** "Key-Based" replacement +The relevant variable is the awkwardly named +=which-key-key-based-description-replacement-alist=. In this alist you can have +cons cells of two types. An example of the first type is + +#+BEGIN_SRC emacs-lisp +("C-x C-f" . "find files") +#+END_SRC + +where the string on the left is the key combination whose description you want +to replace. For that key combination, which-key overwrites the description with +the second string, "find files". In the second type of entry you can restrict +the replacements to a major-mode. For example, + +#+BEGIN_SRC emacs-lisp +(org-mode . '(("C-c C-c" . "Org C-c C-c") ("C-c C-a" . "Org Attach")) +#+END_SRC + +Here the first entry is the major-mode and the second is a list of the first +type of entries. In case the same key combination is listed under a major-mode +and by itself, the major-mode version will take precedence. + +There are two helper functions to add entries to this list, +=which-key/add-key-based-replacements= and +=which-key/add-major-mode-key-based-replacements=. You can modify the alist +directly or use these. + +*** Key and Description replacement +The second and third methods target the text used for the keys and the +descriptions directly. The relevant variables are +=which-key-key-replacement-alist= and =which-key-description-replacement-alist=. +Here's an example of one of the default key replacements + +#+BEGIN_SRC emacs-lisp +("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") +#+END_SRC + +The =car= takes a string which may use emacs regexp and the =cdr= takes a string +with the replacement text. As shown, you can specify a sub-expression of the +match. The replacements do not need to use regexp and can be as simple as + +#+BEGIN_SRC emacs-lisp +("left" . "lft") +#+END_SRC + +You can add this element to the key list with (there are no helper functions for +these alists) + +#+BEGIN_SRC emacs-lisp +(add-to-list 'which-key-key-replacement-alist '("left" . "lft")) +#+END_SRC + ** Nice Display with Split Frame Unlike guide-key, which-key looks good even if the frame is split into several windows. @@ -148,3 +187,22 @@ windows. #+CAPTION: which-key in a frame with 2 vertical splits [[./img/which-key-bottom-split.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. Remove popwin as a "hard" dependency, preferring 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 From e09eb1b024d8ade100e1b2279690a6d2cbfb9563 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 13:28:58 -0400 Subject: [PATCH 131/816] Readme typo --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 6744fb44a8d..0eefa0554af 100644 --- a/README.org +++ b/README.org @@ -142,7 +142,7 @@ the second string, "find files". In the second type of entry you can restrict the replacements to a major-mode. For example, #+BEGIN_SRC emacs-lisp -(org-mode . '(("C-c C-c" . "Org C-c C-c") ("C-c C-a" . "Org Attach")) +(org-mode . (("C-c C-c" . "Org C-c C-c") ("C-c C-a" . "Org Attach")) #+END_SRC Here the first entry is the major-mode and the second is a list of the first From fab4fd5fcf62d67de7f26ba2d37c94aaa8cf4397 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 13:38:39 -0400 Subject: [PATCH 132/816] Mention customize-group in README --- README.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.org b/README.org index 0eefa0554af..721ef167b01 100644 --- a/README.org +++ b/README.org @@ -80,6 +80,8 @@ Popup side window on bottom. For defaults use [[./img/which-key-bottom.png]] * Special Features and Configuration Options +There are more options than the ones described here. All of the configurable +variables are available through =M-x customize-group which-key=. ** Several Popup Types There are three different popup types that which-key can use to display the available keys. The variable =which-key-popup-type= decides which one is used. From 1fa254f62f780c2c08a1888303855f4f5fbffe01 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 13:38:56 -0400 Subject: [PATCH 133/816] Add default replacement for select-window-[N] --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 20594797c8a..5be226f62e3 100644 --- a/which-key.el +++ b/which-key.el @@ -55,7 +55,8 @@ in the first example." :group 'which-key :type '(alist :key-type regexp :value-type string)) (defcustom which-key-description-replacement-alist - '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1")) + '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1") + ("select-window-\\([1-9]\\)" . "Window \\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 From cadb9e7304070f240a77923aaa37288b776d2ec4 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 16:12:53 -0400 Subject: [PATCH 134/816] Add unicode correction for wide unicode chars --- which-key.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 5be226f62e3..897af2b890d 100644 --- a/which-key.el +++ b/which-key.el @@ -47,6 +47,12 @@ popup." "Separator to use between key and description." :group 'which-key :type 'string) +(defcustom which-key-unicode-correction 0 + "Correction for wide unicode characters. Set to a positive +number to adjust width of columns in case which-key is cutting +off text on the right side of the window." + :group 'which-key + :type 'integer) (defcustom which-key-key-replacement-alist '(("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") ("left" . "←") ("right" . "→")) "The strings in the car of each cons are replaced with the @@ -712,7 +718,8 @@ the maximum number of lines availabel in the target buffer." (max-dims (which-key/popup-max-dimensions sel-win-width)) (max-lines (when (car max-dims) (car max-dims))) (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) - (avl-width (when (cdr max-dims) (- (cdr max-dims) prefix-width))) + (avl-width (when (cdr max-dims) (- (cdr max-dims) + prefix-width which-key-unicode-correction))) (keys-rem formatted-keys) (max-pages (+ 1 (length formatted-keys))) (page-n 0) From 6ce1420de93be52683ea24c9fdd5d391c10622d9 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 11 Jul 2015 16:24:00 -0400 Subject: [PATCH 135/816] Add note to README about side-window defaults --- README.org | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.org b/README.org index 721ef167b01..47c63bf82e8 100644 --- a/README.org +++ b/README.org @@ -68,6 +68,11 @@ Popup side window on right. For defaults use (which-key/setup-side-window-right) #+END_SRC +Note the defaults are fairly conservative and will tend to not display on +narrower frames. If you get a message saying which-key can't display the keys, +try making your frame wider or adjusting the defaults related to the maximum +width (see =M-x customize-group which-key=). + [[./img/which-key-right.png]] ** Side Window Bottom Option From 7fb4ddc92e9cb3afb051ad53af28be3c745b483b Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 11:02:47 -0400 Subject: [PATCH 136/816] Cleanup replacement helper functions --- which-key.el | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 897af2b890d..8faddbcb674 100644 --- a/which-key.el +++ b/which-key.el @@ -249,16 +249,20 @@ bottom." ;; Helper functions to modify replacement lists. (defun which-key//add-key-based-replacements (alist key repl) + "Internal function to add (KEY . REPL) to ALIST." (when (or (not (stringp key)) (not (stringp repl))) (error "KEY and REPL should be strings")) - (cl-pushnew (cons key repl) alist - :test (lambda (x y) - (let ((cx (car x)) (cy (car y))) - (or (and (stringp cx) (stringp cy) (string-equal cx cy)) - (and (symbolp cx) (symbolp cy) (eq cx cy)))))) + (when (assoc-string key alist) + (message "which-key note: The key %s already exists in %s. This addition will override that replacement.")) + (setq alist (push (cons key repl) alist)) alist) (defun which-key/add-key-based-replacements (key repl &rest more) + "Replace the description of a key sequence KEY (e.g., \"C-c +C-c\") with REPL. Both KEY and REPL should be strings. MORE +allows you to specifcy additional KEY REPL pairs. All +replacements are added to +`which-key-key-based-description-replacement-alist'." ;; TODO: Make interactive (while key (setq which-key-key-based-description-replacement-alist @@ -267,6 +271,9 @@ bottom." (setq key (pop more) repl (pop more)))) (defun which-key/add-major-mode-key-based-replacements (mode key repl &rest more) + "Functions like `which-key/add-key-based-replacements' with the +exception that KEY and REPL (MORE contains addition KEY REPL +pairs) will only apply when the major-mode MODE is active." ;; TODO: Make interactive (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) From fa1e05e47a569aef0b8f970ca79d017ac444e84e Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 11:44:44 -0400 Subject: [PATCH 137/816] Fixes #24 (Update docstrings) --- which-key.el | 141 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 52 deletions(-) diff --git a/which-key.el b/which-key.el index 8faddbcb674..7a4096b1cb1 100644 --- a/which-key.el +++ b/which-key.el @@ -32,15 +32,15 @@ :type 'float) (defcustom 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." + "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." :group 'which-key :type 'float) (defcustom which-key-max-description-length 27 - "Truncate the description of keys to this length. Also adds -\"..\"." + "Truncate the description of keys to this length. +Also adds \"..\"." :group 'which-key :type 'integer) (defcustom which-key-separator "→" @@ -48,33 +48,33 @@ popup." :group 'which-key :type 'string) (defcustom which-key-unicode-correction 0 - "Correction for wide unicode characters. Set to a positive -number to adjust width of columns in case which-key is cutting -off text on the right side of the window." + "Correction for wide unicode characters. +Set to a positive number to adjust width of columns in case +which-key is cutting off text on the right side of the window." :group 'which-key :type 'integer) (defcustom which-key-key-replacement-alist '(("<\\(\\(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 +strings in the cdr for each key. Elisp regexp can be used as in the first example." :group 'which-key :type '(alist :key-type regexp :value-type string)) (defcustom which-key-description-replacement-alist '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1") ("select-window-\\([1-9]\\)" . "Window \\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." + "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." :group 'which-key :type '(alist :key-type regexp :value-type string)) (defcustom 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: + "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\"))) @@ -95,7 +95,7 @@ and have `which-key-special-key-face' applied to them." :type 'string) (defcustom which-key-show-prefix 'left "Whether to and where to display the current prefix sequence. -Possible choices are left (the default), top and nil. Nil turns +Possible choices are left (the default), top and nil. Nil turns the feature off." :group 'which-key :type '(radio (const :tag "Left of keys" left) @@ -137,9 +137,8 @@ a percentage out of the frame's height." "Maximum height of which-key popup when type is frame." :group 'which-key :type 'integer) -(defcustom which-key-show-page-number t - "Show page number and remaining keys in last slot, when keys -are hidden?" +(defcustom which-key-show-remaining-keys t + "Show remaining keys in last slot, when keys are hidden." :group 'which-key :type '(radio (const :tag "Yes" t) (const :tag "No" nil))) @@ -180,7 +179,7 @@ are hidden?" "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.") + "Internal: Backup the initial value of `echo-keystrokes'.") ;;;###autoload (define-minor-mode which-key-mode @@ -353,21 +352,26 @@ total height." ;; Show/hide guide buffer (defun which-key/hide-popup () + "This function is called to hide the which-key buffer." (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 () + "Does nothing. Stub for consistency with other hide-buffer +functions." nil) (defun which-key/hide-buffer-side-window () + "Hide which-key buffer when side-window popup is used." (when (buffer-live-p 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 () + "Hide which-key buffer when frame popup is used." (when (frame-live-p which-key--frame) (delete-frame which-key--frame))) @@ -383,15 +387,19 @@ need to start the closing timer." (frame (which-key/show-buffer-frame act-popup-dim))))) (defun which-key/show-buffer-minibuffer (act-popup-dim) + "Does nothing. Stub for consistency with other show-buffer +functions." nil) -;; &rest params because `fit-buffer-to-window' has a different call signature -;; in different emacs versions (defun which-key/fit-buffer-to-window-horizontally (&optional window &rest params) + "Slightly modified version of `fit-buffer-to-window'. Use &rest +params because `fit-buffer-to-window' has a different call +signature in different emacs versions" (let ((fit-window-to-buffer-horizontally t)) (apply #'fit-window-to-buffer window params))) (defun which-key/show-buffer-side-window (_act-popup-dim) + "Show which-key buffer when popup type is side-window" (let* ((side which-key-side-window-location) (alist '((window-width . which-key/fit-buffer-to-window-horizontally) (window-height . fit-window-to-buffer)))) @@ -415,6 +423,7 @@ 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) + "Show which-key buffer when popup type is frame" (let* ((orig-window (selected-window)) (frame-height (+ (car act-popup-dim) (if (with-current-buffer which-key--buffer @@ -437,6 +446,7 @@ need to start the closing timer." new-window))) (defun which-key/show-buffer-new-frame (frame-height frame-width) + "Helper for `which-key/show-buffer-frame'" (let* ((frame-params `((height . ,frame-height) (width . ,frame-width) ;; tell the window manager to respect the given sizes @@ -460,6 +470,7 @@ need to start the closing timer." new-window))) (defun which-key/show-buffer-reuse-frame (frame-height frame-width) + "Helper for `which-key/show-buffer-frame'" (let ((window (display-buffer-reuse-window which-key--buffer `((reusable-frames . ,which-key--frame))))) @@ -486,14 +497,18 @@ need to start the closing timer." ;; Max dimension of available window functions (defun which-key/popup-max-dimensions (selected-window-width) - "Dimesion functions should return the maximum possible (height . width) -of the intended popup." + "Dimesion functions should return the maximum possible (height +. width) of the intended popup. SELECTED-WINDOW-WIDTH is the +width of currently active window, not the which-key buffer +window." (cl-case which-key-popup-type (minibuffer (which-key/minibuffer-max-dimensions)) (side-window (which-key/side-window-max-dimensions)) (frame (which-key/frame-max-dimensions)))) (defun which-key/minibuffer-max-dimensions () + "Return max-dimensions of minibuffer (height . width) in lines +and characters respectively." (cons ;; height (if (floatp max-mini-window-height) @@ -504,6 +519,8 @@ of the intended popup." (frame-text-cols))) (defun which-key/side-window-max-dimensions () + "Return max-dimensions of the side-window popup (height . +width) in lines and characters respectively." (cons ;; height (if (member which-key-side-window-location '(left right)) @@ -518,6 +535,8 @@ of the intended popup." (frame-width)))) (defun which-key/frame-max-dimensions () + "Return max-dimensions of the frame popup (height . +width) in lines and characters respectively." (cons which-key-frame-max-height which-key-frame-max-width)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -527,7 +546,8 @@ of the intended popup." "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." +non-nil regexp is used in the replacements. Whether or not a +replacement occurs return the new STRING." (save-match-data (let ((new-string string)) (dolist (repl repl-alist) @@ -537,6 +557,10 @@ non-nil regexp is used in the replacements." new-string))) (defun which-key/maybe-replace-key-based (string keys) + "KEYS is a key sequence like \"C-c C-c\" and STRING is the +description that is possibly replaced using the +`which-key-key-based-description-replacement-alist'. Whether or +not a replacement occurs return the new STRING." (let* ((alist which-key-key-based-description-replacement-alist) (str-res (assoc-string keys alist)) (mode-alist (assq major-mode alist)) @@ -546,6 +570,9 @@ non-nil regexp is used in the replacements." (t string)))) (defun which-key/propertize-key (key) + "Add a face to KEY. If KEY contains any \"special keys\" +defined in `which-key-special-keys' then truncate and add the +corresponding `which-key-special-key-face'." (let ((key-w-face (propertize key 'face 'which-key-key-face)) (regexp (concat "\\(" (mapconcat 'identity which-key-special-keys @@ -566,13 +593,11 @@ non-nil regexp is used in the replacements." desc)) (defun which-key/format-and-replace (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. Replacements are performed using the -key and description replacement alists." + "Take a list of (key . desc) cons cells in UNFORMATTED, add +faces and perform replacements according to the three replacement +alists. Returns a list (key separator description)." (let ((max-key-width 0) - (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face))) ;(max-desc-width 0) - ;; first replace and apply faces + (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face))) (mapcar (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) @@ -594,19 +619,18 @@ key and description replacement alists." (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)) (list key-w-face sep-w-face desc-w-face))) unformatted))) -;; pad to max key-width and max desc-width -(defun which-key/get-formatted-key-bindings (buffer key) - (let ((key-str-qt (regexp-quote (key-description key))) +(defun which-key/get-formatted-key-bindings (buffer key-seq) + "Uses `describe-buffer-bindings' to collect the key bindings in +BUFFER that follow the key sequence KEY-SEQ." + (let ((key-str-qt (regexp-quote (key-description key-seq))) key-match desc-match unformatted format-res formatted column-width) (with-temp-buffer - (describe-buffer-bindings buffer key) + (describe-buffer-bindings buffer key-seq) (goto-char (point-max)) ; want to put last keys in first (while (re-search-backward (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" @@ -616,12 +640,14 @@ key and description replacement alists." desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted :test (lambda (x y) (string-equal (car x) (car y)))))) - (which-key/format-and-replace unformatted (key-description key)))) + (which-key/format-and-replace unformatted (key-description key-seq)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for laying out which-key buffer pages (defsubst which-key//max-len (keys index) + "Internal function for finding the max length of the INDEX +element in each list element of KEYS." (cl-reduce (lambda (x y) (max x (if (eq (car y) 'status) 0 (length (substring-no-properties (nth index y)))))) @@ -629,8 +655,10 @@ key and description replacement alists." (defun which-key/create-page-vertical (keys max-lines max-width prefix-width) "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." +Creates columns (padded to be of uniform width) of length +MAX-LINES until keys run out or MAX-WIDTH is reached. A non-zero +PREFIX-WIDTH adds padding on the left side to allow for prefix +keys to be written into the upper left porition of the page." (let* ((n-keys (length keys)) (avl-lines max-lines) (avl-width (- (+ 1 max-width) prefix-width)); we get 1 back for not putting a space after the last column @@ -670,7 +698,7 @@ the maximum number of lines availabel in the target buffer." (if (<= col-width avl-width) (setq all-columns (push new-column all-columns) act-width (+ act-width col-width) - avl-width (- avl-width col-width)) + avl-width (- avl-width col-width)) (setq done t rem-keys prev-rem-keys)) (when (<= (length rem-keys) 0) (setq done t))) @@ -683,7 +711,13 @@ the maximum number of lines availabel in the target buffer." (when (not (= i (- act-n-lines 1))) "\n")))))) (list page act-n-lines act-width rem-keys (- n-keys (length rem-keys))))) -(defun which-key/create-page (keys max-lines max-width prefix-width vertical use-status-key page-n) +(defun which-key/create-page (keys max-lines max-width prefix-width &optional vertical use-status-key page-n) + "Create a page of KEYS with parameters MAX-LINES, MAX-WIDTH,PREFIX-WIDTH. +Use as many keys as possible. Use as few lines as possible unless +VERTICAL is non-nil. USE-STATUS-KEY inserts an informative +message in place of the last key on the page if non-nil. PAGE-N +allows for the informative message to reference the current page +number." (let* ((n-keys (length keys)) (first-try (which-key/create-page-vertical keys max-lines max-width prefix-width)) (n-rem-keys (length (nth 3 first-try))) @@ -713,7 +747,10 @@ the maximum number of lines availabel in the target buffer." prev-try)))) (defun which-key/populate-buffer (prefix-keys formatted-keys sel-win-width) - "Insert FORMATTED-STRINGS into which-key buffer, breaking after BUFFER-WIDTH." + "Insert FORMATTED-KEYS into which-key buffer. +PREFIX-KEYS may be inserted into the buffer depending on the +value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to +`which-key/popup-max-dimensions'." (let* ((vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) (prefix-w-face (which-key/propertize-key prefix-keys)) @@ -736,7 +773,7 @@ the maximum number of lines availabel in the target buffer." (setq page-n (1+ page-n) page-res (which-key/create-page keys-rem max-lines avl-width prefix-width - vertical which-key-show-page-number page-n) + vertical which-key-show-remaining-keys page-n) pages (push page-res pages) keys-per-page (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) keys-rem (nth 3 page-res) @@ -751,7 +788,7 @@ the maximum number of lines availabel in the target buffer." (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." prefix-keys) (cons 0 0)) (max-pages-reached - (error "error: which-key reached the maximum number of pages") + (error "Which-key reached the maximum number of pages") (cons 0 0)) ((<= (length formatted-keys) 0) (message "%s- which-key: no keys to display" prefix-keys) @@ -769,7 +806,7 @@ the maximum number of lines availabel in the target buffer." ;; Update (defun which-key/update () - "Fill which-key--buffer with key descriptions and reformat. + "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) @@ -792,13 +829,13 @@ Finally, show the buffer." ;; Timers (defun which-key/start-open-timer () - "Activate idle timer." + "Activate idle timer to trigger `which-key/update'." (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/stop-open-timer () - "Deactivate idle timer." + "Deactivate idle timer for `which-key/update'." (when which-key--open-timer (cancel-timer which-key--open-timer))) (provide 'which-key) From 08d07360a2a57f67e73d80332c3cf5c93520e612 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 11:48:15 -0400 Subject: [PATCH 138/816] Update commentary --- which-key.el | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 7a4096b1cb1..4350c73fbeb 100644 --- a/which-key.el +++ b/which-key.el @@ -3,20 +3,15 @@ ;; Copyright (C) 2015 Justin Burkett ;; Author: Justin Burkett -;; URL: https://github.com/justbur/which-key/ +;; URL: https://github.com/justbur/which-key ;; Version: 0.1 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) ;;; Commentary: ;; -;; 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. +;; This is a rewrite of guide-key https://github.com/kai2nenobu/guide-key. See +;; https://github.com/justbur/which-key for more information. ;; ;;; Code: From bed497a846a51c22553c81c3717554d50e20942d Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 11:53:09 -0400 Subject: [PATCH 139/816] Change default unicode-correction --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 4350c73fbeb..506cadaeca1 100644 --- a/which-key.el +++ b/which-key.el @@ -42,7 +42,7 @@ Also adds \"..\"." "Separator to use between key and description." :group 'which-key :type 'string) -(defcustom which-key-unicode-correction 0 +(defcustom which-key-unicode-correction 1 "Correction for wide unicode characters. Set to a positive number to adjust width of columns in case which-key is cutting off text on the right side of the window." From dc84416e90b4073b9c488e8644629848aaf37adb Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 13:00:53 -0400 Subject: [PATCH 140/816] Add support for custom display functions --- README.org | 37 +++++++++++++++++++++++++++++++++++-- which-key.el | 29 ++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/README.org b/README.org index 47c63bf82e8..d287cf0a63b 100644 --- a/README.org +++ b/README.org @@ -12,6 +12,7 @@ Rewrite of guide-key-mode for emacs. - [[#minibuffer][minibuffer]] - [[#side-window][side window]] - [[#frame][frame]] + - [[#custom][custom]] - [[#custom-string-replacement][Custom String Replacement]] - [[#key-based-replacement]["Key-Based" replacement]] - [[#key-and-description-replacement][Key and Description replacement]] @@ -88,8 +89,9 @@ Popup side window on bottom. For defaults use There are more options than the ones described here. All of the configurable variables are available through =M-x customize-group which-key=. ** Several Popup Types -There are three different popup types that which-key can use to display the -available keys. The variable =which-key-popup-type= decides which one is used. +There are three different popup types that which-key can use by default to +display the available keys. The variable =which-key-popup-type= decides which +one is used. *** minibuffer #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'minibuffer) @@ -115,6 +117,7 @@ Show keys in a side window. This popup type has further options: (setq which-key-side-window-max-height 0.25) #+END_SRC *** frame + #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'frame) #+END_SRC @@ -128,6 +131,36 @@ further options: ;; max height of which-key frame: number of lines (an integer) (setq which-key-frame-max-height 20) #+END_SRC + +*** custom +Write your own display functions! This requires you to write three functions, +=which-key/custom-popup-max-dimensions-function=, +=which-key/custom-show-popup-function=, and +=which-key/custom-hide-popup-function=. Refer to the documentation for those +variables for more information, but here is a working example (this is the +current implementation of side-window bottom). + + +#+BEGIN_SRC emacs-lisp +(setq which-key-popup-type 'custom) +(defun which-key/custom-popup-max-dimensions-function (ignore) + (cons + (which-key/height-or-percentage-to-height which-key-side-window-max-height) + (frame-width))) +(defun fit-horizonatally () + (let ((fit-window-to-buffer-horizontally t)) + (fit-window-to-buffer))) +(defun which-key/custom-show-popup-function (act-popup-dim) + (let* ((alist '((window-width . fit-horizontally) + (window-height . fit-window-to-buffer)))) + (if (get-buffer-window which-key--buffer) + (display-buffer-reuse-window which-key--buffer alist) + (display-buffer-in-major-side-window which-key--buffer 'bottom 0 alist)))) +(defun which-key/custom-hide-popup-function () + (when (buffer-live-p which-key--buffer) + (quit-windows-on which-key--buffer))) +#+END_SRC + ** Custom String Replacement You can customize the way the keys show in the buffer using three different replacement methods, each of which corresponds replacement alist. The basic idea diff --git a/which-key.el b/which-key.el index 506cadaeca1..c02dc32f909 100644 --- a/which-key.el +++ b/which-key.el @@ -97,11 +97,12 @@ the feature off." (const :tag "In first line" top) (const :tag "Hide" nil))) (defcustom which-key-popup-type 'minibuffer - "Supported types are minibuffer, side-window and frame." + "Supported types are minibuffer, side-window, frame, and custom." :group 'which-key :type '(radio (const :tag "Show in minibuffer" minibuffer) (const :tag "Show in side window" side-window) - (const :tag "Show in popup frame" frame))) + (const :tag "Show in popup frame" frame) + (const :tag "Use your custom display functions" custom))) (defcustom 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." @@ -160,6 +161,21 @@ a percentage out of the frame's height." "Face for special keys (SPC, TAB, RET)" :group 'which-key) +;; Custom popup +(defvar which-key/custom-popup-max-dimensions-function nil + "Variable to hold a custom max-dimensions function. +Will be passed the width of the active window and is expected to +return the maximum height in lines and width in characters of the +which-key popup in the form a cons cell (height . width).") +(defvar which-key/custom-hide-popup-function nil + "Variable to hold a custom hide-popup function. +It takes no arguments and the return value is ignored.") +(defvar which-key/custom-show-popup-function nil + "Variable to hold a custom show-popup function. +Will be passed the required dimensions in the form (height . +width) in lines and characters respectively. The return value is +ignored.") + ;; Internal Vars ;; (defvar popwin:popup-buffer nil) (defvar which-key--buffer nil @@ -351,7 +367,8 @@ total height." (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)))) + (frame (which-key/hide-buffer-frame)) + (custom (funcall #'which-key/custom-hide-popup-function)))) (defun which-key/hide-buffer-minibuffer () "Does nothing. Stub for consistency with other hide-buffer @@ -379,7 +396,8 @@ 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))))) + (frame (which-key/show-buffer-frame act-popup-dim)) + (custom (funcall #'which-key/custom-show-popup-function act-popup-dim))))) (defun which-key/show-buffer-minibuffer (act-popup-dim) "Does nothing. Stub for consistency with other show-buffer @@ -499,7 +517,8 @@ window." (cl-case which-key-popup-type (minibuffer (which-key/minibuffer-max-dimensions)) (side-window (which-key/side-window-max-dimensions)) - (frame (which-key/frame-max-dimensions)))) + (frame (which-key/frame-max-dimensions)) + (custom (funcall #'which-key/custom-popup-max-dimensions-function selected-window-width)))) (defun which-key/minibuffer-max-dimensions () "Return max-dimensions of minibuffer (height . width) in lines From e37adcd72588b3b699091ac116c742a6bc073ca8 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 13:11:31 -0400 Subject: [PATCH 141/816] Fix unicode-correction docstring --- which-key.el | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index c02dc32f909..10c4b917bbc 100644 --- a/which-key.el +++ b/which-key.el @@ -44,8 +44,17 @@ Also adds \"..\"." :type 'string) (defcustom which-key-unicode-correction 1 "Correction for wide unicode characters. -Set to a positive number to adjust width of columns in case -which-key is cutting off text on the right side of the window." +Since we measure width in terms of the number of characters, +Unicode characters that are wider than ASCII characters throw off +the calculation for available width in the which-key buffer. This +variable allows you to adjust for the wide unicode characters by +artificially reducing the available width in the buffer. + +The default of 1 means allow for the total extra width +contributed by any wide unicode characters to be up to one +additional ASCII character in the which-key buffer. Increase this +number if you are seeing charaters get cutoff on the right side +of the which-key popup." :group 'which-key :type 'integer) (defcustom which-key-key-replacement-alist @@ -776,8 +785,9 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to (max-dims (which-key/popup-max-dimensions sel-win-width)) (max-lines (when (car max-dims) (car max-dims))) (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) - (avl-width (when (cdr max-dims) (- (cdr max-dims) - prefix-width which-key-unicode-correction))) + (avl-width (when (cdr max-dims) + (- (cdr max-dims) + prefix-width which-key-unicode-correction))) (keys-rem formatted-keys) (max-pages (+ 1 (length formatted-keys))) (page-n 0) From 8bb934e8e7fc18a5b48ab4086cde5cedde0ff6d3 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 20:04:34 -0400 Subject: [PATCH 142/816] Fix #32 Main problem was a replacement regexp that looked for a forward slash in the description, which removed group:x/y --- which-key.el | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 10c4b917bbc..c31166677c6 100644 --- a/which-key.el +++ b/which-key.el @@ -65,7 +65,7 @@ in the first example." :group 'which-key :type '(alist :key-type regexp :value-type string)) (defcustom which-key-description-replacement-alist - '(("Prefix Command" . "prefix") (".+/\\(.+\\)" . "\\1") + '(("Prefix Command" . "prefix") ("select-window-\\([1-9]\\)" . "Window \\1")) "See `which-key-key-replacement-alist'. This is a list of lists for replacing descriptions. The second @@ -609,6 +609,20 @@ corresponding `which-key-special-key-face'." (substring key-w-face end (length key-w-face)))) key-w-face)))) +(defun which-key/propertize-description (description) + (let* ((desc description) + (group-prfx (string-match-p "^group:" desc)) + (group (or group-prfx + (keymapp (intern desc)) + (string-match-p "^Prefix" desc))) + (desc (if group-prfx (substring desc 6) desc)) + (desc (if group (concat "+" desc) desc)) + (desc (which-key/truncate-description desc))) + (propertize desc 'face + (if group + 'which-key-group-description-face + 'which-key-command-description-face)))) + (defsubst which-key/truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." (if (> (length desc) which-key-max-description-length) @@ -631,16 +645,8 @@ alists. Returns a list (key separator description)." (desc (which-key/maybe-replace desc which-key-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)) - (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)) + (desc-w-face (which-key/propertize-description desc)) (key-width (length (substring-no-properties key-w-face)))) (setq max-key-width (max key-width max-key-width)) (list key-w-face sep-w-face desc-w-face))) From 6ca581959319c8f737407036e0d8b1d165190b85 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 21:24:36 -0400 Subject: [PATCH 143/816] Move unicode-correction and bump default to 3 --- which-key.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index c31166677c6..330b31ed1c7 100644 --- a/which-key.el +++ b/which-key.el @@ -42,7 +42,7 @@ Also adds \"..\"." "Separator to use between key and description." :group 'which-key :type 'string) -(defcustom which-key-unicode-correction 1 +(defcustom which-key-unicode-correction 3 "Correction for wide unicode characters. Since we measure width in terms of the number of characters, Unicode characters that are wider than ASCII characters throw off @@ -193,7 +193,7 @@ ignored.") "Internal: Holds reference to which-key window.") (defvar which-key--open-timer nil "Internal: Holds reference to open window timer.") -(defvar which-key--setup-p nil +(defvar which-key--is-setup nil "Internal: Non-nil if which-key buffer has been setup.") (defvar which-key--frame nil "Internal: Holds reference to which-key frame. @@ -208,7 +208,7 @@ Used when `which-key-popup-type' is frame.") :lighter " WK" (if which-key-mode (progn - (unless which-key--setup-p (which-key/setup)) + (unless which-key--is-setup (which-key/setup)) ;; reduce echo-keystrokes for minibuffer popup ;; (it can interfer if it's too slow) (when (and (> echo-keystrokes 0) @@ -235,7 +235,7 @@ Used when `which-key-popup-type' is frame.") (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) (setq-local mode-line-format nil)) - (setq which-key--setup-p t)) + (setq which-key--is-setup t)) ;; Default configuration functions for use by users. Should be the "best" ;; configurations @@ -690,7 +690,8 @@ PREFIX-WIDTH adds padding on the left side to allow for prefix keys to be written into the upper left porition of the page." (let* ((n-keys (length keys)) (avl-lines max-lines) - (avl-width (- (+ 1 max-width) prefix-width)); we get 1 back for not putting a space after the last column + ;; we get 1 back for not putting a space after the last column + (avl-width (max 0 (- (+ 1 max-width) prefix-width which-key-unicode-correction))) (rem-keys keys) (n-col-lines (min avl-lines n-keys)) (act-n-lines n-col-lines) ; n-col-lines in first column @@ -703,6 +704,7 @@ keys to be written into the upper left porition of the page." (iter-n 0) col-keys col-key-width col-desc-width col-width col-split done n-columns new-column page col-sep-width prev-rem-keys) + ;; (message "frame-width %s prefix-width %s avl-width %s max-width %s" (frame-text-cols) prefix-width avl-width max-width) (while (and (<= iter-n max-iter) (not done)) (setq iter-n (1+ iter-n) col-split (-split-at n-col-lines rem-keys) @@ -791,9 +793,7 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to (max-dims (which-key/popup-max-dimensions sel-win-width)) (max-lines (when (car max-dims) (car max-dims))) (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) - (avl-width (when (cdr max-dims) - (- (cdr max-dims) - prefix-width which-key-unicode-correction))) + (avl-width (when (cdr max-dims) (cdr max-dims))) (keys-rem formatted-keys) (max-pages (+ 1 (length formatted-keys))) (page-n 0) From ce4561c617536fdbbb5f6b16d600c266cb2cdbe8 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 21:58:26 -0400 Subject: [PATCH 144/816] Add docstring for propertize-description --- which-key.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/which-key.el b/which-key.el index 330b31ed1c7..8d1f0391d36 100644 --- a/which-key.el +++ b/which-key.el @@ -610,6 +610,10 @@ corresponding `which-key-special-key-face'." key-w-face)))) (defun which-key/propertize-description (description) + "Add face to DESCRIPTION where the face chosen depends on +whether the description represents a group or a command. Also +make some minor adjustments to the description string, like +removing a \"group:\" prefix." (let* ((desc description) (group-prfx (string-match-p "^group:" desc)) (group (or group-prfx From f91238ac7af99d0bbd4db9abd23a778c47150e02 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 12 Jul 2015 22:03:17 -0400 Subject: [PATCH 145/816] Remove some old code --- which-key.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 8d1f0391d36..e66e789379a 100644 --- a/which-key.el +++ b/which-key.el @@ -637,8 +637,7 @@ removing a \"group:\" prefix." "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." - (let ((max-key-width 0) - (sep-w-face (propertize which-key-separator 'face 'which-key-separator-face))) + (let ((sep-w-face (propertize which-key-separator 'face 'which-key-separator-face))) (mapcar (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) @@ -650,9 +649,7 @@ alists. Returns a list (key separator description)." desc which-key-description-replacement-alist)) (desc (which-key/maybe-replace-key-based desc keys)) (key-w-face (which-key/propertize-key key)) - (desc-w-face (which-key/propertize-description desc)) - (key-width (length (substring-no-properties key-w-face)))) - (setq max-key-width (max key-width max-key-width)) + (desc-w-face (which-key/propertize-description desc))) (list key-w-face sep-w-face desc-w-face))) unformatted))) From 10298abc507f6604c58be26454f57bf83683ea30 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 13 Jul 2015 07:54:16 -0400 Subject: [PATCH 146/816] Fix a message --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e66e789379a..9e7fa890ff2 100644 --- a/which-key.el +++ b/which-key.el @@ -272,7 +272,8 @@ bottom." (when (or (not (stringp key)) (not (stringp repl))) (error "KEY and REPL should be strings")) (when (assoc-string key alist) - (message "which-key note: The key %s already exists in %s. This addition will override that replacement.")) + (message "which-key note: The key %s already exists in %s. This addition will override that replacement." + key alist)) (setq alist (push (cons key repl) alist)) alist) From 13406f7e4140c33932cc468c4e44ac9b2b66906f Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 13 Jul 2015 08:39:08 -0400 Subject: [PATCH 147/816] Refactor column layout --- which-key.el | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 9e7fa890ff2..04cf13d1319 100644 --- a/which-key.el +++ b/which-key.el @@ -676,6 +676,15 @@ BUFFER that follow the key sequence KEY-SEQ." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for laying out which-key buffer pages +(defsubst which-key//join-columns (columns) + "Transpose columns into rows, concat rows into lines and concat rows into page." + (let* (;; pad columns to same length and reverse order + (padded (reverse (apply (apply-partially #'-pad "") columns))) + ;; transpose columns to rows + (rows (apply #'cl-mapcar #'list padded))) + ;; join lines by space and rows by newline + (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n"))) + (defsubst which-key//max-len (keys index) "Internal function for finding the max length of the INDEX element in each list element of KEYS." @@ -697,6 +706,7 @@ keys to be written into the upper left porition of the page." (rem-keys keys) (n-col-lines (min avl-lines n-keys)) (act-n-lines n-col-lines) ; n-col-lines in first column + ;; Initial column for prefix (if used) (all-columns (list (mapcar (lambda (i) (if (> i 1) (s-repeat prefix-width " ") "")) @@ -705,7 +715,7 @@ keys to be written into the upper left porition of the page." (max-iter 100) (iter-n 0) col-keys col-key-width col-desc-width col-width col-split done - n-columns new-column page col-sep-width prev-rem-keys) + new-column page col-sep-width prev-rem-keys) ;; (message "frame-width %s prefix-width %s avl-width %s max-width %s" (frame-text-cols) prefix-width avl-width max-width) (while (and (<= iter-n max-iter) (not done)) (setq iter-n (1+ iter-n) @@ -735,13 +745,7 @@ keys to be written into the upper left porition of the page." (setq done t rem-keys prev-rem-keys)) (when (<= (length rem-keys) 0) (setq done t))) - (setq all-columns (reverse all-columns) - n-columns (length all-columns)) - (dotimes (i act-n-lines) - (dotimes (j n-columns) - (setq page (concat page (nth i (nth j all-columns)) - (if (not (= j (- n-columns 1))) " " - (when (not (= i (- act-n-lines 1))) "\n")))))) + (setq page (which-key//join-columns all-columns)) (list page act-n-lines act-width rem-keys (- n-keys (length rem-keys))))) (defun which-key/create-page (keys max-lines max-width prefix-width &optional vertical use-status-key page-n) From 3d3f5727a584a8d5099f9042b1724b7530370d51 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 13 Jul 2015 08:59:39 -0400 Subject: [PATCH 148/816] Minor change to previous refactor --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 04cf13d1319..a08d71c4821 100644 --- a/which-key.el +++ b/which-key.el @@ -678,8 +678,8 @@ BUFFER that follow the key sequence KEY-SEQ." (defsubst which-key//join-columns (columns) "Transpose columns into rows, concat rows into lines and concat rows into page." - (let* (;; pad columns to same length and reverse order - (padded (reverse (apply (apply-partially #'-pad "") columns))) + (let* (;; pad reversed columns to same length + (padded (apply (apply-partially #'-pad "") (reverse columns))) ;; transpose columns to rows (rows (apply #'cl-mapcar #'list padded))) ;; join lines by space and rows by newline From e1a03e6a336a58e8d1b9c87086959bc444897249 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 13 Jul 2015 11:21:52 -0400 Subject: [PATCH 149/816] Remove defaults related to outside packages --- which-key.el | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index a08d71c4821..133833b84e4 100644 --- a/which-key.el +++ b/which-key.el @@ -65,13 +65,9 @@ in the first example." :group 'which-key :type '(alist :key-type regexp :value-type string)) (defcustom which-key-description-replacement-alist - '(("Prefix Command" . "prefix") - ("select-window-\\([1-9]\\)" . "Window \\1")) + '(("Prefix Command" . "prefix")) "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." +This is a list of lists for replacing descriptions." :group 'which-key :type '(alist :key-type regexp :value-type string)) (defcustom which-key-key-based-description-replacement-alist '() @@ -104,7 +100,7 @@ the feature off." :group 'which-key :type '(radio (const :tag "Left of keys" left) (const :tag "In first line" top) - (const :tag "Hide" nil))) + (const :tag "Hide" nil))) (defcustom which-key-popup-type 'minibuffer "Supported types are minibuffer, side-window, frame, and custom." :group 'which-key From c945a9676876798fa0b909582547ad1fdd540482 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 13 Jul 2015 11:23:25 -0400 Subject: [PATCH 150/816] Autoloads for helper functions --- which-key.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/which-key.el b/which-key.el index 133833b84e4..92d82f044d0 100644 --- a/which-key.el +++ b/which-key.el @@ -273,6 +273,7 @@ bottom." (setq alist (push (cons key repl) alist)) alist) +;;;###autoload (defun which-key/add-key-based-replacements (key repl &rest more) "Replace the description of a key sequence KEY (e.g., \"C-c C-c\") with REPL. Both KEY and REPL should be strings. MORE @@ -286,6 +287,7 @@ replacements are added to which-key-key-based-description-replacement-alist key repl)) (setq key (pop more) repl (pop more)))) +;;;###autoload (defun which-key/add-major-mode-key-based-replacements (mode key repl &rest more) "Functions like `which-key/add-key-based-replacements' with the exception that KEY and REPL (MORE contains addition KEY REPL From 5e1187f49b7efa4e736c838abb1262dca9d4158b Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 13 Jul 2015 14:59:07 -0400 Subject: [PATCH 151/816] Fix weird no room error --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 92d82f044d0..3ef4615dc19 100644 --- a/which-key.el +++ b/which-key.el @@ -818,7 +818,7 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to pages (reverse pages) first-page (car pages) first-page-str (concat prefix-string (car first-page))) - (cond (no-room + (cond ((<= (car keys-per-page) 0) ; check first page (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." prefix-keys) (cons 0 0)) (max-pages-reached From 01da1c59785cd065bab2c43de20e3670dd5f5bac Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 13 Jul 2015 15:13:43 -0400 Subject: [PATCH 152/816] Convert custom functions to defcustom --- which-key.el | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 3ef4615dc19..4d89a7d1e73 100644 --- a/which-key.el +++ b/which-key.el @@ -167,19 +167,25 @@ a percentage out of the frame's height." :group 'which-key) ;; Custom popup -(defvar which-key/custom-popup-max-dimensions-function nil +(defcustom which-key/custom-popup-max-dimensions-function nil "Variable to hold a custom max-dimensions function. Will be passed the width of the active window and is expected to return the maximum height in lines and width in characters of the -which-key popup in the form a cons cell (height . width).") -(defvar which-key/custom-hide-popup-function nil +which-key popup in the form a cons cell (height . width)." + :group 'which-key + :type 'function) +(defcustom which-key/custom-hide-popup-function nil "Variable to hold a custom hide-popup function. -It takes no arguments and the return value is ignored.") -(defvar which-key/custom-show-popup-function nil +It takes no arguments and the return value is ignored." + :group 'which-key + :type 'function) +(defcustom which-key/custom-show-popup-function nil "Variable to hold a custom show-popup function. Will be passed the required dimensions in the form (height . width) in lines and characters respectively. The return value is -ignored.") +ignored." + :group 'which-key + :type 'function) ;; Internal Vars ;; (defvar popwin:popup-buffer nil) From 8ce3f967022d0d365ab7dc7ab05dd66a7e40f9d6 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 13 Jul 2015 15:22:41 -0400 Subject: [PATCH 153/816] New default pictures --- img/which-key-bottom.png | Bin 33722 -> 36238 bytes img/which-key-minibuffer.png | Bin 64067 -> 35292 bytes img/which-key-right.png | Bin 43274 -> 72576 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/img/which-key-bottom.png b/img/which-key-bottom.png index 9ed2bf1090ac35d444468cc2b350722f08c2629c..00d372aef060e9b742e1585c3fca786180eea78e 100644 GIT binary patch literal 36238 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 z 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 literal 33722 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 diff --git a/img/which-key-minibuffer.png b/img/which-key-minibuffer.png index 586920aed44bee403326e7a748509d0503e44d44..0ce5263b14dac6a604a4b54ad5deb29d8d998ad7 100644 GIT binary patch literal 35292 zcmc$_2T)UA`!yO-Y$#o@(2IalL|T9V(xitHq<2K56M-Po6r?vPQUgd0i1a2MsnUhe ztAr*kNDUAI_u#L*_kZ7SzWMIVow?31o@7qWE@wY$uk}1@hiE_*ZeG889Rvd1R8o}F z0)dE7Akc-6S1$wKv^MEU0smca(Nd5B74_4t0v|3}ORGtPK&4S6C+5V!=WEW2`Ys?4 zY3uplg-)lu=O9oBTuDw^`?bkt!(0J-m)n-8?>7SNWmVXSV7tTWkRlmx$bjt7P58M)LjE85@YWn=Xz+c@-d4u%_q>D&^ z{V754MMqTQPt*Fb^>xc)=NS+Cu`$la|o zLeo}J)1i3S;sHUVcFgn+KGc8I0C#nrk4q&uukw1{BhO*C>1PWepjl z8wS#)Hv0og=z?M4N66Mub7KPN-Sy_G@nA5a0Xx!!e}-Et&>9zn7D;XRxDc%PH=OM| zHPQX^GlEN+9$9PDM0Lq+*};Im^TT#DV6 z+u5XxM`}>hv~fuZlU%G|+6Uq5z6EuH6RwyE+v6ACpdZ|CfJ4z-!Kusx74>ah#^97pVv|br`&igMw9|;JKa(u$FsaooFVa9c zYt*Sz>_>xND$DHC-Ld!y(>lmUNsPzy{iN}&D_e$z5O!4_CySX8e)uoMYAdIYIX91Q zubo3YPS$|&7>Pn3>*UMENBR~`S#U{618Xkw<`(j?pWnus!d4r^Gaz+l zF4k_RnoZ@1Qb_71ZiURsre{=EiIV5@*BCqwX1;ngRHSjvEw@r7YP=dY*ps5;9)7g#mN&(< zuoLG1-(~*d>6iLy&erV{BnVnbXFDZKgykzY>pb8r}X?XJ-$uB&j76=wCcR(%sAnp`9Nu1zRtpN9ZG2 z-JqisY>~XB9_Y15{w=93_ghgr%V_bK-z5wx;y);GS{m>s#W1xuaz=#mn<$~

)+N=DHjn6LrgN+y4xc-2o-VO4< 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 Nk~~zd=$Yw<{{v>KrK11< literal 64067 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�uEkxXrkX~9H8d(D;v+8V zQz0!nTQ9E5KM?03K#m6O_x0*Q&|LlSCb*LHJ_1`p&e`4!bV=^aDGsyTONbRcRuEEe zMM%1O&R=jrp*dGoTt{O7v}9s?FwG}ZvkfGWizVSEmY}=%9w?aZ`xON)-PIF*eh~w` zFl4^>OU{Pfvcqb^f@QILdeK95>Q~gmy8zam0IXktA1hRzgR+QG?FHb)F=@wwdGD!= zK+lsK6Ys|Mb^RVUo`FePRMM91ZOOi&U$gUkU6FW2CNTfr$%aYY<7dPl{hP<$+9Y3y9sKGT# zgAtaO=IkPRGwVpa17xp|z%P~+MDXegGJ}q&PbV%!{kJr=TGjNA*f-X*WKVkqB?MByp$+QWjLv8UbRj}$(+*{^p0#&(}ffDqjxo6n3 zF@-sjmhO5k&qeYxmG{S1%n5-HPoB*#*=o4ZAeR@Ll=ZsLxgtAb_a zS|AbOU)kNYuv8@2gj6S$nY8Q@9651dE=(F%HdWI~DiGAVFb%k#=+7()99@_AZ^!UJ zrF^M@dgWwz_z8*Ax0n9M%!?j#^hd1-3_#ypZ{BUW<4L}OdPw>YfknC%?}%8>XkL+V z#ac|PZkhbzh&U=wy<$A4+AI;3JQ6KFKScjTS&ahyD4jOa0qiQT!8>2-ksv8xwUjt$ zM_QDH<62+y4hp`2L6d06ixiTnhu)mvA2H=$9JFmedOrpv5^@N32T)(zqX4YrKzu!} z`xk`PBlcg5BbU1g@L>#EBhITQKIT3vt39?lfJ6iTwaig@kkJk2#SNb?fksICOtcb~ z>&tajQ~bWh==?L^8}*STNKWe{$D(z*@n{X7wfmEMfJ_SbsY2#V-PEo#sJ?Ky|3G&A zHx{fxgyY5GK>gMEfdl3GywIC5I_RrMSIrxL2(a=AbG;_+-U#d6gdAkpf$8NO-pSK? zqXcLZy5iE@;<}utobUN??f&FIjzR@_!4^2M$3BA>8+wvI=g5Y)C0sHpymFg0-FKIs zRl7fylng{!5+OEqoo=GSF&g(xwERV;7{(s z^cL_C0U>DC?D!G|`jjd`H5wI(UmXk%Z66lHCh|C;Me-~(-A@uD8h%azbW)QM;0Uq* zJuXY^lJ?%rqXjoJ@zP}795uj3=1gzh^N*zvJ(#R&(ugJqzzap31OQ&}*@pg@CW5p0 zCjxk(K?T4INLY^Mi--LBdPnF1cGHG8BH(cczp|aB>q-RMJ0Z5Zu!%aPZV7Bqx-PFv z<}E#VxXQufGcEPe6xVEq|cT9}oYr z{JDk8MtJZ~%b$v_Zn;I8{%3FN3ab^(Wjwy4t^*A@Q|x;qY={lJ)+rT|@7%MDyy)NT z49q87b&rB8{(K#RO zAhMge8t>Kw>Z7BOm=cIZpL6g41-bSIh)+#4P9X$Y9SJIK=TcXl{~vf-ZCpVS*yuBW zptjs@W5tyVd;cu$<+<8UE?pVQ?~nnxfnee21?rN_{ zVmh?(nwnjyPeooG+B9;T1t2WymjwlYul?V}_8HLPX&=~){`|y!g&+0i5+~sK)h4te z@+CLtu9DJRtG`^o;K+eo*%*PF)3Yt}=S8B&dC{m9k5+__d@`xm6Wk9)Mz`NVx-l$i zca`t1J#1^kKT5bf{p}vvx~T%F4>dX+cezImvJJMT8$q7#zu@3SF$YwvT)2sRO5vnM z)v1?7o>#x7Cp}0$W>JMR^5cxlfL@*y05oR!tZUkiM9)UZsjAmFVvSsEcpeo-=M&O66&kDf!45BSJyb;LmC6h(_D z3=|3RU~*w1ADz#2eP28wzs5*NPJS}Y1JLGC&3My(F`gbm7d`JFquwYQ7xHJPM^>laHV^2+lJFE(9`T1 z0w7^X5-aH4N}quZana2wc~v*ip8%PMyy-4~oRjp){#(#S_;yo&PI&Wjc~aEbknjAq zVWnjQr(XlG3qNyjL^-#ixc+Wu*G`vzVj{IZ)0xjC-M1^r9}wKfc8#>Iam8G9<~;B> zCvo$q_4Zdr4(}o0vrBpRy^CUG`o?h<7#_g04Jw8<)z=(*9|^G9kuaN9gKIuYy`H6Q zz6Yv)FL_dKe}(Ncexb}-xbU)%l4L<|{gT52A9D#HIfSF$Kh+DX+W~`K&0i%(3&zY6 z7cKib8rLoS@+hxA3uxNhzI+#b-|5pD{-nUX{pOoB%;J_2lfG-uf|JRl$Fo6YrP@ zilx*gA%tWi6hq>A9q)LhBSWqiV$*G0>^kJifzF^MId9Gmmrj;LTLsUaxtb?EtGNi$ zVR&ZyqZ<=6d2VBQIfVdiCs`HYPSTpyfl=$)AczxI>)=I&TC!M5W3!i6QG5#Y26ObZaS z8^eMrw?UPj692&9e3Czc1#Ud}o%oInsUgMSM_K6( z`9FM*veKQUFnW-(Y!*sY*1@g%o>!i{(1TeSP^ ztOKhYcy|e^wdp5rk_UL;NZ1T;8WpnPH9%sPqd16wQGiP_I(AvUeeWa?*PoMtJ_+sT zjf?ES5M;>T_zZ-6`7>c?(yH3zd(2XjbGizPyB}nrn&Th%DwAc;6Ym^Y=$~^z)Jy>} zPKm|!OjAPKg_$HbI{kkCu0wY*am{IU|IF~{Ta*A~Kua@eMnOY$#IYsHE&E}~Ff1vK zM_-+s(S(0DC1-iW329NJNZT%$+s|&bvy&y$vYnhlJzq9k@-+UCQ`slQuB|Fck=1Q= zOX&B7*#R?S;ECErU!ZU&5( zU;)QPeie;bj9+D3NQ9t~%o}3#F?}w{{PYf_Rr}T+~`9 zX&gs}$HlEk4y2q3<&Z&KWZnXOJ{@?07vuJ&Rc%brIlMK-%G+g}uteZMp57=#_c~+$ z-|a{Lej?q}b*UFU--Wn?Rg50JI0&9yv}3gsIZBh*Nu7%usS30?SOkh9CkN}Pnx zBq|nH?XP8S2TPtmKWZrU@c#ZBGQrdwBmm3qAKb)CygYYdGE4*9D(j^{ z?Q3amMbW`i5fCNMM{k5{#UGh(EqOBoRXJ$wH4h3f=+c_EywUExO1rfvNNsj8dBSK+ zH(lrR$&10-E$<5=#v;Z^<09X5-}`t}>O?h-{j#W#kXA*hglTvQ2cm7A!fKTLQ09;l;Ps)cEmbptCLUx!C(()6x>1Vz-h zkQKXx!!uKmjk+vXPPOH5#&-r$S@DlPcJ(hI^n2b^WuJ01P42cIIDa#-=&BT{x-LFz z2iksbKU)yexzJAMt)eS~!Bp4xMesa9-X4wIk5*6j7A00Ml6(Y1E;6zp<}c!hEdwM* zJFW6|3<0y02_#0AsxhI|8oY0d#*5C`c9WDxC^$V6>x)?U=gJ4GL|<2<4=d2X$LqtV zA_stxjV)bpe>U?V;Yn9l3+)4Mq7Z^-HRGLC8}sia25U7lzB5hmzpxyWB+$KoSk;hrKehM`(pulGFE;u7zP{0T0oR1wB(ury#6AkX)}?&+$D|H82O z3$MH*q4X1cMHy2wu>h_?$=fr^XZ`|)Ies@;hYAP~|2F0Ots3$=(c)(!b05l&Hr zajAOLqFt&jpXX^sYkdhR;f1k)Jn8pOSbOyf2eSA%Bzdw1_~}P^5;y8~izJcH1aYX{taq0H=DoPX#l;Ke@O0mSp1CG^|AOJv_a-sg2R)|ojhH8^Um|6v)F@Ul5am9-1NXh7vQ8z2VvXZT4_fH41?FFC(LWeK zW}r)W0Cer=*kB*ME?>8vZhyoz7q^V@F1hd0tZw`4l~Fb#hxB#*nTp!J!<_I)0^AVl!DaPR(rTu>dcn&|YmOYoRE_zPi6{x^DxH^^Ryxtl<}2@;#AZO2DNi;1AB2 z+zO}IVtXBz8jD+?Yx$6kXGK)`;8x^(o{Rq!`CA*^D#%@es<^4d@!TxdTT@RFN{rgp zkw;jP+20`a&tX7~S1|H=1O?JHgf|uNCR+PvqJ6CaR(*;>Scg>Vx6Ra0G_Hya0t-j_ zFT2lc)Fvf4d1+U)$#|qe<8Lb`;@HN8UQ$=EAHeOH@OfcF zYs8_N*`X$3c>)B^vf0$f>#2!=P0&#BB0Z%yA&>(#M6m=A)bG%B6w4J`M$<#da9K-o zG*X^hZg`N9VYC(nwgxYX$X^xg;v6E{y<{0>H+r6J(q`~_j~#I6bVsC-29dw@a1G;~ zwz9R8;0RA4y;GqbKX2&y9Mm_T6MR2SlH$U^;vB&3VL;LVm^L;qG;DkCYXL`2nUDB5 zoa~hML4l1Sm^_SGx3x}?pR9YOQBNIH_UWyS?|DUr@zr_|Q`Hm1iz*hg(%8=aTpc*s zTJ?D9PTN_qdY>4-1-x`uop}sZyQH}WME{Hm`~-OE<{hzqa%~g7O46dNE?0x0UF<)# zlkg{;I4&}s69#Lc^~LUrFG8TTW+}2doyBh&1C=KCTw0G)XBc_yZC4MiI7>yoj|ws5jHN4tv8Oh1w$Pfb7Oo=XPirRI|cb&F9afndXW|arYJX;WIS#?XB zaxW}+jj%|i;c>ibWCMH_g&d|t!=%4eIFPnhZiC-k)&jVNi|=U-3EQZ!Twz}x2SKmE z1N-^M%MKfO-lXP%#S^KdVT)d@+%^z$YWRvvO$UW1$MGA`q!(q}dCvfFU-ciO_JRmM zH{GTq#CDJQ2*2)a9yH%d-&tLt;(hmebZb4cu%@Gi?M?9Aq;a(EEDTc~6rCLL2WkUV zZ+vZz>r`_E>Tmy&(foIm@oz6gtfrK2OQtq3<*;l4?$-^dIy8;x6<2-0(bWTCJKmKM zd3QY(?V54=G`Q=!9?+-)3Sg4INu{b1X8PTLhrr3)Rm1Dm}dWwm?O3D_!zc%JwNF82U#KTs1cfP{B60CoiuMP^fE zg7CKGoHX|)39o5r<3;&4jQ+B~lkG=9@Fmd3K=lt0u&NfQmG=eYKVCq)lyq~h{cXTU zyAj}sFs9O3tX_Du)jyGrx)np?>t>W?g!vk3KDE5A+8Dso8slcvVT2h`*8@vaBYw^- z10>^<%H&K^-|8!RLV?2+ufoG?miMA9?y6xR=+UXO&m*_H;8(@PYV}YswzL`lRGS@t z`)T=syvUfc>mWF7d|KPip_k}PtL}x%9R-; z{~#cEZ6c%|1L=*3Qk3gUE1E?{u=)^Jyi$Suvfl#O|8@J;wa+hCt1pYDuXHar47AtF zHRz>XZ=&Z_KIv-V3?MIsx4J66)gL;nb3Lk@5ngTW0kU6;;UO*%6JPlj#Ty)>%k73_ zCc06T@cu(PZMvCY6#I_ABFh;vuj391Fjd7A{(SbhFZj8r{1Rb)z45~GnLT#w<^7Xg zULYvd3|${RaByMe?qvr=Tr=BWPCOl7$fZcS)hE0cTCI-{YjM6TzljU;RMBx%v^s(Z z3f|lb^A}v9djP_of1+;oXgZKAcS}U%UK~DG1Y_&lD%QecJ_jyR=z4$l!&|sxYM<`9 zJ-KjVl*_*{`Wa6zH|!b*y-#73t{Dca*66zb0#?=xk~Qz=XeT%2M9{juJrsD``^l^y zvXGXEdC$^y@zHjTcl7+-L7?YLeDOn&<+KyIoc@5^qS6hO+iuj+1CwfY<)_a?-_51I zI*Pgd_W9a~)uPD4{407fa#4#Zd-CQ8U@6VmUVlkeO;?N~xOT*z?OlESK<{4pO=+u< znkfF6*@GLJY%t%~k!(!@&8F^NMq4Y@1XPOOBWj+R&Uu2K?pjzJ9%a;&F@}X!FKctP z16m?@NPW0lPATJkzEhD~@1#cIw@!-t)$4oYY!jX1vc9i~e%Ad7!_2EW%e{UIHq4U! zbyq#x^r7^Yi%5A*4YKxyu{afWu7ghEvDl@uoqx=*6@>Yfw0JMy^9&<5)>-zuI=P}f z>G98sX&aJ>n{2w!TFdO2czVmeOC9tFUt9HH#qh|Y(^n)KJbfYg%jP5|I@$L@xDU2v zYAMhaLNa(sy@z6Z`=e4TDt%sTu{{6LO>V|t_!zGz&yi*0Qg#3HkA7;TcCh49h#hGq zhITEsHm5?+0(*$vfKy6yrDT`uJ1U;Z{b%O{81=}a4eD0XDIX-27bR4F6SiTjaTr25 zEq3RM_SfSB#u2D~D*r7~K^49JT1u377a_U~R+medho49j4C&^`ZStwN9P-+8BBEEb z2g-58A8|<3v7c$C#|o0byIl8`H311LYSYszF)6xm(zk1w7ssd)cr9DAEiu_cqri=N zE8tAIB3t+^R*)bB09UlA8;>_0a(=_VkGHMp8T#8zk#xE)CkJh#2M74|dj&%7m3l{2 zjpOcQQ~1n3J0AK>0=_+ffcTo5R3edA?3Lw9+nCV{=IEa5e&sr3JWP}Hu}oO3=3tpY z>}PUr0E}k-_lnz?Kix2_-k!3TwCAsz&KdYu+=^=f;aTOrX;Oc`OE=q8!s+~UR!k9J#b1k_6+DQN<_r_)i?@O)K9}Y{iiIe zsaBxxk+~gYf({Uzjt9}UKjhB#Pp5R@4C!L9#tD@F-oxY{W;Rc1>ap zngoV>W|x=AfF=Yd!540eJisGj&ax5sbO-$1qBC4A{U)H@%a~J<3LYIbN)_kY=hmV{ zuJe_L4-4ng+IHQ?1(tVP1JHTOzI|otWCjk(Bj^Z+B2O7V` zWuT!^AS-^vMW%K@!SRixr~}qVT<<%ALZN=5_?;xuVo@bxk6n+=DR;5`ozkt0h;JZU zC2?w9oqiL%_QkQfkog5-ke~lrFm3{|Bn$R;yfDftcQCIx7BwJ?R1CJK&Pek>Lqb1=B|`;j#gZKI)fcmK+J+cnlL z(KpO**Vrt5SlkqoXyTTh!*oPihCK+qDUBmXjg(YxV+$ckIGdEp^DpZ#a_>z;0u_f~ z?5b=zc=wU!WD3t}bfJ1vG+P6>>{2yV;Q>!JF<9-s4j8^=L)ss*p$>Cw`t(cN_*ly- zy<0mcrU~za@uEGrDV(H}0B4)jWn~vytbU!Lg?$#k)8ki2=Z8i)G3$#Zo|EFR$T-=h zd)E@bQlH!bYl!UXoB5}4}Yujtb3Bz8|n#NULgnav(v> z0BWJm1zcURz8||X!}EgD)mnIxoA_l)ExN{<dzWB}=tr|n0s*%m3UIYxdv7x~Pdq^AkzYwS3B`0$8Hx{^|8>A!0A)=&wO>*6!2p!XjRMgJOV0Ck%S(Y(n3k+~r~ zTjh(`W!Y(}tjHB=v(p-ft_d>}n0_$P@gl_^6C9YTRI$i;OPcGImeRB#@q&$Qk|T@f zbQ;ilO$4iVQv?Z&kjfmuDK_}-w+r{#S;-H>*?Y*gYO_q2j)$A3?l;8XLfJ(1;PBOu zXxFgYZ#T)fiv@O_Z=gwCpH4P|P*CPC&e^9GTls|~I6@7{at#us*n37K>wXg6ayL(* zCM&o|a=ztJlIcr6|AlluS=NHHZuvM_HC17BuKUZUn@>=(HMKXH>W9y&FHS`#{sNje zueFIU5Re8A*Q@&{Qlnc1t@0F-*@D0HX);H>f9d)`mQ5@<%=5K!M*=(=l0CwKSR#e; z`hf{BaeZf20lRv-pSifFVSQlD%4*e}a}wVm#JfGs2x49MBB~-LHM!7_QH|@y*@vA+ zrOz7WwAg+lng9f$5jd^NCA>r+qEZ0gt)Mb3VUyxAKJpu$j3AtA3OTEE)%1R6kg~P} zZ9U9GE2Wah3~(x}g)A5GT}@cu8WZl26xrTv{&skxLmvdM*qU(wHW_WyxyrRK%CVt~ z0{*=Xznbrq9sh2O@iR^x`9-Bw2@&{Q$hsohV;nu2WEJ8bM|3VC4O$lcXKytCQJDz^ z?Ldkuk1t7H%Ka37C!F>*A>4^EDYyp4Hys6pgFO9DP>0$F)65f_>EB&NYN{ICcs}W!kKRcAJ?j7%+`;n+wL1@5tsaDR55r30G#9MQ+lk*| zuhK|vi;SFhFhvvwnXL0)aTj-;aoaxd^917DwekoSv8&@(|73PHc#;GC9kDCW)NQDr zwSHYdJ(BV9_8fH>xBZk;Wli(4o9wN_E>@@rR$}~1|G_<;$|n~5=*#}5596@&sLgi! zZoH^qDd+q0zz$A-$CDMU+*y85Z8IFbhI-*0G7D){rrjA4IbbvWUer+5eC76Apub3X zRYinn%F~ObgCKw^_~y4r&PlKboy5T7;yoSozw0h(!7z1s>UDmz+H?ORhUR8Y$4^~u z)zB_LC+v#~Rh!up$Ks&JiZxTk{E){Fw)p*17Vk&G33ll+$kC97r2oIN$l1*pRWvnY zDd2`QvGXr3Gnv_+_Kh~sTXNt$%a#-b~bx|8xPuX zL~92N7XE`<)}aEpl!jYV6fQ>KgC!wxDXE(Nr#(V%Js7eoxm%7d0=Dx`($ejopC-e6 z9aBCb!iL1c8X|tyHM|7>6sgMa$c1hg4D~0zj#;)#v_vv&v0Gi?I9v=hxPv|mt%1zg zgyp-F-!}Dob6~Y8es63CC&@ULOCXCPS6)V)Mc>c8Z^N9#duP*nYO`T{3J2W#B8JV9 zK3z?_(5F?HLxP`-UHV(b;00l-EOYj3sPPxk{E8|5jn}1&A)dLnQ6YNdu={IXN!w$Y z;C323KJHFj>}Wy*N0*idlbWHLAM~P|>-;jFV`h)>kdg&T2o~+YkCF?Qe1bz+*I*io zBsfB%T;NCeRH!~kt7o{z;Mxaznz(4z*~eyT(b*nua8`eWqQb$0_w8VJaq2x@cCcdt(D$-%raS=ViPW zlc!?&Ji#d$QG`%q<$0ueG~lSgw}er(?AbV(PrGbG^$P@#`J`p|TIfW|aKF)!B=17D z?~|VJ{o;U8+dB*<@oN(xoxK}h0^e~y`UL2U^Tp}=0|U7^D_&`y;fs$dYs?yOSG3%# zc+xJ2EZ+rys%j=gMnqmqg@tPOP7`BVEtU$3c*-^jrOn*9v*8|UWF@PF5C7#hKGZFI zwsOf2Xz2Q3UH8|Kaw0A5lxg{H3G4CNs zGzri&iUlP{_VRB&uM-TTe|JT39s3Q;r>GJt{5BOiyX*wp5lqqfCl3$?Nj?x>C=P8LN-AT}`bDV` zRYgaPv@0_{3wXjMh;nOpzVILIIb}g!T1!ivl(9c)VxCQzTbQL2t>XdJwW>MB@N)!| z=Y=If<;*VCkjy;bFW%#9Aw}G&Sq|85qgywD7RayOA5I7z512(6^$4jXALJ1wHQx22 zUM2cTwDVqCE zs;|F#f)~%FG!g%D=JLTW3dPgY8t`jG$BY&`bv{-IaFV_@ycng}Py}G@^p|vwiQjrg zKR@wPyt)Z5NRJ&k{WN^M)OXOmIvi+1^`wuY@95?W%`e9};Q?1O)GLV^J*vqE1QNgw zXH$RoJ10%Mb{b$2hJKZOwvao)%I6ejJ5{s!u*h;Hm{RsUjc}|fW8iBz#g$lPT~63- zHa?RY>Uv1d)QbDX^Ha&{&<*RmlEFgQ0`wEY3FPoE71@^)CfAGLaf~M@zqOJ$A?QL} zG8gdCh>?u3tiG)?GHirVzyOdGu=Z?*Y!mQ|E7trG;6Qj9eWHA^lO`b!KFg{y=h_1W z+Q?j_Zw9-Lj%Af1d|v6S11U)6_7>#iw&i(5X^ZFU;fN<;fga!8-ci(|cDpcnJk20o zZR?e5w*)3Hm_3mrafcv^pyT+~NzR#+bkVIxiA29rJoTNP1gc z_M2eYpUtzMI@)213IfwCq|F*zYg(JX1=HmG7J_`HVdO=ES3tkI(geOz`adDS)foUGDRuljZDGB6?`})(^WIdcOm> ztIDa}tpM4$K`e#s9zxBJv-9;LOX!!XhkTEKi+8=s(kc=98PT^i2tqdZ<1{r$4~1(s zE1q^_Racnb0hP?k+?i6|sD%C;37d!PQkRu06eiE5RYjWJnKB^q$fdn#8-}qW2)O3C z`ri}f?Z`$q0=FO{fTgnX2R3=bOog!IN zrm&iS0YB-U*xzg^KisscaAbLey#CuoziJL$r(M`0z^;U9H4(bipKR~&2pU}*mM5A1 z7yv}SdiNcdYbPCU*FfUspBnbIlzqiA=H{!pJ5JcQ3i@g4y+ih!NR=zu9mz*#06p&T zpHG&rCfl7Iztq$>Wl)EXl;U@4xvxlexYgQ*N{0QCp7f|3fMk#WMB% z)8KW2`}b>(!-qw9hkM3-k|Z|y+8HP0RiPGjJJi$jTuFxjOu$$(4R<|eXdLZ4sN4a+ zq6F9^@i&{Rt{cQoaN9{oP5fiW^ApnyNmy#F85>ns%jsIjdo{!&NVF0;H z^AB=*?#EVBso4HH_jZ1?*z2=|>C4x|%U!>x3`DYB zejjoi#ugvnzyz!{o~1re_G8F?;6R-Zcx&9GfO*3UpYMq^K-kOs=B5TGUZyB{ra~HX zpi|Uxuwkwl1=#{gQSg`G>h99V-~P>5L->C)*2n_iiVx^X2mt(j>#rZ6soO)1iNJC8 z#yCLSV}2ya*`(jKAQM_!Vnhm%NNfjJ(1$Q@SEoM)DF4_LkJq?;|(V{opg~E0+^knBqU>02UzEIbc&n zso&Zk$b`@Sf{94tErHbkt1rbR8B`GQ-PWiDTYfY;4p!?3OGz;Jpa!Q6TZSV#xBI7MW#1Zgc>z+e8HTst$MczjHl)+|Uo0FL?E??~50^>ovFi zMz4XO1~!EUuTrYUX0vrFoOis?-gDnU$4S(7fR82okJKS>)gc{CsjmH5yXjZf}iQ)s>s#4~sboUR}PQd)Yo*$^XcR?#Pd4 z%FjvtbdoV#QnE|(z})&%gus>7Sypk+suTT2xyYL)4OCzHzSUmAGlcit%lNas8N9}P zmt3=)_vKk{W?vruhJFE(uQQy0=a@LQn=yKg!S%>PzP(NieC(0K500K?qzBAPUl^644vuh ziN7bXEbb$H8yKswp0~WcUmZCl7~#3&Gvm=WQZ6jb*k5H~Tf=Wo8!>AG6}X}TxXwiq z+koRB(7SCzWpm-+K*%H9W)j=tu36qrG#CB!V5+?(on@%ktP)U^3F_YSUP!BS4*Ssr zWZwVu{ScICMQqUt_iY!%W5E_F4;Tjr8R3++9DQ7KP-uZ#QZY%?dlBPA0zAV+$wsjp zDQ3*@r_pZrj}Y?c6FEk<+`UjDH|vX!*iVAiM9Z1*-aD!(A0R@OC9K1$TxY_?O=|9f zbx*~E5&3o_^rA*&SFh;;CA(|#U9F*ozwrV7-R2oz0{zfq-PEbRPV=%Id9a3fBbSb7 zS6}(-SqiwYsLe7AymLaeH(*$M2|`SBqBX0bB7qIl7#-|ImoG;*joR-pXF(KZd(~fB#wVIDUF;4UX3eoPYYx&~mF)#I!h@VJ(f$!de`0$sUDo%zaI{u7apc6U;h zm1@nxjxB*KE+L>to?%DD0XzBgVo9TDR?~K=I4p6)V{;P@RatzXGY|gjK#od&lVE8a zjpciyoA60Npr=v~i=T~8@ehjqd$|Y4uO{4Ib_p#ixsG>2t-|!F$Ew4Z?Khm%Nx0ou zs#UCNBr*Y!m%3N0Kr?uRftSI%Fn$Cb{m-tAko){)JC9r>ToAQBXly8PzT!vG$%#~4i8 zcusJ+7p&c}ouiv>&{ZJ+`w~;tF4Ow4j)7KK3ooy?4^*ht zM>?GSha&pFBDYQb`&UAt-XR)ii$SrS38zdrDdSz3s{WE?miaz4yx2xU-kDYh#V4gk zvA>{Im)@VdWM_X1ixVxcwZGa8;Q9-*%=Ldc=_d+}4GSrgNo-F>ID051&CkIt{FW^* zOG_+{+LWyZHU>C|TC&c1hJzOS)NC$D2o7*L9G<9Eu- za-w+X#qVV3VR~M~ZBoPTaDE79)9-U4E_r%7;UhM_IR9G&5Lp@(Po^fZzlvKGHL*r( z{)pPvE6Mj_ii3{N6`qs{9q^N`aC)SV0CCpz2M}kMokU*%an=epGK{vfUx|I^ss3PX zV_}(UUw_Hj(z{E|J9AGa*KKL{MK(umHK%%}9`%gtj~}yK*na5zkhYw5!c+MaXwRB^ zF$`!Bi5Svyd=_dD8~I%gKALd%dJ#$qqSx=s^EF>8v;MSLy6$0oMs+()#4V=+K$=p`E&U z%8fDa4{H`O^Dk@5r?|IcgdfIgcj+D)+a<*t=1g&obos>_1D#X4x^-KCDt+i5W>Ndq zV7ad{zV)prgOV>D{A&PXtYSghwMl2JvJDRv=FZ`pbz}=AX1_y!5ADWH@IM zd>0>Q%7&&^?}|PqV<4pv^v=F}#OzmgwGqW(UmdeQq6W7ha}Qq%+8VGei1Y-8 zhw%O^!iQed6nE-?3bmnoS!KhOhKJAXbHu5NhN!2prB1$KZKgxZ>j9*|W~| zHs9LPu1d*P>R#}il&=U{s4PoQaV`UEjDUk_n%N5rUIZWW~ydc{E7jok08 zoddnnmgTwiwN2;8$LB?nGEMyNle)h}bpd5L^ak*7X(qkm-Eu*hI;;9oJyjQOyYe)y z%F?X!-;sXNg6*RsHWxDMK#nGJt==*k(8>#l9(a);oidfLsbV|@ziELA=%MLb@V%lG zeQQdae69B#V+K!BrjhL-P#puMY9g?X6wpiR2m8}zJ9^w<#TYoST0bi+(-YL?UrRhG zke2R$lqIG}50L-RTu~(Uhh%>Sz5J;6?&mD0@q@PaPLY*&aDBF5jNZG9Bj-4|(p8RO z3PWr2HJ8bAmYX}2Zwf}8*WpFn^N5@PdQ0>YFVxmd*QONNHr$>Y+i8&T(0L#0w^s03NWuhPsz7rG!`6Frd-&)Enc&0@hmvcT; zrS3p|Q$1L$N*1d7WQQ`Z+JP%IXIhVUdP{H2BWai>-ui%DR5Cg>%-AaUa{u>dk!RK} zKM)Auv_4Eq&juBA4b!2IJ~2C8x{k#jpMY3ww=oc9-(19o*7HZ}uoBqMp8DhL2jre$ zsHa#zhMsa_5V&CZhC0IW`3KnK$IbxBRh!a)WsJmV1vuG~1+Wkq5*L`JJ0(96K0YI>{f`|9;SeV+~HGp*B`^;DZ?Iu}}q_@5D&{fv|H zX%)ydg&WiF*=_%2cedQiDUdUC7S?rO4PEP2y~AWS80^)kkv1_Tsipv)v=34j>)BFmZcexT1JG_W-{siI*@8@KfR_3CW#WCKW z4?~@yJ__^~PGa;t@R!Ta0sV-cJQ?JMD(Jz(@M%T{Snlsok+|;02t+WJ&m$=2OUl@8gW zqUun2C@p5MOa*R}1^!YSH;4qifCECe*ry&%qYHhCOD*Hfz^{oXt`e}Tll56`|5PA<6_u}Z>6O%$A9 z6I}8>bzb`uYH*uE@K-fX3W77w+$&Vxp^R8qN4M^7k3=uL;-Kv703zp`8r64ud8;3; z)>gpG271>X-N{m=xtL?c8=Nu6ttoO+ciRZO$P=12}XRh$nItghz2s zaU!0Lh$&CsT6#ZV?3AL>rBI}uBN+FU^Yn?F683Cd(+{zJsv@aa>@=tZQkTDHCfbC(mHWW*QhOgo z5umPTr$@bt67&6^HuC?$c)n}+e7T^CUYcKW{5$VOF!}ObV?L}m=l!bZr9Ch2JO*cH zUWBZUkIcL7NJ5QNkP>g*YgRr_*c)2ir0=f=Ds9QVddQ2IzfPrc;p#r0@iIWtt^oG_ z^_KH;g_3yGpv&Ac_7Uhuk&~G6o*TH_S7^=Jn)fyvt*t%kR9=1BY+pI0tOjVpP#r$I%r9r zmZ@Ic874q>DMKrHdOZv|yanc^0x9l{WmGpD6XTy)vSfGuRi5k?R^ll0AWlwJU$%8q|QQA zar@MA+;C1&YSOucd<_Q|fZ^r8%%lI&1ba{Ih{xP0^ElgYZ!FDq2iZmzE&euYp3&TH z;zckn0f|hUn-3Nu!gn1REk;_O1p_He1hNA~#zk^tpR;A9v=tV5(g|~1X4NsL<=PJO zVxAPjqS2;RAUhWsB10wv^98FgfM|~7ZTb>iX9d`n`ah8-RD6262I@gd^v(Z(}qrdwYm-lYqrMhk8brIJVnah0L8*J zNe)HCG;R&4mjQ`Nk8*ym3fJuJwtl#cm{4JMb^<@?gq~uHD0bd zK}e3$+~_3)2K9{T@45xMtq0(SO$T%KwFSI*BsZh?5-Nf#RGX|cZel1&bZgRbx$7Y3 zXm&oM?_JfcXqS4qyVjzyJZ?^sX4H$PtkE{)&Yw;bPZ`fn$Gll+wsH}!ZjFk1XLZ~2 zD<@hhq!=m*qh(8(gW%~ zD9dC6i$LLfXQ|UEP~GYLzIWv3e53G!NZAxWV3brk_ep)9&TG+Won*{NrLk^mT_h_= z5Pmx!J=}LONWpL+Mnl>~mZ4PdmQ|TN#{;ZfUy`Ut(hUIV+aaiN?ZPaAv?(77*9f#JEY3%HbmvbP$d~ik zut5g64Qk#C5{5+QUfz)t#qRtJIFsiA&2k9$#Sa8*GELNe@yXg5J6pl5u(s0{HjfXZ zPlma%ftH-tKK-~=QgN+gSSj8-ssXrIBu4>whEbC;oS4l+Q3P&0MEFf4m@?k1U)3t* zIpU^UHE(cE#*a-hKfE<^R)-S7kwM{993bp-BacR%tpcs`^3M(7c(7*ut6Lc<7|R+K zUqNG%L8H~L`cLI`)=V|kHu;qDiIqzhE_cx!GyhD-xTZO1v74xG z?EMyhO;%8OAnazkcZ-_81Ih3Gz&Xb=w>Cz*ZWi#5J;Cp>jds;%Ew=eL$H;9pyFUP7 z=ZL7m&O$>OY6^`-s z_X(;?K{$Qo({L&y@oGB8cVgo^&ZFQ{tLWoveeH_iarTKH8JvzlU1}bud4-Li z;$bZZ{oOfrj0|d>2NPyPJs++Bf_dcG5i1S^JucmJJZ||Sr_>N!|NBd!U*p=U%$r+f z)?lPrF;GAu*G(iX+ZkD77<-mLntyDW8#dJLksYgjHlmHAfe~ZwO7hN>NdXu3igw?X zH7erSxCsH9QqN`LRH_IV=_R(14b)@%5ApQ;{~@+%CTI`&08#<^4=CcSndy;K10hll z@NO|%JYC)1oIf);LU2W@Vm!uc^5kDjeTudgi=9mvJ>BIqw$c-<`C2XgKG;SSRxT^yo%@#?dvMmPu zFm!)W_#t~8a!J4=kXA3JCe=rpX%zC-y7!5D_J2om)?u{G>gU|Vx-sSIvVtB?@jL49 zbU!4f_GiSAdVM})xX=b?n}@88lwv?|er9!!+4`RR-oMjK|EF%I|B;w4sxni_qXdt$ zCyxjEw2kvteafv^Z%GDkBtMuDO8(UJnVmkkp#O__fLK)`(W~C34-0A7wtJ>9a^G2` z7eyg?(Z0WY>uY;EOZt%%(unW;aNRO0_DCDpgrEcM?y z?^KUMfp^8!R-6kL|6fYc9a?8=1ZX9d$YGj`7KJgGwryM8lTrpGH3${*A_J+7A&NIF zA==zp{>e81O9QfuDuau>6gda=I?@gtY2E|KD`NUxhdQEEK*`hCzkGl{5&;=NwjHzk zf0%pEuqL-|YdBQts3=X4q7FEZ zT7b}d?=_*kcX03L>~qe0&ij1-K7MgQ0xS1gYtFUi7;}t>U`ekU?kMl~g_Z>tQl#Z| zVf7X$?cFBP=P1M0reQ_f+6hlnn8Q`Jx30&f&(+T{meuR{g<0Snf7U1ddE4l=77jz8 z>YObFSVGk#&T>r|ulA?3>`s!@v@}vo4}wWbLI6~nl({BpM;`98%wX%;1Sfn=59fZ) z`;zNbh88rGgFK-+jpJ+p*qh13ruu?M%XjR*n|WBAKy>Q20IqQXRC;b*>Im<>9`nqOax;lSaOXED@%WvN9|xR!y1Bwi6{%UpBfJQDF&x4TRQ{8vu`n z&HzF7)3#2y-5}_`F1`;<6W%$rwdL8B@hvhYG!Rx+*fw|#X3KgY8H;TJ&Y%KoW#={y zKaVy&>)by6X8`<~z<&Y2S@5O6nm0h@4$KdsMsKsATfro73c9BjMZ`5Etp=p$Mg*E6 zE;K+f@J}3aoKkZ*zMgaKCS(omR))C*S7<~96vrzx@DrO)b$zPg&tN%7E zgW9J=r+I_+HVbWY-pRcub)YzSnm)ybUBy-+j}m3qZQuOCVpJeoDpK83-Ybxi>zgZ*_7f?kW(RcrOV>h9GgoGPD+Ri(-Cj*d4C zU@ZW`s}ciSu|V*J0`JxE8v+@&n~_a?q&FGJrUBblaQh6QBT?9uj4+=jMA?E|*Zpf) z&_nmvUU$J|cgMw%#aByi3C*mo23ZZB#<{3&$LrK*%Jx0n&~Nd8Ih5a(Osw5VJ4o%C zkbNj{B2$4%D0|XccObW3JHIsi0g(U2hycM?n5J#L9GT)D0oa}yvK;{K9m^+*z%6?7 z$n!((eA#M{2(9pdM`vO*%tjko8da)X@0hi(cui^UrQBwZu|zBC#DD;F2jAdQVO)9L zPhT~>`G%AegE^hF$ZB9`=Z_3J)DuEm$Qw`Z{%YvEF;m3c& z;F?Sq%Awnn?Z14`tp)(}J;YkxoFHuRz%ytJb9Wu62|}WU_)b24#|~61MW+e8^#=km zo7L!mWO=;-He^JobMGYiXY}GVK5d{ZC_H@dS?KHa35IWJGxJ8Zj^XDn$1wSNeiG@Hl;|PJ@jFSiSUg%VqvFis?otxLC?uBQ4p#G+JtI?lVt6$DGw+ zu}pHWg;;8&%3F@wZ5*1e*EVbsF1=1E>vN6k1-g1eSC=Wt}~= zR2f-X_??~j>(>3VZzm#FETrsg?{;jG%MMtHj*)GC4i?d!MJlBX zsTzXsK$vf%F^^UN{04%!fLF9RU($unfCX*<{Q+kN@hB&=M+|TKFT&2wIKtPRRU|TT zbVN}v>IY5V^MrP0QhGDb-UTn)dS;Y0S#fQt!QbD>9RddaqxROU3coe+z#m+^yqJ~I zgCW2-ExQl}R%RTy)X8+saNMOl{hsuC>jj>-8e;=4{KYe|yKD@1Qv9!1ClKQt>YCc_ z<4GNhCn9&{OaQcI$dK<4fy&~L;`$olI%cr&-ZToz2Vg-zQJ?n7@ZFfdfZhUpMEb5J z+vX1bA7OIPBtG5(phjbzE}A%)uhRU`$za6sB5dn9wlMEnKgq9le;L0`1geM@phuh;9*hBhv3lb)bd#z1iG@3$Xx{PWQ=ZtyX9&+sNY{3& z)5dD^FdaV9@3Td_A0i(E2EUPX#`laC1)B~`zn(ri@W+Kh;b+=F+aNq@?J5F}92nz# zM`nl}!7^-cL7@lXw@5y3#*0fiZJPq^1PhU5Ql(Nv((KhHxjKR$bHqh{KX0JYsJ2KD?nsx8{ly?5)^ThUvJ_ch)|_YyX=narR9A6Qe|5q`#gTIh0#pn zZmBY}ieHrfd|N*^tNm%#zB-h$Yeu%;+I`pW6CezBxQBouKNclyx|K`ZzYn#uSn-hq zblAPVZ1k<m-fY%SNw)1j8mdr(P9ZCAO|rpALOk2?AZSW&)Loy z7p0+b`&*Jk`lh=!Z5b+7tAWe(oi9;?Q}pANNh8X}6syE@d(A5LJ^l$>;qH*hT$E1q z^YDaL%)EGoqWF_e9jRn8n_?~|wmx(T?6|Z)T>!9KhO8_-=`Cn9+vM5<0)}68v+D_@<$JSjwzgq{7#uGcX4U&y>289r#aW3qn zh4DUGUsn*%@!)(X+EWm6hVwrK976q1#DP+hRI33cdZQFWe0eHG;5mIwQEG_bcfqoJ z4Jv~v2p6c0Bn88}8=%h!|7kcsq; za%NwPx!f@aY5vDi%eUt`U$y_;cNq zdjeMUFFua>8zVBHwTKh2@(yaMGfH(Y&8thwXS~T9fiyS)crY9T#N*AihHn4Dp3jEa*YKt%5n#IZnj%Mec-r=Tnc$ z$p|G;pOD|eoj7~SZve1qADu?GpdT3$nV#Dw^C)ArLDDiD1Is!t)5nGLuHQXlwDf;& z@h<|0g!4)Av0-Z)^vaC76<3VO{{r4~B8vN?obG+>Th-`tt#odYL4a1dF?@ii)YY&2 zHZ(}a)-fKO60w`9iG1z{%FCZ1#qThU>;jwd`|qVCl$w-Evp#Z@4jF8HiMjCQ&A7Ft zwyHPmM`QYFE~So^boGv*^+t02CgHOUnb@{HHz-0JCE*VKwx--Gtnn9+Z}Fdje5#{` z+@F-5cq+;-92aZNHr5R&A?rcKx|_=$>h5?!A#+*+_@IKo5jiZ) z+l?M%R&eN~x{XmpTp&YBx|5BWTL6w=+G%;sSEAoC()t3*`ze-gj^l_0beu|S5_Y?Qvt3G%6 z4c5X>^@!qpVKrz2tDQeX_V=Z8f^$Rwf?DtA(HtY=jIBEg<8N12@6#beeZ zf8oKX{~Y{>J*reo=8hRFdy)$V+&hH*knfiZySdP4Utj6ML2Dov2y>G9wl9QNuiL?~ zK5G8P@bv>)&?ptYgl0G8b*RZ9Am}sf`Hu`>31oo#|5FA?`#S?9@MrMM+74SULznZO z`IMhpUV+;-xumwX56vj+mnPA=4V+hHth)ki$o>mMfE#TASitANOSg)2B);V(S<`4{ z=o&jw?j-&%9D(U-aG4=+J+xq2Py9`}y9euYwbN#Nh+wDE(br>KlZ++kTW_$ltT@};^ z%JMH>Y{7}%uC-Myzdp`*DY3~u|2+0zG>-S=22eU|G5>K^^_5RzHtJFT6Gy-RfXYyR z^1#lHvYGJeMpcL|SibJgoA7%AUwgHP#`5C%%YXxq@g~qGxTZmP@hJOm4wq#_ly)+$ zuk13~^lp;hqx!eqK6amq-0d<v!@2r8kY39F^KxtVwJK}JZ3x}GKBYds!i3^>ppQ`?t;p7Hq zR>-bw!G@@$94vx`2mmjwoW}|P>5EuAyLJe#mGvJvVgCDnhY$Z49Kk6K2@iw`K(7Cl zI^cj;yK-na_jv+=r2cJQ7mx+YkJ^l2a!+mih-0j<(d?}<&!1E5e*KVo_&x53=^hWj z9r!xi&360^H$Xdn1+dAQ-B}m%b7eob9l+q_semk{B14m>X<2QpQ$bNbM*$FKVLgGw zN)f4ac|dmpAgs&%=U#;Fq$K;6KXXY~{VKu|egBhtY{+_v5BmCt)8_|4(34tRMG_qE z!-O1rm4p|CcDV4T1TJ8D)Tw+^F1zsO(olHSp^u7^&yE_FlzGYC9Jw<8Xna*KPoL*1 z0&!w0t$W@&P$$4$+U*yahP+kxllFFf2^=s6ixJz4DH{(L`z`Xv4@B7rkrvB26sB=5@TqaQ|FX2cy?mk?7!bMLz;p6zZSx+32$L%mYqnD-4E?o%b&W zNg<9tu>ZD|tAQ6#E4=##1j1IHCr|AUVE(v;G5=FQ2EFVrfA`pPB7p$@R#-rf2%Y$e zy09hRygmAc+JE&yM?ePImFD;dI=5(8jnlMVgqVn_q@(9=Tj65|>t^gK_1uj_g4Y+qd)q-Lmw)bNlCf+rb*Ad^0mv906bRZ{CJ+=UU=NcDkDTUaxCOK{ zosArnUwYNnc2gspG8?a`LRSd1G=2X9v@|im5+D3NjVVriz@Asyo>(zVDa3R4`%%4S zr}i16s;!bnLFu5-3%_dT0^B;&KY2pHewfFHUwob5>q6!F<%fq?r$@rF;KdcUvz|iI z-21Cc%#eTxVxuNLhpf>f9stTsa1d@lVr}{nlE{Ji50w*O4D{hwC+;s0Ra&|@Rd@e;uP;KlE;t9`enYZs$TeU_Pw;Pm5*^;@(P%k{-P zS$oG@(G3G>r{BS2Y?S9_POEh<3#GiYwNgW+#(vAmtnU9P6PUutZJh4(G_cAw90ft$ z8?a5Ow%73|Xnq=?4g+{!c{2c}X%FcVEkaiQGIB6f!(4%J#uCrjmQI2Z&Rhh3+cWom zlod>Nv%P4*4$xNLE8RJl-fP^(Ptia8 zujXx(9Ke@4@wQQ}#_x!9n7&hNKRg5u9u^>!IOke{5+Z>lP)d%jkvpozg{QOJjFi%4 zBF<@|P!kmC!+_RhEj*P@pS8KGRx%eecj=657LWp@tgj-0EA3=xXP;*+9~rE54@nd- ziAX>}MuN|{YEz{7R~QoSp$^zQ$e(+tkJd3rca#6{u@>uAQgwHYF>;E2=K%=~=3|(S zO9-En3~Ihxa{%la5U309S!)!sa-ph`H#leF61Am_PwITjt}-Ma(X5!> z)&tt;3wHn<*(i-JIFCUa;8!U|)YHhlop$`@yvHe8^<=W(kHEM_D@oNKmzVc`=#zX0E5pICCx-K5Uv3yIJf2E<`%_OtlMWGFaL*^+@xkP{_sv~EaI1aC z2rRnAj471^t?bY@-;qC82%iw%fB(|bo%?8HgmOt?w)&KMVLeH@ws0x^b-jjq`tBbd zRiilmtPs&WaOaT4(7A5((z->#n_>G`4ot=0Z@l?4$xJs;Q;G3jzuNC1k*P5-)5Ae9@gNo}8}^K&%(o)Bg*X65aYA&e_bK&O^S( zXttL$H5UqOSIqj>u9odBq^WFpu$}E@)ZEC7*I@f{frsq{5A7e@3k^K%ZGRO3v3z&& z@Nm{N`T7sNQbr?+JPNe;SO*l{X@CA#9+mCoq^Wc_dwB=1{3^$PqH}vmDhl-3X~PL^ z_;kam5Om}8MCkM~$XV0p;6!DN?c_JxD-tD(n~|(fsehi#i9TPqkVXdiXdu-pUB456 z(BWl`0V^uZe0PNO8iIgt@|g8JiyWGVx^F{{GTAew^*dHb0k!eoX+i|8ZN%$$%N&`t zN~(Jo^~P7^OCsNG({KzB;eTVNI@bi3pSc(A+|8pL_4qlJdV|a)&&2VU^)%YKvOSj( z-vj7xdA}^&dP8h)(|(DJMR?(e*ShaQ8ScRU=xYs6CM-}G8bkW^!;6o+q3?J zO>objy7%P5%zutf?4|$>lYZs6b?7N(omCii@M#NdR5>5}Z1MQYcJ*Lu!%Xao`2k(R zzTt*H*HWz<)-bxdVcWKp5^dIY@2ud1;}VafK1S1>LPG#aBkR-NYUcJisx>kC0Lvs% zf!2`Yp1E~G`PtX}*Rl3IG;C)MOQ<#y{k<&Cw&31u7i=p1$difLd#O5GHf!&`_JLcL zIqbayg{r4<#|pE$$XUpd`sK2jD(E6fbe zXO3GsY8Q&$$#X79>*;GPDjqYqYy4j#&+K-mCQI6z77Rgp}(} zRh#6O1Sz03>)#1pPB|lL-jif1oq3>>d@P!ipv~E%&o`l$SeuZ-4l8VUT&XwiyGsE}_UYM(idnjfE6ztZ%PKqxZliPGk)tbjAf;^!GqL>xExt4hcJ1z@DZzQ=sb|(a z=wuw7oW7Ux*DJClfob(U<45nZ+#15Yg3^q9tD?>MrGH0ttV!sO<3!WSPT^nIeCmxg zpr`R$ZCEq-zd?soEq?JcajGb4}$uN{7^!d`Vow4%a~y=ZyeZl`L$YVxe@ z+A+0NaAWYU|dMOPud+=UFR{RV!5 z8k^3-H=FJcHnnIbfpRC0^8BrjZSqUm<0vU3CDw5*+Kokrhqb=YqO!sLeo0m>$n(#F zk1YI*NtYuktd98WwZoN-b47QPhtTybc^icqr|Fg_dQq?upaQhFKlC}~P=*HVN9aOD zI1aZDH(52=EImBDjEGmW;R z1?N$b@0kEEtz>;cOXi$3`jebubpW)kZ(_Dob^6UkC@DZr|3uBh4z0O#e>svV+<0X7>>o zVQ)YuXAT89!Lr${$Rfp0g?;c-oa3|k*o=o)pwBPWThq_TVY82flDLJ+uLY~ZT^1HQ=4z)Z0XbQ z(oh4ag@wyDg1Gt$`)_ja zorK8Zw4L6h_*ob!hR~DwY_vJEs%L?&X8x_cLW(}ACxX{4sr=r$*Y?pOOIOz=SZ@9e zVd&ug<3aya`TCEWJw(&eI!xbx70whMd4|{rvfkU!FTzA~#b4uha@i?52w&Zs<3=Z! zym#i>?ht-aA8+sdUVbK!QBs=afUf$=W6u50Cu#?%dy(wN++l{LI-xC=@^6SCHKJr_ zX(67t@VIB+j6;R4ohtS0w2bLGIt7`CO^xKlq&ZMsSeXsimfc_FoL?xHREbQ#@iXgg z!GZAM)txPI13PUp9lGSpjNiiPho?_?i3-4EeIde!mk>%&?Z`!Y3y|6VWAgBlID;~t z3w6Z`4sUI^zVgeVd=K>ST2VHx28?nlKF@-$Gr9RZrOiCrN zRk4i`&9;pAWv{Nqoj7}23>s@y<>#nfAZk?%Se`UoS`B%?nwrLAeo@HyEP3t=feU5c ztL38b_h*nBZ>WjRmRkgWdy z&Bq6fSY?qQpRk$L1vP0E-|N^3vqGewtdYNukzwMQco6;ZET3-H3CnZscuslSHQh~f zn6+#fXQTq3r)Mr|P~5n)e839Z_-4@KXVUKvCwym-aWynw{kQD{{Sn_Wh~eMQp{%#% zUi*BEx{3(ei2Iq4zR-Jf(H5!}2{?rXjkEb_sauJAQ)X$@`TP)aS%oq; zi^;irie#ru{T&9!Tnt9lPkSE}9UWWq-CiYL?1>NVP;k!*lDzqV(2;PS(!-0R#Wm8M zes=De97&UbseG-_^z@ZZ(ZIvoeWc4jeOPvzIMKcGE2rlb1x$tVj(n!i0zlwz^3#LRguJgG*bMxt zO@~!cTrBk|UJuee%r9REq-{V-kn=|V@Z!1i*iYj`y6~~1hDkr|R!YUm)j?+FncWm; zw7qJfXpXPg*Qnx~JC7+Qk3PJ;-$d6*?i9kXy|hq`yYKzys`VjlE!FZT9bHvNQukk9Lc(W@bF{>1uG{mRh{oi@a^-A?rMoA) z5-M_F*}ft=)W{vR%#3On*c;$m?EUg2RgNM$@6QUaR`gTy* zKuBKy!K7DAEBVjp{sUmfG1S2;)4<&U;Cne1?Ueb=55Y)wf~p$)9QPgh2&SqTrzn~z z8XaG;%gSBM#}Le)9?KU6HfA`Ve3v^`iud<9^^6ztnW8McQBL;`0NxWKUkF^tJO+-X z@ITs2!140!|NBRV(|8B-4fmXc(6Nt6)`p&6aIJDadAQb(af9vNw7wJMCplTK(iE!` zi1bdmHrwP*4Lq>4PVW9JJ+KL59c)qfFUj(bt)Um*pmU1h&zlhcVHqvvQ>}xolt5J5 z!Q2kC@w`Y_)Jd6RZOl-bey`2wo9ZT_(@HF4Fs-J=_7h*mWBSib7H*z(zARM7;mkcHea zV(Qvd{5mW#PLJfxvHgVVO{hPul?y)o1aE1CK1v<6He32(?={OTa+GpiG|_J7o1}kM zxqM9&z3yW~Min-v^ta8Uq zFQLvDSW^xuSfjpKuA9C)@B?xpFrtbe=3Zl9>O89W5KR5f(*wW zzdij)-yA&hnZIm|5^XNUGpwgv(K1j-+!!#3h!d~sY3vO{zcAZo?tQ6Ai#oak&9WcU zFZfbV-)@60&_id?QeScBMHg_d_LpbK8BSs*a9c|HgJo8L%O&4H+7bFDB;3^!{QafP zsVzY3=oWqm8kNV7NV(F_$G-vhJJj}<(MXiNTAmG8Ny`WNFV7AFw`Uhv;5=DR&34SJ zhP=N(Cxkdud|JH{X&FB!u*U47FUE|wn0ukM18a52PWP^hK3`3d--`Osgw%pR zO)x%b&Vjo5`ZeRX1mZ+bp5)^P8)w~^VCT&j_1AEp54#j_FqPfblOh1{dO$w}?FtaJ zo-5M%e_?k?IE$qMf%^WcP&gO-`K3X?293CH+5{oKr%D!>AADUG!q;2Qf)CJtR-Uuc2QOW!Bn@~t5|i=?t*)6TXAAgYo1LTRTz&sWU>?WyhXK(!s z3qA5zEbvdXNM>NRWiVdWGtcgg+WcW3QA#Zjwv=5y0L3^ zn!v!sPxr4k68#lBFBOK~Jwz@B7n0(T*@ppbeX$q3^u3@6D%l;O&LuFsQs6N(o!r zT;N03GUe`yHnqozZ%{)_o|OP2f6lw%6m(Ul*kw==-g2TUMhX!%=#kpjoU+dNOR9YA z*%HH8B~Fpjww*7&D+pB^F5>U|xrIy{eSIMQ!c(VfV|mtV9`!@gFQS%z_b!f7*020n z8^9`;kThMmm|C4(E-~ahrgwTDNi?$87@gHq?iRHrg;>X`hq!INV!L)|49Il8!$uq| zxZ)=OUo2i|B}3!1(>;39)upfQ@Vt8}O8K%1m%(2v&YmQ~WD8=h;q9xcMg6MROT1{) zp=GarN{Du8-)J?{hXTfO0t`-!FKFexmi}2 zzCbq?6-2c`nFXZ)^9lvhCIz+H8>a>dpbL^zYOZhF>sK4BpbPmSVzVnkrW@tu@_cRE zc{(TICN}^QBHpF~fNP!3@^O2!Q1<9c1<$86>j^C>3oCdrWe&e5yl;RrZKpK5kXao% zn2xA6Z>OW}$A(2+W*(A0W4dqjj#fV;BwV021yo3qq2j+d4g;PrxoO(F6-`xNB}s(K zWUf`24Evz0#f2UG{7h)4eJ&PyV6+4PiGTA>SO+sX=&39oSSoa`J5$FA?m*e<1#%3l z##sICKg)67&_Y@hn{CG%P;riYX6ZGOz}*Ou6`Bf6Qt$B)2VB$)YOx|Y+)1l-44qX0 zS9?E4;w6NBN;tBuP5a!KWm;z7yW%5ZaRUx%vWuwACU>WyfgnFS4k;}-VO*lCl;fmaneNSKl>9dz1|^f{CxA(WJd6OJ3K=8X-Fzu)54VK zkK-0t2r?mgJQi$S6=gmE9nmYoM703s9Q3d3q{%k(l+FVD9MijxqkH_(CyNzv*0)CE z?7irAQqDvJcmTsQxM^km*vTT`p;LgQrB#v6Kb{AWs!wAdVJ~?Pm*I+)h|ZauRV&V2 zgIZdkmnwelH=~DUVdpV=SEMk0ugCuK;O~vja8?lL9^MML0$kaPDgEfDqLt@bQ{#W; zJjw^P-Kr>*+m#~PD!9WTv&yLI@mVxxP#YE9eCrv|EEB+vb?Lj6ET^_e< z8K>ySeD@H430^wdwpSjLLw=bduh^`AR#q3nBXF&YYR||(uowX9+=gviXL-pt%j>Ua z%-1M0h2E;iy>K}e*Yd3CnaQz$o3xqsz0UQ8<&vW{P5An?4y{wzVohG;oAkv&jd~7` zvOQ%i)p_}J_bq&s*rYCi&K2o^rXqKUbC<0zQbM4$>`iD(x=_2%C%BHYT98)Neefmo z6*qUxv4YvA4~d{Z+eH)hur(4Fz5dv_(xyjb7hlwqxw@Y@u+IZNid7pk9x<8wJ`=gV z&rw_(YCYK65uvCpxY`NRi2dpcVT*@5OEymSuHUsA>qXTV6509yxH_8tp^RKm0v%pq){J<;r-%yY~^UF&Bb+GJnsuWmj7our$6 z=#%#HY-wlx$So}A+39sI_Td%`@vDftAaVsk3c+t(Xx5%8W$6OZGU&*AVrc`Xz>5#s zLpgQkj~<^9H;BxdjSHgW$Xs=>^wy4Xx$+iA{}PS{ zXjhTPV=m>*?t5%j1tn7Y;6<+BjH~osZV)cSD z&T3r@iIDM!(w3yKu&w6!HC3HPn{gBUPLdz&h6mAD4%>}73_!3aB|OBcuYV&qWFzM9(0EArx} z^mU`h=(pEAMy4{w7Y#yhJlX|Li7AB#zRR_aWy%2~QN9n?tfm?NY8{pe;q%S9k5w^x zg&CU)wSZfdg~(?1MMZ|fc}qwzq+IEa47S|dt(1lo6u#bdtfb{M3@?AUzT#{L6kNsG zL+{=o-5;M( zzkQJXZRS@e2DWx&-=2KR(hNLhO2gjIk3sJOP6oV)rPr>drhKGesL0t7%WlMF#Ott~ z>JIu#>mGItpmWhU6g`C@!({83vjqch5GtSQ4GaF@bMCW=g0EMOKOJO;9MMq1rSU&@ z{$mJ@N3;Gf?Vjj_LPkFNfQbNlDv*5^9Fva!Z8B#ddAmZWU}WZmJ&o=h&|8%nY%}g zrF}ZCs3oUT$sTit5Qj~(3_l{^|1i_kPEu@>Nd2-&`&M_neT6bXvpdprWz%D|kxy788%tCeqUuiCt-pmg#T7Rn{Ava8Bf&}u>=4`xES&62Qd#S=`IwzFR4U7r0a z^tN_!`Ieuq;Ey&-ob< zTnwbm5_YjA(r?Gugey7`4Kc08DvEO%yJ+tCpuIGCU;zI^ivo?TVe@6Yp4!(ZXokP! zL=D9c*YvF=v&Z^SClNC;6g^{J)3KzipjMNuqjm6-xVEU6LSEv%Q5=vIuNi1Xa{Ydq zjA9Yv)mbX>#a;2%F{W_J7aVDn-P~Y`lGDq}Bw)2|UVcd5kI2gGg2T0y*kuyXs5Jf- zu>5zUwG^=C|CbH(?`<*rAUVnGso!@f8)aL$Jzt<07loxTQ#_!)Mlrx!apj!mas@H$ z#+K6{V^3EZ>gM!)dgG(0#K0gman)*7^vm%X!R@ql3rJsS@u9us^yw}98-ZnNO&O9$ z?r>}}PiIQ!`Jc9w04?tX{|b$3Hro*@=4vs9o_hOcMUzTHow>YxxJkBl6SM27_N+_x*iG-E4S?? z4j9&2wGE*#b54xYfTQ7;o9$V9lGj2V$gQqr+&k7drMSW$gQNkDOxR5r&f|k~i&$MZ z`o+byUBiQGAZI)_4G_%uNbY&(HTG@1S^8d9kNF_fO5??V1pmw`lU`I+&=RsHVxi@J zn7Jj{wvPG{U>4YmPvJR*fpMsqv@4Cx64xUj7sKJh0Sw1+y^yNs;M+P!oI`j+Ezr>(cKfogegQrmrWp5V0ry@-}8675xu z?+2HN^vGzg@cTQA?6)biDi`Sn7AK)G0>lEhtugvAT^}=dqpu$m8p$d^)rI8^V>wSM zr&GrF?IqV3fJX~D@3^Hj^oNc{JF43<7u1MS8E33DgP}jwZz~{-9qr!fZ?3JK9DX8a z%=YuiPsCY~$djSs=(m}^jyoh;{Yqf@7KC$H>2CoIX=RVy2IBb&Vu@-w z=&2mg|98&f!tYV!;(kD-s3;t{2lqIfdSjAYCpGqwT%-dX@F>8AfG_(ujdF$APFjd; z(bAkl2Bj@``+8j);WGnq@`S4|CtvK7eRg{MPV~pvZEK6swBky6hF(v3yArO@2Oy`y zi!^42j6x6>O{Y1rG=(`lbpd~4NdKGbi6_GTn;L%q<7Pcid#!TJ^O8l;#gDG1iIRH# zM8OZq8}B-60&%(;pSbu!?6^xYm>5C~8F0tUSeCdm#P0?Gl2;e7u+ z3py}7TV2-}&AqFz)LwQis?ShCZJ}L@!fc9#_MzY#HUiM;*;-nI<7{O~X!_i1I+mB>ZbW^J4tE-5 z7R^>CpG{f1eBPUUaDnnZr1AcdB^|%Bsae3aah0J9eO57_AKz4u`&uERcfjCNByg&$ zYf$WGq8DozmL(=ua|Jte)`3O4HVB4InM(+1Shrp!*_WV zqRZAp3WCH5Wj(U&VJFXOh`WT=M^84C*_4ZNi7iSUosgHxGSlRs0|}jskD=H7sd+lh ztnW`P|5!%$g`PTfG@|_3TXGK8`#w38NxWHBU?FOJ^2}DV`!poaVl0nHy;PJUIpgGq zluUA>260sf+&%~ra_SQ*#Aedye1e<6{d}YAr28(`Ubla3O|bLvJFs0BAt^XQWQdLv z(g05%D0bf{p6SDFFKt&-4TIgOKnO~8d%Jxe2-o*-Y&WnG_RPEUw&c!^+kS#Pt9Pn8 ze;`CjqrTVhzwDU(K>D@{-s}IKyt+nnq-)mH^6j@^5XbOEiBM_!I)4<*wT!sR2Vx5P z!G6<9?Xgp93|ExxUoMBIm z^-Gneu%BvV{GM!7R*+VvuI~=Li1p8BGuiq9YvC;bwa4FukXcE5ydLj0XhaNf_*3)jlUgH7Wy7n)*-wzBr&IFNP1hK$(yjc*!5G zlNlW_)S&a25uj=IUtWwhR1#t>ePNr#77lIYHj>OCF&cc%HbeaMf-E&?a|Hh(<))VJ zu`r^&A;|R^FlUn^Tde<6YuAE;LYCR%zy;mA5k>1WA@7d%;3r0nInaoogp&bLayMm&`n9!IbP)<-s8YTO; zp25|K{)07>caUJNVfgKfGA$K$E!+ zzzuXXii03z{I==7@^2Nj1Lqh#)=v*UM{^E64lFi8A~9sfy{Pm;J9R6nN6q1t?ry1>RQIjVUKnxT?dFEl;tHC{jjuEnUoAk+CirIvovNNzH@YD}fYKcAnG0s+HcTEWb@(}DLSK8+ChOHRMA~k; z<@I&P*!{KSu#5M(u5m8BYx{g)FjxYdi)Xe8*-5Q$=@Y18HB0y@9g;s6UD}WKAsf)v zo*mo6&)P;$&dv%WV#=8YRH=slEQJ75eA<8<{ogkpH|CRu$d%#XwIDsHENR96b>nGM zslLr-UtlbG($vZ!HADVNFk!{4tUcjY#7|lXXxQ~BY@-s`b9=Tz0d2C05!XP1*YH7y z4@klQjr%jO!bzvjvubK%ZwfO|tOvdv2!WUU$;d_Izz`MwY*Ft2`r?(mPl-`Rm3M#A zwhCF4dgb0SdTz}&6KtOYxopRT+W~s$>db-oDH~#6GCw0xV_ipbd3FENY_nvnJ*Rj^luH%5?QTlWDCd5RoOiD*6F5F_OCg7 zDCMdUd*{YgbFD)x#g+)CC>t!kk-}Am-Tmpi*45_i5u+VG=>u22wxE>mbyk4Op2S|B zSVCsNFoI9^CZerQeLx@#ev_mFYP(+tVw zh1h4d*EJgG&8}rXkG({H_HcNdI1y;|Dln&TUI?pi zz>f5B3Ga-T&&%bHANjBU#FE#k-VS`nV98PX`H^zgrP*(55m=@Q=Xkhhy6>HEg8q}* zvuV`Wndz=BS-aZBdn^0!Yl@FYj&`2Faw8P5F%?^t_A0G=)kYhAq6hA-XC!)1VV}F> z==FoCdX}hxb$dhZ`e~H+hU`UuSMi90y$HD_J`#;^YzXU%qzqHv>>G+nA@ zTjPv)Mg_zO>TCM%<0yOodXBsq|BceLhjq%$PY}wwNMsGKezSY7K0|4cs|g2NPc-=Ve%gK``P`WSgVL&?y2R?XYOS#?Ui155iiNFf+bm#bx5oG zQ2Ny=!Z(E=G5?FO-K8p=SEP1BxwED$6-CoT!cU++4?d6A&mjbpiZS{2JE4G)b>)>m z8@%!1;beL?KXe2zY8Rybv;T|8M+PlOK>_MN{=Lv3sb2L0C9>`U3z zx}HdCTqiwXA5CD^#h=Q9+7Si?oB;W|TPq}QHDRD|2D>`~U3|(1xp6s35M23M%o;rc zV1=RMt;40y@72oar~l(Uf+6u{hQKEO`D;2eH;wYGGo$_Ee z-TN@BJ_1nXP5k1rZGAEoymF5Rk|^}lua7l4r*)0PM1D(ZU^jaAwv=_e!VfZ454IX; zI&1HI4`w~KC!2q?L>Du)TCM#6+Co2uib?0QeBt$aE2P+8uZB3%N%eZyqqAsX*-C|0GLH z-@#Rk(!+#x*tqtr(yw>q($6`v_`6lJ!73CF<=+>u`}%)!g8DD*zf<0PRwcp#Dj9po+{^$AkfnQ`~e_ zgjAOMgIDqeq8Q6aQ%8dHBI?Lgvl-JWpO*{UP)JSLy`#-4OmTT~-keNXg5m2poDrO;};^tn#DG{ zE?j42$#HP8>amq){y&vnXH-*bmkuB(h;Zq0ks^pf=pY~jf})5L5EZ3{-lR#Sw-5`6 zSEN|zC7@uWg${wxj6#4Q_<;}z(xem0rA9)@cQX3Tnl&?PW_`cTT6xz>PWIXR+536+ z`|d;hBig(d89IuV*%GDhwxuS?N;rby^Bp%U1(Z`1KY?4u{ys1Jbz$K3fBf#`cW6Sm zp~h)&b8>c$_W8|_8@--SPK<;JC-8!tM49!gC5}$BLmw_3UZBhld=J79Q%hf%b}ydE zeqN;N71tAcxhifXM!Z_^@_UzBL~vL>8BJo(J8!4sOqxQ5B3#agbEoIPI?kt#HPZQ; z3R;uKn!#ekGP%b~J%G7Cu|lQ{*KLMsVa}TLplzsKSl@ipMRdDfKIvSH&+4WTKHEkT zwkJ0Khu1r#ZA^&XM7IwI$cY(V(Hg*EG?m0>6=}V~EmzTYKl+JBLHK+A&dvpSj|%hm#&qdDMwC@L;O-MKG#PmP zCs})q-(Nk)6-zY>)yt*qoTuSCIx&YATOekg$F}Z-pUmEjJSOVHGy1? zMuu$pLASNoUkaWbF!%P%HG(ySiXmtYH~H?9+ia&A2|y0Mw2O96Dm-}Sjp{3)Sv#oYMFq%{bz8Zu$)z5i7bY$_ z)(4i8vRgfOUJ%7qpkx-fHt>(&?j4#HLH>c->t`Y(F|SK`!4dsI0+SaqF!2G}o}+Gt zzQ+`u19$}r4U$f6*2TI`7l@vnvau^hdLVyxK@!Q}_>l5u`st{$37Cj}D|ZjPn$U}AaZ1`(TB&U<$0-l4 zyH8)A6Dd(lbT3o_StSBqVkHAl;x!)|c-{WQ#(?N)f8|BkR)MD46rEFXNRsn)WcqS{ zRnTKG`aMoX!AGSm#DWzFMmlTpTsX=YN|^y z>yM}~9LJH0Y^|wA3Z{gXr$A=37BLDR^sxs>CJ;9^Q)q5B9@~S}l%y(X^vr%gxh&B_ zZdtKU`xv2?T&M+|Mj;R3+B@tZdBB3n4>U>V)%g~?u9|12aFWxPGv(=>eVD`h+=}li z#FB)*(chpgUWeaGHJdBJ0`x-D&cSuL#eB>-glAC8xL3U8o-_mhO*!n{3+l4|$%Epi zP>!>EA9^^?)JG1Cb8C`88B@1UpKYe1yqtE2#}puO*Kt>C z&5H!i234CIJfgX;W^#u_48hYH)J#VV%-woem9p+*~cCK~}Hm^0D9 zLQZE~=*!Pupb;r*aKbQ)1IwHUXjlq(zEbe|r-xhPTeva~LP{Rjq*FA@!vxp=#{U0* zsbKrWGnj;5-~qI`C*Glh9W*Yn`*t9S_Q|i$288GWlE@PTl8vDI!cHVs+KCSfGD!71 zMn?7ki+=%&fhmM-0C(V}`+wpbrobbGvd7y$g*2Q(k3R+Uh@ZEZNeEypYo6nct-DO< z8S>xF+#frd5uGN^z#&~QDKnK>rG@uatTk#nE3~(MzF=85AW?J*!#Nn-NK`vF)S1Ge2whCWsSwyWpO+ zyzReXw*Idy(ZcUn(-8hVw2P>unAT6tTh~`M&eNBz>zAtoc;{B&&5=c7B=0*&U+*Zx zFN_V>O0yB=ZD7_92=pgV7XX0i&&rh5POw1jTM=Z zUR91FX;tf$JLo?8{%-pF#KH8%!2TPqdY5y)b8Odt+a%xY7^#<}3}J0PIPOWld~ooO zsDe%cc|WF@DYO9t_^8=SZ}Wh zS?+CRCvi5b6w-{sRc2|4E4(R@73pFH_qQI2GO{)*ZBXeO21fU-oIOu|8ulC`fVwO?|ti>^uqzki(ap0{y2O~J6@Pc~n#P@P^K4|?fH#t}$+FmDm*JOO(bmbDSrtuIGIxWs?6Ux>4SYH7Dz zXONZ_pj?p6N-~lg=?e34?u3 zYt@fhX>nh}E5B>Uct-jDO}^>hWL4GrIDCB6ViYQHqb1FT5iU%AMlc;Bm^Ls z4u^j|rsbQstCjS$`O(F+)q0}ve_b^L~YS-pwECf--NkQ4*1+$wgf$AT2+$-(P^(JO&Ee}!%cj-Be9o)BSjvgHac>J)(slA@xj_;915DIy5Q)9o|y|@1yHf!)}o^i z%|m~7f%nQ+F{n2#!k|eCv$!86+!a1kzWjD`*Et8#tdsMnu!1p;)i*~AeRyeqt8aD9 z?G6j5m7oab*G7WpLcXVfZQAU*rxjR+u&}3y=Dm}3 z5h+@zZXQVf%G(@|8u6~($2sV&Reee?j+98z^z^kG<-_#PyFrXS&fyo@&JfF;ORUxd zX_vOO=gEHN7Pd&;fCU~#w?_8V@Fj^+qA{I;lO)aFYTYlB*kv3X=23S1z(g4X)Eo6K zLh8_KFx2vZ$F)SzeeY2)!fnVLkEx}F_JDp7P+RQ307pXx zuCZ>}4~E}uX00?j?&_E2H(!cKnLa@XmMf_fOWKWaaC-e9meZ1p{3@**mzptPM5sM$ z5}QI8EZ1VHAPOIURVhj=SZVn2(~B3HNHL|y$TiKvFZ~Fb0w3F_cZ-Z^iCu@6pN7(3 zGVY9+;%8DgkY7OR4p(q>&n=xzaC2)ZU|?({d@sc7>2~t-ubPD53#lXQAVmJJ?AN#) zZ}*G-fUE?tm3q*+(4Q*6nHu(kd#FxJEI)R{hZWT=g0Jb^A0C5@x`ay$mK+@Av#rZo z3@jc4s1Q!zG$d6?R17Zfd7NyC#`1k$?u+&+z9=nxF1F;4&+fjVDsQb@UsJ&F*)_M_ z(!ZaxWdPCO#w7W`>nAu&9wDLS|2Wr{%D0};0tQ4(|2QVqA;$x=B@s|2<&pf&eSo!p zr>!8={$md`xe)r1tH7s|p1|Qva%Ta-SpdfXsNZ;QOA-}lsU`n&{n6hfe z5g~s(wE0!TiDSUtiEo*i;#_3MMuXgz5cHQS+3(Ci4F>{Mi8Rjc?M;@qzt2fF!Q)6N z`^%&_Klg*7;@VA?<%HX~?zn+jLU4{b(Y~r%$&oQ8K2wQ|Dku-_eh%?0GCrKXVY%3A zV?mU0HpW(n4I%XS>hcxGqEr1GSthHP+zdq+{LT?_f<)7zy}cWM_nh1lC+;7C-v+H0q!TPWeQtryYcmARCf$lCvH8vbG><8#m6EQ;`bl=5%9WBDm?K-V zG2^dJ-?5EBnRyX0(jf~-nGaBxuvc*slDUnTbMZ&34?FL4d^`Pk6VPA$m(rhoKMh$@ zqx99ri(1`*w_?3nB(QeXK3l0$D*cCH*3?2()!AXWSJ;CPVRTO(g<%#|MQ>3$&$ z{v&?2Kn3*hcstjOYzZqhtmuVL zhK~IixX;@=*7EQJZ#E{v@-uxZAED16*_5$hqwY@Dq2LCaof9&_rLG#~T%Dhoobf0~CiZ_zP(8F-v)hCK)*@|>xF2x1LeP7Tdx z%{tCp&W&n|Go)MVjREuyiY10vVxlQ zq@e>=fao{5@>{o8WzM|$`4WiN|I$YLQu?b6Kg?xY!}aTP(6BmS24?c3$|M`}JbQ8PRbx2zvA@9#gp5Oj%c>Iax z$8M+m;@cOgJb>y@Rp6gJOsurm0B_DlUN}AUn`)ReCE&5RDG=1^as1sQB*P8VO#FO= zOS|Zu?CNJj`uO%XVV~d7VsFt(6pCnm(dJ=h&Yc-o_G?!J_2o+JtlxaS z-i5!e1Y39)XrC1{v@6xC7&z|ZX9ZC8a&FD?Vhm%>So>#C-5F-WovYaHhutkNBWnf?PkU`6dLI%T2no@t%9Q?* zd=J1BcZUwQk;s!}Puiz(d|il2R`7~?_4CV@gtY9mOPJrp_>^)3_rUM;R~1wJwhv<5 z4A`1eEh)B4#w?0EdExg2)2f@8BoWSHxmp37W=DZT+aw>KAvt+LskroTfmf6zBM>iDvYWN_l0xu%hx_a*JO;-iqq&E`3L46=@_c|@xMC9(I?+d zCl-HYZ&si*kns#)l9|aXN`|(7>XTTINuAKGy%uYi*%s+#Bb89^EAR5g_-Ji<2OqXg zm%O37M!Gw_5+wr$M;a4^PA^w7?jeLx`KYUSE-(jA4OkV5W6?U0hr{pEL52KKUfNFm zX1hL8_f4aQ7FW!7Ueqn(mRVnH-f`6O5ft-j^!ViMu+>omwb@W{p;AOu-GHp3@2noG z;}Ruxop6QMhXhK~LMX}2d^35}%DUCYE(1D4YQ!Psa{@llE+96il~12v zVI=a^)17GSb+duKsmrm$(UC(eppzl2#XNV#a*dpNAov#3eV|Ap0yAiLuPWuEWM9Iq z09Tu0IKK6 zz=_I6x*`eh;~glDyt%nga9@i&7#a3GPm7BQb>TiD*}n!Q4ga|g@?;gcag^RhT5e_E z^sScpda~RSurX%s_*%crVeR4y{k1;J(zf)5EUqT$!EHcM@D*QP7j{+cxVq< zLmgckkiAr{c#k$aoT#je1h;^{Vm4&7!Vj?nuu zhtROP*FPqf8g$eUuraJYQ=yRUi$6TpcdJrRIcrOQd1uJP#gG+Kq|ci>0tve3ymY2j ze5Ba#I(Efq%H@vP0El0Y9Q4jvnCA3uNwb6PAlq#-!tt!|ZZR#t3e*N~ zC~c=Mz#{1+x$5kv+HXJO!SUyoXcTp3R+fw2%vVSs_#V1d=H6}SMhd!u&HJ`@duEh3 z-{oHS4df|`N&N7A@x#Em_F`X++dCl!%is(1><1Y-Gi(bn{Jx{~xKTyxvoun0Kc2TU zy5Afjx0;EM&VSa~1sa@>*bdNPfhkHw)ksIT1q8jaIUPxW-jBnP8w(`EK7=8^!N;Qu z?@B(t4;1CuRw-XSYC{0kSSh3KOPM=M#pr*VlyiI*qKq3zT@@B(y zSl9KL)^UvHptfY+A!pd)8#i7eE>)CKe19Oy(=jO9HJIDDWOSDj?;DqF#&OFyHLs1J z23#R!k0P#m*$0zu(BXLn#EabY*C(Xji#iAPlmXi3|)srav7lZ56L_;j&% zv@YM0(fzwcw9P>VaN3tpDF#njbiK^gApO!$cgM@TE#R&(Fm@j!7tqWX50o^IB8Oc7 zz~NB*;H^B*Z4U1bSz-&7X=O{b9V&og2a?+s{6RUGQ&Wsq4e{^{Y2>HhbAuo1Eolv{ zi5i3J0uI7Ykl{V0T?#d~eS+DNQ^TK*PJ_2JO;X^VI%4pgVL>`57$mffq)l_VC1@Ay z^9gTj2#gi+ZeV1x0ZL4H1HHqnIUA=lbl(2X(muV-&)u%KO4I8cEDErvk-Fk&*|`C7 zbdi7N6VFhWWyY>Y`S(BgM_s6;J^eD4x{DT2Lh&aI0~CyyG{~973gDlQf2Oj(p5F5_ z|M|_oc42(>N7ge>h}(HRE`7hXJyUbXnyB0}Un#L35_HT%k-kTU@BE3~-h zL8Lw|yp`}fJ zlWe`8w%Kjp8#oe^IR~g_?iGUPh@*ob$BXVx8%Ozp%sGD`6DIB*YD@YHs#&hgjv7>3tzM((}YgUgQ3L`278prr!{ zck6HHPomcVF<95G{q3%!B)c0BEhs+kcu#PzG}sP4iCEw8Z<+GpdDfh@0kkUa_I=H&gDT8L1C&5#($gMWpYd zyomd>0hithUb0CRmbjF8J=yh}Me^o(lN^T0#_xHu^K6r!J?bd{V5fet$$&?Vn?6?n zT4`NQ?;1NRv+fixNLeDSB;m(^82v%qw7q{ANb=;AqcW0X`Xq^yEC zC$(?UMtV~6!>dkY=j<+GlJ}{pAo^x>XGo&BF~b(OUyq#xDl{$5-lvX50gn&)-W}wi-qwL!$*CtW_ldz$!!C z{I+1ZtnX}@O>*GYaq$9Hh(*Zpn45i+xlCnh*-(o9%M+%tA#u2!=#O2;S5M0_EMMO< zk5P&a41!&OM%HA-v`V$M5Z#)A=j_jm!RYXWd1rf{6YJF{<^~z|$r7GCp0!@1jnZ$U z(UZYb`zZ7yg0a;&H~R{Ss!JivMGS5lB~z{^y6u&bT7^VDqac!VSxyI{!(Q)MgvyJr zzDZRY2S?|OOG3=F$3uDsAEJqMf>twXEHAx{c_qxR%s(s&Uy!fT(6WMjtQqB<15Y<1 zLx-u%fE1HY9#ilfSDN>ZzRyBl`8VRmIL>E)%l0YK5AhkDE{|{{#De<9SQsio6e-UqvIs0_!Vpdk_|nUWy4IA1#%&aXKuOY&~W=N-al_${fwuhV23LT~67%)sqMO!3#_H|^ z!3fvK`!yrWS9iWw=BzvCyCdF?ej#2==>_5A_?w>p$BWFeX=~EXAC1+TZyc7>0*-8| zv9!xZ6AaW#vnxR8Sf(M{kax)Y-zWmO{S6p4>C8R+V(0wi98_)ryDKfZ0|V?qTcWrHW`MHV$vN-l`ASM+@Y0_Q10^l>%xn zKIvBD0gw8**h_iM4aGz{VC?@?LUc^)veBS@wKCc*{--xyOE1+|B(QJ{B;m_Q0 zCt2C7!X5J12TwZV%ntD}%Ag9foZaD{p2NUld%GKcJTXdQ&=Nj4-`Zi?_v|YAw3GSY z@SQpZ4?3F{*VKIcjW4b|Aboi{Jf2p!RliGLh&BBMu4%uyH^f8<$?n1AeV}dVEL-0pXY1HGE7nnF-aMZ%n!a07QB+e=CFBMZ`Cd1N@o)9@ZCF zv;dvQ|IY+qmh}Vm1At`H z-{uY2I)sYK(wI_-OEs>Y9$Ne7(CZ!2+*t#8Xt}+QD7TumDIEU^Wb=UxFO#geq`? zrpx~`c_0qjh6~b%r<;ZM%!bOhpxlHF-@7->N|YkP$J`GQW^6p$WER0~!#%PGx%4(- zdTk_i_ujUbSI|AoZd~HEWrm#~;R#Wr8rK7*cU!vNc~r-1!ecLlGH^KI$&3!$fx$hNa5mH zQ=*Y%s0v{rYGVzX-`*s3Z$4=}@%zTi!Y43;+X?=r_jH=yFDs6;y9-W0dndbn->mh^ zksA)=q$i(Y`y;O*SnL92w>WR%8wtD1mo>X+Uceld!k3q6lrmW^tz`Mr@nO_Jmwl zfBkOJ5k-BrZ-F`GifgcnTgeSKkCN^&&+a`D`lnBDxWo781dJ`+=6#4bVdlsFIM*3B zPJwGz)bk#b#1jl7(tZipz7u+4t!PJ7PLC${X;?+<%5d8w7nH;lXi9~nJv3E@76#lM z8m)PPk9Gq*pL2HU(pjw9KKiA2VM{xSA6fQ*=?;C$SfgrNPl;}R>VlJ4WlEeyzT`4k z%7c5kcm*u=92Kwo;5^2}%6#C^-j|R7IYTQr;I$q5i}-IYOz% z$IJAH;8KE5-Hm*MVt?)$tW3+@pt~O`H!4`)w_KIrv1Hgb{rOFZ&q>pMh86?VDR`uN z(0Hl%*VsH+3$)==^lmoIy2uW0E$~-T6 zBT>47*^!hkx+u)BRFZHU$x-~O_o?TbPN~Q1OC{K{zuqrwgozYD_N?F;cRO60K(vy$ zvGkm@O4fKXvv=G9oC$l5a9&Fu(YXM>2%DS zP_v)J$1c+ zc6$g=>L#-zJisaW4F}8fW8D)ioA=C@5T7bSe0>brFq%dIIm>PQxB{Y9tjwekFWmIa z^MSLE90!Y$X+~#sc$yBzt};|yjeaA6!cW(+j8{oVe;X(!E%mn=bEt*MNd;{QQ#I-Z zi3Tb*-xj?{lV1baS5-*mY*;B``MyxVy!-^W^~=~={;LnDEm87D@2vUXJwC6;8zc9*~(O-13)nX5?p|X;(B3SRFaM?xxaiL0G@B^C&p$HikDI@ErCq z1aj1sZ5Z+tltFphujWYkb4`~{*Y!K$vav1A&mK<^X2*E z+!RF(`)$RUHgTyH;B1>TabST3y+jt~eRWqLN8`cAxv6ixas3zi+Y3wSzUx4g(GTs8 zHeUzW>t*R%hCG|HRXVRld#$)N(ugs+UiKVI%&N(~4vta#%Fmw)LfswoS9)IA=PZ9C z2<|Z9mck$AO4=x86~fiZ>XcMOZ@DHe+_D+RO73j`^33cE^og!zsjsO+B@mCT_cGr2 zQbY86*^dkA;}DC(r5jCuK+VC?FIGsKyF2%l zOZ~s7b=-;AJ@j9cF4>?09*N59IHh#-*#Dc-x#s*ErBmV98S27L1^BbkK_QG^c2!}F zrIR`Z*IdEN3@@PYl2z-8^n3Od+3KF4eWmry?Q|ScJ4Ic>ErdMs28)cqrX^>KScMtH zj7=#mh2m^>UGokBL=}$+n)#e>+py0O%c4`jWuG1#?tOaB_C_;wNxYBrZ06>?lsMM94a%UTh?BwC{Hx+fCX8fM&>UFW|0$W@_E zir0bw01N4v3z&(8+>G(?XLg7;4$5|O%}b)J_nca~K6O9#y#8SkDILAmj?Jr(ehhulozfvi=12CB zZEx{)>*MJk7;a2i+Q{H;MAgW8P@tjD=B}uBMQ>cL9OyhIYLKQ<{j~+O&gW>SOA1(SbQX_H87aHkH=S@mu;qoTdqo-j}2=ZapdSIG6*1pxr!smQtQ=>CDDli!`O8KCf@-m|0w zJ!9_jVn_A$4?P0|hrIT5!zuUQJ};|7Xb3)a<&L{%xmudYF*z*3Oge$njjKkDlXT2-ZeytDv}#IntBwUc^!SmoT#O zf2#a+QN2+b!n#l(r1LygO9wwuQKwaUY}LvURhtqiql#NSmYL}2+j&7SzO6fdRaXpI z<0kqkguc6R+)h45em#2(M~PE-RIg-j=7Cld$KdgFhA9Pf+Gu_6TlG>F{YN3yxptrzvKz1EHzSsWHn<=Wwj> zqR5aDk(bz^=Qf`{jPl}`4tb-5QyPXEwx#{C zbYEki;mNdv;j`c66N44mk75W7?TN&1itF=oku}O_|3k#uf}(AvZkJBEv2(mh)+e-V zbt&`*rgaTNIV8|rh_QM+5N9=+8)qw0p$Y{Z$jlD2?^!M_Z#a#7i^NQDRFmr{?lm?L zu7I`MXva0H=9iL(E1x35cN+U{B-cn*uv5n&UQ71%47qIHQWf&#o9pSC>*ib9W06j+ zchtn+gJe(UDycBg8S0|4`I&Y;Ia&fWbczF`(q!Bil?k8B&69VFl=Taek4Mdqwqcw_ zGKOVoVn(<7H({3>zw{uz-9!e+<4yiNru0$R@jW^VZEgUd?)lgqK&MLG5!ggtjr;RD zyPf9iNayv87LPqr#-#XpjP78g9db-nq9V-4ycPi9JVU0hlYYE#hsH2z_cLU) z`B?W)xy6DdhL0Tje4hW|$^b55at!=e1&NZ(W=H?mE}YWQuf5(-7|{@qdg0gmDNTFf z$Gg-9>dA_1d7AiN7rh1FiUj-4AAOiVGBU`@v0nJm=h6GgO~g&F}k)+)5KJJ{tiLKq&kxL7_w1v&cNa4;t2o&^Lmfhhaor2WJeZjQvnouLiNV9r$c>*roEU6!m&88l!-WlJO>jwP5NG#fbMT%lhcESV)L4tmA1IdRZVesU1;b+VViAXlq|s1fdsh-^|j} z92n)5INz{=h-x_5e62|6*&}66+j$1VSDkfoR5xoSpi37bYvj;Z(@5uu2BEFn`Jf{f z%dci_w>$Xn^W-T^d{L%Z#?_sQ(e6kksTm3~ew#Vj%*&W3VfP#3$RI28l5RnoX!6J3 z#71+2a#kw7qKQ<{3;y=EDF2;}-UT20n3vB_53Q1ZBOW!Mvl}DRg%kPqZ1N4hkaFr1 zgLL#0Ten_w`sUvXmOrmP!hb3D`7sj55o=u14K|TdHi(=yyB5<>%A^u)1q$H6pL0Tb zZOpQo10#gBuIex0vdEDRbccB9PN?Pbfkej-ozTKy1Tn}Q08n6T;DZk%!U?C9IsUU7 zdegR?Z-Rz4hLd_?n8)3w!IGD2cop+?irz{g>LYZwha=u+MwN4l31lYk-H%VHwl`X zE%kobDAKJNVAnwN54fEQ*|{iYwcgqxCS-bCZ{KcOByCmCS(3i;^~qpZKXWh>-P)kt zqr!1R$=9iVf0h3$V)z9ueJ+ZW*9L^?Ma2|;P8^g&p7VK25UBO}emKf-Ie&NLZOmBb znh*c;I~!XiUBYR`-Hi*tN7ngySIJbqN)Z0({^_{Ra{QB}I)iQr|KT=&aoQJ-4mmWN zrHq4z)qz`Ec3M=H^sHw2HaYFI(qYh<7ej;#_dToe*C1C}UC2}e!A>knNZc&;iQW}E zuV;d{N^xbq^#ZrGl&AN_k+7ov%z7X#2(K$ilA3)x{XmYMc3t_;ON zu4ANOjIUxW?SWfoa+dX_G~6y|vHaMH^n{AR!;cvCS+!Vr?v%(1=dIr&OI7njT}D!@ zIp<}y&&e|JY?z+?w~6_MgNB(6V3Qhh`3kUgqfxptv@UD>l9m?jbP!(>@=Lc)Dh401 zc)v(JDTDhyli;6F{tBlOu-Z=6goD?%bx$83-yU+^yOe2K)arXz^%@Gff6>MatYE;M6p%2 zY6AoAVdw{)g0$3TSQ&yt2xRlRKi7}4h!#4L7~<1cQGSVE5>oPkB{uWxK+;LyC-1tK z`~&IMc&~2r<7@}SM^c4z~+v7{-Gvj2uE1E@52cTQ38z#mRk6 zkX(T}j#B?5-8X0DNi*9ikhRxlEeD~;kw`T(eqUl9ElTruWS?7&_Hf>W=q}#j(qP_^ zm#j)m#AAOGz8tb|I*YAxYL zMGjq`{d5JI>E&ZL5W#2j-^J!3FyC2>t^1J`BJeKV@E20rw;^u#roEFtW8=?b;^zg% z;`Ey|H*fjf$l}ZSh%~G-@%Gi~(s0u2((x~)$6I}jIqxKSp%N{n3(^Q29VeL1*s~~^ zNv3o*eYIP9*`<@(E$_m3mn5#Hrg>1q(F7I+09<1%qh5ssN)sQ-hpj9WYD3-qy+6&? zQ-nUFbL4qos=VD0pcOudJXerrL;olWCrh<$+j223$vx`Z8t!~>5Z~pV={F!23d<6~ z`r?EE^<+N1JKPLRUBF?>90()qpsB+^SrjK$xK7i~Bo*)2tSShPR6%c|`>b+c6s~7eLC0k4R9AXRJl+ljfgWot?{9PcQNyawt?LgQP+-`HXbw z`0aR2Z?qsI05tlMUZ2b+nL>%Tx9sb{rtF`SRaEzFUw7NG=#_bynp^C#e?C1v@xUXn zj%wEy=ofW)SEDg};k`;O!#~CmGBc$GSkV0Q@xNsOe_Krc-W5*pDwS{l!c)d~0c293 zMXtV942V;;Vw<2Yyi)Qcg_V5m%I!o|UH66}WV~jp%Y`|);5qA{GXOb;$XB3BwZMe$ zn@TQ+*#;TOfpjZbnTjxFLF-pqhL)ZBa&ExiUJhiTK@u|Fqmtdt%G>f!5A zE~*?9lUK;^tW~2amQ>sUO8C)cx6)%naCddK6js}pny}^tskjn1* zFTP_#`wZq}Wsbjsc&MA46dZdL?t1JkP3Hz$6S&RHMZWd44QDDOUm^-jc)28_4q@VS zq&j*D54+5?JNBjD)ozAfp$wURxbkhMl3Y;@xg@f!(E=Z=B0k&3qm+CcA=?CIoK!D^ zty0EzpDo(LZDemNeDfs<-VNFYi)lOUt9)O7Lb&v8>+@5Rakt%*D(SqtMpK&OuJ&Kc z#qZ@2M(+5z?gxw{2+R*`bia{9Plq`8`0j^1b_ocSbw){*z4{Xw1a$xA<)HV zqrSPjVJ=AFVcNeNUy@TooWx*Bw_}Hs((@wpx=IjRWw0yXGbeOGl*EXg(wu6JZhO;? zrJMHkb($>Wy1X6;P-vD%<3aA7F5twOG~)s zM(|Y4&#gqz+4_x*0K`}8NT`)zS+C{!PtV%82zx!-Z=AS$$$qlsl&m|3+STlfasR3=CiG2x1=jI3nni#-PO<0F`}P}oi&ca zn}rG-`6h?#t{Wd}-wpE>pk;dC#z5hpXjaU;jN3RDV5_oRILE!Cmc_2O=s27h-}9J& zC#@p&&!1hkcIiKxIiiU)s~jDWU9avl<_dBOwhXdC3w9ERz+~C3s+@oeX}A($x~CCS zoj8V?&enzA6|uYTkpG;ri?;JBnacfIr-ifyoS1ImFUDS!38jKvz9Z)J>)=!DVD(G3 z7fuG}wd%8zKx%ASQYM}`IkQnxBRa|*%l#?4K4#j2?k^`_2DFAayP&h57!u;HM;kfI z`<=&-0OS`xys4{%x`s9BA%(Z@G|)E3nZ3&OsoNRnQ;T0VS2?+hhR__!)PecQ$Yp1r zM_WID({S@y*`Faw6rUGfBVF+KjE8#8&FHa4)hPHP+n0k494NXb8+epZib=zdy~nS@ zEg)15LKbTRrD5dgdo~A}{W0~Ea4|3Zlb30fasHF_HFFQ^gW8?eiMi$6q$*vYi)3w^ zZAYD~AiM(h!w4qWKBwbCpW5YU@HhHPYu@F&6#DPt!?%;pf$gg2#q^wZ|+HQja^#lA<9M|B# znzHq2@(X1fh}t{50i1_d2f;$^>_x1r+~l4K=#gDRVJ@LloMaO0@H%|B8sWsJA@cn*@{@2;nV3M^I@wu}&5GPThMUTxmk~R|8O6WwM@K}0hoph+ zS4d_3?&FWR#E*Blf-2gZ(7`I&ULvO*dj@CIQqQb=C;daR6tGI~O^+LU(!H=%Y|2yS zITyVBsP~*lWk##nWC2*`n&sB!MDb97@GBl6e_JANY@ni0JYOIE%3Svmwz|m`%kE^O z4hxOk!V5!C+hUdI#0|wsFjQwz?8RN!h3`1`6#Z&fvU&|F-{I2Yk#3~LK^&;7_yJd& zOHefgF9{uJUfpeJwsJ|z>RY{HWHAdneHr6+TLmxC7Dkvw%)T6$Y@R#=x!27^_SBGT zlfI{c?teL%|Cb~3-%ZZ{YuCp0H#3}xfszBmnTyfaDiVt=u46B2%&5HNAs9o6A@lLD zI9$s|E@!YOo9g766-kL-*t?cxy2=hQwOv=qzki*&2 z*V12`yho3}9oJ8_NlR{ls|h*Ix~_ciLyAbxtik1iXCljE7q@1_4EsR7<&~S;e!bM- z6}+^_#U-rPue^*jBy8-3S*Ef}l5Uuz&Y`qc%Hsf^Zz^6HVqyYSH+Z{>c~HzfWz1|y0L zX4ah^PBn@~DcyQ%BemFsA&bu$r{*sIxmjhU>&&^?DDbsUmLxo~v^+`poXbJLTYh+; zV#oBv1;@4`9tzvs{Q}C+yQG4NqhU+%vwAC`ur^z6k4=Kye4P#u7YO5d0;6;C;e{Wb ziS&&79Cn`W`!(SnvqOXuX(fXD+P~W-+z-eTTEr zzNCLx#qrdxJ+j-{zpz)KRnaekE1b}{qEOiyybN3>JzJggXrr)@`^V8~)q-(e3qfL^J* zHN3nUIW9rEMuB9ZM^hO&ZJ1@C_LTNHVMW+T^6Y2so7L$(B{*wuMpVV1;j2OI!-@K- z_FbRHVanGy2R@R}JFqfT@pvrGO1v<^qfchAK^=63HHkceCON56K=F|T9?%;&Bp0g1}Gl-A!-mtz;r=b8u6{mY*}-o0Qg<1w)= z-iPoel){WLNu$(|S!Q0ibrJEdsZ>JFtkVy~HHK?rH;jQPyq*q@4tFUESo|N89pz`( z9%qeJ?WO>U7pr=t)xW)lyF7ESy*$4y^Nf`!GCUUGyV27Co$)@Eh!qTl{pE*pcPhMp z>_4?JgrpNm+LUNr=n6 zV6ix_^*T=c^g83|pilm}`B{T8QVfwg3yvaOlDCj3|2rG+V0~N3(htQ_){^h}ij-aa zJPtNVd9$}$fxgYozxi!*HGp0C@efrBffQPL;eh9*(xZ@AN{jY9zLTuD#fO)uKQzpW zGKV*RGjgzHe1jyUZQSM5XwSQD7xD-n(=&_@DYFwNyBy9_hV;mXbgbxSA(%YpA20bB zaPlOqY>-QqDZncZ6o7HZsV)UAwhG$zUVJwLgRV(!f&Y=&)o}jjzeF?b5|$ICblcg| zinpekq&nLohhK8nt06{Jf-QdHFURyy@p7zVb^G4wJWU6luH7snnB@orpASIKJtt%5RCY?&hQU$8%Z;He zZIu-v)Wr>nN>mVjn|7GJ)m~7h?$$8=+%E|NIESCq` zNgVx#io^MA4He4Bw>6WgE+kHpFaALv);>>b@wH}1_BWqj5&X;eY}sg8v2s72EvdF2 zwG#Hxo^(5;3;nT$kwe2(O+*#UqNP+kUk-zvsr~ij1D0j#Rx)&%dBC&jHt4UrYzK+3 zRSWJ^dHVU#x1&3OjBFbQ;V9H`sV+?3-NxOEbiitI*+#56Z;H7sl#UzLXReo zKAZwlK8fNAgV>Rd1D@UiP|8R;L;T*U+>yNK209u%I+{6oe-r`DK^t-%I`8#?j{2DK zsGJ8xnW~zsyqF9;9Fhw|T^0;ZSh|6FH6SglcCz;u#Wj5{z1gjYQkMI%>6zG+5!?+6 zT>bQyki#`Jr*=QKk+fMB*4d&65Yf2`dBa;M@xp88CXK+z8FGzM&}EAGyF${iRfhB~ zvqzTw&Cr8tF@4Yixk#J!;Iu(ZNWzkL&=+X_KuyXRvfriqHEFg;wqF#!-Y#vwH{d|F z*XjnaMT8oWBwwV4?&3z#?rK1h@i`ef8m04?ie!+*4(}U}>>ChqYFD{$PXiWd3*Ju9 zL1y_S4k0sLO$Ru)kut!@G-vfOk}BKn>6Z>3t+6A zAE;Sux?V?j?aPl5_JxSw$Ky}7`aVc)2Gjq$Dh#$6?Cr{sgnxV2(hlfqy1S&28uF;$ zE|a_t=r)wl=j~ln;9NoaTHddoOXlP8^IC1qO*c~sd41{Wml14Zy3A*tT@sGfzU$e` zPCA7g@vQxRO|4G?4XowywKF5+qe9;q2)4LI{$?JJbulw2GZkWzgdJ*pQ{7=A?95~e z#{@p=9V0J0vM0qyE!W{gr{e|OKqz+V_Fz}va!?}WOLb6LYR~2t-+`Fn?*gIpD0&F*q;jwgmp$Uo_QO z1WQG+@72KOm52u(TzM581aH;}c8e!GQ*FcmBSChVcX{!AnFDW0h}19G^u#)rtfj@b zRK8CTMQ7)zR&Z2!3(=Ho>D^TGJ1Gn-P|KR7bgaQAPOA%0_>!jz$TFt-t zGgyB{TdrbLF&Vp|VoluA7B=U|lXZ5(c^e(0L2!}77d=faM+&yNkGQC9t~69s=K7!L zKs|W!f*D1jFE#~S3-TnkhC2VfHuCEfTK_Bg2ut}Z`G}i>ib2c!YsBEG^J$IAJG~8@ zcFtXCZiOMqjL~j3t8M3ZNnV>kj0p0;s}ELM-Fx3mnvE96_6rmod@H54?!M3ih;=PX zM#ZYJ%Jew+iUznY+vX^G?6PK3k@N*jb&JIcmUW3okW^Q9vK?}a`(A$%Q%-%8@!d6g zBY)L26Xw*e#^zkUDy%jPHB+dveXqF9wuw#1{s4X;_ljNlkG>%;%qr`&vc8bTKTMeiUCqfNru$?^uYq|U3Bh>E7hXxR{ zEeD?Y7oAtN`*$BN(Zfd-e-aoc!L`CQ*vjG~VQrUkre*I82Djj;Y~$O6ylXD~S4_!v zl$0DA%aEM!3U(eR0Wb4h@Cr|$j-XPqO-5(xrF4RY?Z2yS+hZNF+8(nph>X6EQWd`* zF8vPA{~rFz=?mD(##zYk`{rGifhyOTxs~z+{aMzUOIyAqHmana=G{@WFx0_EcPC-A(xY(<58IR@|lY*`ku7@ z+q^xmNOg8n(qd`{M}0o0=427o<;!FRZqABQjXi!$VU~&sZ+{G8D8Zu+ie$NEH`=_K z6*^gV3&+{rR?mIDUH~_oVV*l2|5i&^Kl>4ihA;{U&%5T)EF&0lasPqJV-G(g;}5xZ z7H@E93-Q_Pj%_%3Yq_D|RfYHVQehu^;Ots69#)z42c+Q11H;2RJ~!7viT;d_p$;<- z##e=qH~V7xSG$(ngX{Xwd03ePFZ16raO`nRH9e1UY%c988Lao)D{HI>o+8dYfzeb&p89LzjUGP34@U~X-~)jIE306- zckG(zE@7QwjTP*@r931_d&<_!=LmNwH~EM$no|9_`awZxL7t_^71LtXR4MxNCH?#g z`@dl{Rpg0zu^8+1v9Aw(s-3{`TC z0@*(f^>|K9BIHf)Z_5}x&7|?32Fh-GjU*fpfqJgTTMpPe2s=SHi=PLm?Y#I0WTJB_ zADroW+}YT#(4^7@jNHH8&NaqkpByM5YS@)g z;rq^?4teSJ;|R%8*lw*8-r&Mt>D_1J*TK4vz3ur6&SLm+b zn_-Xp`;)Pn8kZ&dSZouB(e9`ZW-N!7zJ&STOh!hbpY0fg9nR zJ)A^zTHOo?ApC+7^>DD{Qyt1)^lkdl0*Cj-jVN5nSv?h1I>Mcu7RA-!)h67Vn(+Y^ zq!%%`MR6HBsOR+=j9-ci&o^*!_dnnhHo?3}XxCCnpWYuOeS2{@EqnG-`z#8ImOGmn zAIhzAluwYNo-Vgx%jn+GT8uBy{D<}5aN_xucg<;jb3mheHLq}}ONW&_hHq#AaU`Wt zLPJIK$;<9naOkFFmKy$FwB#(V%eucor>i$B*ShAh~4m58Kf799A3^8e{Nf zCa(heqVkg=+>A5RVs}O^L}WQ15aI_9E(&u)A z&j=@=bBz+x#<-M~Ym5+fWo~(vRwc=lI0`7t2lT;iwPkvQy=Qx5@g8vT{UW4Hvn-S9 zfv3l0kvPl$x5WRSaR1LjzW>V@@G~*(k-zIl%BO#4dsN-0*6#XKIIf-qgZb_*M?GerL;+i`B(a{H)h=ZNmnmbx^nKMJdk$9IW9(3uOm{r zr42;-5Kq>?6nnS8$wn$52WK*@`ST>6=Qxm;pvbR>K1K&$^}M=}_-0I8*Cdlda55UYe2Xll8whLvMsFD?b?`PpkL^=ss$01385TYW$DbB*$eV&ugCKk& zp>NT!<7Qrm5Yh!zDSchXidfl)?GcM#itA`VJyVt9Aij zW#}y*3&Bf}*4M=UL)%^YL?)1ruOW=)dDI%T=n9eco;xu3dh#-oY-PCg@h!S2$!Kd= z5AiNMhYZk9n|u1kb^X*~TKPZs?7ulg|Gu67|6NaGXRot+oMxwBmoq}_9WwLn0qzEo zsO$zMfqt_N`LY{|Zt@u_zVUN;2)D%VNqc7!-m`ea)q;fg384puz3az#(4`UbFERiR zpaLA+oHYP4X-uYBYt%^mHW}|3jwi3LKn{U7FtZu~=dEtFvzi&4H@=+$^ z#srWz-oduv8r(i(%NyG7q3Z&E4=M>^*X#iudOo&q6oK1e4(hJFcPDoj@tNzrK%^&6 zxR2HS5N}Vgepc5%rH;96 z=)q>?1_AhJzt7exlDeyDi(Ddt|Ni!>L*-`K`qE9eAg6wJkh}-F@V+K?86^e|AWNO6 zx}ww$ut57iVrMD%P@_}lkJup-MwmBZP_Du9?Vw#Zs;1j}nxn1%x>Q?YI{NrQP`bg6 z$(8L!FelN3d%j5KJTm0nKIy3%?wr#>h|V&6y6*F#8Rwby1+m{pFr<`dPn*S4M#)7W z+3{i#(;W4WUug9>;o_e~5U&D$|17fQNUX|aClknDJ#2KnN$H^v|Cvvus`d%w38h6L z;JwmqgHydyZ(p&p5+|vPJZe~Pn;T>g|IaF!wO}@4Nh;EFFHAbzl00iuE66QbT0$7f z3kp>$8Ip-_62gTcJ_Q3HSMT?t%$jb$7tWMol&GVhC-nRVWG};4zP+EHdRc62XXi^_ zzxx(GM^lo|#1m;Z-ll{9p(s|l7Rh@%`Mf&MJW6KtP(%ao6}z-zvjJ6HGYpu23?2OX z1U59daA&31gSq>SQ&#skTqEvV(pK^OjguXb$P1~N_y1V9$-lVJ&MgHG^W#Lmii=-d z!}4mGScyJOmL?+-@y&r;lKAH7gtqJDM7^HrCf^qF>exoMeZTHs<)VeCa54IF;Wus76!-R~X&eKqCsOF398bx=G67R%N0;vLQ(W13 zMFWduI2!g6r)7q&+7-VKu#rR+7nKt3as|o7{IzJJKj7D}a46fepiu`~(Z8u<`CYgE zO;S=q%-2Oc3RVW^6YHLzIJ_DTeM*y{c9z;x0CMzUJ#$_S7}gcsrPE`|D-0u|&QRyX|eHHJb2s;S>#E&S0d|Bx|QCE?%F^#0*s#fjW$ zb|=O!ZK}Y%Gql(K4{Prk*3|lKeMbao3W}6a1Qbw^j)?RKB30?qi-<@Oq@zfa4$^Bt zKtQ^P^bSE$iS*t}5TrM02@nF$9d);J_WwE0x!%{0`_i3cWv$G4&pF0#B*FPY#Ot3~ z_`?{f>xL(lv#vf3=Q*1KEs@`M;!JOIT4NhROB`^nBb<_NDaDm6WYOvEJ(e1-j~1p=mk71_ z_GV^6+A<^{`{fofAzxKX1tpqR*YisGuRbGj=8w-kP;FN0}(mQ^+Xb>X9W^ z-ei_=#;SZ2=7tkZ zJ2rX=7@r;r-P*exky(&VrOo0cC=}m5MzK38ZN$!Px`h}-epvBzc3d7~kv5-0EK<+s zsKBvG77nL_gc>@P%&nHM81jDoV5}*V25i*-KB-Jkk@MbL9{J}wEd>;_tBm+!_HA2A z8On=$S-4^D+4Tc>DQYLK@8%E$IKqIQv*es@#t5;`eaN;`?RSEw&sH&liXWjmbRWfS zRq!K9Knr={>Htscy>V=In^;tUpZwd4z)eV`%-2gJg#TaK$64_^-mF5CA#YsRPVq)u z>+a;~Gi>s=^Tn-OGnyVM`Z4q`*dDoOA_W3)h=S5;W|jJrPo@bzc>XMIEijQ8A<%Cs zGS{FY(VWbXhhVw2kAIN8cBPyRl?&exxfFez+F{i*Z-k7({7*NF1zwoiuq^f*1=yaK zFwY4=bdnV#%WgGp9S&aTi5dGoBlF1b7a{^yefK0S=+bByczS&E_&bPY5f;-d+D+t_ z=F)MZmBriSSw4@>o}X^3I6U9r|9g_`%k`{6z45cq@&&{E7VF{*L9OMoyn+9 zr6v95nYh9Hm#X7O7MW}IuT#R_ zH>eEv<=Z+o>7sj?S20$vFZ3NPjPH2>e|+}v*dBftXVHdj6tT3}anF1nj6PU%;kg1z zZA`9Rka-iTs%2!*yr4&o1_hs45LxOLP%sd?`U(35H9WR`KjGYq&TDxBQyx}BXa8&6 zw6)+)q@~Ka$V*p?FCd3DrpR_~Z;!sH7knC^BXEA6ipcfueeAvTj>DjGg+02O@jw=6 zasIx&v#?SHn=K-saCGW}v0M$Ac3lkzki6g527JdL5Y=x;Nbz;!=N2_ZCe5SkeJ- zDY0ATb#RinTN`|Ryyx{)w-ADVYeC0`ze0l>x!~J0+$MPW_z4q4{lOEn?_kv#hx}(r zz5c7DIthB%T7(aZxdoP*CYSqR@RPPCMgFCZ{~$LZk)!HdA(jA^sGnYaZB=J(Qjwlb z7a48ZX$^+~B4q;uI^i?BrQ*g2S=OY%rG6uU+#J_pT{>zA*~c;VEpPdz@#Qa%6`$6y z3SaP8%oE|aR&VQR={o2o-ZD!`92#U>$7o=!bTRd7YFEN73!5AAO59!T+={(S<2N_O z%QiW&#zk5wK&PLNdp9AF-n-cw6_JqV7KambUmZ14mzp%n$1y!k-Ax~VCxzNH8Xet@}kvtE%yd~l%MYNSlUNT(R`xexL|)P^fPdMG?S&oQS&(loX^yI z5c1#aaQ^YY)Bo$dOl*RQw(mn1F#6tf3=}*FN+r5UEtyCl&U=@GvgBY|s4$Mm#lQeF zhEn(U1Lem0D{gfm^x)IyLIo1#aYcVkc{`Ij@9^{T45nsHQDX}6PlwSGb8}_qmZP_X z>byMWb=d7Lth-kCV#s!mg`hrNaBp?3f&H9|h_seo@$6m}71Akz=rxpz|Gnj<8AaZIaW- zTR5KTg|X;>Qf@k;@M`<(yMZld2i?&P(r!ahj?Id$iD(ZymQvxj_H>x~A|#4_5Y1gD ztox~(zGy{y#QC==W1laNRGJq6 z{V&1@<+fd_&3$91zqk#Fi*G+OeIp!V`+77WMu(ck`&<*u$8LR7@?Oi=H#C{>+QVlW z7nPKCsH0HIa?ykW#-#o28n{i4g5ft??BSy}d4E3(1`gK#RlUuHe#u{AWnF&=){DEA zo@yrsKgs)i1=5gZ9Ru5&Pe1C?8l4@^8T}wm2Cb~PR5{&8?3y`cR{uKjRQ{7YMO&=0 zIQEO2JAo~)i3U!v$OSpMT#G7af59U&yVyP|CM7|B!r5%~9m{Nh#`s2pmz-;WQ+*w3 z4SFz`HRIjkh`sU(#z!%>CoW{YRrCB46pNeE%X=ZsUpd>K7v@E`U=vYVh}0|s#b17Z zf;Nhyk?HtdL#?OwAG|Mdr|@vl{W{t4BmHpBn6ko> z^V2Khr>~T=CKPjk$5Sy0?H&L6cjd9l;}(~8DZzgfefZ<}=RUKBBF_H#tsBocC(qte znFV%_0M(V*QwE{gYgdY~hVwp{$;aF0Usn-j9~m>(mmcT#iy-EaPepUPM-R7UqmoDF zQYLtU9g&}19M~>EB-^paHFkUd=>!ZeLewDMwKvP7A$nLo`fOij@rvCV$H(E5Y z#*PZJTc$sKB;hgFK1D$}yRfv67_|P`Dm;1ft5s+XWsao0d~H2Rk5Z8h0*r`Y)FUAo z76be0jQb8D7d7 zW~2n&b@Hw(W_y>-fg@S$lUp;ok%wG*yiC_P5AQPgW9)ZN3NbnFK}%|GRJ>tc#Gm<& zu$vMMBo2TG^yw5YH?xr@WI*XQ-Ra#Ek>sfceZqCD1(fgdnVBo{T&uD-KfKzi-0|-x zinUFlt5cmRqmkziYh)MiW#lt-EgMmJGk2x9zTuTXY(@(larB)|ns@!NvR&6+%~ox4 zRdY=??gmrS&z57=kfHo>JKD@5P_V&!wk10vs&|2@u^9M^~5-EU5Xd6}&jc_}T|NAx9ywN1ih!m}&1r`gTGL>u4^65nM< z7@KAPseV1Uec@*)=_J4n!r0+6WR!Ic=ChQmsD=*gK`fk;1 zMS5fSTbZ@Sf>s*cRpiN|okl*$1COwApDI|IK(3P(JK-9;%fKVd80I!TOEDXxnsoI^ zgS0W=?v!1#oD14#`uw?x7UNh3V**g2t06C+HRNMOSg`8BLg)h5x7$KqFgZJyjca|< zWB3&B-d~~;GSPQ;3Z*A_$6loUIH()(6|cMh!WnE{$4;H zHB_GQ(l3$IDyxEzbEr={K7$vuDWN~x6bCbfi6A5;B96D73ezNE`NDpFzyEN`sdY-xmb)L(aet*Np# z&-O0>=W|6y#PY)vMniB-1FAg@(~A4=d`+fAoRpS_jTsUcx1^3R$E{uZXIo&`VA$Jy znFB!sO}=BPXPo6u06pm72jK^1*zTd(jc^+*jj=(Ij2Cd+#i#3B)@{_ju1vHGTVk6F zo8Ma9ule=xT%K{o>PUL097kN3y*l2ct#j~h-Z=@aC2dmSwSwi!v%UkmS~}&FDwdFC zOAe{aRz9x#*UYrB^l)BZlz`u@;3GBV@f*P2?HL$D=(K9jfc&$k*(@}QX}Hjo5W*U& z%41yVr0wIWv|O1l8QNFVF4$<>`=_1?-6{l7M2=#~6tW7|w!2Zw5jtdy2SC%C=fU5} zJpvRkanWEHecMmxJden9?KC$PbxnXU;~jb5+(eyh+KT;~f&+}i&U34+rz>xNXgYJrd7oclK{ zy7NmxNtEZb_;(E*btdw0A2f8wtIAcEz?Pztj=%|~U}nOQb1A`}Lf0Oeg}alQrh#Hu zq3&7Wn0o3mTX1biUXc#V*Exu{*TnMcSSIp6aTYaE#wKpXMXOj}&mGc#MK>mG2YaS$ zz5(S3kIw_*^>o7ZShAbr$H;=ccJ)v8P-GFG$zMc6nyN*rKE?Dt0XpRu12D+4-nX{wAr<9%_97KN>y>K?Y4t=pbSIJw!QcZ6utgVs zjKi-MR2W~@Jce-2@bzZjD|ETOF9c9}48S?V{J(B*#8&P>{Z;m8^MaO4bk%OrD?D!U!de~0v&4E7q^uG)i1 zh0xQhEz+-4$M;$~7k0!_d`uQMsa0xDba|K8cBfN3d4BSRWydiR7XZ_Fvs-!&9_I1+ z_SOfS+hPn|y`X9dP$X;Vuaq*pqPDS4nPTLJkr*D9;M!T&AJf0`@0_4__Qfu) zCh&VmNam;KEnwC1>^x`ZoexqwdBfR-b{8J|xsFaO6jOkK34P#ZBi;PU`hHldWA}rJ z%SST1^{kplqfuH|@p6H>;A6_}`=874v(Q=g@5GquETzoE7X6HH(QhHZNNBkE5jW1Z zz9OPGB`se2Yz}+=v!HS}CcTSkHpOJ2p?Tz>mMQ6$07k|De*KhW4adU9YY*ow7Kpv6YI5f1bcV>lIG*qJTKf2WsNbd6k4|>eP)dVifH9=K z{k^JwohdJwSLn$lCj%xItmoQCW9HT4)~3B{+vWDbRRm3YN@v9k+~cb}ytl}8*6Dmc zw*62sh{Lew$)-7)YR!m+@`o07x`tY;v0bHG-p+oI2+T>Zf6ACer0t}oG<*)6D#f_7 zy2%G6Du(T=XHwCf##G5wO8b3w_|3%HLl0i5v8S0A4%+)4yS|N&4hru~cR1g1jpknQ7ba8RSB)L;o>T>-e~a^sfzFLJgjTkxZknZxyIC6HmfI~;l7F^3wr5OeSB1{DkbXT8bjCnO z@<%r0>#2LV72*4~O8tv|+0rF%osOZpi@h?Oxb~@y z%>3EfLY|{Z+5YOo7?q$ii@2oRu1es|vNR%wx0lnXwJ)%C-%@m)cZRoxa_dT}>G_RN z6WSgwGYy)GCmtG6?rt`WrS3ZcIgZAKThAMMQfn{>P4uon>bQWnA$AnREd+zOY zwV)a`WtkHLz(H$@9%HGCqMQq1>HXWwKt^>iV zQTKrG#mSGyKJon`UmAngfK~mk4Ku4uWS;ULw z93!2)9ZF}u-6quV=1g|qVFt{OYJY~HD_NPl*%U%G*PIZ`NKcA>?^x(u+025Lw3=Q%>gDuTR~sv2 zY&sq9-PhMZTN4$s4DFi@>{PlOZUdVwu}+kLia2IxPO|2W!XssN+CzEKL)TJ|a&E{u~G2?&AVi?0jm$iLGXI zj8vEBeY+Lrix&n=Na}Ec%#qzK?yd9vv&(19E0DNR{VV0?E#%Va-oh&t(gpwCw@~r? z>|3rW-rbeVTxYCRP3tR_bM2*rXc{Q8^aY7!tpQYAo=}iRv!c5)?#{Lneuxu(a4br6 zfSX|lJR<4m!t+5lbUTc>ZF@PgW8S&%uk=sceW2$acD{knD_X8GHLfN4QQ+>nIpPfz zZl`beooX4&_O9>WltEk<-o!qr~s##_;L0k~c>=R!YQC-CG#VNUm_2CjGxmlA;-+u$lOOpUs>;C@F zwT(Owg;U{0;fG(zp8t{w5tGbn%S-8G-CaL)UNX4-xVBmGQa{>Lw1i?d62ALFm;ey* zg$f1wZehD4_H$=}1y7|My%3ApM-hXK!_5))A+@e2Eo^w8Lb+^>KM^2Pd_jg;&DiWGAf zz@j51?lvF2NCt+W=U2i+Q1K~EJkFS}TSu}eE|U)x4O{aEm0HzAseDeylP?x=s+5al zWN%Q6|AE;%lQG#Q-2YslD^RP_hZ5U+D5=DL&=vC}>IZHPtsFUN&#VBFfalep&|}7K zFqqK(IhX*S8$XypkF-Gxoma`&=AOPIVvK9bA z{W+JoTNV6a;>g%|$gK^pN$ojkf%C7R#qx9U6x6zZjx{o}GLn9k>z zNFS~kJ+iIWIF`s~8oU>M?ru1z-6A<7|3=sgqdXygB7Od~CWNdp*vRm5mDM_Gbv3qCCYZ{oPWfcIeEcC2CF#dB#;JB1MzPo|CsJon{heE+(Jq<}(?+IT_ZUd}gna$<`3+3e*Ss zWI%oJbxe&Ozo=j&1e;2s%e73EUvzh4H&v_;$zjwcm zD%4_aqYI@PY~|>5!s_tQ|6DoTyG*C86Khy6RaYUraV1oPk2{p7e>ZgpVI}f_ zrg8z0J>wR_`*PRV-iQb7JTr5SCCwV^uCXNr=wbXb<*p0G3*6|YSODNPlBVU)Qm6e_ zsXGy#Q>gQY6N;s&Zk{7vXD9zmT{e2Oz2fge0{kjMo;&c2SF7SeZ}-IjN5EN9l|`sr zg-g(_Vw(FoDf|Se-cLEuXC@SvUn4unYgc^Ly?Z^T1tImcKk=eH{_sqS{K=;HqXxK_S9z-u2tcTJOGOhezt=h(@QiHl#1wL+|G?%ciNN?E~x{;I4n>dgIYum zYEcF*_c6)=Zr0aEU4LiizNoEP01tR~N55$i|E~q-pEA@Z(RlkHW#spYPk~Ruyt+MI zZYig9Nq1b2gyR_?b|F{D((LAe#aS$f6|43J`rDZ@FVI;EFPkSCrOlf zT0EH$8=G-|2}XxQS-P?PoxW`gDV(sjc!?y*l_{TK)O3rtkV~pk(_;BPnu1;4xH+Z2=648oO*-Xk8m`hSe zzGiY>!andwFn`dtXMRdY-Pped9^jo7pciuG?Psd|QNP%KL^) z>Uh11nYJM>Mw9O1@e<$YdaFDrlW*$O;t#125>Ib)8=`J>GjF^6n*spu^Rc-SLhEyZ zFdWEmFOmNH`kyGDcdBY`yytWJ`p<3Q9F$LSsG$Ve~6;5dP5s+ zyDVveQGPX*r|WE_pEB|?RwzDeSi`W&D_wrh)_}!R6Lw2#=T+sJUr$X0mDa++ycdW} zx}{&hRIIDtc(tqY7vr`3D+4k>5?z66^{8y@6D)1nlvE?{+n4kEZ$dgJ zvFE?H{xMtiTRL^GN8LWH&@GV}S4A8s2|=qIOSff5Fzv18(7gEh_Ujl9wqykZv+s5< z(jLMB9OFtL@8MzW`Oc^ct&Bye9~0g5L}rE%sf$qt{T8LLlC2=;pdWu2ZOCPu)pD4D zszfrk@BNEO%*%Ji$3GZtyO$PcInphRWs#X%zYqIu@a?{20E?@7gXW0~)L1pYO_3Yf zeF-X!&1u*#>L zB<&|QQvN}+rSfrg0Fgh}hj56$2|q|0peOoH*1z!lCy)5+{Ma=EDEF)(_8Hesxne>3 znKiq6(39p!%X3)$QOeskb1!Gj6`fVaCu%~P1(SfYBfPI|fg=h{&wH*dd-txLnwW_} zlsn`@3y?~(#nK=jT~2L!ZuTD*`SpWR7Xg^R&*>{BT!Jxy0$L(CKuWBtozr_lY&C-keRQcnb+gu8` zmtzv*%Lj?XahuSQRF3U}(jlYqLs*^jLuR?{tjWb0R^aS7R+2V2%@N=jUXfvrN2oHpc6Mg?Gz87~mgrYb5L7 zJ<-cU^yyh8QJ0x5ZNyxqC4@H1)x~tKoC~EAR0bxI=+|(9O@#6o_qT@v>BR+W1xS@$ zC?Qzrr#6`#9u_2gc2HXWDv^EQOaN2R7DYU`9T<>TPhD2erKtiz!1!-)qR5ah|4(~Cy&%9p#;ATLxN zdcZ*w;FchDuH|qXQzh)6?o!BM?tPy4LvCimM{kuVUnn(nE{;GpU{j^r= z`evt=o~kHSK5uh`$M!@jiM3ci2D`pt$h6H-B@r|^O6lWp^mu#vFzSmiE;H zSpX6F4skQ|2jyE-xPYc{1OJi-#4QY52ABxT5w5s1m_^yTUlgBDh+dX>FoqsUpH9{p znZhUZFYq^U6}WH!`|FD z0IigRXBMCr|6f@dtV+Jxf3h;F(^GEf{{hQ58|E+azkp?&wEQK|lYR+y>apT>P4Hw3 zlq%4^6G!gnFmDH-D8U?AJ#iyAyDMKRtiirgu;(#?pc|!o(C2$k9+E3qFEI7o4k319 z9)GIZx%BHunXy0G${wz>7YT&z->CZGy0JSBOG}u}Fji+NKY`fA#tQXhkT{XY?=@-} zrO$khs-?QK96mfjr~lOMLbplPSDszpK~zM}6f=8P zC>CMeCyPximY%BIq6*-TQXoOLS$YPqh*>v?r>e8)8K3 z!3Ltx$gFi?OF9H7wW{{Q5TmoV&0OYG^)lpUMp?u8ew52-`yFm)8YN-BB7vnOg^R?VOcIYq>!5y*6{49Kjm~jH)CWG z%U?ru>B*Z%TFv-9aUyN$L-b>q<~@WRW>kecqKeXAz-CT7|4hA5V&ZNVFfB~qzc^hhgjh0PDN2DYv1xt;A-#%34`JR=XhQ= zo|WHEv52kJBMWX<<>EEbXs|KeZU9QMw(NTL1mm`4!m{1i0rn37nrPomq#^l2(qoE9 z!71bW7hi&_m(NiP%b(Co&ZJPG&R)iy-bWcp-YDdpuAFiz9qxmt&BCcptA#7h)t}q_HY58ymC9w5Zp`K0Cu7IPdG%V&_@pOSJhPNT&-R9Eb{!zoyH z_U!j~cMLgcf7GyYXOBWQR>S>Zfc!7-Sh8@kL;XE7;q$&1y+oEuKSnVeOO~_^=c?80 ze7Hi)=gMA)zOSZy687<$#;@wA)v}h(XV2VWgU$E%n?U%Sd_RTYFTyr2mmuLZB()?|R(-&~CnpfWr@ z(|&?9tNwI2Vv-Vd;NN%xt8;3*?5qp^SX#pTn<-yCzm3TjhJ4^FG5zK9g1kyLgl!Ln~Ddn$5}1z~wE6_AYlf+^xjP)UWFR{4-RKo@!;D0K zcVt=XkUCZJ5Ul{^pDSf>E|+us(H-jVpqhF8tLd~i3@=>sexh@DVl%Q7DL1~C-?a9W zGfmpknVhW^^+O$ZH==P@Z;Tg|O51ezKwz;{?Y{5Q;kBJo&`b=&Q zc&B^zZ&cqNx0?c73_G9g38NbO1NWOtx>~Ze-V&8DMzZsK+*#;JtgOdXWAzajWmn&@ z0`-BWQrO9d>BU8`0O}tH-X=ZIZUMEs7W&pnZ<^dJ3!vRF9N+L{(VIEq#)bg9mCjw6 zqcXIIa5shZ@wVNel+RtezQ=Z+j>kFeLUTBizZ7Zc<%LEzCM>S%ddquel|bMWLr}x2 zm3)H4`r0(;r}&Q$L$8SoftD3sWE^V~xcQhne2sFW>5ug*Lr&@WSF?}jZ`XX@nM+`o zGJ1aCwLMc~xn%>8er_a#z9dIsU4U(_folfxf!#x1q8uUJ)OsgLinGsO@Q!-$0_7LC4iRcDX zW*mTO>Y#c5PPVURX5)He_{OKRqMB)$%pk;#!9E33O0%qG(1LL$(Tqdqtp;T)|+HZp}IU`Wda8Wo|AkqyD&NJW)%a|rno}&>LEHVyT!P;+f!9* z?dp+XmVMqY4q`~nt-D$xFD6Tr=&nWxOnGr;@1F1}nlCw3QROhvT}KAW4l>`2A-FQk_yVZH`XwTv4e7lbRX`-?YSNbxpBaI_AO^ZohB9pj zLXTK9rg}Dv$2Rcdve!jq+pnAF2l2QofS^LId~L~EeOjq%_ddZr6J74~$x|Mw029%9 zJ$4t3{9bD5EVJw4oQZaxa2)b^QjYe7sbKB*8uG9qzyxq+{G~2%$38N1GxOXC+&@?f zn@{-i7aNO`^HSowAflOjEq(%Ser^~G-KR~R_0y{o?KC_3&61s{aASMtDo=T{tJr7uJ_k!PA_i;T34@El43HUnN5O zK&cpa=6ZgUBd$LhJK9a2(jU^g9eXM#e5}C=TNOXwg2Y^7*+}w|b0^0|LbWV~5D^kpj#XP1V2!kqTel6ss6zxyEB0pIKl&9GTOa z&Q{C6Yp%ovUt>Em0U18{IzDaz&@ZZwI>^im4;8~{d z!mEh?IV@P5NA|ubGYm1)aA%Z~#_F_2nq~Kj`7pXDk(Q`YDQ(c}b6-B<%?}6KDwLhn zQCEJIX>U#~gLjwJT;x`N+xNHdt9G8Jmz!95x4iA&X=O+P0m9r~#Xf38@cpxNCT*Ru zVUXx^LFEjNdUNieDkUn%pf)qzMfwhw3(oif@RLXQ%E{R#S08O%&@{A&QU8w2$!VhT z6{|h3_x$>v| zXGo3oYL@4dFl4Mrq>s*&QEHj@&={KoTpQGaiRMM`re{w&_Ibq`e`?!x^x1{?NtY_9 zhGYsYLe*;*sNI%S7cY}%eIeBuPE06#=K8(|K8sJY{jeB2n9X}7!fWh$O8V!xWsh-5 zbL%$^_(iGp=`%P&?3dRhSr+{1pK7?j%LqV%eG}f^v1x3W6RHr-^?tIz9sCovwZ*SQ z1Thi;b6G-ftdkO0e){$rEA_aAZffc$3dqu)z{43q=nt0Tms351{(m_00+=hl2bjKz zx1HOp!UfhR@7mATCf@<7^~)daaZUX<2uBGeYL4Z5|EW|L-7$ZDEnMPqu0P`vL>;&k zh<8qZ`tgbZZ8d_T)AD4`Bi~n@bvSPyckM>Fg~)QJR4<2iH{{DD(y3*WC_| ze>~kg#qxq++z_8K6h(~>u#*QpLFi($o}Ui0spoCV@9=&=lmwHSiaJi?m&$O3_o`X# z?7^%-1Rorh*vFr2BlPvH>J!q*F?U5N<#1Q;a1Pt&iBRb~!HqSr>t2~s34Drc>HCkC zR@lhA3bMcWR(20FPbi)6lB{aDTa<2AnVH4HlJM=s^R3t2q3V{&nx^sS*s85Ej>O92 zH|}nV*ckiSf9T6OH!x$V3BACYa$#&X{VC3Q{9G4@r{NOx9W#H9*9y{GW-WN9rBtoB zT!3E-<1g+umz4kdsS0k#!Wi{iO%Ab0{Kt~@r+{2V=2r%|eR97k!cKLGswetrOWCOE zvw^E}^H+Y|${&E=S4D6uh3tzr)xhvYyJ!s*T-shY*r%x_)wdBpXMvs$fLtPX;oJ-H zpOYTR7UGNEJfRF||KCo&mJV_J7(=aoKEC=qMG+|8cj(x6eQ5^imwON1CvlwPd z)3m8eDE*l1gIgVs)FxtEP%7J_LKOIj*4Kapp)v;4&)g`ucaGp)H8gL;Xr%?Vq|BMw z1dDt3OEjK<@c^{fIrmHus1nq$^D1x7IeOt@wzy#=ogM0+l+q%$;WkkHc82lauz;N% z>{fn$Cx5}XDBW0EBKJ_Td!!y!eX>L>v7vd<9h{Yw9Nwq&&zg;cMeI<60L|@!uXXqf z!76j!`;(}5AV9VVM_{h)2zCw&Njq@GxzVordb0jE&3CwTA#Oy^-R8z93&m9hR|{l@f~3iSS4xyu{w;d!fcT($GJ@re zNF9dWI(=07YP;`_@4H_aq_48m zgkC|Hm)Ot`q7ov;ZRuG=snI@x8ejkdDO4agTC^7w$iiGatLn#FBt^qv)qkM5bfpn} zBQ@iwWw$s`ShbSh454@QTDT}0zWnsW!vf|O@DbPU`A>&)tijqO2**2}ht~S9RbR4R zaR8V~`FmHPqmD7%Yd67H`o+D#`zT0cJK=K>&P4Ro7pG-J0`h&;U7%Y|gD+uyM`{FY zuu%!TeqgNk5}3_UAf4njSl6EWUI4E&^0rE_i$A>c);X?uL~*QJmXXP(_%>9bn|_25 zEekDdGP_eUgfGyUqT6(a-?W@!N+-nxkh$qWosZH za!RnI5W_L1VA(wi4e}H&zIF4-LXII9`P`V_D0ni*%*Snftv@%T)A0^7uzVF7plhmA z+_$!H8dOOT0sJD^lKG#G%JQxK@}E_=45wnjQQNs7u$Jcu`ja7ymTG^J0q`isi`f0X zS$7unZ1NsgqjGnz@fi{T%yLGDXLHg!&b|v;=?DQ9Id_}znA_Z<{N{oTe2wh;W^k># zd)0bD4~L2X+RR$vT#I89-8;-Rs>a#spaw6N*iGRGN+$f~EvG*Ft#1IO?7<-IQ-9)m z<1#ja_kAiKBKRVkswZC+ee!{;|XalW9@A2}*VmTr_6)w?6=aQ$-_XJ7^wK}0q? zUfjR{m&cBKD8~3`e|zZxDyP;){M4*SFy1G_1tYDE*D<$A!@F<#(f)bDXdr_An>5L) zqpo>ThbB*2bM`MB3QOF;X}B>(-|emKD)&bmSF_JN$S&~}|FnD|rl^Z1K=7+UsnN?Z zwM*|e7OGHBl@5hSci@c&=*wO7BPwV)D6hvp69~|AD`^JnUwFKmk^$VPZ^$xI{3$u0 zFK3iDf&z4z9hPEpAtkGeqjY2Tr1=Po8T$_j8psD|9XCN=dlWyA{^a`d5a7!o4GEhl z6F4saJX+tp_P+}vioj8|G}bS5O5S(}ed=)-)5E*|sc3`Fk?maayn=@I=tnQ%msOh) zDcwuXBF7Cqvs{TD6YJzD*u$mi+#8UAWL;#3|>-h}PM-*YIUI17DV5pe%#enImHh zy@T6-b>CP7vtM}9n((G2BX>B4nZemxMRlB5kRZE6S2HqXFqIe4}v106s5=x6M#itc>HN*w$=zipmN=;Qnw%a$i9 zRWGeSW|#HsvK{ZfWR@z#Unv-WAk+^mtIdh7c0DL|DO!2dLe=KR6_1PIU+%LKp4HE| z^-+OI5#!65;OHApseWMho`U7aj!ZatWcK}(j0TbEx0S<<@TH%cXz^Q82BsClQz9GY z+yi;C^fp&WI}8t~)>tHloltuo*3t@*Y%7H#!wewc<8QT^r8VxS!)xJs1A4n(lz-II z2J5zL^!TT*>$LmQ^?!<^<( zIZ<*90-0DZ66#4AOw0O&`O-I1$~aNkTCWvw%B0}CoTbX9Z-l!y-uv)oJHGWI-TtzL z$+iw`0I&&Gm0jwu2XBeKGN|C~<|O$k3ppuae>MOuLqN}3Ued($Q}DcOX=`=ORLS;i zYO~{IAa@S(N{)apYZB&-!Kwd);2H9Ab&$-wLiP(0JB?@%t6)~^vf{Y;#=VcNIo4<2 zni&S^T*2`w86?WDT{BA+=5K>mAUXuybgvY%S^Fp4&8)&jgj=D$;Kb$rXc8<>q~QuU3&p~UOq%H~t~&V~HbyI+d=G=G`T2l3Cwf#((?O?-H)K|L*@ zJE`-yCDJh=?R@?__Ue76T$~HiLMJ`F8-aL;qF9Jq_wqB!3v%Pxckk`{E|yhcjSb0< zyeMTdlKLIr*gB31K56oU& z`LK&?5{wz?Y5N~~RNkPD=4S@FZqo&zq$}MIB`N22UI?|XtcH|s@9to?Jq$Ub+Yp;QjeJO()y zCXs`$>qdy1;Irqq6Rsr67usIe_!b?)F8dL?HB-o4b);kF2@dNZtmO8sqPQ)50)4jU z#m+7zlo~SLy&xiU0PYTktLJ-}zQ{FOIqr^ZNp@c>z0zzo+P(k|)gr+^Px2uZVLk6- z!cdvM;2`gk=%chukr9FvRebfJby6xf(u}1A(S)Dt@1>DJSOay+C)%|2u1m2~7(y?G zK?Z>KE}*!h(nx%iFyLHs&7Hp*jQXBN1E7{`Ag@AAMsPmkx?b@4T&n`ba?t+pJchk+Hi1{nXxNgSW9)#)|BAMq=s z+RqF?e;@H7A0|2gDRHKTv3W7QpEFcu3$jO~#r&zNcfnQ+XA1%)t~BdCbMT1~dvd)= z+br8V;(Y2Y+762dV~^=Q$__OjM^x%dYoCYG*eIXJM}~rDz`KO%mEpr6gqJ_!wo4_N zYnag1T>!0uKh#5wU$)IfH07#XTXMakf!iMCDeQmGGq+TAu6ZulJE0(pKX0($Jb9MA zPc-e@r&h%%Z}ioblzJl}ySS~KaeUmvIEZ_YN=`AWXTcIxvh*<`r5n4N8}3X}E{`Ob zH+OBMB;<^H_g-M!6b&ki2@mqR<&%SVIDu}kqtz+!&p;yjixJc#!R;5D>`gp(6H%(& zckb}{xWMJ=g4ecHIC*C*V$XkH*n8#vad{2f_f2<1{7vu?T}#HB2=F|4*e}d|QTf>r z^p_*!yH)zQI<@c}!5QnW3U4>fmIb>>cMYV%XB>T%;WLJFD%H z;@J4Dnk*^yj9`yNyTfTRoO43eT+g7g6M@b76|DrI9`YN{zhAw~k+|+d& zS;e^9AZjdL=-;cR9Adit|Te~(++?X0{XO1=vwcSn4 zn-pofN;;c<`1z0#jNc$H$o>%%fvL&x*4u5>@p-PHXyPmsN~*Xun{(+2KP_qX%j6s- zSJ!;={OaN1a}gKqq8cr?9l)$yw~3dIjX}-BG~SU)A4YR7MVxa?8hIJW1HTX7AM|Ox%en-kA2Lx!^|393)cRbbaA2%*4t0Ke+If{&| zL$cC2Nn~Y~9gdUClMq=4g=FthRyHAf&x~VJ$0jM`$liPXuH#dm@Av-Q_x-qk_pkp- z-sgS2&-K1u>p67fpD%7bhI9N-2}{?1dN8M-7>rMk)*Dw5e+WuM5Hd%K5AU|3OjBFD z{=@YFJIb!`ukW{J%BJn3Ymveot9oii%bKmfMbT*uWs}%_ncoyxdNbx1)v|y z|4RAvUSzRsmfZBm#{SVK20QTtC^XHR+2k<19p+(bfpyQ=SCdvITyw3WknMioR`isA z|NCkGQD(0eN`oPIvHY%lYg#d*#yoEqB|4EGn0~zqppk9Ym^1yLLi`GJdWm2HV33Qr z33WX{Z%fLeYL9lbJHze%coC67JGY}LDq}PAUvi#NqEQ#}z5FveTDDM?wUW7iz=_c- zP4N|=O9PC{E2xhI4=VF&z}2PwOM33vuv&CNfgAlyu7`waikDz26~_DngS~4+iy|uX zCSziF6MxrIqFXn!@4w5mz}CRtmT4tI#vD2i@cP?^e=~ zFZ8}%W>;)qllXKTk+CHm{vcqb&2XP0Uk=Zf0_}PN&6vmo4K$ZYb}WW6J7fU~+{mcz zpYAh}@Cj1u|K-X1KO&|7*Z6AY7s0Q&BsC}3eg%8{40Z%YkN+8B+teeNY-WXIC&-Ye zN6-8-{(kY1R|jJKU7T_E=aKZ!7v7$}xw$$l2!cveDi4wPTJL&RWRs6`n`b1hh#M}5w} z1NmtR6k(G1h@C@DLBKtNLoyx9W_R=L;jsSXo zg#&wJe>TGhxqKR~z%>Tk*o|j~rr(!c=DOJm-Y z-LV?lu0QBiAZEI&eKi31M*Y#C1x{DvA9}{umk~QVdh1oDn7wVF+GD^`G zA4r+SWqw^=OD=xY1oGMQvoaTp0FLFplOfGTy9WC0+gD8E72j&nj2T)7_N zZ8U4Ii0MWSDyqyCqcv#?z!YZ*WoT#^G(Cx05e@X+kH?$q*noGJ0u@c)Ztu0_XO~OC z*01-WC<;Rt-E1+r_3wVRqhK3C%7tl!@{->ga{12=y%_QFQmxzdueoRM(NlrO(Lc}d z|B6r$2w)FA#{&lo{nFx#Be(Gr?VNZeC7u_XwCllI2@V0gRTtOvjuguE&Wj$y%5#;; zSEIf%U3YTm;a?lZtW&wKHy$0X218?k{5z=)@Zmn01f?%1EJ&|Tg0`K0C#6Fq5U*Bo zGd}8aKk(h1QU8F-fz?`TYO%cc&sHBP1-YHOR@MO3s;zgZGV$%hfLMar$>Bt)xN@m9 zBcTgM zZ<`{{ak_GV;Y?MFU4FHz@WN>_Z+7jp^B6{K_DkBY_rizL z54ly!a#wN~kNK1yoXGKl*2xj8$)n}326cz4qdGv;=QI%YQE@i1{GD<=s{fvg{Cf|9 zSc9!E+Af$I|=`(+%sEhtX1J%We;!9@l5sgRT|o=~AA53Y4rq#2v)e?WH`u-KI}{$DdZ5{}s^4F_pAVL_9&}kh94f zb4i+laFaXNeTd5W;6aVV>z-^b!+xFkKfjp7Ftf27rjA`2V7Aefn!!zLu0pGBIRuH|#E zKrF(1sW3)s&eTkr391cTX(o@Sd%_pruh{c=U`FztArQ^WX>0c%LU?FyT!d4zzcd{7 ztae#MZ0wO{KR8&4fcNRfA4xORCas<$m`<`C8__H^zK=q2@*gEFw_w{f{*c@v6JQpL zI_cynNdXkUB@oZuHMRYaQb ztMYf=CT&Z{U(KVTeO7RN`n+H`ivWGg=b+#@)79(!SDW9O*A=?$37)g3$F{6_P8ZZ% zl6~c)@erbMS!pN==0LhfP{SiFMmT*hfm*o3L|J|h`&_@o*1bVRHNB1yPT$kH(%^IJ znc2-_kzA?HH)3xEACHa(z%FpcA@#^}PGrLE@rUP8+K-jAm|DJ;H)#9I+-Ts!atE$< zvFaeJ=o?iTdwSN}r}dR$$eE`3nxn`+z$_+HHVoL;9SeFI=c${7SX_{U(w*Ck5@w8qA;q*@$a)F75Ls#B8CrLfpwZVm^MM!x`ju*_V4 zi6T41fCfYG5lrkCe+)VN!UWf@XcA@ykGci$r^oxWcPsZ};2(Ptk_6|-`;7ZrzomOd z$Ow~(@b=Y9qlSB5izHH9(Tm<2FKj8sJ9p7qRxI#A_Ic^|Hk@<-^ar*}reGP&07F2% z5V$b+KD7Uly}KHreV-PqzA(wvciETvmrPrWsPnl-6x452S&xAuj@@C}ig}p*<^9J| zRT59!!^9~^Z(plmZ;Bc0k>R=-P$LA-*M0`@0h{6hKWz)3_yv+B6~>O8pLov5Z$HHe z1AdS8g@$rR{5y;Yb)&vW*nNLnvJ0uw>!S@KTtQ*8%AFq6GIxqWE`N#W=< zJsCnGMg#*AdY*TvWffnVFrU(q)W-k8$meUHzz6<@NB(+cr2nVr77@AAU7q}(LnNATx7KlhWV&)tAEa@Aiq} zN-cSGrS28pjrD(PO16L=!5DBx3kNg5v$VHxG>6QstN-dqL(gE;X6`CwZxo4{o`1Kv zy86;-$0VC}BxU#2=5Qs;P=VKAEgF&N`9f`f)$z(b!+72`w~ZEEFbQt_p1!XI#Upibo+X24#6Xk@d9#QglTkVXn#>J39*Y1MO++Zysxg6fq-tubw`<$j%n_PE|ZC z;xzy3=Q0^8{v4&SL`mK8~=zuzUN;zr+{H9!jK-^ve7e;bZ;PT9oEf?UtFh>TkG{zF9g2C zT9+&O>|x^7`-Rz6<9Hd~&o`eRV`?Wdx4{y+y0g#C)PW1Xx7jbIxQv|0FOh5|F0|9W@y2 z?z+wC@M9sa9H_NV4tT4z9NVQhhoeeLq1v&l7KF4j|H_u7w_sGd9E8@q{W1ZFesgB-R#9g7rKEED9`or~BIu{#VfE{=7_wpb8p>eKU z`3#znb>|X^Tdoxb@Z>Gywik<^c>+q@p6f!!APSR3N)|oKY#@}BKL1gc=aR*EpJ&RN z7OTAEXc!cP?dPVRPAS+zi!ci;X~PRqw0NJn!ga<-g6yV9YoT`mz*EaWZoV#Ju8SmN z2U>;+9iw7MrKy`$=ZatYW~OP^8Ghq6)YVnUj_?N%YrC`c^~z*yzhpjD@qRfwC5ryJ zh8W?_SvEvo3(eMg3QK62Dn2&vA;N)dqn{L#EO(q$rwGu z(_%}RCL)rKgXJYtlgUwXRM9@V-_P5=tv+4nRcsg^%O21+omrR4gnv;1fM7)!%GuD5 zS(`4q9UYJ7cq4Du8ZW^)UNhr#v1cy?$6u5s+M?wdNfRI(n;!3n-@)EooHDKg6*zf4 z5fC-+@X$nzeVUB1Rw0DcE@I?&5kTf~`CCoW{a-=Acr_r1D(jft{4vYXfCxsIUkJ+W<^Ye7)=5&_+H?D@a7iYrZgtnz1g;ixiW&n6LX z_%!*XPgz%-F9!U*T%>mGcCtz2%h)Y{HFt5eDFZ!$sNJEW{PV=c0hCX1XMN$4?t!eXX(g{ zPgJA$wRHu2Yv~u@d-Gy=I-cl`mz?%;*+WP)lg-~zo^uGbrUM7Qq<0#WK=NT#8yw|8CeK4b-j!>w(|(U=AF!K;dM zb*`D&t5wt88m_yK2==aB!L(J~@&)D`h+e`f>5 z)onj3R)nr5VBX@Z{GTI&#Jj;Do8NQzByev^cT@!I?6z>OagYqm6Yx zZhj?{MBQS;6Bb6}x^17AujI2ZJ^XxE=$R;No)zBtIjN*;KQ&sRx>qdB5{S|xifT^w zQakdIgSI+m9p@k}%9*eFC>tOn;5nNeXSj@Pj}OrG`Gr!(j*E4hOK)DoTPeOws{SCz zhgJ}UlCq1eydzH2jVG24i8*Uds9UJG2s$2=ah0yUD=5etwmFq7>sc3nn4$9rcrE-z z&e>Y=G$a1(y1XhJLr3u?>{z18CuunT(6T}~S3m^ayq^&KBw>CJ9#&uR(QA3;IW%!Z zf3z59BZ~$cpz3)Nv>jS&@A6kSXia$CB5759T!UQl&X*F@`fjf>o%v{^z|?`vk1O1P z1{WsRBcrRXvM5c~v-&Ar+qZR&n?=c)c&jO8Y-I&I9TM?|Hj_{GAZT$4&?&RX7ajyB z<6$2yi3&0=_anNdCqqBeToyf3upX?G&R!q09%P5N4}at^Zk=CKgD!4mQuVoM@*hQ2 zQ+?hmP}9l1!^a10q%O}uG2o4@h{T_{vRy@1@59Er-$*;FZ2G|a_l!fYKZD{mm^{A< zC}(wJcbRbt>%vx+SsLsc-;SCqJjfOo8&`G4-6w3YBXcIVt+F?7s#g2G#!+bfB+BO~ zqCj!_Y_qrlO>==CniKd#m9A(NcIBo6lG#rz7oYMn6mh}N@dRL=Tsd!p7e=No!b`i1 z9}&^FUdVw7Iom8uecrlS(%K-msYH$CHxjP`J|d@>UVz9n*D&CDpU|z&lmgxA)Q>#I zW;YFxF@BP7bx7pUuFXV+%B!}57DZIVEuHpK#*em;aBnvo1^Z8!B&T1e9N{W5$eabX z(9g`>XSi(p#Etf47>16Fc-v%xs{IAo&r0TjM zU#N*m8NRN5#GmL@CA-oUZ=lmp1y66~W+Ea8>YElXKVJVeI=_E!a@li0%wuzWB=7Rw z0jwyu#{zZTVa8T5t6`$0C|>PwICz&Ay1r5QC}SY{K0MiJwbky)_yZv^hSnVk@FMo% zb;Y~2_1?ouJ4?<0AXxO5LT{TKUYhGjC3n9F?CUo$k*4?IUIpV(8P5TbVnUL2FPt>!zziPHnLrS~s z4L&y=b!NDBjtZA_+Zyf+&1%=RYBnp_ni<$~sC(TRFrsjLIg(AhJN9*=sTCukIX~k#A2D6HY8Q31J zJY6}naK;i%)kNEJhiZh^T zz&-mE@@2^Ha_hQq>q9A}wc9CXGOfAHto3JaU+6xgcczexpOz3Qu|nP_kZ7XLZY21- z5s*LwVfX)oV=?M|gV?Wh(IY4Sc61=y%B1Q0^PP$th0aX-tf>2}H?FiiD+JsO(53dS@6RzpWf**Iw zmxh=O#4|{&MzmX+k0w71IC!F>*L=1i1|Cv#2h2U|O>UOK+*Vf0@UeE2P6Rp0sZ*0l z-eFyLs%&W2$hY2mlc%iwJh~N%Pz9j0Nfi#uZvU;7kr7Z!HJsJN39$yu*>SEaDG(89 z3)@ko0CgnaGK1JW1iX7K5@<@9NmDH)26y@C@zCX=)mK;p?waZlx^CanGWCsi=JR!B z+#A&;zIZi}Q>d)x>{Tw1vbC?*3JiJ}b}4nFK})A^;zVDOqfxO!Zs!;tsfe7NV=zQdFHgeH9>f$E zOJX2p-dMTCB1N5)m*D$kLcs|*@IU%^|2pc0;)a?Z-21>>rxRAr9az#-E*Drb@Q%Es zoQp5fN+77G1d%$uYBXY4TcfJXBrPQB(!(6F>*$#NYn$bE&ND*IT>+ywuIIIj>)lx0OfHW)4bn$5q{s<9$C)kqW9@BqM()zq z=?vyNH8+;Tl^t1se@WY%$G-15nlY|=EJbsx+`+kAEQ%c&hv!ElY*Vly%T)P#yvh*w zBb~yrDu7up>OWC@?bs^o9nK@15#8>BXHkiaJ62v zT8F9XaNjihx6W%4J`y)h))|u?6pV`$=lP3!wlpoQ=mc z{lNts3<{9-aTv`JYkI$ogqgXHUbSoS%GDGqO}D!poF0|1Jy$hM=@Ub$O}otAve6f| zs=c`InC99oR8FuIOVwNJyu8LPbF&noTDbeK`<&_KlPQDeIaAIF2m{Tk&A8l!d4o^D zv7?7UzVnYEmR#7LNLKgME0;3sX1f_p`oz%!^t~Kc7mT6V!MFA)7<}8M&EC7<@5-)^ zZ#=8!rJ>WCdXwB@Eom@W5KPbDG^K56p``8WPl00FSOrf;;+qp>+28+wA! z!?Fg(XJn|l(X1t%%Tu`mRr^k=t84BWB@f&*U$;Hs73=j5eX;pgkxQ$mYxpvG&s(o= z6MG-zP~!GT{;ngJ{E9G*0whGThmPz5p+wKi`qKcc>gR+h(~&^B+A# zO?rFX3DFUFla{moR46L9O)!a(L5=rukiWttB^aBfI*Kk?OIP3^3)+)RLNt>o@qAuT zazy#|AW#3y7qgEZ^$PS1??@XwqYhBm|le~A$Z7RlHU*=aRifDlhP?zeCz#PeajdopY%!T{d zf%O}h4`0B*6AyjPknOo|yDujSZbl!E<=<&dVh>b1>7Q_yR~|n0T|w-9_|h!^{#EyoYy1G5<&g1#x?Yfxb(}V|_Z$kKhJQyLZwH|U7tL|08hSnpbM+tjK!}ZFnAh@-52`w({Xakkmz3El3Ew}!D z!PD%>a#CY2EPxHpF&E)2XlODu4Zbsvijaw0-6ALUjaRPztD4v*XP#=xna<kdq6!0h*BIcW=qj$H^j)lWgt!Lp?tvZjWOWkVg1ma;(ChH1eY=2wSYSS!CIxEl7bRQ)$QOzteX568n>z8@`KJf~8UwysR9*c`xJTUXJl`mo zzIdrBl6Yu@$q-_(2m0!N&OSEjcB*<2`Rk!<(HvFEC<1@%#A$ zTp;w?0HOsvfD3;R$TqONPX;|}D z|CHh@I6}+uCV;JMFk^QvHygUU@=lFvd|#)}XopUS=JNuM%khxw&UT#$)Qv0c;pEg@ z%4L>h3gmbCVvB7;Kdbb1g!eb-y1VHQ27*YbhX|Mk9sP6@2m$XWOFUpnifsHm;tRi% zb4<${juS6(6^g^brnka6Wq@Px}U)u={jfGpdFoc~@2BAqDM( z$ABs23^?xm?jj}&$@}Y(9g34%eZsiEgJ#fzwyj2_FWvQDU3Vou4ac6 zVLg<{2olph7?#TX&OE|ZU6*Ki z>pn-|)k}uthBK@LZP{Q?>>Vjc^nUCU@Z75!wg@iaZY-2fnU;ehWc`A1LoJje)Pv0h zTH*t1c{M}LZ-!|U&rZY?rhVVpIqxAp%mi9Hs&YJ-*6_#*B8K~FkY?+54WuK9t`icI zv~L`VTjw@7FN`}JdPyBJ_b2#qaDk*eVd^vJa<0JFp(ywNbR=fuq%%gO!*bhh3nF&J)4g4pOFYy}b2|UiM_ftsR~V@Fv?0u9%~d@3iavLwyt| zX0}`I;&~J)EQ))Q=HCZZFEo(RV-3hss&V%?ee|2&c8G^t+bvio4CZ}L<0RW7DxwX# z?HjOrmved_jpCQTGm8rgmsjs*E6I?)M=L)vysqphXK;4crtT1UyYM{B)~BcuR*P5q z_+5d8Hs_Xif%d?_K7OJ?M`o7&Ra)&%vD{tj@lSCJz7NU32*ML+-GG`o8vP_}?@P=0 z2Wu9$(5WmzO?uxjn6hulZ+j_-Wx-QH*_@V-8WW;Kcz_;Mt5lrp-|l*U`|7!l!&TBB z?nXYs`$<9Y7#ru~FAkg@`C|#Hvg9c0Z>inNjE!3xd#~KDQN|6q?b)tQXZA%OOkFF> zm`oMacQ!X!Ug-1>i@slX2+U3*lg=WmF%})+uB#GGV4Gg$3(LCYB`9Z*DQbXLn#v#F zYFBug1dQCrD`JONUi#X53&z{Q&z{V%>-VgdMFYmJf9k^hJ%B&P1U-KQF;3so&gKoc ze>JLeLZ#>HGrqI&^xzw2aJd!`rRa1a1#v3yqHO-@oYZG;qB_RHz5w$zkVwK3!TIGk zm~Tv4|A=t#<{qb0Hk50WcPN>cDDOS_xkN@#@FuEHCt#!qwDS{qpU1O*PFY~?4fY)H zZT~+FqXEs`9}^<(ZiN+j9#*ut73J%~-keIhw0z^>;`MftV}UcrLtzg$&1*1K!?m4K za5!dsLRJn4paQF&xgq{HLg-d_gaGP_!yJ&a$dW|B#ggWV-smnNLai#XtdxdIyoNOwm z(`ZT23?p+Z<9E;efa1bx@o#P~-k;VImC(!>+Y(lN_#?3fSQS}ol`;ez?fNA2>tuR< zbfz%ZjhC6&o9Nh+Q2Ti}+mfNiqs7?Rx5Yabr&c4a3+J4zrT9JFbeOQgMjdQ3#M0l^ zG2*2C_Bqq;_a<4t^tPQ-jISV=ZFlB2bm_C;(xp1;3tA z01KM@7x}~;=xzFx0d+6&m@pl{>Et~2V{pNO*LuAt& zHEEPCi@G>lfD^YAh!l%|rXDZC>dVktC$c}vaqwSa@dt5yU zn#U4OtxVECg$b!tdgqwGC=QNg_}wKEG{gO(>ShV1q&=ampRdJApxX~+c`^c#@mmwF zjdAkkSvjh=vmX7PZr>kc%Y#|iE3AiYar=zem{=V}=H9Lj+D<8c7;Bj;p#DK1V_RnQ z0i!PB^6(CEgrT`YJ^&iI{E~vP77gMm7ss#P&8ga)CFps7GxEy$H*AAh z5gIM9k~{t)raBcbOJHMKCARmDPOAYhYI6k@nhQm>f1(jCQ8{Qln!B$#uNZ~hGRzf- zP{ycihx$1v!Mxm@ZtQ=0Spx7CbVJ<_t>1{%0y~L~*MEdvGILWOPvomBamgW}BqB}z z&Y*kL*im(&qihq%$dmp3&(+Oyym&d}(oKLy7_Ey-XuXWWb{hC-w;2IY@eGi`+~O7Y#EK z@oD-7jWIU`Dy!SdASTuPrG3Ja>caJB`_l%mvR&@gmLCmZn)Z?x>jr95_vO-7W4OA} zCWc6mfy2TU$x?jWdc}^gqOsb@r>TNT)QC+RZRzUrJILbu#IaacqRti&O%8G;Fu!dt zPLAX5-!lV(Yi`s0hxC5%oduFPWeJoQFZZ~$qRLrmmN`3MgC!pw73URZ%aV2H3WWii z{B5AXRz{b3;Wa<`eL7Z+ue|N?=R>rd!1jCkDf~}y7dj%l&fF!u{AzX~25AFlm6r?mGo^^;6yW}M--6zAVUJ^eSX_?z_A_Jf5Xas@`< zxUYL{tyl&*Y#2dtjR-502*Z84W~dgo7E4I-xU5N2OWHoX^G_^bC6`QkpkYn5?&&?;9=DKHgV{ zpY_LNEv3*zx}EiF&>krxIBO9>daN3DeiZEfB=|G61^1T|3@S9~DKiC=7z%8eHT@YD zopgLl`oydvV7keWVpUF}oB4o=buu;xS5l-t2j~HB00FC>uGC3>PN?lVI#jGe>9gy+ z*Ugc$_2&o#EWP8y3m~_Dv3nQDifX)uExm*3PVjWU+Y!R1@TyYo0tP_Q72bW&%#f5S3pcU|TpWM+x^P7)1{I0a_@hQdsDRjL{tZHN# z`LJ;dAs-;A7GEP|tw~>b@YU~|w;r0H!0Ii@e%?*5dhDLiC0q{g=W9sz*UasKv{&RG zO}I5ht2z|6?-xm!m}G2R=chIMz)CACmSVEi@gT)pw=&kY&8-Q zV7f-4I-g+%qM`tx=E=#)mZlbxrE8UeMcRDelsr~dq?}b})_f;Le#_y!6THBD+7ZS- z+Vvp9Cz21_m^gHB8jYA;KX<5Ocg`q-P(FA*mI#@&e$>53l^a11{km2reAM)H#t!=K z;ysQ8vDAMe73UeAEdD^O>TT{wzamo(n=B*aX@K#JVxe!`B zPUQ|7h>hb1ssxbTi!1_EYJCYbiFV|IFe9icu?tK%W3^tKq&jnY^GDr<_OfOt;^|AW ze%C9e-mWPaes|0a5I|U^2!2MK&DZ zuDpALgfC94P~y<1yNoa1%s4YKWu*7Fck>pqzwQ1I$Gg*QQQ`DzBN7!ai2HN(1*;bv zhy8lheY4*A4LL|r3@-Y^NO7fZ2EXsb_L8ALS4l3N751)GqQy2;uejnMS0WEpb*EpM z0~`pUy3UsaII916I6*U8km!Q=!(+3KJy)eD{U5Aq8wQG$5fin=iL31i<5BIV9zY9x zHNv}q^_8xnvv}&klihsuqM*kU)Jaf!J&G~&4wv?GRZntu6z31%lj963R(4CqdG#b_ zzJ=pCPuEm?a0qUcvCHb{UJFR}C@w@I^)m$2ozMpN_RNr}g833&f_%!50s`*mcH5Uc z*e4rEnw_}91TSBg8jb9ov-YV4mOi}Ry1EY`lo*>u%LXybIiqdDcF_|3O%j$!^mf{o zUypwO!%Q00lcO#&%*wD&H-;MPN*1_Muw;{!n2RO~u?z$qv^o8o;)?Ud<^2z` zeq4*C#+FNxf+;eQ$Jo>11~E-~@+Xk#q0e+ak@L7-;*(twq3QQT+PUJPlj|dnC20-G z9P&wB6j4>{f1<|9Ll8BFK+$q4-~wK(=2&%OJc@dQ?dM3_HLQC~xI|U>MNsC<8wyd;Z85R8h5^0Rq&(+U2HJpQ*R z3gYQ~WNZx8L7OUMGXLH=UH>OfbZ>Yuo4Xe0vIjW5PZ9v&=V^;o(IFXv>PPe%v+Q0z z@IWWpIuCR{i0YSszwi>Uu&qFIYMzc1u0^99r5Y8kl%E6j3;E)!M@672@i|YZS{#_j zQj}dI83f6aqR!UC3;vbX{M%_K6fYP4Pp~U6XSU&lZp0%>?>5}|@Ns46O{jIp|itqOo)qR2l*d*2sa+kot&<9p!_E&9qDO2jg=eCxBj3(h1VaQY;SA+;+ zn(C(^?OytI%)2>BrRXXl@SBRSH6`Y$D#w|fT}C_?k6T^0pnzmjW=vpg=ED`~3EEjA z2S1O*zk1vBS_ynUV`OwP4F(*HC8jUbK^@~5D?5m!Un3&(v-&U@Eyd*|*o2HVI2Qg+T zKw__E^As21NAV!LS5dLr`PRvVHfuEy+EPIy-*P8uGqjUH4M3HKOY6BeXU%jZL z{C2+B5`ad^j@|qQI!^ibei77~^%zcAu`p?XGh#RQhl~VhF^PH%I8fJ5=+nt{JZ>=! z_B~I=*0qfFy2x{~pL}(+Ac<=os@|ha_fwxL@}-p zv@qm-)Wv}Z$_x-iPHEm3@CSFHQA^=epD|tQd)DSSYuVq8?Qqs5&#!A&S7@YoUIFib zv%nw7;uDzIfns!IEl(%ah4zM#-Eq2^U^xxYlw%uF} zt#9M`(5PP}844?O`zDrpsgKy!g@m90LFCb43`Z*QOWD_%GV=tWOhP{n!2)M#`_I_rZi{L`um zhfZ=p3zr%t!4A=V32T|H(cc0m{+8zmdw_w`y_H18W?>||e$6i$1s-WrQ+CNfdy3Ru zeM4IFg;6`vfy-;p-V}4=3V`mzB>S#0#yqsoqM~%wdxJIF&HXJpLxgI)Y-74!_1X9D zt&2_ssYN29=$5$XRN3ehI00XH(#{QL35;wOGAMTZ-je3~+zo;&r!zMvsa~?$6rdFg zj>gve20p=5*dj>0%SBiTsND$P7A@4BP z$_?g5btiB?heUrb{tx|a7xuQ0De?ff!K1QDT z2>Oq)0$A72yFguvpe!}H1Wujr3X{9J!iIsb9w?yXAr-};bZ0O3dKI8HDA-CE^2`!! zcIRaTshz>df)N23s^9V&3C_*|;tKN^2sRgws7Wag4WP80v zUMkQ-PMHwPyg&VO?O!V8C>_>?YS$0N6RV5t)H=Xl!rpVcM~l5H5HzbzGz9;RZLA3hv;ePWxKIH+*q`)g$&aLf6G)%zvSK+s9yI;%zD*&9V z^1{CwXj3+rjl%6VS8dCMFX{j1X5e7`3zUEF?f*=w`QLUwZ6FPfFO6$m*UVca%FNPd zPN9<%_>uz-|2jpT9WA|I`lBcCiokqPCZ_nK(=hYP(XA7D4r9oBR5vzGPtUrfZV^+p zy!aXetQZB3La!VYFl~H)u$6f}>J{^&9*OBwW~QWGp`B^pb0=Yh0pFVsM`Si;zNhvJz@ z?wQg?_HCU)TU~aocBPpGmJ6)~!U>C{V^zfDUp(24;GMm3cBM=WT<*_JErO3`e8Wl? zS9Scrr*wvSuM)Jx9Ia=xA3(+h8E#isk`0gD!C%BK;YubDaq1uBSnhsBd`gl$?A;jm zm>GXVHA;dZx_=5b3Xf164JU>m_0$bLNc9<)60Nxy4r$X%Q}@hVOR1{IxI!T9O(v6j zYaLg@H{dD~_^CUKS{8Mq08yQhR-rj#rH>fJ%cO{yrWFj1(rz!B1l%#VZK_-7#2@G~;VS}dlB5R^%XOioJJ%Lo?Mu*C+`?)}81(&l z2;Wb-$>VXaz#-7dW;ga-QX;H}{D#TD;EEB0NPtWkmBoSaTH+j^KA&xSZ_!Fg!P zf*n0WayZ0gy@oClb9fuV(gmfw@M#^lI4EXxwYXyI(G2hW%!l>ltKIKK9BOLTYB#N{ z7b56;8oTya-Bh`|6|)4QCIpkd%!pv}0;LpC7@mn4t0B_Wn75BhLds0KpD}uFUDh)l zr(d;OHQCx-wc~)At{ybEc!>y$sU@OvX-Rv|cH*@B^4x~m&(6{j3ly_6dBVNAX9I`!0gRN@j z3dx$BU9>0H_05e%RZMP!oV^43)oA9pdAzASOC7p#GCQcIPbG0YI&HhpElvwy+UFvg zp+KO!Y1;?O{raq|V2Ao6U{s2E^CmJG1v6!<`W@(OLYHoRooIuNbLm*)s&wP-ZQjkzk4k?C=Cn^%@Kp~4CigSiwi6lx%W#^*(d>u z2PC-aOiaNtPm7mQqYX#k>pdLQkYw(=#G1JO7CF=t^CT}g#{ArfYt-C#vOf1YMTn#Gh;Zb~Vdf z7jf(T2AzPs{ieo~+9&zU4j`5K$u8X~eQdUiusjNWWvtpOcmzdP@NcWsKwP=M$hR8C zLb>ly2s<7|I&q&Z8qs(8WEZt%H|F$>dPa$O>}*P|NU;$`^zyIFmztI|Jb+@m}obGOZtF35$Va=`zu0tt|``Fa>nMLm>csX8+1($aPUgzWdvTxM}=g|ma z2tKIj$D7n_Jq0Fd>5qeekQVvErO_JpO(2|5BNnXe%x@t@BP+ls<-x4!T-_I9C75I* z6w#i<`tWo7y^620bv5h(=5B_j>>68}s+ufJ1*@yK0-h{!rZrE7c?r&Cd$vy-cXYh& zK(Qbf-q5Z>gQ7SlNT`qbxIz=e4iH#)yq6Ct(}s#Lbb`d_9JHy7wP~4*vFRe2zX1CnY;^lnd;`&SU+IraG zIr(W@;Pvu;{)Uatc+W_6PH#d})9S5w%2dF9%vZ76P8SvEtkG*Ru4Q%)7(~o3I%ZMC z#S|GhRzLDCmilag+wj#7(xAh#D%UQs8X9059Lm}UwteOlWGszN&f#gr!yHPK?m(VH zZQ^$>AFkj_R?$vgpl4>0d7l3i zijjxR>Lu;O4gfc;;rrRh)5In(GBLMkHFq}GDs2?qDj5_^C{t9gUxF^{7uybD_CtqXXwV1U8j$`;x`+d22vy`8%LN zoi0rz`SHNS#Yh1}>gKRw@d(f)C91C#%sYV=GJ?E$23SaWOI|<0gUeg>6W@WZ(%Nx6 zcegkym;{0nmvNunjLT}q4HZY!2rf>;Ou5O#oh%nSc(&4fMFfLNWPjs)no84#ib7j6T+OuCBSe)?o5;iAM zW5yddAzta^zTit}wE#?rYlB?jPA+)gkfSv|*tqctC*9V`YggnU>plyKHfr-}-4q6f z=}~wSn@mskkPY4kU2+`syluvu zuD%hA!V}a*h;H}fH0*46@7`5l@}?p6BjX8p^Ib-XMs@_Q1|g{tGxom78|wt*25zX? z78esQjdJkoJ$Mkm@>SleEhzhT>sMwFUZa$C`=XQX)ENWktu|j6qi0KhTJDa?VVnd3 z?)aCy4qOLHfYW9e|M`LE8W;-vT zD}DnTM$^ZF3}Lr;qGj}GbXPaS!=2~uYo2=DmFBlXz_H+!LVZWuUJk=`R;Gx%k0!PL z$|EXp7W=n8_Eg`2L%?L0{QIWhw|^-ra{qs?tYk#mVN?>PX#cq-{?Gycv^HYzX~da# zB#@F#IbP9(UzO2#)k2;c|3z#7kz3Ezzl-hXuddofAKtShp3um^Uh6eiT4qB2di_^k z2~?(YR^TuC^7T#JZ4R4LiFc=L*h5`YowoWlBPQ`eNa=uD)w>`5cU>L{;dCj&giNB( z3m<{i=>LnC*{64l>85wYPlzWfntjgFvK99sq?{G$(gdUt10PnF-Y6Y9-YZS{cj_F+ zRs#09)0G11#?hCci1m+PZSno(Z*P94 z<#Vgpx=6Mye?{A3_|HB5N8k7o*o*BqO=P!KeyY&hZ70f@oV|_96TY$bk=M45CQbg+ z&09d`Kk5DNmq3U8Umy+tKI`UoJ9RL^q_b-GHu#ipmKD1r_DRZ|#%mqRYleie$mWCXRTS?$O2zy3HCV@N5M2N6|t#FT+yp}2WNiS2INSBf` z$;Q~%>8jJOUtdU_Kz!3H21OT8VUYZn*ZRj6yA{p(UkC5x?yd3Ys7W)%)EMtA1*+e_ zZ@6J)5C?K0=#~qoIm0h~MpUh5M)B@?OM~ym#j@byV9sQ@*9wptjVGYFjA!WG!H8tYz7^za_2JL=Xw8%|!WssmcPzC}|U*Kl1 zgVVD3+2+qk<*@1J2u7w{22wGObFC{r@9g<-Ej&quL%enw@v9W&O&AW!3J1w$ig^!3 zO0jR=z%4JBCL3J)^}UY|;5pOW7M^0EVqs_6$zijJY%^{j=n-W<3~?0dZH+}|bs8?* z8!T!+Y;SI~VMCogaoDst@f7r4&YE4-`{W&7%T917sNi-O*CEr@EniLFc}27?{#;n2 zkIt7x{QgV)!O@YF(<}+Afn$ouav1A9a$F=+G$s4~?d>Oz>L}B?Z|V{cpF#G7c%MH@ zS)vV3`6>0~Gt-+ah(2m`Ov6Kucud)`?kX-}=Fv2Hsd>zK$))8C<304iDfrx#by=~6R7xICPBaOhq2%O6jE{P{+n5n|7$$Ge(O9zJ^?bq9wA z8nVxspph z1Rkz=Hpjx#QTET_{7J51F>toA8MC6Zp_DIso{jJ1e=wuXw6h{yZo!W)-cEP?pkJKT z&4K)#AR($gtdwY_q^gx|f1zKr6(UR^e#HbHfOco_aL_pK{p|;|(p+i4;5-LRK){vJ zaSDfsRm!>hmo(y@BRE-|^_13GUj1Rd;KqP__qfZ=wcy5xl)p+UwFAGq`}4;0hTQ_s zg?Pusz4tz+B?~W|-&Y^!Nhk{O^{)H29FvtxNV)OY_v^WBYF=+oEZ8qV{f??H{tOvN z0i{EMxL7Q}=JsoC7oF^IOIiA>7=nl&sk+hJE%4^aPW90nCC%c2dI)lY0dSL;i^TIf zEoX^^V#g$2W}1;~Q)wO?5a*l6aJTIx9jxxka@Z~uRO-~TKuY+0dMu}X+i#aAwKO`}?8gJK7_wFZ#@>!1!-keom zOr7df%er$s$3_d>wi-aVoF2?85$`~AmGBqm)DGmc@&?-FN;K*up{&6VRaro`o?2q> z?c|^}l-qn%$*-+_N&GH{a>ciTwcD^d7j#6gr|kv3Z0s?KEzj-6l9fwReqH^k8C`4{ zj(Wf1St4Y`r4g%u(|NeXt14^6t7pvs1y7$eFr{p4Puq_y+;}Xdh^m9CmCwHm?PPaQ z7lxl81c;1;B@TKPW?brIo9kQwrNl`ESh4Z5)1`^VJGP62kb~86?E&hU)1~CDi}eZn zOVfk)Pinu$(XSmhs;>Ev);7+EmKW50scleu8XM0TdU-+=FEF0YfRU5_rSPZ}eoEJ| zCv#&kP;lKO>3)49qcJr3BS70wfL*mcgGlDrmhp%?sqRX~V@AoYg)8wFljB{@Lhfma z*`Kvj37h;fJ&YfaI!%XoB;=1u=?QPOVQzcd(ht!EF~{O`?A}~yY*0%Duqf4#Y* zlB?0TDZh5cwh^CB(Ts%}O8BAnPjxvS6X?BlSa#M@l1Tcci(S0C(K_7(pS@o%7U+nv zDAzi-vOA2_Uy^AdYHolvXQ>CNgSC@1XV2VUyPU7=)_%jCPw_Lk0hW|h*W+Dac(@A+ zg&&@J7}pC}7LpQ)O3@6_VI9-{)?SbbzcMuU&K8>S^j2HCigTzouHqw8=Ul;T&`c0f zn5QPGyD?Zg*3RR^3BGj%^bC&HhNv#a@c^I%ka)^PVnRnq7@hgKN_z+;zYT@69rDZ- zk=xCPD*&ueEXlE#`=x?BA&!G*VuJcDNw6>6`?~mx&IX3X(n)Ds?bBG?j@#o!Cdp*K zj6cRepJnyJvi`BW&uIA!-OS%;y z8*c`&St!1{qIk3M=VzMB4n~VvSqtdKDDlFyeUr@){A|nziyx0-$p^HAtViLCD%Al% z_4CusmVHClZJ}dDM~-p1?m^gm!Dm~(O_g@9m5z@j*XElaH*B_(Zl3H?lOogSKRUks zPQ(f%$F#i?K)HXOb|tp90MRn;dCevTd%9{=*4JR+ti zv}_Zz8OObY`Aa^ZL^`M~41HkAek1Op6;vmQ)6s4)Pn0cEhpG0uLSK#_#I%A-4Q#tx z0mDjeJ?%ej`G#Rguaq*;AEhdv(Yv{Zu;vYU_GptL!|x$t{SFJ5AEM9I#V2;fg zfrV{9qV*q_c(=TR{U8EH{ivV_3M4pAWWmf{6fVOSr1KDDl_?O!7cS;K)8zmAoV7(Y znY^koDp~9jPa#3L=FksN z$p@|Al^CkFUq6Tpx1{@>e5^C=6t!~Tb7p6r_&J7miRxf7she*Xkw;#HrDB{mA`QZy z8dSJ35H554;>rC)nPxQRL!?(F%z)oV>yidLp^KuP5>`fZdR|^FaM7e&)nNPOQQnCH z03@sWuTQ^w0Gb0A2_SeU10L?05#IkZ6e!C@#H4My$w~?#k7N61IufNkB?%i6O1_5G zoQ@X5jKqAg`+bbAlewdN4^}+NL=Bf8y$1>gv>-&h8rQ@`6FdDDfe22v+<#zCuOR zEB=4=fx15VU?Cp%D#u8ieE2By?tJ@LoE{ z<{yqpqLqp^C2?>PvEc<1Trr?E`tn|56JiLtx-6LWEovEaQ&ft2x9wvFpZNXVtZ#@H zcx8|xS3+L)r{k}-op_edX@wL+2l>%fx;{te0QuI;Bq-8@WFO7Dl($a>EX-KEk6m^7 zniwmM5LB{uwe8Y!f+1$@hJ%Rl|J5LLkiQY!GKJ;7?cR`SCO&*w{5kXZp>;OIV|_j` z*AI7?#n&;_$Dw56{${t!L$dAVtG<(mAU{!Q zidDL1DdJoArJrhWox3{TlueD6n;$$nPI%}o32bXiIyoaj1Eor0S@?o{sgHvIR z`BBk8Q9$Nt%&4GUfU^d)?Fs_LkcREn(1xhDTjj9p3M{&Xsw7oMeuM~Auk7`u2i$0ZHj*usM5P-A)RItvPjH2srIl(4 zMKU1~_UPixdfr`A#YK|b0dVaRQivZ`fP8K2QG&LqJ)-$?PY5wstH?>20cWJ_R(XC!M9;C#e>P0 z(XwPn0+z4OP+jdb;R2^5e&y%HKcwt7;~i9gR6Wz8a%!jV=+fY(YPjegxK=&B7ucQ@ z4eR^m|C$>8oY#3^WtdFl;rv^;3B8b}D1QO&%P5NVV~+{8`Z~7yWS@Q=hlFQZhkzuQabu4Ln>0 zny=u&Hou8_?HNTP7t0C4#*uOsDaob`atez{Fgv0`#w?6$7%65Fqw#b-z)`r&WSkcg zE29ipTSbsdp(**>k9|7!q~&%AdTHdT4z_E|;I-kiB1adD>7tGR5iD;UAs!<-lpZt? zWb#q^cVRiU2l9S}nvy$yNPJ+gZZ1)wbdBr~)K9nEB`*kDx+1s^_cL=d;#Xu=tGn*S z_MtoW5h+QTlYE%I;9(x+3Sa4{7*D`F5bOQMR=)46_PM48)P2nN8-KS!BA^ZecD3iS z3`~DdQ+F^qV)A)0MDoW`XFi2zI0F(`6?>rI# zS-Wm6y8a;IZ9?*)LUfItBJar>+Hxwea=MTE&*GWGsLXw|AI@RuF}!EYQaU2vKSpBb zCeI0~U5Y|^I>HK^>%@Y~1Y|7x2_;rliX|hqtfyYRLszmJOm|*L=+md}5L8*hmRaoH zz?raC3#8Lpw_XC+ie5KXS@&sr$sUzXni3Ug^HFm4=k&V$q9Zn$3&Za7?s4s>HOYUb zBfE|V2eby_8#R`S!({B6m#n`wp+A|xsG|Iq+xNs|k4;?h)i%~5UTd;|GYT}TQ3%oj ze|$^@@XuE*?RpqN3DihY-!1EPrAL@7iBVJd3Kt~AQkDJKb+`l$(yvnw)`*?6E?Wnu z#8gcp=Wh4%4?dv?%6tc|+^RjVBF?vK+y;m(lYa$|Tzsr}0;v}M8jGHR;M1NmPqkcZ zUV{nHBl+JqTTYX24bycCM}nkZA%2YN>qT0>?II2%EH+7> zf3+g4*ng~PI6?U2(0aeKKP5YFzTO)HHs7ZQ9)2>pYHFek0DEqbvxhW@2np^7;we;L zi_;J=f?kD&$e8qyfURos5E3NJaHXX!k?rPZNyS)3Fav)VBMqMGcj+!Hh$yWFMnrJg zef!?5(|SUz2_du>Jo13Q9e;q+L4wEGC(=XiSNN%Q3of)^POC2+TM^`f(hokyMDSx3 z+oJXS_0L6hu)l&DG}$2FNnGGRuO_wcuq3vB0420)3II!y#{CCS34DwNAa+ujN{zg&cR7*tk{7a~W829vFKmX1Or(XY62rr3VO!m9Ma3J0hqK-qu4Q)MFymTld$#QV|Rdh13;=q_?#>J-3S97}mF zDGARj#;djx6dE^VRbU~dmb7*Od+*n+mkH<-3X&uLlL52MfIFI$s4dQ$e|j-|70+DJ6t3sl5-NQSIz0MW}Y8|`5(ymIFK4j_zH_EOG{ zriPvCM0_*3zSKhlPg3(X`2#R~HJ!cor<^_Lo-|utSWlluQ%+{zS8J++2*DEm!kAon z`ctdmQj{x=`dQ@6$$apWT=KWt1|WA3(JQM#v|o!mf_u9Rw+`UhpLU!2dC7 z(PH+y@;t{m803*K_{nXXnir-PfKsyUquzDTBqnm1pt`#z3=W_`dvATbpns(M7R=f| zF;cgq^S-YNnT#-37WLSo4mM0j)JAnVsh+ual(As4=tF2r+n(xz@u*8#xIk^raIZ^p z+>Yw`jFMc))6&0~Q6Q#KOPh^3L@Mop3OIfd!a60E?@l&;v(3plU_Xd{*L4TXp+rM!rQ+p$p1++{_({EH! zQ_G>#ypyR~C4sv=gG-8YF8a9MRk*tM^4SgEji^AGrSN?$rnW{Pt<}@^g%ovz*_hk=g znSKz+-e73$&zGn3!$*-aYVe2gv!aYwnnb@3v{EPDH}C0JipBG^XP{XoCc#E6)7o$@ zg68D!`gKYFJ*;t0RkF!jqxx}5UtX)1z6(3vAWs<%768v{09#_UG=v7}-_2p^@NP_& z@E<2-5BNssCPE~7v#y~s<^u=<1ZiKaH{M@36b&q@G6iH;MNj@;Lh=8J%Ju1higJNjA0>fzZVErla2Q}=~~4-B)84_U8yzLKuj6wAi1 z-XX#1Tv&JWmmd1Tu{TsonB^L&a9NAD9z%iVAaY2Kw7=Ak6mwC0wzJ$j{R@O}IjqZ8 zhZ3a}9vB*?k!%9ra%Y2JFC4;PZ$7+M#aFoG*{-AybhLVfC$^x zoG}R9*p#6QD9)wQO7gPmJuMEk^Hml8SxUy~F!si|%CzIq=Xu+nX%kie@lrh9B2xP= z#7jIz?$~3yYF$x-d7)3M%{*m%ki3WcV*Rw`kXtXR=QSy6Az@mjwKK--s{5pA)YM#} zFryr>@_vM?!?}v~;Rz#XZJ#CzIKf331$A?H28@- zcG^t!RC0o0YIxD$ZB5(Acd=0KcjMY%qE|)Uj2D+l&_f>QxL2L3rVXM}Y$=cRw($WF z)-Ij}q|5`+(F^^DLGj08Y5Ngu430O~tkxp!h(~iEsUQbH9Wn>;i6v(zvW9oYOz#m| zjSu6nvZq3s%@h$ka@b${?YUVWVH|L_=As#pU;z6y3YU5`fd7G<4t}M8?|JD*g+H9= zTyf|8c;#B$G&%S(4)>nqdHjP4^}f)>?+Xb%xmN^-9=2~S7x1qmrWgOXGA-ecwYMnY z;C2c>us>*^sVGWM;&-#iy6v!^uNoO;tlEw?Xz);h=Z&j;;{*PsuSv$>=3{;TH^u=% z?*C;BNp~p7nkP5;KwOVWgYnE=y>IVhwYnMv(<>Ld0y)Fo9BFCu>XL zL?P}U98E>U>Fdx83bO6RDHJ~Uh+%Q2Uz3u3O&@!Rxdbsuxrs6&ni>@D(!dQg24d*5 zOXE7;$MV`>_RBQelBa3-&lasQKbI{s7wucO?*3d^MaU~oI)|lG) z1F*hk|0rVr%alP5eFyc%j=gKMMB%L2QZ>_kN=%ki*I*cCN>>qPHsD6y$Xrl6dv3)! zpxVCx)xNBtMd#49w?n&l_YeyN`~rsiZ5UyO16 zT0TU){wheKm%!@~6ExBRAt!>+S+wozgFgnlWkCjN?F@Q?v%5Fq7dpGJEAZ2SDY90ippEF zJ3FaKL-7t+zR*%xPDa;%Prr#_se42ZSPm2g+7T1@L2h#n8ofQuQ=LOA;s+f6a7oV2 zXFbIg<~N=A-!1N)AhsPY*ngW8H8)WvY>UYMkXc#z)7EanW3GKqfCaDUah|Cson}O6 zHVfVs_a+6-Aq^B`XtG+dLEQAGVZv{S7LH9+HA>XHF z;MNLWc}w{m5*}X|@gZ%NyoWz)={cQJMp$hrJR>0&dxlDkl=%i;?u6~%M!=#M`E2=Np&%*D@{ zs|xDp*~qis44T-Oi#DTJX)B_xW6ZD$OpChRUUKC1%0o*7_{Z1A174%0lZnUe?^hn$ zdl^iC0JsUA1bG;mMnfaX?W)TJk^w@7Y<~G)bq0vCz5~ofbB8=wPHNpM2esVHL1r_b zY}cofGVe&h7$JKa{fp(WeC-PC%**vre?dq<^BMBa~W5u$dTf=Zr~K5iCNGvZLZMT3xNn&5HH zG1-6=A4jQ+^Qqd7);NJ`;M)8NTN ziTa-TO`qn`62~MA6UDW`Cv!X7c@We5iiRV|;-BbzNBkl|5~L*4z9mAQUMXz@Hr@oE zzn>t^2wd-C(TI=tjCb6k)v`OGu!NUOW z!OpdJgrTPO>zzyu35eF!eHu2maJ_br?6;Jye(DF7@z>{_w0eVjGb8dS#d$C;yAl%Q zCq$*nYI)sv_UCFMU{Um6G)G7MQoeP?vZ}8EFa~T%#ubVsxdPC_({+8Duq?(CdNwop zoK)FTWIywb3y%#=_rjk6F|KfuEmk%kNy)tK#u@q`c}0MitYjmf3)9MOsd?wNox$hV zT<;hOaqDV7=TYjJ%*V&6Q3OVU-K>rlbYcgaPds*2p;rgzkT}fj<1)%jM?+)l%YfJp z5lDQz6LpyoZ=94Fwmmkc1!J=G(VeRTyT5h^?;6nhJm@UWKQ1c8lJeLZQ{fw*a!6H-eMxP+ zG30c9*V!4Bc+4i4#uMON&_9nTQzj2}ow{T6TiO3jdOUZCiQFy6@{ahfRGM@Y2dgwc zP+Aq8D*L|IwJj#>z0BCqeQYLy0$r^8$Gd9#uO>>c(zTtVZQjSU;B$~xZ;*d;Z>X$y zxcl^pXceDkhFO8Ln@Pe&)Kr-U7@t1 zfF)~guSZuD-TkC22W%q1J#=?m*oB1m8m+5*%$O5?JeGEBV5%~naPpQuj-_wM!fBxW zT;*KAZ~GMuE2ul+^M`>;13F;(>RYTl23@|FN62Y1qCoE+v&2zRAoJ9#gV)DwXR_zy z$!UMu4~ldLB&2Q1T30mWRw4M8^Q*kSzi4riGK%%jcP-O*nnAP2#kA1yl6FE@*7&81 z*`)=x=RdBeCwbf)6-70ZOBy_1ZSpmtN)aVw-!@eke5vAD*}_VtpQ;`B_;~IepPoVl zEng|$Iah2N%UjMz0v4&qBX}IvtBWs}Rqh*gjL(FxzVQvQ9hsV`TAGlz|IJEPa^t1g zVE1QQ?OYo)mw}8BPaj=_33|nqz+^9l>V4{9 zS=A<@8ndJdmAN7MCXCIqq9uppcnV}i<>~4|Vk!G0Q#$?=j+at>vP#$YHUYf=$xmh` zvikra#>ylc!}T6;_mdF7?qx{5%rFxn>LbKa_$eb(IVHbdgMYtucHhGU_Z^Trf&b6w zhyR)LNQ0vkt`4urZWbRuA06Z3?_nWOF!N%36@Kb<|F$#eqJO)w_H51ZxIMcfYr8?} zHuj=@aDl`T@UG*u0LxYuUD+kE#1Qxd8{s0f5fXD<)iDiy7z+DLebk3~1HI^XBs`%B z>rGaC2P9>a5GD|HCqz%nXA**zau4uyst=J&AnW$w^tlA8g31)p8;qsFuj$wOnscO% z&ILvR07H{$1Bfh2i~p6_tfQ_sv9|T$b%$SVFkqC@;FoQo!~xp~pXa_=QPb8mcGF>@ zGpSj#g1@$QbpOj+i3iF2&0OBh3hedMRTSCAUKXrR^B$uZX^oWmqSYF!+S_$?jJ z%bX4(CQro5s4IVmn6t(oEShsx@lDU2bsi^V3LKpEiX+$ed7>f~|3SM}^F`tR(x?D( z@W3idLsY@2qO*y^{DMxWp%4QU=O15_hiSosF8**Ogqb|X975($Q?<9`Z7fEO98F7) z#>^`0d@m0zb=~LK1wVKH1LDyqB0>7Y8g%kG#6ZrbGfa)oUX#QWyhb3FZM(;8F>X9+ zx_&M{Iq&M!qyUkU#^Za?q$b*3Dp(zEC%MLrE55@;k8sFSTMfIRjdmYMsFl<(uJfTa zQn58QPMb$)jUXfSCJ^rs{32<&E-rqzA1|2MKmmJc7g%>{90!UKyuabU$@Hdk6AWGZ z)ql@j&Pdf^?dHAYR!(7M-wGd+AuilrOwfkcfuW`3Yo*IwgN;8`7?joUjL`D15M{(_ z((pG2a@g~Rm5CGmI}^iL77RVs0fC_#*6wj~#DD!k4yoc?bc^MMw6_jAhxoYY(utv2 z9655zWhm}|b&Itxo*Cq}Xz+j<+v6_vFVxQigm$sJPsarSs=IMfj|v$F(FI>Di&2pv zqh3BW47`v%qW zW&LWaUhw$8L`1U|RIo5|APt4S!7_K%@_j zSwzx8U2Ok?NUa|H$1$TPI2(7IOlNZ-&s}=Kg-R4POeRC((<>8(+*Ng?(*+<2ik!$}>CamFcdA+pZ z5o8HF|4_|F{5pUrOSG8Ic?22$bX>GRk_;ezZBa@T9c=ub%D${U4$y3qCYiHl5BI!| z3NY{etLKmIqz^i`YyJEEE7;CHx3_=(!J!hrzgL1=j*%NGqm<4RP2_{vcQ_4))_RiW zq+gD|SLh6?-lvyuDI!f1Uv+1&3rkQrCupq&4C%ecVy@q9#($twk}SKRb^!L*fe}zv z)Qc$v;)(}b#87@lE0O|2<+iPNLpwVC>hs1yu(AyE^F4#x1o z?U-memHMkGYkdn4ftY9xcukm#xBdrGui9_nXBvO{i32H|8(mCI8ofySK*=n&JFVuh z?ZNc6Hd*)6ow-MxCA!#&)SIuRfCLpSPTvT{Id_CsAb$Y^_Bc%D2J;Tr29L3Xf2Yv) z20Q22yYT+?1gh+yHrkJI)|_T@Xaq7Bn%IT1$=PH()KJ-+Mz$Ou9Io9*AN*MEp6>%6 zk%e;Q9Ka+$6t|0_-3itB>tS(D3Upso8CT#0$8&=>#gI#lDPel+v0%RDY{>Pd=V-8O zHxcV=xst^bj=`~B>K5%9tQi52s{=Pj`~}_@{>@}W*|ibi2ab~ssaO06+^<9%b0OaQ z(2W?I8NU@D2};C1tsOA)>YF)cs;Pa7x?i|k>6HgLTIixc^C8dIWpOr>(=Imz=|7w^ z|IE|MI5}7jD2%?Xs)*zT5kp_Jj6T~NSxEo1{kCF5vM1Ynm*b;k##i;A%;mga93{y& zVsG)R)@7UG71J-pCHbHbz4Y1m!{Ru_+gwxljn33K?6SOGT0J?1?g{f3cH-X$b>2(s zvn#_^^SX=y%M18CZ%WRBeMHJfd`)hxPYq0Ix;et)@~LbYE`EIrF!TTBqxKE|BUts} zr}U5etFHrLjn~}A-@jG-q#iu+JU(Z6H3C9yZiV{7deOJXm`ozF_evPQmKZLqrL{TS zo`;QF^FeHT9FVYCfS8|c$z-@ciX(%g08kD;`IBI(xnb21o&e9G``+pPd1fL8WT8<1 zt2}=Vk=YW6u9SK8GJZ#z0|Mr7_Pg60;S!Tdg_rjhlRzc^8Mydk^FqDOPx9u~oCD<$ zZ|!CKjgKY%k3s#{C~D-qB&%$<)M;}^%Ln-h2vmn6al#Zo?zEkwMsB9upo(wiltn}m ziv?Gxxov%}7ycEpD$KG{U!OgvWl~+MP_Z3)>Nj_T#xL2;Ye5nQ3gYymp`6d2A1foA zixu_=i@{vlmaO8QLKl_?MAXe+=j;3wDvz-dq;HVypmViuEsM=y-NCr4wZ&Uu8T#vO zr*fyxjNVnJ`jaOu4`))l{9uz?MDYEu7iNda9=JvikI1=);ob*!4G}hn<>g4tr`MOe z{tZ(>4k78r)^DZ3VvMmjLg$}}=XN-DD^ye-POR(eg2{%%d2~;P? zijhye$XUD?f&O;Q1)=d8;kAc27l`YZnd826xKg!saI?l+KVLqkeq|y%zGH}WEU1Fl zvt`eNmg|FHkWqrdxt#~FdMB}Hfc=M+Y$cM!OUrTH(loku_r|W{IKwu1s7<8jx@qc; zPgcvvChWgsVvro~!A&!%lONr*{Zmh9Y4vNm2)9WASXhiK(1~2w{fhS49(Wv(wFPlaVhow*i0$9MMK2+f z`$gnAqvJu-t5zod_cx7nSJ4{^ZKcA_zIUd!DKrRLd=L);pOU2yKg7X+GHQsKH5b7LX>gIHXHh~ zY<=-Eua(XsGhbB2J z^X5hAaP{L!IxVJn`@xe!{7M8@gc+v?~7lW=Fbp|?8~16#8a3-Yy+8v91Qsax*h4k5T!#a53=m@pAfqi#^vTw zyA}Q#s_c{5S&<{dPJ(qqy4amwZYfC$BzxM>^`sI?$-Fp>WF3Uhexk{I%fo_E(%Ib!+eON(KI}RqPwuVD)Sy-gujSDSy?F`$kE-?z{ESayu zF)j3?Vhcy6(2+`R!rMl=o;r%}4o6Og@N^gL`*+MU)y)Y|PmgR&ox+B&IHDoW=#SzR zDrKTjSSDtH)E@|RzkDv_E~?<7{)GDhz0K0sC4&=t-s&ygAalC*uA4A!x4P|@BXEE4 z4(<_KELHdl!_USYOqQ|2UG9~6ty3%Q$-KjU(&@9y2lv1EH>cUm2{p@2JmW(p8nhKP z!6$TLqld{hp+}*|;Ug>f(+oXFomy>|xB*a-_NX6p^)A~1{d`Oyo#v-q`QuI#I;)IT zDYel2cheQ_^pO*Ocsr2ZNex`G*4f6NO8@L6gJ`Oki-pqJ;0U>pm~B zn!0VUi9$Y+LGQc|-ybmZVja6_6J0JO&3{m{m=`+ASEYZIOQo|*^ScXkwj9$UF@fb> zcXg9Cz1q|%+}x9}%}@PInOSIc0)&VGkv%0QM+(2*$DpCE4ZUZIVAn6a;m2Fi_-G8K zs^Y*-@el6Ilp#O=4h`F#vtRdrXQ}atYs_kgP)zgkOtAh&ndwHxe-=LVBkIdW;}`nC z50GoFOO6rWZCaV-5=p!?YH}paeW(WV$CFqJB%7IbeHtFmY5;XUIZ}aVeSgchf5zil zwBVV(8-Jt5ev__oHdoFG=i|iFC2MJ{*moV@6ST@ zuUDfO=uNB^R=h=)TH`}-`8f&d2L(%aV6vP1QgHV{tz|=>2-6dIEAIMWazDA}L;+fv&Td6k z(H~_}*%H~sgv7;lEaVq(>FFg|>NADYp&z`oBKB4IcBAk`+snpze07=O+!WVq@n=)DLY z2Q@273F_ti8OHOz5u{P+W&RE`im%7RWAMy<^J>?4UT30-Ud&_%Or>iD1ns)(78$%H zr&4h*magbFA}F^i8)7$4`Hk)Wn{aCD zC6&Ad2N|P{*6NQ~PlC!C7;7y_#Sv*HshQ|0ge;Oi?SuWaZLi=DdIj0cfsE*Oh~)>! zPq)O3siGhva*5JFZLw$87&UoFqDF{|caD#H>*ZPuk&V->?rm=1yO~G9&1sdpd6|AOPOs16i=9T}r9k#KWs>|NwYW%lmYhyDFGd-X z$tg@A{L{lKqCr=-B>$^D`*KA3%}2SY1_gr|*_gj3_OYLXso#N)+Z-<|D3Wt=SxN3i zpIJncr!Kz22t!KP{Y8#&uig2TQ;yGV1W8FeFmmtMSi_ zabvj)LTmE+5$Ss>mPYg;8_xxy6-A@^#(|yiv^h7sfM_`iZauc8=ZGG>CwkUAm448O zhDZacu*+xX#*(ji>^&Z*oWjzOydd2Dw|OxK@rjqg7c#^TP_=9OLtj9yJnrJ*!Trrh z7dmc&z^B?bblUVpT({*hSFTFumx!tsiFh|U_u?Z8B<%oer#5zJjFeA>ZsqF@F3o%T zBJ89{3+B1m*5sibxhS_cZ=UB6yOWgH!s0p@il}VUTF;cegF|)UO+he%nBsOT4AfH+ zH-cD?3A-B+(!k?a;|S7*2-p-X-^yp@;G5VUYC1h_d)|bV2_(DnS}No&a!<^Kg=k_H z-bWptNplus>t8NnWa2z8I=I2P3%Q3>z|Teg*7>59HY?o&GKr@?xC&qHnDxIc1^1s) zlDikA|7cV0o-+T7*an`;v6CP@N4b0pjt*n-)h@8y4`u^?9rccg7tM-{qPn4CGl#^Z z_bUFTBEaGLfFQl&A2R#qhHqnutce}9X6osknjvH!6Y(RPL)GEm7uOeN!B=RA=)%f& zKEz@Pm*d8>)jJ3mJ2(JPnZHe+EqfR2p{VWe0>W2d=jHRyNL$1Kva-Le?>#PNb{no@ zjhhV?^DSe?Nf+0DZlx~@7b`pWQmXw-$qqZbH}0=|1vsnq5y$}i_BNs`D)ki>3;YNm zN&dE#j#|Y2FqXS?r%J9xJ{C$TBzo-W@UimwzdlD(9qbbShqnRV5ytx8cNEaE|2}>O qYa*0RE?4{vhWKBf6G~D5 literal 43274 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 From e286290667271f4d6728918fe0df9057e970a0c6 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 07:41:00 -0400 Subject: [PATCH 154/816] Fix #33 Check for group before replacements occur --- which-key.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 4d89a7d1e73..0d6a8fe64d3 100644 --- a/which-key.el +++ b/which-key.el @@ -614,17 +614,18 @@ corresponding `which-key-special-key-face'." (substring key-w-face end (length key-w-face)))) key-w-face)))) -(defun which-key/propertize-description (description) +(defsubst which-key//group-p (description) + (or (string-match-p "^\\(group:\\|Prefix\\)" description) + (keymapp (intern description)))) + +(defun which-key/propertize-description (description group) "Add face to DESCRIPTION where the face chosen depends on whether the description represents a group or a command. Also make some minor adjustments to the description string, like removing a \"group:\" prefix." (let* ((desc description) - (group-prfx (string-match-p "^group:" desc)) - (group (or group-prfx - (keymapp (intern desc)) - (string-match-p "^Prefix" desc))) - (desc (if group-prfx (substring desc 6) desc)) + (desc (if (string-match-p "^group:" desc) + (substring desc 6) desc)) (desc (if group (concat "+" desc) desc)) (desc (which-key/truncate-description desc))) (propertize desc 'face @@ -647,6 +648,7 @@ alists. Returns a list (key separator description)." (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) (desc (cdr key-desc-cons)) + (group (which-key//group-p desc)) (keys (concat prefix-keys " " key)) (key (which-key/maybe-replace key which-key-key-replacement-alist)) @@ -654,7 +656,7 @@ alists. Returns a list (key separator description)." desc which-key-description-replacement-alist)) (desc (which-key/maybe-replace-key-based desc keys)) (key-w-face (which-key/propertize-key key)) - (desc-w-face (which-key/propertize-description desc))) + (desc-w-face (which-key/propertize-description desc group))) (list key-w-face sep-w-face desc-w-face))) unformatted))) From a1b88958da69d5504623d86902780af55cb204eb Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 08:46:16 -0400 Subject: [PATCH 155/816] Fix add-replacement functions Also cleanup use of push in code --- which-key.el | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/which-key.el b/which-key.el index 0d6a8fe64d3..19528b82bf2 100644 --- a/which-key.el +++ b/which-key.el @@ -273,10 +273,15 @@ bottom." "Internal function to add (KEY . REPL) to ALIST." (when (or (not (stringp key)) (not (stringp repl))) (error "KEY and REPL should be strings")) - (when (assoc-string key alist) - (message "which-key note: The key %s already exists in %s. This addition will override that replacement." - key alist)) - (setq alist (push (cons key repl) alist)) + (if alist + (progn + (if (assoc-string key alist) + (progn + (message "which-key note: The key %s already exists in %s. This addition will override that replacement." + key alist) + (setcdr (assoc-string key alist) repl)) + (push (cons key repl) alist))) + (setq alist (list (cons key repl)))) alist) ;;;###autoload @@ -303,14 +308,16 @@ pairs) will only apply when the major-mode MODE is active." (error "MODE should be a symbol corresponding to a value of major-mode")) (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) (while key - (setq mode-alist (which-key//add-key-based-replacements - mode-alist key repl)) + (if mode-alist + (setq mode-alist (which-key//add-key-based-replacements mode-alist key repl)) + (setq mode-alist (list (cons key repl)))) (setq key (pop more) repl (pop more))) - (setq which-key-key-based-description-replacement-alist - (assq-delete-all mode which-key-key-based-description-replacement-alist) - which-key-key-based-description-replacement-alist - (push (cons mode mode-alist) - which-key-key-based-description-replacement-alist)))) + (if (assq mode which-key-key-based-description-replacement-alist) + (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) + (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) +;; (setq which-key-key-based-description-replacement-alist + ;; (assq-delete-all mode which-key-key-based-description-replacement-alist)) + ;; (push (cons mode mode-alist) which-key-key-based-description-replacement-alist))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes @@ -745,9 +752,9 @@ keys to be written into the upper left porition of the page." (length (substring-no-properties (nth 2 k)))) " ")))) col-keys)) (if (<= col-width avl-width) - (setq all-columns (push new-column all-columns) - act-width (+ act-width col-width) - avl-width (- avl-width col-width)) + (progn (push new-column all-columns) + (setq act-width (+ act-width col-width) + avl-width (- avl-width col-width))) (setq done t rem-keys prev-rem-keys)) (when (<= (length rem-keys) 0) (setq done t))) @@ -815,10 +822,10 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to (setq page-n (1+ page-n) page-res (which-key/create-page keys-rem max-lines avl-width prefix-width - vertical which-key-show-remaining-keys page-n) - pages (push page-res pages) - keys-per-page (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) - keys-rem (nth 3 page-res) + vertical which-key-show-remaining-keys page-n)) + (push page-res pages) + (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) + (setq keys-rem (nth 3 page-res) no-room (<= (car keys-per-page) 0) max-pages-reached (>= page-n max-pages))) ;; not doing anything with other pages for now From 1b55f62024b1ee1de1e9fb576e6fb8a72155c174 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 09:26:52 -0400 Subject: [PATCH 156/816] Cleanup replacement functions again --- which-key.el | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index 19528b82bf2..a3ec4f2e15e 100644 --- a/which-key.el +++ b/which-key.el @@ -273,16 +273,13 @@ bottom." "Internal function to add (KEY . REPL) to ALIST." (when (or (not (stringp key)) (not (stringp repl))) (error "KEY and REPL should be strings")) - (if alist - (progn - (if (assoc-string key alist) - (progn - (message "which-key note: The key %s already exists in %s. This addition will override that replacement." - key alist) - (setcdr (assoc-string key alist) repl)) - (push (cons key repl) alist))) - (setq alist (list (cons key repl)))) - alist) + (cond ((null alist) (list (cons key repl))) + ((assoc-string key alist) + (message "which-key note: The key %s already exists in %s. This addition will override that replacement." + key alist) + (setcdr (assoc-string key alist) repl) + alist) + (t (cons (cons key repl) alist)))) ;;;###autoload (defun which-key/add-key-based-replacements (key repl &rest more) @@ -308,9 +305,7 @@ pairs) will only apply when the major-mode MODE is active." (error "MODE should be a symbol corresponding to a value of major-mode")) (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) (while key - (if mode-alist - (setq mode-alist (which-key//add-key-based-replacements mode-alist key repl)) - (setq mode-alist (list (cons key repl)))) + (setq mode-alist (which-key//add-key-based-replacements mode-alist key repl)) (setq key (pop more) repl (pop more))) (if (assq mode which-key-key-based-description-replacement-alist) (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) From 3e9f4762953e331d76524040e8ca69acd38293b1 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 11:45:09 -0400 Subject: [PATCH 157/816] Reorg the readme and add key features to intro --- README.org | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/README.org b/README.org index d287cf0a63b..0139a50ea9f 100644 --- a/README.org +++ b/README.org @@ -1,8 +1,17 @@ -* which-key -Rewrite of guide-key-mode for emacs. +* which-key Introduction +This is of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]] for emacs. The intention is to provide the following +features: +1. A different polling mechanism to make it lighter on resources than guide-key +2. An improved display of keys with more keys being shown by default and a nicer + presentation +3. Customization options that allow for the rewriting of command names on the + fly through easily modifiable alists +4. Good default configurations that work well with most themes +5. A well configured back-end for displaying keys (removing the popwin + dependency) that can be easily customized by writing new display functions * Table of Contents :TOC@4: - - [[#which-key][which-key]] + - [[#which-key-introduction][which-key Introduction]] - [[#install][Install]] - [[#minibuffer-option][Minibuffer Option]] - [[#side-window-right-option][Side Window Right Option]] @@ -17,10 +26,8 @@ Rewrite of guide-key-mode for emacs. - [[#key-based-replacement]["Key-Based" replacement]] - [[#key-and-description-replacement][Key and Description replacement]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] - - [[#statusgoals][Status/Goals]] - - [[#stability][Stability]] - - [[#completed-goals][Completed Goals]] - - [[#incomplete-and-planned][Incomplete and Planned]] + - [[#status][Status]] + - [[#thanks][Thanks]] * Install Add which-key.el to your =load-path= and require. Something like @@ -228,21 +235,9 @@ windows. #+CAPTION: which-key in a frame with 2 vertical splits [[./img/which-key-bottom-split.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. Remove popwin as a "hard" dependency, preferring 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 +* Status +It requires testing on different platforms with different configurations, which +is beyond my capabilities. The default configuration has been reasonably stable +for me. +* Thanks +Thanks to @bmag for helping with the initial development and finding many bugs. From fe07489d5d24c24f869057faeb9a49e119955ba4 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 12:06:03 -0400 Subject: [PATCH 158/816] flycheck-package fixes --- which-key.el | 121 +++++++++++++++++++++++++++------------------------ 1 file changed, 64 insertions(+), 57 deletions(-) diff --git a/which-key.el b/which-key.el index a3ec4f2e15e..e998d5bfc19 100644 --- a/which-key.el +++ b/which-key.el @@ -46,13 +46,13 @@ Also adds \"..\"." "Correction for wide unicode characters. Since we measure width in terms of the number of characters, Unicode characters that are wider than ASCII characters throw off -the calculation for available width in the which-key buffer. This +the calculation for available width in the which-key buffer. This variable allows you to adjust for the wide unicode characters by artificially reducing the available width in the buffer. The default of 1 means allow for the total extra width contributed by any wide unicode characters to be up to one -additional ASCII character in the which-key buffer. Increase this +additional ASCII character in the which-key buffer. Increase this number if you are seeing charaters get cutoff on the right side of the which-key popup." :group 'which-key @@ -109,8 +109,8 @@ the feature off." (const :tag "Show in popup frame" frame) (const :tag "Use your custom display functions" custom))) (defcustom 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." + "Location of which-key popup when `which-key-popup-type' is side-window. +Should be one of top, bottom, left or right." :group 'which-key :type '(radio (const right) (const bottom) @@ -182,7 +182,7 @@ It takes no arguments and the return value is ignored." (defcustom which-key/custom-show-popup-function nil "Variable to hold a custom show-popup function. Will be passed the required dimensions in the form (height . -width) in lines and characters respectively. The return value is +width) in lines and characters respectively. The return value is ignored." :group 'which-key :type 'function) @@ -282,31 +282,36 @@ bottom." (t (cons (cons key repl) alist)))) ;;;###autoload -(defun which-key/add-key-based-replacements (key repl &rest more) - "Replace the description of a key sequence KEY (e.g., \"C-c -C-c\") with REPL. Both KEY and REPL should be strings. MORE -allows you to specifcy additional KEY REPL pairs. All +(defun which-key/add-key-based-replacements (key-sequence replacement &rest more) + "Replace the description of KEY-SEQUENCE with REPLACEMENT. +Both KEY-SEQUENCE and REPLACEMENT should be strings. For Example, + +\(which-key/add-key-based-replacements \"C-x 1\" \"maximize\"\) + +MORE allows you to specifcy additional KEY REPL pairs. All replacements are added to `which-key-key-based-description-replacement-alist'." ;; TODO: Make interactive - (while key + (while key-sequence (setq which-key-key-based-description-replacement-alist (which-key//add-key-based-replacements - which-key-key-based-description-replacement-alist key repl)) - (setq key (pop more) repl (pop more)))) + which-key-key-based-description-replacement-alist + key-sequence replacement)) + (setq key-sequence (pop more) replacement (pop more)))) ;;;###autoload -(defun which-key/add-major-mode-key-based-replacements (mode key repl &rest more) - "Functions like `which-key/add-key-based-replacements' with the -exception that KEY and REPL (MORE contains addition KEY REPL -pairs) will only apply when the major-mode MODE is active." +(defun which-key/add-major-mode-key-based-replacements (mode key-sequence replacement &rest more) + "Functions like `which-key/add-key-based-replacements'. +The difference is that MODE specifies the `major-mode' that must +be active for KEY-SEQUENCE and REPLACEMENT (MORE contains +addition KEY-SEQUENCE REPLACEMENT pairs) to apply." ;; TODO: Make interactive (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) - (while key - (setq mode-alist (which-key//add-key-based-replacements mode-alist key repl)) - (setq key (pop more) repl (pop more))) + (while key-sequence + (setq mode-alist (which-key//add-key-based-replacements mode-alist key-sequence replacement)) + (setq key-sequence (pop more) replacement (pop more))) (if (assq mode which-key-key-based-description-replacement-alist) (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) @@ -319,11 +324,12 @@ pairs) will only apply when the major-mode MODE is active." (defun which-key/text-width-to-total (text-width) "Convert window text-width to window total-width. -TEXT-WIDTH is the desired text width of the window. The function calculates what -total width is required for a window in the selected to have a text-width of -TEXT-WIDTH columns. The calculation considers possible fringes and scroll bars. -This function assumes that the desired window has the same character width as -the frame." +TEXT-WIDTH is the desired text width of the window. The function +calculates what total width is required for a window in the +selected to have a text-width of TEXT-WIDTH columns. The +calculation considers possible fringes and scroll bars. This +function assumes that the desired window has the same character +width as the frame." (let ((char-width (frame-char-width))) (+ text-width (/ (frame-fringe-width) char-width) @@ -334,9 +340,9 @@ the frame." (defun which-key/total-width-to-text (total-width) "Convert window total-width to window text-width. -TOTAL-WIDTH is the desired total width of the window. The function calculates -what text width fits such a window. The calculation considers possible fringes -and scroll bars. This function assumes that the desired window has the same +TOTAL-WIDTH is the desired total width of the window. The function calculates +what text width fits such a window. The calculation considers possible fringes +and scroll bars. This function assumes that the desired window has the same character width as the frame." (let ((char-width (frame-char-width))) (- total-width @@ -357,7 +363,7 @@ character width as the frame." (defun which-key/width-or-percentage-to-width (width-or-percentage) "Return window total width. -If WIDTH-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it +If WIDTH-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it should be a percentage (a number between 0 and 1) out of the frame's width. More precisely, it should be a percentage out of the frame's root window's total width." @@ -367,7 +373,7 @@ total width." (defun which-key/height-or-percentage-to-height (height-or-percentage) "Return window total height. -If HEIGHT-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it +If HEIGHT-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it should be a percentage (a number between 0 and 1) out of the frame's height. More precisely, it should be a percentage out of the frame's root window's total height." @@ -387,8 +393,8 @@ total height." (custom (funcall #'which-key/custom-hide-popup-function)))) (defun which-key/hide-buffer-minibuffer () - "Does nothing. Stub for consistency with other hide-buffer -functions." + "Does nothing. +Stub for consistency with other hide-buffer functions." nil) (defun which-key/hide-buffer-side-window () @@ -404,10 +410,10 @@ functions." (delete-frame which-key--frame))) (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." + "Show the which-key buffer. +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." (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)) @@ -416,19 +422,19 @@ need to start the closing timer." (custom (funcall #'which-key/custom-show-popup-function act-popup-dim))))) (defun which-key/show-buffer-minibuffer (act-popup-dim) - "Does nothing. Stub for consistency with other show-buffer -functions." + "Does nothing. +Stub for consistency with other show-buffer functions." nil) (defun which-key/fit-buffer-to-window-horizontally (&optional window &rest params) - "Slightly modified version of `fit-buffer-to-window'. Use &rest -params because `fit-buffer-to-window' has a different call -signature in different emacs versions" + "Slightly modified version of `fit-buffer-to-window'. +Use &rest params because `fit-buffer-to-window' has a different +call signature in different emacs versions" (let ((fit-window-to-buffer-horizontally t)) (apply #'fit-window-to-buffer window params))) (defun which-key/show-buffer-side-window (_act-popup-dim) - "Show which-key buffer when popup type is side-window" + "Show which-key buffer when popup type is side-window." (let* ((side which-key-side-window-location) (alist '((window-width . which-key/fit-buffer-to-window-horizontally) (window-height . fit-window-to-buffer)))) @@ -452,7 +458,7 @@ signature in different emacs versions" (display-buffer-in-major-side-window which-key--buffer side 0 alist)))) (defun which-key/show-buffer-frame (act-popup-dim) - "Show which-key buffer when popup type is frame" + "Show which-key buffer when popup type is frame." (let* ((orig-window (selected-window)) (frame-height (+ (car act-popup-dim) (if (with-current-buffer which-key--buffer @@ -475,7 +481,7 @@ signature in different emacs versions" new-window))) (defun which-key/show-buffer-new-frame (frame-height frame-width) - "Helper for `which-key/show-buffer-frame'" + "Helper for `which-key/show-buffer-frame'." (let* ((frame-params `((height . ,frame-height) (width . ,frame-width) ;; tell the window manager to respect the given sizes @@ -499,7 +505,7 @@ signature in different emacs versions" new-window))) (defun which-key/show-buffer-reuse-frame (frame-height frame-width) - "Helper for `which-key/show-buffer-frame'" + "Helper for `which-key/show-buffer-frame'." (let ((window (display-buffer-reuse-window which-key--buffer `((reusable-frames . ,which-key--frame))))) @@ -537,8 +543,8 @@ window." (custom (funcall #'which-key/custom-popup-max-dimensions-function selected-window-width)))) (defun which-key/minibuffer-max-dimensions () - "Return max-dimensions of minibuffer (height . width) in lines -and characters respectively." + "Return max-dimensions of minibuffer (height . width). +Measured in lines and characters respectively." (cons ;; height (if (floatp max-mini-window-height) @@ -575,8 +581,8 @@ width) in lines and characters respectively." (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. Whether or not a +to replace and the cdr is the replacement text. Unless LITERAL is +non-nil regexp is used in the replacements. Whether or not a replacement occurs return the new STRING." (save-match-data (let ((new-string string)) @@ -600,9 +606,10 @@ not a replacement occurs return the new STRING." (t string)))) (defun which-key/propertize-key (key) - "Add a face to KEY. If KEY contains any \"special keys\" -defined in `which-key-special-keys' then truncate and add the -corresponding `which-key-special-key-face'." + "Add a face to KEY. +If KEY contains any \"special keys\" defined in +`which-key-special-keys' then truncate and add the corresponding +`which-key-special-key-face'." (let ((key-w-face (propertize key 'face 'which-key-key-face)) (regexp (concat "\\(" (mapconcat 'identity which-key-special-keys @@ -616,6 +623,12 @@ corresponding `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'." + (if (> (length desc) which-key-max-description-length) + (concat (substring desc 0 which-key-max-description-length) "..") + desc)) + (defsubst which-key//group-p (description) (or (string-match-p "^\\(group:\\|Prefix\\)" description) (keymapp (intern description)))) @@ -635,12 +648,6 @@ removing a \"group:\" prefix." 'which-key-group-description-face 'which-key-command-description-face)))) -(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-and-replace (unformatted prefix-keys) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement From fc6fd2d920904c59bbbfd36e701537f91cec00b2 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 12:21:11 -0400 Subject: [PATCH 159/816] Fix url in header --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index e998d5bfc19..167de9b4d86 100644 --- a/which-key.el +++ b/which-key.el @@ -3,7 +3,7 @@ ;; Copyright (C) 2015 Justin Burkett ;; Author: Justin Burkett -;; URL: https://github.com/justbur/which-key +;; URL: https://github.com/justbur/emacs-which-key ;; Version: 0.1 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) @@ -11,7 +11,7 @@ ;;; Commentary: ;; ;; This is a rewrite of guide-key https://github.com/kai2nenobu/guide-key. See -;; https://github.com/justbur/which-key for more information. +;; https://github.com/justbur/emacs-which-key for more information. ;; ;;; Code: From c0569471e35f12c0e3274949a33dbddce854a257 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 12:43:55 -0400 Subject: [PATCH 160/816] Typo in readme --- README.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index 0139a50ea9f..e21425814dc 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,6 @@ * which-key Introduction -This is of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]] for emacs. The intention is to provide the following -features: +This is a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]] for emacs. The intention is to provide the +following features: 1. A different polling mechanism to make it lighter on resources than guide-key 2. An improved display of keys with more keys being shown by default and a nicer presentation From 19fa37e1a47fa715c002fa8d8f54c47bf980c940 Mon Sep 17 00:00:00 2001 From: Bar Magal Date: Tue, 14 Jul 2015 21:02:40 +0300 Subject: [PATCH 161/816] Updated images for split frame --- img/which-key-bottom-split.png | Bin 135022 -> 144354 bytes img/which-key-right-split.png | Bin 185058 -> 194797 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/img/which-key-bottom-split.png b/img/which-key-bottom-split.png index b1d1de9f2c77a5b444180aa48480b155da5c956d..a13057e330c99c558b296a8c32688941217297ab 100644 GIT binary patch literal 144354 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%0DAm-yj$E*Gfkf~|?`slDuV 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 G=>Gw|fDXt2 literal 135022 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 z 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

yW%f2SW8NJ=Wd29%EAj4TIP& z`t%2w(ON!@aYL_De04AO30pqN?ogP|y(8CG21|oaWc3Z$QO#_L(nV*|T7#b-wMdoR z!wrO3PHo3&KI=Br>|r4_^C8T{n)y6?=#H;oN;@>Xym)i0MeR>W-($5_!)=$$|^oDRPW;nW&X_2(vX1?Qv)#jfM?GCx88b%_Gd*lIM^o z>5?bG54a_P4o|d{Hy?@sq9P#$;9b`(4&G97z2l{x`+ccc z*63nlW`?7QigXh1pSEj$0RHtjejx z0MMt!PQ+Bd9+HMqSQ0m3*K#sNC)_)pV$2&M;?EHg6w$YP1rjKkD;gE&vyA>9901-Q zf>r}y2B7U@QYZKa=Kt0Ii|~B&kFGbvU^Zd@qsU(znu1{qEu^7i75g42TR*L@_Zl($ zH+|h_0+8m&c;on!9t}AyT#!{H)){!=-ZzdFYz`L`r%kF@j7eP{csEQMgUpe>+_l$b zB2zu%sa4Jr`-AE)DDMg1zQ8NYpZ3On{~3;I!db{LeNL$36&=zUo?W|mSXE%XpX$L{ z6Im_mzKw)!H}~$Haz~MDj9_2=O8+>LdWlU$Ja!vs5Rox~Vch2NbqFcr{*wQP;7$Te z5ru-YM5F?yrqDo!ShL%6kW$9`pL&kO=om~4f$v7G$XF$h@}mb>JRky_2~a|#821`- zKfwJzZvM+UfG`22&_IUJ)nZAbV)K>-5)ILQlO;PNd(CudVPs=|g<&U>Z_OIgt>HFH zi%0bzWPFJN_%Q%zm>sV!yE0xT37YSARz5mZg?h~RR1Pg+##!m0-TP&;VM?=8?tHU* zZ7tjsx+zxhNmnT4E}+oHPzGsjaU4q920r|Tl>y25mKi*_lngi0&h6)S>z<)`7P(kSFzx*{)Xvo8P{?SepDb2sthw*Lb zUQ*zmLa23Rc*cKlwksS^4=AmnC-D2X^NmpHda~kKN5KAVcQaSQOIDG(Ls+-HV*=p1 NfRweAN)@fb{|jv9syF}u diff --git a/img/which-key-right-split.png b/img/which-key-right-split.png index 944293fd93990aaf3f6a6df473f17d33419d4a24..581ae68bd582fd5183d65849d8914b0aa63627a5 100644 GIT binary patch literal 194797 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∈(v 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

O|A%dVvuKt3m+k2bN9= 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 oOL9fKDW22F;>aQQ(KQVQX=dlzYG5KL^ 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%0D_ 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 JtaD0e0sv33rL+J5 literal 185058 zcmZ^}WmH|uwl%tN3xN>a-7RPcF2UX1-GbYKg}b|ZaCZyt?ykYzT_1a&o4xP-+Ihcd zP?MTfqxz`PN1r`dR$2rR9vdD203eEq3dsWiP|5%R_%1B?`(Mb}RNLNvK-de2DZ;|S zF8`L<000O9VnY0iF51WGFlo5G@#i{@G8v;BX1TRf(0TE-Lu#VnqWos0C4Kp5@sdz?~H#&!AJq{a;V(8g=JO)9NICNCPifjOsP|0@9W>U+M!B9*!syU{B0d{bRO+{LXAd%TsUbSFOF6q ze_2%pb^*u#nLMDrA(>|>#)8F;**HI}jy#+Dzfb1H33d<;&^i6;e9zY+KL`bFj_>Yr z`Lp)?)LKHMr7E|3X3n^@;wU2?Z+b4}a`y;>gt)G%O77H6&Ij_p#@2=Wd|2l-#^}Dl z^O0hFQJ7juAC1q$V{1(du@t;cJzM$8Eq!QRCr{qihp>7Fu+;~3=nzs)Z*TNnLnhK_ zdCsSxonY)1HY|?65axek*g+?hm7V>&%O8P`jt)DVoS0buaHhzu^%cFEKj!R_kc43?E@;0{RcE*kd{pZ-*a}UnWHeUiv+sVGv+eM42n; z|BQ=nC{t`$z;;Y(v+a8R_Q$}@^t>t2;oxymCi?_V*-~5?|Fa|i<$KA(lK%bn)^mIb z#Yh@ji>D41kil!v^yIK!RZU)ny}RYjzA7pAc8P31|9;Liygo0yxM>+9>c*WH8t z1NcS|cw0n~=kpf9+v9w@@lAEK=bOoGyvJ>6h=YSeW71QX{Zn%@tt95B?9?wbY(!s@ ztRQu1!1cGllg_VX5U#GUzkLg1MN9{QjW%J>^WJO=MuO~bZyK;z3I8Y68~tG`zdT!1 zwDx__Zm?brL8DoKVbf>F{16ciICdQ&1|J(06BWHbb#5=2HBYvAx;+8j9v{dUEuUn# z?k3xA^?eaDF`-a6(!9+8o~pIFIcjJu6TIDv)SqRwqlR*F-OMP^;&zap&Q{q7z5zWK z_kMUjEz{C7h83%nso(VB{HR3c^K8Y!!Yb9?%l~ci=d_$rz1N?2+3ikVCL=+liQBYy zS>8rCIVcI!-^XR)FW;WW-;VV+F)|Z_h|{^qF8w{V2aI30wjfA|UmU&}IVa}TOrxR} z($QE@l~`UOWfw%8jHlHSlPmLj2(QR41-t&qw-q+Xg_YMTgZ_mukM~mn0y%LWV4$F? zuv|nSA_;iMe2yh!($mXiDb+PJ)bQEDGMS9vhdXw!)cD!RO=7Ps)iXR;vBNEuGs#+C zZkKy|dyl(?o_dAPBob)hU}0UZM%ihosa5mrcSrOTE=m;@6clW1Y&6qOJ{=cE&|&F* zew9>mc4kin)1`q*f=-B??M;BF^m&KH=<|=&=6E#2PcZo_>+6|i;JUxVmUnsd1^+Dk zUYwAELZm!s%Zw&*iQzpuJ6P}0u|HjDdMSQC366@J>JKP5VApO&8mVTlU67uhtiy8d zc@OCg3^O(9Z;(RX)i-bHT76lRqfN0oq!c5vC64CdV^`w7*$dwPhDRN8LHB-;BGY{@ z-Fac*HRvTIBxI>l4+4kij=hISPiIl+ac4MjvC|ug=bjMZb7eG#217@}X^rRNc?RO{ z;x!L2shSMX)YL@#_RIB(&1z|;B2YYY!teh6{^_j! zZ780`^Km*;)fk;~U}VJ5d@&LN9oB}c)T1nAahK8eL{0aLf6G~0>IqNB-fP*c%B1># zK!d3UKF;%0n$|_cL!8d~{Ek?Ir8F`@#V&D

xz1k>r2<2(A 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%0DN%fJqo347R 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 eDdqe0B0Xn93*zo*xb* zGs?SSWr#LUb~&j^m|qHqj0OVl+p(uw^Ii8~V`ATtZRX=XY-}^A(avSZKI{{(x=;5m z1ip@TQNt)z4h6VP5$d&=1iG=}6oG1pqD=V0b zR^PMmv}(uLc^AUxAz~eAYK(kTK++q=2Qoix9vb}Y&s;u_lzv(eJj%c2S@f_Bw+rHW z`3R26?5$Q_R--uNFnSwxOCDj^tKkbweR-@z$F&rnJfEqR-&njAk3OXBhZfkHcD@O| zesVC%=L`*p0ZoCQQax5U0M2bgI9L=&%djXlQq#~DWC7-o{-&9}fj_)&v6h~BhzFA) z7Yp1<*PX4WX5Lb}euS_tPXJiMbXb@51~# z(+;QOI-xcn*cdE3jLr^y#_KTc?(L^q#7x~YAu9#*1c>-r;sMrkCJzS+J~R%Q(~=a-j^If@H?T}b+uil|y#Sb~xrmyr zxBuDO4@#|daFdS8EGe9$sAN~5!Ezi7{=(nYIRj;}x>65*TZJ|QIPer-dI89P_h}-B zF|9lwD~j3yZDYDqZ#&@#DnN3s4!CwLK$f#ABwlPhf%pA3__Y3kGkX>@1snHy@V4@n zw_=Y-r1QG{-Gr1Bt+H{NjQ)M-uf{R~U2s1(i9k0Daxe}=xqVYNl9JH>fng6S3@W4k zts-!@0zT@T6(#0TqpMxZdMqH}rMoe_(*V@eZbx-*rz0Qrd3f!xUf`0XvZo`D(wRwi zZ(z@q%}TT+6!8m;L$U$JXNDk6BKXp`o>yT28+{fO7(FCqVx|%)lb%Y!KZO1^Li8Io_|&DJ3T01OP?etO)Z-dtsC;qbNGFFiDsRnrCiJLdfXZ7ogN8WBY98wz9I<;kFCA# zfHFWOeGy{d5T$^p!9^r$>ki-VQHis)7zVL?1pVu`+%9HdIx+on4risv=EguhXrvKI zw>v}5gD079vWJ8YgWo`VsEO`eTVT28MI1GxQq{p5qvdL`v5iHg^hNR=kNd z7Qhz%*;-w~&|&dik~A0$hzMJxigz#m)<1Uo{)lVN^{!yPpTQg3Mf}2xgV!&Z znWaZwJN3Uam3Yz~q?`z56FXAwSV$@;FcvGhlm_x%>L{Yt7y|di?@#P-W|h0rUdNP} z#Mrvq+hsK01l!y?>*mvvu;~(FYQGnBKTvAl5e1LlPr^*e$${qch=(5NiMEXZCUAcm zHDVR<^TA-sZ)p1Xg}VKm_?VtIv~Wx~o}lO!JiPRQpS`3svA)GP@zH=LIW)GV@ceHkc%!Oi=&Fu^Ry> zISOeH;wKBphx}E|nG~TNes_Bg%1%hK4Y+vcm+241W ze4V{!?e*;OCMQu}Pol$gy?tGdC_E%k98e%YN^(@eeK|-MPy+ZQ4sbakW{T$1f&J{f zvNh#t>(pb*StJ&l)7rMZkIFVaR9+#5PLqX20(+&tH<8%!J_<+PGR4_-jzoyj67@J$nHiwTPdXg*nYje@W=91y6H8MBQ z5|ZqUtWe6O;3H5=hZ|~iDmXvNdl^~Ru)JRqkrzrY z>#sWQ&*>0nSvm%hofMnpOvavMh|PSQ6Z>{IPj2`y%=9yCbl6Os_1hCRq-H<;+4WJ= z9B}&K>P=%WBY4m>bP3D-GP>4U6*v^R&BbxP+`&onZQquG`{uX!Q2Ch(TIY4Ec%ZlpE)sw(D*T+!vZPn7|*iKXwu302#%p>cB_T{b(y*Jw9K+u%#W5`?EILW`M z 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 K^3}3dk^cp_=-Uhc From c1b5b6bc100e7070d1036a097813afb6c29472a2 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 14:59:48 -0400 Subject: [PATCH 162/816] Be consistent with use of double slash --- which-key.el | 168 +++++++++++++++++++++++++-------------------------- 1 file changed, 84 insertions(+), 84 deletions(-) diff --git a/which-key.el b/which-key.el index 167de9b4d86..c3daaa68d74 100644 --- a/which-key.el +++ b/which-key.el @@ -210,7 +210,7 @@ Used when `which-key-popup-type' is frame.") :lighter " WK" (if which-key-mode (progn - (unless which-key--is-setup (which-key/setup)) + (unless which-key--is-setup (which-key//setup)) ;; reduce echo-keystrokes for minibuffer popup ;; (it can interfer if it's too slow) (when (and (> echo-keystrokes 0) @@ -218,18 +218,18 @@ Used when `which-key-popup-type' is frame.") (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) - (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)) + (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 '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))) + (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))) -(defun which-key/setup () +(defun which-key//setup () "Create buffer for which-key." (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer @@ -322,7 +322,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes -(defun which-key/text-width-to-total (text-width) +(defun which-key//text-width-to-total (text-width) "Convert window text-width to window total-width. TEXT-WIDTH is the desired text width of the window. The function calculates what total width is required for a window in the @@ -334,11 +334,11 @@ width as the frame." (+ text-width (/ (frame-fringe-width) char-width) (/ (frame-scroll-bar-width) char-width) - (if (which-key/char-enlarged-p) 1 0) + (if (which-key//char-enlarged-p) 1 0) ;; add padding to account for possible wide (unicode) characters 3))) -(defun which-key/total-width-to-text (total-width) +(defun which-key//total-width-to-text (total-width) "Convert window total-width to window text-width. TOTAL-WIDTH is the desired total width of the window. The function calculates what text width fits such a window. The calculation considers possible fringes @@ -348,20 +348,20 @@ character width as the frame." (- total-width (/ (frame-fringe-width) char-width) (/ (frame-scroll-bar-width) char-width) - (if (which-key/char-enlarged-p) 1 0) + (if (which-key//char-enlarged-p) 1 0) ;; add padding to account for possible wide (unicode) characters 3))) -(defun which-key/char-enlarged-p (&optional frame) +(defun which-key//char-enlarged-p (&optional frame) (> (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) -(defun which-key/char-reduced-p (&optional frame) +(defun which-key//char-reduced-p (&optional frame) (< (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) -(defun which-key/char-exact-p (&optional frame) +(defun which-key//char-exact-p (&optional frame) (= (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) -(defun which-key/width-or-percentage-to-width (width-or-percentage) +(defun which-key//width-or-percentage-to-width (width-or-percentage) "Return window total width. If WIDTH-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it should be a percentage (a number between 0 and 1) out of the frame's width. @@ -371,7 +371,7 @@ total width." width-or-percentage (round (* width-or-percentage (window-total-width (frame-root-window)))))) -(defun which-key/height-or-percentage-to-height (height-or-percentage) +(defun which-key//height-or-percentage-to-height (height-or-percentage) "Return window total height. If HEIGHT-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it should be a percentage (a number between 0 and 1) out of the frame's height. @@ -384,59 +384,59 @@ total height." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Show/hide guide buffer -(defun which-key/hide-popup () +(defun which-key//hide-popup () "This function is called to hide the which-key buffer." (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)) + (minibuffer (which-key//hide-buffer-minibuffer)) + (side-window (which-key//hide-buffer-side-window)) + (frame (which-key//hide-buffer-frame)) (custom (funcall #'which-key/custom-hide-popup-function)))) -(defun which-key/hide-buffer-minibuffer () +(defun which-key//hide-buffer-minibuffer () "Does nothing. Stub for consistency with other hide-buffer functions." nil) -(defun which-key/hide-buffer-side-window () +(defun which-key//hide-buffer-side-window () "Hide which-key buffer when side-window popup is used." (when (buffer-live-p 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 () +(defun which-key//hide-buffer-frame () "Hide which-key buffer when frame popup is used." (when (frame-live-p which-key--frame) (delete-frame which-key--frame))) -(defun which-key/show-popup (act-popup-dim) +(defun which-key//show-popup (act-popup-dim) "Show the which-key buffer. 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." (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)) + (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)) (custom (funcall #'which-key/custom-show-popup-function act-popup-dim))))) -(defun which-key/show-buffer-minibuffer (act-popup-dim) +(defun which-key//show-buffer-minibuffer (act-popup-dim) "Does nothing. Stub for consistency with other show-buffer functions." nil) -(defun which-key/fit-buffer-to-window-horizontally (&optional window &rest params) +(defun which-key//fit-buffer-to-window-horizontally (&optional window &rest params) "Slightly modified version of `fit-buffer-to-window'. Use &rest params because `fit-buffer-to-window' has a different call signature in different emacs versions" (let ((fit-window-to-buffer-horizontally t)) (apply #'fit-window-to-buffer window params))) -(defun which-key/show-buffer-side-window (_act-popup-dim) +(defun which-key//show-buffer-side-window (_act-popup-dim) "Show which-key buffer when popup type is side-window." (let* ((side which-key-side-window-location) - (alist '((window-width . which-key/fit-buffer-to-window-horizontally) + (alist '((window-width . which-key//fit-buffer-to-window-horizontally) (window-height . fit-window-to-buffer)))) ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' ;; were added in Emacs 24.3 @@ -457,7 +457,7 @@ call signature in different emacs versions" (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) +(defun which-key//show-buffer-frame (act-popup-dim) "Show which-key buffer when popup type is frame." (let* ((orig-window (selected-window)) (frame-height (+ (car act-popup-dim) @@ -473,15 +473,15 @@ call signature in different emacs versions" (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)))) + (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 (frame-height frame-width) - "Helper for `which-key/show-buffer-frame'." +(defun which-key//show-buffer-new-frame (frame-height frame-width) + "Helper for `which-key//show-buffer-frame'." (let* ((frame-params `((height . ,frame-height) (width . ,frame-width) ;; tell the window manager to respect the given sizes @@ -504,8 +504,8 @@ call signature in different emacs versions" (redirect-frame-focus (window-frame new-window) orig-frame) new-window))) -(defun which-key/show-buffer-reuse-frame (frame-height frame-width) - "Helper for `which-key/show-buffer-frame'." +(defun which-key//show-buffer-reuse-frame (frame-height frame-width) + "Helper for `which-key//show-buffer-frame'." (let ((window (display-buffer-reuse-window which-key--buffer `((reusable-frames . ,which-key--frame))))) @@ -531,18 +531,18 @@ call signature in different emacs versions" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Max dimension of available window functions -(defun which-key/popup-max-dimensions (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. SELECTED-WINDOW-WIDTH is the width of currently active window, not the which-key buffer window." (cl-case which-key-popup-type - (minibuffer (which-key/minibuffer-max-dimensions)) - (side-window (which-key/side-window-max-dimensions)) - (frame (which-key/frame-max-dimensions)) + (minibuffer (which-key//minibuffer-max-dimensions)) + (side-window (which-key//side-window-max-dimensions)) + (frame (which-key//frame-max-dimensions)) (custom (funcall #'which-key/custom-popup-max-dimensions-function selected-window-width)))) -(defun which-key/minibuffer-max-dimensions () +(defun which-key//minibuffer-max-dimensions () "Return max-dimensions of minibuffer (height . width). Measured in lines and characters respectively." (cons @@ -554,7 +554,7 @@ Measured in lines and characters respectively." ;; width (frame-text-cols))) -(defun which-key/side-window-max-dimensions () +(defun which-key//side-window-max-dimensions () "Return max-dimensions of the side-window popup (height . width) in lines and characters respectively." (cons @@ -563,14 +563,14 @@ width) in lines and characters respectively." (- (frame-height) (window-text-height (minibuffer-window)) 1) ;; 1 is a kludge to make sure there is no overlap ;; (window-mode-line-height which-key--window)) ;; FIXME: change to something like (min which-*-height (calculate-max-height)) - (which-key/height-or-percentage-to-height which-key-side-window-max-height)) + (which-key//height-or-percentage-to-height which-key-side-window-max-height)) ;; width (if (member which-key-side-window-location '(left right)) - (which-key/total-width-to-text (which-key/width-or-percentage-to-width + (which-key//total-width-to-text (which-key//width-or-percentage-to-width which-key-side-window-max-width)) (frame-width)))) -(defun which-key/frame-max-dimensions () +(defun which-key//frame-max-dimensions () "Return max-dimensions of the frame popup (height . width) in lines and characters respectively." (cons which-key-frame-max-height which-key-frame-max-width)) @@ -578,7 +578,7 @@ width) in lines and characters respectively." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for retrieving and formatting keys -(defun which-key/maybe-replace (string repl-alist &optional literal) +(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 @@ -592,7 +592,7 @@ replacement occurs return the new STRING." (replace-match (cdr repl) t literal new-string)))) new-string))) -(defun which-key/maybe-replace-key-based (string keys) +(defun which-key//maybe-replace-key-based (string keys) "KEYS is a key sequence like \"C-c C-c\" and STRING is the description that is possibly replaced using the `which-key-key-based-description-replacement-alist'. Whether or @@ -605,7 +605,7 @@ not a replacement occurs return the new STRING." (str-res (cdr str-res)) (t string)))) -(defun which-key/propertize-key (key) +(defun which-key//propertize-key (key) "Add a face to KEY. If KEY contains any \"special keys\" defined in `which-key-special-keys' then truncate and add the corresponding @@ -623,7 +623,7 @@ If KEY contains any \"special keys\" defined in (substring key-w-face end (length key-w-face)))) key-w-face)))) -(defsubst which-key/truncate-description (desc) +(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) "..") @@ -633,7 +633,7 @@ If KEY contains any \"special keys\" defined in (or (string-match-p "^\\(group:\\|Prefix\\)" description) (keymapp (intern description)))) -(defun which-key/propertize-description (description group) +(defun which-key//propertize-description (description group) "Add face to DESCRIPTION where the face chosen depends on whether the description represents a group or a command. Also make some minor adjustments to the description string, like @@ -642,13 +642,13 @@ removing a \"group:\" prefix." (desc (if (string-match-p "^group:" desc) (substring desc 6) desc)) (desc (if group (concat "+" desc) desc)) - (desc (which-key/truncate-description desc))) + (desc (which-key//truncate-description desc))) (propertize desc 'face (if group 'which-key-group-description-face 'which-key-command-description-face)))) -(defun which-key/format-and-replace (unformatted prefix-keys) +(defun which-key//format-and-replace (unformatted prefix-keys) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." @@ -659,17 +659,17 @@ alists. Returns a list (key separator description)." (desc (cdr key-desc-cons)) (group (which-key//group-p desc)) (keys (concat prefix-keys " " key)) - (key (which-key/maybe-replace + (key (which-key//maybe-replace key which-key-key-replacement-alist)) - (desc (which-key/maybe-replace + (desc (which-key//maybe-replace desc which-key-description-replacement-alist)) - (desc (which-key/maybe-replace-key-based desc keys)) - (key-w-face (which-key/propertize-key key)) - (desc-w-face (which-key/propertize-description desc group))) + (desc (which-key//maybe-replace-key-based desc keys)) + (key-w-face (which-key//propertize-key key)) + (desc-w-face (which-key//propertize-description desc group))) (list key-w-face sep-w-face desc-w-face))) unformatted))) -(defun which-key/get-formatted-key-bindings (buffer key-seq) +(defun which-key//get-formatted-key-bindings (buffer key-seq) "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let ((key-str-qt (regexp-quote (key-description key-seq))) @@ -686,7 +686,7 @@ BUFFER that follow the key sequence KEY-SEQ." desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted :test (lambda (x y) (string-equal (car x) (car y)))))) - (which-key/format-and-replace unformatted (key-description key-seq)))) + (which-key//format-and-replace unformatted (key-description key-seq)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for laying out which-key buffer pages @@ -708,7 +708,7 @@ element in each list element of KEYS." 0 (length (substring-no-properties (nth index y)))))) keys :initial-value 0)) -(defun which-key/create-page-vertical (keys max-lines max-width prefix-width) +(defun which-key//create-page-vertical (keys max-lines max-width prefix-width) "Format KEYS into string representing a single page of text. Creates columns (padded to be of uniform width) of length MAX-LINES until keys run out or MAX-WIDTH is reached. A non-zero @@ -763,7 +763,7 @@ keys to be written into the upper left porition of the page." (setq page (which-key//join-columns all-columns)) (list page act-n-lines act-width rem-keys (- n-keys (length rem-keys))))) -(defun which-key/create-page (keys max-lines max-width prefix-width &optional vertical use-status-key page-n) +(defun which-key//create-page (keys max-lines max-width prefix-width &optional vertical use-status-key page-n) "Create a page of KEYS with parameters MAX-LINES, MAX-WIDTH,PREFIX-WIDTH. Use as many keys as possible. Use as few lines as possible unless VERTICAL is non-nil. USE-STATUS-KEY inserts an informative @@ -771,7 +771,7 @@ message in place of the last key on the page if non-nil. PAGE-N allows for the informative message to reference the current page number." (let* ((n-keys (length keys)) - (first-try (which-key/create-page-vertical keys max-lines max-width prefix-width)) + (first-try (which-key//create-page-vertical keys max-lines max-width prefix-width)) (n-rem-keys (length (nth 3 first-try))) (status-key-i (- n-keys n-rem-keys 1)) (next-try-lines max-lines) @@ -783,7 +783,7 @@ number." (cons 'status (propertize (format "%s keys not shown" (1+ n-rem-keys)) 'face 'font-lock-comment-face))) - (which-key/create-page-vertical (-insert-at status-key-i status-key keys) + (which-key//create-page-vertical (-insert-at status-key-i status-key keys) max-lines max-width prefix-width)) ((or vertical (> n-rem-keys 0) (= 1 max-lines)) first-try) @@ -792,26 +792,26 @@ number." (setq iter-n (1+ iter-n) prev-try next-try next-try-lines (- next-try-lines 1) - next-try (which-key/create-page-vertical + next-try (which-key//create-page-vertical keys next-try-lines max-width prefix-width) n-rem-keys (length (nth 3 next-try)) found (or (= next-try-lines 0) (> n-rem-keys 0)))) prev-try)))) -(defun which-key/populate-buffer (prefix-keys formatted-keys sel-win-width) +(defun which-key//populate-buffer (prefix-keys formatted-keys sel-win-width) "Insert FORMATTED-KEYS into which-key buffer. PREFIX-KEYS may be inserted into the buffer depending on the value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to -`which-key/popup-max-dimensions'." +`which-key//popup-max-dimensions'." (let* ((vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) - (prefix-w-face (which-key/propertize-key prefix-keys)) + (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")))) - (max-dims (which-key/popup-max-dimensions sel-win-width)) + (max-dims (which-key//popup-max-dimensions sel-win-width)) (max-lines (when (car max-dims) (car max-dims))) (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) (avl-width (when (cdr max-dims) (cdr max-dims))) @@ -822,7 +822,7 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to max-pages-reached) (while (and keys-rem (not max-pages-reached) (not no-room)) (setq page-n (1+ page-n) - page-res (which-key/create-page keys-rem + page-res (which-key//create-page keys-rem max-lines avl-width prefix-width vertical which-key-show-remaining-keys page-n)) (push page-res pages) @@ -856,7 +856,7 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update -(defun which-key/update () +(defun which-key//update () "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." (let ((prefix-keys (this-single-command-keys))) @@ -868,25 +868,25 @@ Finally, show the buffer." (keymapp (key-binding prefix-keys))) (let* ((buf (current-buffer)) ;; get formatted key bindings - (formatted-keys (which-key/get-formatted-key-bindings + (formatted-keys (which-key//get-formatted-key-bindings buf prefix-keys)) ;; populate target buffer - (popup-act-dim (which-key/populate-buffer + (popup-act-dim (which-key//populate-buffer (key-description prefix-keys) formatted-keys (window-width)))) ;; show buffer - (which-key/show-popup popup-act-dim))))) + (which-key//show-popup popup-act-dim))))) ;; Timers -(defun which-key/start-open-timer () - "Activate idle timer to trigger `which-key/update'." - (which-key/stop-open-timer) ; start over +(defun which-key//start-open-timer () + "Activate idle timer to trigger `which-key//update'." + (which-key//stop-open-timer) ; start over (setq which-key--open-timer - (run-with-idle-timer which-key-idle-delay t 'which-key/update))) + (run-with-idle-timer which-key-idle-delay t 'which-key//update))) -(defun which-key/stop-open-timer () - "Deactivate idle timer for `which-key/update'." +(defun which-key//stop-open-timer () + "Deactivate idle timer for `which-key//update'." (when which-key--open-timer (cancel-timer which-key--open-timer))) (provide 'which-key) From 3ab7a2eebb7eae9c76745d55876aeed0cd24291a Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jul 2015 19:49:43 -0400 Subject: [PATCH 163/816] Switch to only using dashes for symbol names Matches elisp conventions to the letter --- README.org | 24 +++--- which-key.el | 220 +++++++++++++++++++++++++-------------------------- 2 files changed, 122 insertions(+), 122 deletions(-) diff --git a/README.org b/README.org index e21425814dc..a48ce8f9627 100644 --- a/README.org +++ b/README.org @@ -61,7 +61,7 @@ This functionality is targeting [[https://github.com/syl20bnr/spacemacs][spacema Take over the minibuffer. Setup by default, but you can also use #+BEGIN_SRC emacs-lisp -(which-key/setup-minibuffer) +(which-key-setup-minibuffer) #+END_SRC [[./img/which-key-minibuffer.png]] @@ -73,7 +73,7 @@ variable =max-mini-window-height=. Popup side window on right. For defaults use #+BEGIN_SRC emacs-lisp -(which-key/setup-side-window-right) +(which-key-setup-side-window-right) #+END_SRC Note the defaults are fairly conservative and will tend to not display on @@ -87,7 +87,7 @@ width (see =M-x customize-group which-key=). Popup side window on bottom. For defaults use #+BEGIN_SRC emacs-lisp -(which-key/setup-side-window-bottom) +(which-key-setup-side-window-bottom) #+END_SRC [[./img/which-key-bottom.png]] @@ -141,29 +141,29 @@ further options: *** custom Write your own display functions! This requires you to write three functions, -=which-key/custom-popup-max-dimensions-function=, -=which-key/custom-show-popup-function=, and -=which-key/custom-hide-popup-function=. Refer to the documentation for those +=which-key-custom-popup-max-dimensions-function=, +=which-key-custom-show-popup-function=, and +=which-key-custom-hide-popup-function=. Refer to the documentation for those variables for more information, but here is a working example (this is the current implementation of side-window bottom). #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'custom) -(defun which-key/custom-popup-max-dimensions-function (ignore) +(defun which-key-custom-popup-max-dimensions-function (ignore) (cons - (which-key/height-or-percentage-to-height which-key-side-window-max-height) + (which-key-height-or-percentage-to-height which-key-side-window-max-height) (frame-width))) (defun fit-horizonatally () (let ((fit-window-to-buffer-horizontally t)) (fit-window-to-buffer))) -(defun which-key/custom-show-popup-function (act-popup-dim) +(defun which-key-custom-show-popup-function (act-popup-dim) (let* ((alist '((window-width . fit-horizontally) (window-height . fit-window-to-buffer)))) (if (get-buffer-window which-key--buffer) (display-buffer-reuse-window which-key--buffer alist) (display-buffer-in-major-side-window which-key--buffer 'bottom 0 alist)))) -(defun which-key/custom-hide-popup-function () +(defun which-key-custom-hide-popup-function () (when (buffer-live-p which-key--buffer) (quit-windows-on which-key--buffer))) #+END_SRC @@ -197,8 +197,8 @@ type of entries. In case the same key combination is listed under a major-mode and by itself, the major-mode version will take precedence. There are two helper functions to add entries to this list, -=which-key/add-key-based-replacements= and -=which-key/add-major-mode-key-based-replacements=. You can modify the alist +=which-key-add-key-based-replacements= and +=which-key-add-major-mode-key-based-replacements=. You can modify the alist directly or use these. *** Key and Description replacement diff --git a/which-key.el b/which-key.el index c3daaa68d74..d2cc7372b92 100644 --- a/which-key.el +++ b/which-key.el @@ -167,19 +167,19 @@ a percentage out of the frame's height." :group 'which-key) ;; Custom popup -(defcustom which-key/custom-popup-max-dimensions-function nil +(defcustom which-key-custom-popup-max-dimensions-function nil "Variable to hold a custom max-dimensions function. Will be passed the width of the active window and is expected to return the maximum height in lines and width in characters of the which-key popup in the form a cons cell (height . width)." :group 'which-key :type 'function) -(defcustom which-key/custom-hide-popup-function nil +(defcustom which-key-custom-hide-popup-function nil "Variable to hold a custom hide-popup function. It takes no arguments and the return value is ignored." :group 'which-key :type 'function) -(defcustom which-key/custom-show-popup-function nil +(defcustom which-key-custom-show-popup-function nil "Variable to hold a custom show-popup function. Will be passed the required dimensions in the form (height . width) in lines and characters respectively. The return value is @@ -210,7 +210,7 @@ Used when `which-key-popup-type' is frame.") :lighter " WK" (if which-key-mode (progn - (unless which-key--is-setup (which-key//setup)) + (unless which-key--is-setup (which-key--setup)) ;; reduce echo-keystrokes for minibuffer popup ;; (it can interfer if it's too slow) (when (and (> echo-keystrokes 0) @@ -218,18 +218,18 @@ Used when `which-key-popup-type' is frame.") (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) - (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)) + (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 '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))) + (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))) -(defun which-key//setup () +(defun which-key--setup () "Create buffer for which-key." (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer @@ -243,7 +243,7 @@ Used when `which-key-popup-type' is frame.") ;; configurations ;;;###autoload -(defun which-key/setup-side-window-right () +(defun which-key-setup-side-window-right () "Apply suggested settings for side-window that opens on right." (interactive) (setq which-key-popup-type 'side-window @@ -251,7 +251,7 @@ Used when `which-key-popup-type' is frame.") which-key-show-prefix 'top)) ;;;###autoload -(defun which-key/setup-side-window-bottom () +(defun which-key-setup-side-window-bottom () "Apply suggested settings for side-window that opens on bottom." (interactive) @@ -260,7 +260,7 @@ bottom." which-key-show-prefix nil)) ;;;###autoload -(defun which-key/setup-minibuffer () +(defun which-key-setup-minibuffer () "Apply suggested settings for minibuffer." (interactive) (setq which-key-popup-type 'minibuffer @@ -269,7 +269,7 @@ bottom." ;; Helper functions to modify replacement lists. -(defun which-key//add-key-based-replacements (alist key repl) +(defun which-key--add-key-based-replacements (alist key repl) "Internal function to add (KEY . REPL) to ALIST." (when (or (not (stringp key)) (not (stringp repl))) (error "KEY and REPL should be strings")) @@ -282,11 +282,11 @@ bottom." (t (cons (cons key repl) alist)))) ;;;###autoload -(defun which-key/add-key-based-replacements (key-sequence replacement &rest more) +(defun which-key-add-key-based-replacements (key-sequence replacement &rest more) "Replace the description of KEY-SEQUENCE with REPLACEMENT. Both KEY-SEQUENCE and REPLACEMENT should be strings. For Example, -\(which-key/add-key-based-replacements \"C-x 1\" \"maximize\"\) +\(which-key-add-key-based-replacements \"C-x 1\" \"maximize\"\) MORE allows you to specifcy additional KEY REPL pairs. All replacements are added to @@ -294,14 +294,14 @@ replacements are added to ;; TODO: Make interactive (while key-sequence (setq which-key-key-based-description-replacement-alist - (which-key//add-key-based-replacements + (which-key--add-key-based-replacements which-key-key-based-description-replacement-alist key-sequence replacement)) (setq key-sequence (pop more) replacement (pop more)))) ;;;###autoload -(defun which-key/add-major-mode-key-based-replacements (mode key-sequence replacement &rest more) - "Functions like `which-key/add-key-based-replacements'. +(defun which-key-add-major-mode-key-based-replacements (mode key-sequence replacement &rest more) + "Functions like `which-key-add-key-based-replacements'. The difference is that MODE specifies the `major-mode' that must be active for KEY-SEQUENCE and REPLACEMENT (MORE contains addition KEY-SEQUENCE REPLACEMENT pairs) to apply." @@ -310,7 +310,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (error "MODE should be a symbol corresponding to a value of major-mode")) (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) (while key-sequence - (setq mode-alist (which-key//add-key-based-replacements mode-alist key-sequence replacement)) + (setq mode-alist (which-key--add-key-based-replacements mode-alist key-sequence replacement)) (setq key-sequence (pop more) replacement (pop more))) (if (assq mode which-key-key-based-description-replacement-alist) (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) @@ -322,7 +322,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes -(defun which-key//text-width-to-total (text-width) +(defun which-key--text-width-to-total (text-width) "Convert window text-width to window total-width. TEXT-WIDTH is the desired text width of the window. The function calculates what total width is required for a window in the @@ -334,11 +334,11 @@ width as the frame." (+ text-width (/ (frame-fringe-width) char-width) (/ (frame-scroll-bar-width) char-width) - (if (which-key//char-enlarged-p) 1 0) + (if (which-key--char-enlarged-p) 1 0) ;; add padding to account for possible wide (unicode) characters 3))) -(defun which-key//total-width-to-text (total-width) +(defun which-key--total-width-to-text (total-width) "Convert window total-width to window text-width. TOTAL-WIDTH is the desired total width of the window. The function calculates what text width fits such a window. The calculation considers possible fringes @@ -348,20 +348,20 @@ character width as the frame." (- total-width (/ (frame-fringe-width) char-width) (/ (frame-scroll-bar-width) char-width) - (if (which-key//char-enlarged-p) 1 0) + (if (which-key--char-enlarged-p) 1 0) ;; add padding to account for possible wide (unicode) characters 3))) -(defun which-key//char-enlarged-p (&optional frame) +(defun which-key--char-enlarged-p (&optional frame) (> (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) -(defun which-key//char-reduced-p (&optional frame) +(defun which-key--char-reduced-p (&optional frame) (< (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) -(defun which-key//char-exact-p (&optional frame) +(defun which-key--char-exact-p (&optional frame) (= (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) -(defun which-key//width-or-percentage-to-width (width-or-percentage) +(defun which-key--width-or-percentage-to-width (width-or-percentage) "Return window total width. If WIDTH-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it should be a percentage (a number between 0 and 1) out of the frame's width. @@ -371,7 +371,7 @@ total width." width-or-percentage (round (* width-or-percentage (window-total-width (frame-root-window)))))) -(defun which-key//height-or-percentage-to-height (height-or-percentage) +(defun which-key--height-or-percentage-to-height (height-or-percentage) "Return window total height. If HEIGHT-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it should be a percentage (a number between 0 and 1) out of the frame's height. @@ -384,59 +384,59 @@ total height." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Show/hide guide buffer -(defun which-key//hide-popup () +(defun which-key--hide-popup () "This function is called to hide the which-key buffer." (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)) - (custom (funcall #'which-key/custom-hide-popup-function)))) + (minibuffer (which-key--hide-buffer-minibuffer)) + (side-window (which-key--hide-buffer-side-window)) + (frame (which-key--hide-buffer-frame)) + (custom (funcall #'which-key-custom-hide-popup-function)))) -(defun which-key//hide-buffer-minibuffer () +(defun which-key--hide-buffer-minibuffer () "Does nothing. Stub for consistency with other hide-buffer functions." nil) -(defun which-key//hide-buffer-side-window () +(defun which-key--hide-buffer-side-window () "Hide which-key buffer when side-window popup is used." (when (buffer-live-p 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 () +(defun which-key--hide-buffer-frame () "Hide which-key buffer when frame popup is used." (when (frame-live-p which-key--frame) (delete-frame which-key--frame))) -(defun which-key//show-popup (act-popup-dim) +(defun which-key--show-popup (act-popup-dim) "Show the which-key buffer. 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." (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)) - (custom (funcall #'which-key/custom-show-popup-function act-popup-dim))))) + (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)) + (custom (funcall #'which-key-custom-show-popup-function act-popup-dim))))) -(defun which-key//show-buffer-minibuffer (act-popup-dim) +(defun which-key--show-buffer-minibuffer (act-popup-dim) "Does nothing. Stub for consistency with other show-buffer functions." nil) -(defun which-key//fit-buffer-to-window-horizontally (&optional window &rest params) +(defun which-key--fit-buffer-to-window-horizontally (&optional window &rest params) "Slightly modified version of `fit-buffer-to-window'. Use &rest params because `fit-buffer-to-window' has a different call signature in different emacs versions" (let ((fit-window-to-buffer-horizontally t)) (apply #'fit-window-to-buffer window params))) -(defun which-key//show-buffer-side-window (_act-popup-dim) +(defun which-key--show-buffer-side-window (_act-popup-dim) "Show which-key buffer when popup type is side-window." (let* ((side which-key-side-window-location) - (alist '((window-width . which-key//fit-buffer-to-window-horizontally) + (alist '((window-width . which-key--fit-buffer-to-window-horizontally) (window-height . fit-window-to-buffer)))) ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' ;; were added in Emacs 24.3 @@ -457,7 +457,7 @@ call signature in different emacs versions" (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) +(defun which-key--show-buffer-frame (act-popup-dim) "Show which-key buffer when popup type is frame." (let* ((orig-window (selected-window)) (frame-height (+ (car act-popup-dim) @@ -473,15 +473,15 @@ call signature in different emacs versions" (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)))) + (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 (frame-height frame-width) - "Helper for `which-key//show-buffer-frame'." +(defun which-key--show-buffer-new-frame (frame-height frame-width) + "Helper for `which-key--show-buffer-frame'." (let* ((frame-params `((height . ,frame-height) (width . ,frame-width) ;; tell the window manager to respect the given sizes @@ -504,8 +504,8 @@ call signature in different emacs versions" (redirect-frame-focus (window-frame new-window) orig-frame) new-window))) -(defun which-key//show-buffer-reuse-frame (frame-height frame-width) - "Helper for `which-key//show-buffer-frame'." +(defun which-key--show-buffer-reuse-frame (frame-height frame-width) + "Helper for `which-key--show-buffer-frame'." (let ((window (display-buffer-reuse-window which-key--buffer `((reusable-frames . ,which-key--frame))))) @@ -515,7 +515,7 @@ call signature in different emacs versions" window))) ;; Keep for popwin maybe (Used to work) -;; (defun which-key/show-buffer-popwin (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 ;; :height height @@ -523,7 +523,7 @@ call signature in different emacs versions" ;; :noselect t ;; :position which-key-side-window-location)) -;; (defun which-key/hide-buffer-popwin () +;; (defun which-key-hide-buffer-popwin () ;; "Hide popwin buffer." ;; (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) ;; (popwin:close-popup-window))) @@ -531,18 +531,18 @@ call signature in different emacs versions" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Max dimension of available window functions -(defun which-key//popup-max-dimensions (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. SELECTED-WINDOW-WIDTH is the width of currently active window, not the which-key buffer window." (cl-case which-key-popup-type - (minibuffer (which-key//minibuffer-max-dimensions)) - (side-window (which-key//side-window-max-dimensions)) - (frame (which-key//frame-max-dimensions)) - (custom (funcall #'which-key/custom-popup-max-dimensions-function selected-window-width)))) + (minibuffer (which-key--minibuffer-max-dimensions)) + (side-window (which-key--side-window-max-dimensions)) + (frame (which-key--frame-max-dimensions)) + (custom (funcall #'which-key-custom-popup-max-dimensions-function selected-window-width)))) -(defun which-key//minibuffer-max-dimensions () +(defun which-key--minibuffer-max-dimensions () "Return max-dimensions of minibuffer (height . width). Measured in lines and characters respectively." (cons @@ -554,7 +554,7 @@ Measured in lines and characters respectively." ;; width (frame-text-cols))) -(defun which-key//side-window-max-dimensions () +(defun which-key--side-window-max-dimensions () "Return max-dimensions of the side-window popup (height . width) in lines and characters respectively." (cons @@ -563,14 +563,14 @@ width) in lines and characters respectively." (- (frame-height) (window-text-height (minibuffer-window)) 1) ;; 1 is a kludge to make sure there is no overlap ;; (window-mode-line-height which-key--window)) ;; FIXME: change to something like (min which-*-height (calculate-max-height)) - (which-key//height-or-percentage-to-height which-key-side-window-max-height)) + (which-key--height-or-percentage-to-height which-key-side-window-max-height)) ;; width (if (member which-key-side-window-location '(left right)) - (which-key//total-width-to-text (which-key//width-or-percentage-to-width + (which-key--total-width-to-text (which-key--width-or-percentage-to-width which-key-side-window-max-width)) (frame-width)))) -(defun which-key//frame-max-dimensions () +(defun which-key--frame-max-dimensions () "Return max-dimensions of the frame popup (height . width) in lines and characters respectively." (cons which-key-frame-max-height which-key-frame-max-width)) @@ -578,7 +578,7 @@ width) in lines and characters respectively." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for retrieving and formatting keys -(defun which-key//maybe-replace (string repl-alist &optional literal) +(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 @@ -592,7 +592,7 @@ replacement occurs return the new STRING." (replace-match (cdr repl) t literal new-string)))) new-string))) -(defun which-key//maybe-replace-key-based (string keys) +(defun which-key--maybe-replace-key-based (string keys) "KEYS is a key sequence like \"C-c C-c\" and STRING is the description that is possibly replaced using the `which-key-key-based-description-replacement-alist'. Whether or @@ -605,7 +605,7 @@ not a replacement occurs return the new STRING." (str-res (cdr str-res)) (t string)))) -(defun which-key//propertize-key (key) +(defun which-key--propertize-key (key) "Add a face to KEY. If KEY contains any \"special keys\" defined in `which-key-special-keys' then truncate and add the corresponding @@ -623,17 +623,17 @@ If KEY contains any \"special keys\" defined in (substring key-w-face end (length key-w-face)))) key-w-face)))) -(defsubst which-key//truncate-description (desc) +(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)) -(defsubst which-key//group-p (description) +(defsubst which-key--group-p (description) (or (string-match-p "^\\(group:\\|Prefix\\)" description) (keymapp (intern description)))) -(defun which-key//propertize-description (description group) +(defun which-key--propertize-description (description group) "Add face to DESCRIPTION where the face chosen depends on whether the description represents a group or a command. Also make some minor adjustments to the description string, like @@ -642,13 +642,13 @@ removing a \"group:\" prefix." (desc (if (string-match-p "^group:" desc) (substring desc 6) desc)) (desc (if group (concat "+" desc) desc)) - (desc (which-key//truncate-description desc))) + (desc (which-key--truncate-description desc))) (propertize desc 'face (if group 'which-key-group-description-face 'which-key-command-description-face)))) -(defun which-key//format-and-replace (unformatted prefix-keys) +(defun which-key--format-and-replace (unformatted prefix-keys) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." @@ -657,19 +657,19 @@ alists. Returns a list (key separator description)." (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) (desc (cdr key-desc-cons)) - (group (which-key//group-p desc)) + (group (which-key--group-p desc)) (keys (concat prefix-keys " " key)) - (key (which-key//maybe-replace + (key (which-key--maybe-replace key which-key-key-replacement-alist)) - (desc (which-key//maybe-replace + (desc (which-key--maybe-replace desc which-key-description-replacement-alist)) - (desc (which-key//maybe-replace-key-based desc keys)) - (key-w-face (which-key//propertize-key key)) - (desc-w-face (which-key//propertize-description desc group))) + (desc (which-key--maybe-replace-key-based desc keys)) + (key-w-face (which-key--propertize-key key)) + (desc-w-face (which-key--propertize-description desc group))) (list key-w-face sep-w-face desc-w-face))) unformatted))) -(defun which-key//get-formatted-key-bindings (buffer key-seq) +(defun which-key--get-formatted-key-bindings (buffer key-seq) "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let ((key-str-qt (regexp-quote (key-description key-seq))) @@ -686,12 +686,12 @@ BUFFER that follow the key sequence KEY-SEQ." desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted :test (lambda (x y) (string-equal (car x) (car y)))))) - (which-key//format-and-replace unformatted (key-description key-seq)))) + (which-key--format-and-replace unformatted (key-description key-seq)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for laying out which-key buffer pages -(defsubst which-key//join-columns (columns) +(defsubst which-key--join-columns (columns) "Transpose columns into rows, concat rows into lines and concat rows into page." (let* (;; pad reversed columns to same length (padded (apply (apply-partially #'-pad "") (reverse columns))) @@ -700,7 +700,7 @@ BUFFER that follow the key sequence KEY-SEQ." ;; join lines by space and rows by newline (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n"))) -(defsubst which-key//max-len (keys index) +(defsubst which-key--max-len (keys index) "Internal function for finding the max length of the INDEX element in each list element of KEYS." (cl-reduce @@ -708,7 +708,7 @@ element in each list element of KEYS." 0 (length (substring-no-properties (nth index y)))))) keys :initial-value 0)) -(defun which-key//create-page-vertical (keys max-lines max-width prefix-width) +(defun which-key--create-page-vertical (keys max-lines max-width prefix-width) "Format KEYS into string representing a single page of text. Creates columns (padded to be of uniform width) of length MAX-LINES until keys run out or MAX-WIDTH is reached. A non-zero @@ -739,9 +739,9 @@ keys to be written into the upper left porition of the page." prev-rem-keys rem-keys rem-keys (cadr col-split) n-col-lines (min avl-lines (length rem-keys)) - col-key-width (which-key//max-len col-keys 0) - col-sep-width (which-key//max-len col-keys 1) - col-desc-width (which-key//max-len col-keys 2) + col-key-width (which-key--max-len col-keys 0) + col-sep-width (which-key--max-len col-keys 1) + col-desc-width (which-key--max-len col-keys 2) col-width (+ 3 col-key-width col-sep-width col-desc-width) new-column (mapcar (lambda (k) @@ -760,10 +760,10 @@ keys to be written into the upper left porition of the page." (setq done t rem-keys prev-rem-keys)) (when (<= (length rem-keys) 0) (setq done t))) - (setq page (which-key//join-columns all-columns)) + (setq page (which-key--join-columns all-columns)) (list page act-n-lines act-width rem-keys (- n-keys (length rem-keys))))) -(defun which-key//create-page (keys max-lines max-width prefix-width &optional vertical use-status-key page-n) +(defun which-key--create-page (keys max-lines max-width prefix-width &optional vertical use-status-key page-n) "Create a page of KEYS with parameters MAX-LINES, MAX-WIDTH,PREFIX-WIDTH. Use as many keys as possible. Use as few lines as possible unless VERTICAL is non-nil. USE-STATUS-KEY inserts an informative @@ -771,7 +771,7 @@ message in place of the last key on the page if non-nil. PAGE-N allows for the informative message to reference the current page number." (let* ((n-keys (length keys)) - (first-try (which-key//create-page-vertical keys max-lines max-width prefix-width)) + (first-try (which-key--create-page-vertical keys max-lines max-width prefix-width)) (n-rem-keys (length (nth 3 first-try))) (status-key-i (- n-keys n-rem-keys 1)) (next-try-lines max-lines) @@ -783,7 +783,7 @@ number." (cons 'status (propertize (format "%s keys not shown" (1+ n-rem-keys)) 'face 'font-lock-comment-face))) - (which-key//create-page-vertical (-insert-at status-key-i status-key keys) + (which-key--create-page-vertical (-insert-at status-key-i status-key keys) max-lines max-width prefix-width)) ((or vertical (> n-rem-keys 0) (= 1 max-lines)) first-try) @@ -792,26 +792,26 @@ number." (setq iter-n (1+ iter-n) prev-try next-try next-try-lines (- next-try-lines 1) - next-try (which-key//create-page-vertical + next-try (which-key--create-page-vertical keys next-try-lines max-width prefix-width) n-rem-keys (length (nth 3 next-try)) found (or (= next-try-lines 0) (> n-rem-keys 0)))) prev-try)))) -(defun which-key//populate-buffer (prefix-keys formatted-keys sel-win-width) +(defun which-key--populate-buffer (prefix-keys formatted-keys sel-win-width) "Insert FORMATTED-KEYS into which-key buffer. PREFIX-KEYS may be inserted into the buffer depending on the value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to -`which-key//popup-max-dimensions'." +`which-key--popup-max-dimensions'." (let* ((vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) - (prefix-w-face (which-key//propertize-key prefix-keys)) + (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")))) - (max-dims (which-key//popup-max-dimensions sel-win-width)) + (max-dims (which-key--popup-max-dimensions sel-win-width)) (max-lines (when (car max-dims) (car max-dims))) (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) (avl-width (when (cdr max-dims) (cdr max-dims))) @@ -822,7 +822,7 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to max-pages-reached) (while (and keys-rem (not max-pages-reached) (not no-room)) (setq page-n (1+ page-n) - page-res (which-key//create-page keys-rem + page-res (which-key--create-page keys-rem max-lines avl-width prefix-width vertical which-key-show-remaining-keys page-n)) (push page-res pages) @@ -856,7 +856,7 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update -(defun which-key//update () +(defun which-key--update () "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." (let ((prefix-keys (this-single-command-keys))) @@ -868,25 +868,25 @@ Finally, show the buffer." (keymapp (key-binding prefix-keys))) (let* ((buf (current-buffer)) ;; get formatted key bindings - (formatted-keys (which-key//get-formatted-key-bindings + (formatted-keys (which-key--get-formatted-key-bindings buf prefix-keys)) ;; populate target buffer - (popup-act-dim (which-key//populate-buffer + (popup-act-dim (which-key--populate-buffer (key-description prefix-keys) formatted-keys (window-width)))) ;; show buffer - (which-key//show-popup popup-act-dim))))) + (which-key--show-popup popup-act-dim))))) ;; Timers -(defun which-key//start-open-timer () - "Activate idle timer to trigger `which-key//update'." - (which-key//stop-open-timer) ; start over +(defun which-key--start-open-timer () + "Activate idle timer to trigger `which-key--update'." + (which-key--stop-open-timer) ; start over (setq which-key--open-timer - (run-with-idle-timer which-key-idle-delay t 'which-key//update))) + (run-with-idle-timer which-key-idle-delay t 'which-key--update))) -(defun which-key//stop-open-timer () - "Deactivate idle timer for `which-key//update'." +(defun which-key--stop-open-timer () + "Deactivate idle timer for `which-key--update'." (when which-key--open-timer (cancel-timer which-key--open-timer))) (provide 'which-key) From fadd5fda44b7359e2921f46882a7d25ec1bcc5e6 Mon Sep 17 00:00:00 2001 From: Syohei YOSHIDA Date: Wed, 15 Jul 2015 10:35:13 +0900 Subject: [PATCH 164/816] Remove hash quotes They are variables, not functions, so hash quotes are not necessary. --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index d2cc7372b92..42cc1401a13 100644 --- a/which-key.el +++ b/which-key.el @@ -390,7 +390,7 @@ total height." (minibuffer (which-key--hide-buffer-minibuffer)) (side-window (which-key--hide-buffer-side-window)) (frame (which-key--hide-buffer-frame)) - (custom (funcall #'which-key-custom-hide-popup-function)))) + (custom (funcall which-key-custom-hide-popup-function)))) (defun which-key--hide-buffer-minibuffer () "Does nothing. @@ -419,7 +419,7 @@ is shown, or if there is no need to start the closing timer." (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)) - (custom (funcall #'which-key-custom-show-popup-function act-popup-dim))))) + (custom (funcall which-key-custom-show-popup-function act-popup-dim))))) (defun which-key--show-buffer-minibuffer (act-popup-dim) "Does nothing. @@ -540,7 +540,7 @@ window." (minibuffer (which-key--minibuffer-max-dimensions)) (side-window (which-key--side-window-max-dimensions)) (frame (which-key--frame-max-dimensions)) - (custom (funcall #'which-key-custom-popup-max-dimensions-function selected-window-width)))) + (custom (funcall which-key-custom-popup-max-dimensions-function selected-window-width)))) (defun which-key--minibuffer-max-dimensions () "Return max-dimensions of minibuffer (height . width). From 84a234652534fecb417265fa777a4345ace51f30 Mon Sep 17 00:00:00 2001 From: Steve Purcell Date: Wed, 15 Jul 2015 20:08:24 +1200 Subject: [PATCH 165/816] Misc formatting fixes - Inline standard license blurb - Define parent of custom group - Insert missing blank lines between top-level declarations --- which-key.el | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index d2cc7372b92..2b7f58ed1d3 100644 --- a/which-key.el +++ b/which-key.el @@ -8,11 +8,23 @@ ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) +;; 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 . + ;;; Commentary: -;; + ;; This is a rewrite of guide-key https://github.com/kai2nenobu/guide-key. See ;; https://github.com/justbur/emacs-which-key for more information. -;; ;;; Code: @@ -20,11 +32,16 @@ (require 's) (require 'dash) -(defgroup which-key nil "Customization options for which-key-mode") +(defgroup which-key nil + "Customization options for which-key-mode" + :group 'help + :prefix "which-key-") + (defcustom which-key-idle-delay 1.0 "Delay (in seconds) for which-key buffer to popup." :group 'which-key :type 'float) + (defcustom which-key-echo-keystrokes (min echo-keystrokes (/ (float which-key-idle-delay) 4)) "Value to use for `echo-keystrokes'. @@ -33,15 +50,18 @@ needs to be less than `which-key-idle-delay' or else the echo will erase the which-key popup." :group 'which-key :type 'float) + (defcustom which-key-max-description-length 27 "Truncate the description of keys to this length. Also adds \"..\"." :group 'which-key :type 'integer) + (defcustom which-key-separator "→" "Separator to use between key and description." :group 'which-key :type 'string) + (defcustom which-key-unicode-correction 3 "Correction for wide unicode characters. Since we measure width in terms of the number of characters, @@ -57,6 +77,7 @@ number if you are seeing charaters get cutoff on the right side of the which-key popup." :group 'which-key :type 'integer) + (defcustom which-key-key-replacement-alist '(("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") ("left" . "←") ("right" . "→")) "The strings in the car of each cons are replaced with the @@ -64,12 +85,14 @@ strings in the cdr for each key. Elisp regexp can be used as in the first example." :group 'which-key :type '(alist :key-type regexp :value-type string)) + (defcustom which-key-description-replacement-alist '(("Prefix Command" . "prefix")) "See `which-key-key-replacement-alist'. This is a list of lists for replacing descriptions." :group 'which-key :type '(alist :key-type regexp :value-type string)) + (defcustom 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 @@ -84,15 +107,18 @@ is overwritten with \"find files\". The second case works the same way using the alist matched when `major-mode' is emacs-lisp-mode." :group 'which-key) + (defcustom 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." :group 'which-key :type '(repeat string)) + (defcustom which-key-buffer-name "*which-key*" "Name of which-key buffer." :group 'which-key :type 'string) + (defcustom which-key-show-prefix 'left "Whether to and where to display the current prefix sequence. Possible choices are left (the default), top and nil. Nil turns @@ -101,6 +127,7 @@ the feature off." :type '(radio (const :tag "Left of keys" left) (const :tag "In first line" top) (const :tag "Hide" nil))) + (defcustom which-key-popup-type 'minibuffer "Supported types are minibuffer, side-window, frame, and custom." :group 'which-key @@ -108,6 +135,7 @@ the feature off." (const :tag "Show in side window" side-window) (const :tag "Show in popup frame" frame) (const :tag "Use your custom display functions" custom))) + (defcustom 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." @@ -116,6 +144,7 @@ Should be one of top, bottom, left or right." (const bottom) (const left) (const top))) + (defcustom which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window and location is left or right. @@ -123,6 +152,7 @@ This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's width." :group 'which-key :type 'float) + (defcustom which-key-side-window-max-height 0.25 "Maximum height of which-key popup when type is side-window and location is top or bottom. @@ -130,14 +160,17 @@ This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's height." :group 'which-key :type 'float) + (defcustom which-key-frame-max-width 60 "Maximum width of which-key popup when type is frame." :group 'which-key :type 'integer) + (defcustom which-key-frame-max-height 20 "Maximum height of which-key popup when type is frame." :group 'which-key :type 'integer) + (defcustom which-key-show-remaining-keys t "Show remaining keys in last slot, when keys are hidden." :group 'which-key @@ -149,18 +182,22 @@ a percentage out of the frame's height." '((t . (:inherit font-lock-constant-face))) "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)" :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" :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" :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)" @@ -174,11 +211,13 @@ return the maximum height in lines and width in characters of the which-key popup in the form a cons cell (height . width)." :group 'which-key :type 'function) + (defcustom which-key-custom-hide-popup-function nil "Variable to hold a custom hide-popup function. It takes no arguments and the return value is ignored." :group 'which-key :type 'function) + (defcustom which-key-custom-show-popup-function nil "Variable to hold a custom show-popup function. Will be passed the required dimensions in the form (height . @@ -888,6 +927,7 @@ Finally, show the buffer." (defun which-key--stop-open-timer () "Deactivate idle timer for `which-key--update'." (when which-key--open-timer (cancel-timer which-key--open-timer))) -(provide 'which-key) + +(provide 'which-key) ;;; which-key.el ends here From be66556faf84003c9cd190fe370231ac1bc7beeb Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 09:59:24 -0400 Subject: [PATCH 166/816] Remove useless when --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index a72187b3961..bfc0ff5e5d2 100644 --- a/which-key.el +++ b/which-key.el @@ -851,9 +851,9 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to (concat prefix-w-face " ") (concat prefix-w-face "-\n")))) (max-dims (which-key--popup-max-dimensions sel-win-width)) - (max-lines (when (car max-dims) (car max-dims))) + (max-lines (car max-dims)) + (avl-width (cdr max-dims)) (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) - (avl-width (when (cdr max-dims) (cdr max-dims))) (keys-rem formatted-keys) (max-pages (+ 1 (length formatted-keys))) (page-n 0) From 742a9039fcd379851c0be3665516f44977e7b598 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 10:47:02 -0400 Subject: [PATCH 167/816] Add ability to temporarily prevent popups --- which-key.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index bfc0ff5e5d2..067283a96e0 100644 --- a/which-key.el +++ b/which-key.el @@ -226,6 +226,13 @@ ignored." :group 'which-key :type 'function) +(defvar which-key-inhibit nil + "Prevent guide-key from popping up momentarily by setting this +to a non-nil value for the execution of a command. Like this + +\(let \(\(which-key-inhibit t\)\) +...\)") + ;; Internal Vars ;; (defvar popwin:popup-buffer nil) (defvar which-key--buffer nil @@ -904,7 +911,8 @@ Finally, show the buffer." ;; (when (> (length prefix-keys) 0) ;; (message "key binding: %s" (key-binding prefix-keys))) (when (and (> (length prefix-keys) 0) - (keymapp (key-binding prefix-keys))) + (keymapp (key-binding prefix-keys)) + (not which-key-inhibit)) (let* ((buf (current-buffer)) ;; get formatted key bindings (formatted-keys (which-key--get-formatted-key-bindings From a640439125e080b600cc75652e71a3e7803b72ac Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 13:11:12 -0400 Subject: [PATCH 168/816] Fix typos --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 067283a96e0..174a50378b2 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.1 +;; Version: 0.2 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) @@ -70,7 +70,7 @@ the calculation for available width in the which-key buffer. This variable allows you to adjust for the wide unicode characters by artificially reducing the available width in the buffer. -The default of 1 means allow for the total extra width +The default of 3 means allow for the total extra width contributed by any wide unicode characters to be up to one additional ASCII character in the which-key buffer. Increase this number if you are seeing charaters get cutoff on the right side From abbedca80430738f9837598f675871df4a6532c1 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 13:16:21 -0400 Subject: [PATCH 169/816] Don't show echo-keystroke note more than once Fix #38 --- which-key.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index 174a50378b2..d9ca4ac7961 100644 --- a/which-key.el +++ b/which-key.el @@ -256,14 +256,15 @@ Used when `which-key-popup-type' is frame.") :lighter " WK" (if which-key-mode (progn - (unless which-key--is-setup (which-key--setup)) - ;; 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 which-key-echo-keystrokes) - (message "Which-key-mode enabled (note echo-keystrokes changed from %s to %s)" - which-key--echo-keystrokes-backup echo-keystrokes)) + (unless which-key--is-setup + (which-key--setup) + ;; 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 which-key-echo-keystrokes) + (message "Which-key: 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) @@ -321,7 +322,7 @@ bottom." (error "KEY and REPL should be strings")) (cond ((null alist) (list (cons key repl))) ((assoc-string key alist) - (message "which-key note: The key %s already exists in %s. This addition will override that replacement." + (message "Which-key: note the key %s already exists in %s. This addition will override that replacement." key alist) (setcdr (assoc-string key alist) repl) alist) From 909ebe487644b8f403e027d7ddfae63b3d441bd8 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 14:11:04 -0400 Subject: [PATCH 170/816] Better notes --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index d9ca4ac7961..f2edf7901c6 100644 --- a/which-key.el +++ b/which-key.el @@ -263,7 +263,7 @@ Used when `which-key-popup-type' is frame.") (when (and (> echo-keystrokes 0) (eq which-key-popup-type 'minibuffer)) (setq echo-keystrokes which-key-echo-keystrokes) - (message "Which-key: note echo-keystrokes changed from %s to %s" + (message "which-key: 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) @@ -322,7 +322,7 @@ bottom." (error "KEY and REPL should be strings")) (cond ((null alist) (list (cons key repl))) ((assoc-string key alist) - (message "Which-key: note the key %s already exists in %s. This addition will override that replacement." + (message "which-key: the key %s already exists in %s. This addition will override that replacement." key alist) (setcdr (assoc-string key alist) repl) alist) From 5c0c3c4bc9c998e9ce81979719ea9a485dcde960 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 20:12:09 -0400 Subject: [PATCH 171/816] Fix #39 `iso-transl-ctl-x-8-map' is not checked with `key-binding' because it's stored in the `key-translation-map', so this adds a test against this map. --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f2edf7901c6..3683b39f34c 100644 --- a/which-key.el +++ b/which-key.el @@ -912,7 +912,10 @@ Finally, show the buffer." ;; (when (> (length prefix-keys) 0) ;; (message "key binding: %s" (key-binding prefix-keys))) (when (and (> (length prefix-keys) 0) - (keymapp (key-binding prefix-keys)) + (or + (keymapp (key-binding prefix-keys)) + ;; Some keymaps are stored here like iso-transl-ctl-x-8-map + (keymapp (lookup-key key-translation-map prefix-keys))) (not which-key-inhibit)) (let* ((buf (current-buffer)) ;; get formatted key bindings From ff3aa9a5a6535d84ba5dbd5c8d8c68583055f694 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 21:52:24 -0400 Subject: [PATCH 172/816] Add another key translation map to check --- which-key.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 3683b39f34c..ae19c921d1f 100644 --- a/which-key.el +++ b/which-key.el @@ -227,7 +227,7 @@ ignored." :type 'function) (defvar which-key-inhibit nil - "Prevent guide-key from popping up momentarily by setting this + "Prevent which-key from popping up momentarily by setting this to a non-nil value for the execution of a command. Like this \(let \(\(which-key-inhibit t\)\) @@ -429,7 +429,7 @@ total height." (round (* height-or-percentage (window-total-height (frame-root-window)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Show/hide guide buffer +;; Show/hide which-key buffer (defun which-key--hide-popup () "This function is called to hide the which-key buffer." @@ -915,7 +915,9 @@ Finally, show the buffer." (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map - (keymapp (lookup-key key-translation-map prefix-keys))) + (keymapp (lookup-key key-translation-map prefix-keys)) + ;; just in case someone uses one of these + (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) (let* ((buf (current-buffer)) ;; get formatted key bindings From 064e9b3fdec013055c550ad909365ea4f3716a25 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 21:56:38 -0400 Subject: [PATCH 173/816] Cleanup comments --- which-key.el | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/which-key.el b/which-key.el index ae19c921d1f..784e8a67239 100644 --- a/which-key.el +++ b/which-key.el @@ -234,7 +234,6 @@ to a non-nil value for the execution of a command. Like this ...\)") ;; Internal Vars -;; (defvar popwin:popup-buffer nil) (defvar which-key--buffer nil "Internal: Holds reference to which-key buffer.") (defvar which-key--window nil @@ -261,7 +260,9 @@ Used when `which-key-popup-type' is frame.") ;; 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)) + (eq which-key-popup-type 'minibuffer) + (not (= echo-keystrokes + which-key--echo-keystrokes-backup))) (setq echo-keystrokes which-key-echo-keystrokes) (message "which-key: echo-keystrokes changed from %s to %s" which-key--echo-keystrokes-backup echo-keystrokes))) @@ -362,9 +363,6 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (if (assq mode which-key-key-based-description-replacement-alist) (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) -;; (setq which-key-key-based-description-replacement-alist - ;; (assq-delete-all mode which-key-key-based-description-replacement-alist)) - ;; (push (cons mode mode-alist) which-key-key-based-description-replacement-alist))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes @@ -607,14 +605,15 @@ width) in lines and characters respectively." (cons ;; height (if (member which-key-side-window-location '(left right)) - (- (frame-height) (window-text-height (minibuffer-window)) 1) ;; 1 is a kludge to make sure there is no overlap + ;; 1 is a kludge to make sure there is no overlap + (- (frame-height) (window-text-height (minibuffer-window)) 1) ;; (window-mode-line-height which-key--window)) ;; FIXME: change to something like (min which-*-height (calculate-max-height)) (which-key--height-or-percentage-to-height which-key-side-window-max-height)) ;; width (if (member which-key-side-window-location '(left right)) (which-key--total-width-to-text (which-key--width-or-percentage-to-width - which-key-side-window-max-width)) + which-key-side-window-max-width)) (frame-width)))) (defun which-key--frame-max-dimensions () @@ -778,7 +777,8 @@ keys to be written into the upper left porition of the page." (iter-n 0) col-keys col-key-width col-desc-width col-width col-split done new-column page col-sep-width prev-rem-keys) - ;; (message "frame-width %s prefix-width %s avl-width %s max-width %s" (frame-text-cols) prefix-width avl-width max-width) + ;; (message "frame-width %s prefix-width %s avl-width %s max-width %s" + ;; (frame-text-cols) prefix-width avl-width max-width) (while (and (<= iter-n max-iter) (not done)) (setq iter-n (1+ iter-n) col-split (-split-at n-col-lines rem-keys) @@ -834,7 +834,8 @@ number." max-lines max-width prefix-width)) ((or vertical (> n-rem-keys 0) (= 1 max-lines)) first-try) - ;; do a simple search for the smallest number of lines (TODO: Implement binary search) + ;; do a simple search for the smallest number of lines + ;; TODO: Implement binary search (t (while (and (<= iter-n max-iter) (not found)) (setq iter-n (1+ iter-n) prev-try next-try @@ -920,14 +921,11 @@ Finally, show the buffer." (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) (let* ((buf (current-buffer)) - ;; get formatted key bindings (formatted-keys (which-key--get-formatted-key-bindings buf prefix-keys)) - ;; populate target buffer (popup-act-dim (which-key--populate-buffer (key-description prefix-keys) formatted-keys (window-width)))) - ;; show buffer (which-key--show-popup popup-act-dim))))) ;; Timers From 9bbbe796b02b89ce113934ebddaad4c1c1689f6e Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 22:27:14 -0400 Subject: [PATCH 174/816] Tweak setup breaking out echo-keystrokes stuff --- which-key.el | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/which-key.el b/which-key.el index 784e8a67239..5274f308f1d 100644 --- a/which-key.el +++ b/which-key.el @@ -245,7 +245,7 @@ to a non-nil value for the execution of a command. Like this (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 +(defvar which-key--echo-keystrokes-backup nil "Internal: Backup the initial value of `echo-keystrokes'.") ;;;###autoload @@ -255,17 +255,7 @@ Used when `which-key-popup-type' is frame.") :lighter " WK" (if which-key-mode (progn - (unless which-key--is-setup - (which-key--setup) - ;; 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) - (not (= echo-keystrokes - which-key--echo-keystrokes-backup))) - (setq echo-keystrokes which-key-echo-keystrokes) - (message "which-key: echo-keystrokes changed from %s to %s" - which-key--echo-keystrokes-backup echo-keystrokes))) + (unless which-key--is-setup (which-key--setup)) (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) @@ -278,15 +268,33 @@ Used when `which-key-popup-type' is frame.") (which-key--stop-open-timer))) (defun which-key--setup () - "Create buffer for which-key." + "Initial setup for which-key. +Reduce `echo-keystrokes' if necessary (it will interfer if it's +set too high) and setup which-key buffer." + (when (eq which-key-popup-type 'minibuffer) + (which-key--setup-echo-keystrokes)) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer - (toggle-truncate-lines 1) + ;; suppress confusing minibuffer message + (let (message-log-max) + (toggle-truncate-lines 1)) (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) (setq-local mode-line-format nil)) (setq which-key--is-setup t)) +(defun which-key--setup-echo-keystrokes () + "Initial setup for which-key. +Reduce `echo-keystrokes' if necessary (it will interfer if it's +set too high) and setup which-key buffer." + (when (and (> echo-keystrokes + (+ which-key-echo-keystrokes 0.00001)) + (> which-key-echo-keystrokes 0)) + (setq which-key--echo-keystrokes-backup echo-keystrokes + echo-keystrokes which-key-echo-keystrokes) + (message "which-key: echo-keystrokes changed from %s to %s" + which-key--echo-keystrokes-backup echo-keystrokes))) + ;; Default configuration functions for use by users. Should be the "best" ;; configurations @@ -311,6 +319,7 @@ bottom." (defun which-key-setup-minibuffer () "Apply suggested settings for minibuffer." (interactive) + (which-key--setup-echo-keystrokes) (setq which-key-popup-type 'minibuffer which-key-show-prefix 'left)) From 6d2675a072d92739c2799d20d1848dd352b407fe Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 15 Jul 2015 22:33:41 -0400 Subject: [PATCH 175/816] Erase truncate-lines message --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 5274f308f1d..ebc77bb125f 100644 --- a/which-key.el +++ b/which-key.el @@ -277,7 +277,8 @@ set too high) and setup which-key buffer." (with-current-buffer which-key--buffer ;; suppress confusing minibuffer message (let (message-log-max) - (toggle-truncate-lines 1)) + (toggle-truncate-lines 1) + (message "")) (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) (setq-local mode-line-format nil)) From 60aec4bbc317157e1153c379a1fe4dd16a8d9fc3 Mon Sep 17 00:00:00 2001 From: Chunyang Xu Date: Thu, 16 Jul 2015 12:15:28 +0800 Subject: [PATCH 176/816] Make which-key buffer uninteresting --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ebc77bb125f..3a9237c9be5 100644 --- a/which-key.el +++ b/which-key.el @@ -114,7 +114,7 @@ and have `which-key-special-key-face' applied to them." :group 'which-key :type '(repeat string)) -(defcustom which-key-buffer-name "*which-key*" +(defcustom which-key-buffer-name " *which-key*" "Name of which-key buffer." :group 'which-key :type 'string) From 5752d1feb4b452138bd44144df1e1444186f9cfe Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jul 2015 07:46:48 -0400 Subject: [PATCH 177/816] Change echo-keystrokes logic --- which-key.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index ebc77bb125f..566074d722c 100644 --- a/which-key.el +++ b/which-key.el @@ -285,14 +285,15 @@ set too high) and setup which-key buffer." (setq which-key--is-setup t)) (defun which-key--setup-echo-keystrokes () - "Initial setup for which-key. -Reduce `echo-keystrokes' if necessary (it will interfer if it's -set too high) and setup which-key buffer." - (when (and (> echo-keystrokes - (+ which-key-echo-keystrokes 0.00001)) - (> which-key-echo-keystrokes 0)) - (setq which-key--echo-keystrokes-backup echo-keystrokes - echo-keystrokes which-key-echo-keystrokes) + "Reduce `echo-keystrokes' if necessary (it will interfer if +it's set too high)." + (when (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001) + (setq which-key--echo-keystrokes-backup echo-keystrokes) + (if (> which-key-idle-delay which-key-echo-keystrokes) + (setq echo-keystrokes which-key-echo-keystrokes) + (setq which-key-echo-keystrokes + (min echo-keystrokes (/ (float which-key-idle-delay) 4)) + echo-keystrokes which-key-echo-keystrokes)) (message "which-key: echo-keystrokes changed from %s to %s" which-key--echo-keystrokes-backup echo-keystrokes))) From b47f6e7ff2ae025c0ffddb3f615f46ce58b6405b Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jul 2015 07:53:05 -0400 Subject: [PATCH 178/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 566074d722c..4adb9ee6a46 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.2 +;; Version: 0.2.1 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) From 46fed20a1a3f1f399e5d4847b6aada8572b56929 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jul 2015 08:09:52 -0400 Subject: [PATCH 179/816] Add MELPA to install insructions --- README.org | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/README.org b/README.org index a48ce8f9627..3ea0f2cff1f 100644 --- a/README.org +++ b/README.org @@ -13,6 +13,9 @@ following features: * Table of Contents :TOC@4: - [[#which-key-introduction][which-key Introduction]] - [[#install][Install]] + - [[#melpa][MELPA]] + - [[#manually][Manually]] + - [[#initial-setup][Initial Setup]] - [[#minibuffer-option][Minibuffer Option]] - [[#side-window-right-option][Side Window Right Option]] - [[#side-window-bottom-option][Side Window Bottom Option]] @@ -30,6 +33,11 @@ following features: - [[#thanks][Thanks]] * Install +** MELPA +After setting up [[http://melpa.org][MELPA]] as a repository, use =M-x package-install which-key= or +your preferred method. + +** Manually Add which-key.el to your =load-path= and require. Something like #+BEGIN_SRC emacs-lisp @@ -38,9 +46,12 @@ Add which-key.el to your =load-path= and require. Something like (which-key-mode) #+END_SRC -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. +* Initial Setup +No further setup is required if you are happy with the default setup. To try +other options, there are 3 choices of default configs that are preconfigured +(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 From 0ae863dd723fd87baa2bc78134eaef7bce044740 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jul 2015 12:24:37 -0400 Subject: [PATCH 180/816] Add MELPA badge and change README indentation --- README.org | 85 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/README.org b/README.org index 3ea0f2cff1f..c1ca7558c0b 100644 --- a/README.org +++ b/README.org @@ -1,4 +1,6 @@ -* which-key Introduction +[[http://melpa.org/packages/which-key-badge.svg]] +* which-key +** Introduction This is a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]] for emacs. The intention is to provide the following features: 1. A different polling mechanism to make it lighter on resources than guide-key @@ -10,34 +12,35 @@ following features: 5. A well configured back-end for displaying keys (removing the popwin dependency) that can be easily customized by writing new display functions -* Table of Contents :TOC@4: - - [[#which-key-introduction][which-key Introduction]] - - [[#install][Install]] - - [[#melpa][MELPA]] - - [[#manually][Manually]] - - [[#initial-setup][Initial Setup]] - - [[#minibuffer-option][Minibuffer Option]] - - [[#side-window-right-option][Side Window Right Option]] - - [[#side-window-bottom-option][Side Window Bottom Option]] - - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - - [[#several-popup-types][Several Popup Types]] - - [[#minibuffer][minibuffer]] - - [[#side-window][side window]] - - [[#frame][frame]] - - [[#custom][custom]] - - [[#custom-string-replacement][Custom String Replacement]] - - [[#key-based-replacement]["Key-Based" replacement]] - - [[#key-and-description-replacement][Key and Description replacement]] - - [[#nice-display-with-split-frame][Nice Display with Split Frame]] - - [[#status][Status]] - - [[#thanks][Thanks]] +** Table of Contents :TOC@4: + - [[#which-key-][which-key ]] + - [[#introduction][Introduction]] + - [[#install][Install]] + - [[#melpa][MELPA]] + - [[#manually][Manually]] + - [[#initial-setup][Initial Setup]] + - [[#minibuffer-option][Minibuffer Option]] + - [[#side-window-right-option][Side Window Right Option]] + - [[#side-window-bottom-option][Side Window Bottom Option]] + - [[#special-features-and-configuration-options][Special Features and Configuration Options]] + - [[#several-popup-types][Several Popup Types]] + - [[#minibuffer][minibuffer]] + - [[#side-window][side window]] + - [[#frame][frame]] + - [[#custom][custom]] + - [[#custom-string-replacement][Custom String Replacement]] + - [[#key-based-replacement]["Key-Based" replacement]] + - [[#key-and-description-replacement][Key and Description replacement]] + - [[#nice-display-with-split-frame][Nice Display with Split Frame]] + - [[#status][Status]] + - [[#thanks][Thanks]] -* Install -** MELPA +** Install +*** MELPA After setting up [[http://melpa.org][MELPA]] as a repository, use =M-x package-install which-key= or your preferred method. -** Manually +*** Manually Add which-key.el to your =load-path= and require. Something like #+BEGIN_SRC emacs-lisp @@ -46,7 +49,7 @@ Add which-key.el to your =load-path= and require. Something like (which-key-mode) #+END_SRC -* Initial Setup +** Initial Setup No further setup is required if you are happy with the default setup. To try other options, there are 3 choices of default configs that are preconfigured (then customize to your liking). The main choice is where you want the which-key @@ -68,7 +71,7 @@ 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 +*** Minibuffer Option Take over the minibuffer. Setup by default, but you can also use #+BEGIN_SRC emacs-lisp @@ -80,7 +83,7 @@ Take over the minibuffer. Setup by default, but you can also use Note the maximum height of the minibuffer is controlled through the built-in variable =max-mini-window-height=. -** Side Window Right Option +*** Side Window Right Option Popup side window on right. For defaults use #+BEGIN_SRC emacs-lisp @@ -94,7 +97,7 @@ width (see =M-x customize-group which-key=). [[./img/which-key-right.png]] -** Side Window Bottom Option +*** Side Window Bottom Option Popup side window on bottom. For defaults use #+BEGIN_SRC emacs-lisp @@ -103,19 +106,19 @@ Popup side window on bottom. For defaults use [[./img/which-key-bottom.png]] -* Special Features and Configuration Options +** Special Features and Configuration Options There are more options than the ones described here. All of the configurable variables are available through =M-x customize-group which-key=. -** Several Popup Types +*** Several Popup Types There are three different popup types that which-key can use by default to display the available keys. The variable =which-key-popup-type= decides which one is used. -*** minibuffer +**** minibuffer #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'minibuffer) #+END_SRC Show keys in the minibuffer. -*** side window +**** side window #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'side-window) #+END_SRC @@ -134,7 +137,7 @@ Show keys in a side window. This popup type has further options: ;; frame's height (float larger than 0 and smaller than 1) (setq which-key-side-window-max-height 0.25) #+END_SRC -*** frame +**** frame #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'frame) @@ -150,7 +153,7 @@ further options: (setq which-key-frame-max-height 20) #+END_SRC -*** custom +**** custom Write your own display functions! This requires you to write three functions, =which-key-custom-popup-max-dimensions-function=, =which-key-custom-show-popup-function=, and @@ -179,13 +182,13 @@ current implementation of side-window bottom). (quit-windows-on which-key--buffer))) #+END_SRC -** Custom String Replacement +*** Custom String Replacement You can customize the way the keys show in the buffer using three different replacement methods, each of which corresponds replacement alist. The basic idea of behind each alist is that you specify a selection string in the =car= of each cons cell and the replacement string in the =cdr=. -*** "Key-Based" replacement +**** "Key-Based" replacement The relevant variable is the awkwardly named =which-key-key-based-description-replacement-alist=. In this alist you can have cons cells of two types. An example of the first type is @@ -212,7 +215,7 @@ There are two helper functions to add entries to this list, =which-key-add-major-mode-key-based-replacements=. You can modify the alist directly or use these. -*** Key and Description replacement +**** Key and Description replacement The second and third methods target the text used for the keys and the descriptions directly. The relevant variables are =which-key-key-replacement-alist= and =which-key-description-replacement-alist=. @@ -237,7 +240,7 @@ these alists) (add-to-list 'which-key-key-replacement-alist '("left" . "lft")) #+END_SRC -** Nice Display with Split Frame +*** Nice Display with Split Frame Unlike guide-key, which-key looks good even if the frame is split into several windows. #+CAPTION: which-key in a frame with 3 horizontal splits @@ -246,9 +249,9 @@ windows. #+CAPTION: which-key in a frame with 2 vertical splits [[./img/which-key-bottom-split.png]] -* Status +** Status It requires testing on different platforms with different configurations, which is beyond my capabilities. The default configuration has been reasonably stable for me. -* Thanks +** Thanks Thanks to @bmag for helping with the initial development and finding many bugs. From 2ef9642d7e36b3a9005d01316474724286487f15 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jul 2015 12:24:37 -0400 Subject: [PATCH 181/816] Add MELPA badge and change README indentation --- README.org | 85 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/README.org b/README.org index 3ea0f2cff1f..c1ca7558c0b 100644 --- a/README.org +++ b/README.org @@ -1,4 +1,6 @@ -* which-key Introduction +[[http://melpa.org/packages/which-key-badge.svg]] +* which-key +** Introduction This is a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]] for emacs. The intention is to provide the following features: 1. A different polling mechanism to make it lighter on resources than guide-key @@ -10,34 +12,35 @@ following features: 5. A well configured back-end for displaying keys (removing the popwin dependency) that can be easily customized by writing new display functions -* Table of Contents :TOC@4: - - [[#which-key-introduction][which-key Introduction]] - - [[#install][Install]] - - [[#melpa][MELPA]] - - [[#manually][Manually]] - - [[#initial-setup][Initial Setup]] - - [[#minibuffer-option][Minibuffer Option]] - - [[#side-window-right-option][Side Window Right Option]] - - [[#side-window-bottom-option][Side Window Bottom Option]] - - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - - [[#several-popup-types][Several Popup Types]] - - [[#minibuffer][minibuffer]] - - [[#side-window][side window]] - - [[#frame][frame]] - - [[#custom][custom]] - - [[#custom-string-replacement][Custom String Replacement]] - - [[#key-based-replacement]["Key-Based" replacement]] - - [[#key-and-description-replacement][Key and Description replacement]] - - [[#nice-display-with-split-frame][Nice Display with Split Frame]] - - [[#status][Status]] - - [[#thanks][Thanks]] +** Table of Contents :TOC@4: + - [[#which-key-][which-key ]] + - [[#introduction][Introduction]] + - [[#install][Install]] + - [[#melpa][MELPA]] + - [[#manually][Manually]] + - [[#initial-setup][Initial Setup]] + - [[#minibuffer-option][Minibuffer Option]] + - [[#side-window-right-option][Side Window Right Option]] + - [[#side-window-bottom-option][Side Window Bottom Option]] + - [[#special-features-and-configuration-options][Special Features and Configuration Options]] + - [[#several-popup-types][Several Popup Types]] + - [[#minibuffer][minibuffer]] + - [[#side-window][side window]] + - [[#frame][frame]] + - [[#custom][custom]] + - [[#custom-string-replacement][Custom String Replacement]] + - [[#key-based-replacement]["Key-Based" replacement]] + - [[#key-and-description-replacement][Key and Description replacement]] + - [[#nice-display-with-split-frame][Nice Display with Split Frame]] + - [[#status][Status]] + - [[#thanks][Thanks]] -* Install -** MELPA +** Install +*** MELPA After setting up [[http://melpa.org][MELPA]] as a repository, use =M-x package-install which-key= or your preferred method. -** Manually +*** Manually Add which-key.el to your =load-path= and require. Something like #+BEGIN_SRC emacs-lisp @@ -46,7 +49,7 @@ Add which-key.el to your =load-path= and require. Something like (which-key-mode) #+END_SRC -* Initial Setup +** Initial Setup No further setup is required if you are happy with the default setup. To try other options, there are 3 choices of default configs that are preconfigured (then customize to your liking). The main choice is where you want the which-key @@ -68,7 +71,7 @@ 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 +*** Minibuffer Option Take over the minibuffer. Setup by default, but you can also use #+BEGIN_SRC emacs-lisp @@ -80,7 +83,7 @@ Take over the minibuffer. Setup by default, but you can also use Note the maximum height of the minibuffer is controlled through the built-in variable =max-mini-window-height=. -** Side Window Right Option +*** Side Window Right Option Popup side window on right. For defaults use #+BEGIN_SRC emacs-lisp @@ -94,7 +97,7 @@ width (see =M-x customize-group which-key=). [[./img/which-key-right.png]] -** Side Window Bottom Option +*** Side Window Bottom Option Popup side window on bottom. For defaults use #+BEGIN_SRC emacs-lisp @@ -103,19 +106,19 @@ Popup side window on bottom. For defaults use [[./img/which-key-bottom.png]] -* Special Features and Configuration Options +** Special Features and Configuration Options There are more options than the ones described here. All of the configurable variables are available through =M-x customize-group which-key=. -** Several Popup Types +*** Several Popup Types There are three different popup types that which-key can use by default to display the available keys. The variable =which-key-popup-type= decides which one is used. -*** minibuffer +**** minibuffer #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'minibuffer) #+END_SRC Show keys in the minibuffer. -*** side window +**** side window #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'side-window) #+END_SRC @@ -134,7 +137,7 @@ Show keys in a side window. This popup type has further options: ;; frame's height (float larger than 0 and smaller than 1) (setq which-key-side-window-max-height 0.25) #+END_SRC -*** frame +**** frame #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'frame) @@ -150,7 +153,7 @@ further options: (setq which-key-frame-max-height 20) #+END_SRC -*** custom +**** custom Write your own display functions! This requires you to write three functions, =which-key-custom-popup-max-dimensions-function=, =which-key-custom-show-popup-function=, and @@ -179,13 +182,13 @@ current implementation of side-window bottom). (quit-windows-on which-key--buffer))) #+END_SRC -** Custom String Replacement +*** Custom String Replacement You can customize the way the keys show in the buffer using three different replacement methods, each of which corresponds replacement alist. The basic idea of behind each alist is that you specify a selection string in the =car= of each cons cell and the replacement string in the =cdr=. -*** "Key-Based" replacement +**** "Key-Based" replacement The relevant variable is the awkwardly named =which-key-key-based-description-replacement-alist=. In this alist you can have cons cells of two types. An example of the first type is @@ -212,7 +215,7 @@ There are two helper functions to add entries to this list, =which-key-add-major-mode-key-based-replacements=. You can modify the alist directly or use these. -*** Key and Description replacement +**** Key and Description replacement The second and third methods target the text used for the keys and the descriptions directly. The relevant variables are =which-key-key-replacement-alist= and =which-key-description-replacement-alist=. @@ -237,7 +240,7 @@ these alists) (add-to-list 'which-key-key-replacement-alist '("left" . "lft")) #+END_SRC -** Nice Display with Split Frame +*** Nice Display with Split Frame Unlike guide-key, which-key looks good even if the frame is split into several windows. #+CAPTION: which-key in a frame with 3 horizontal splits @@ -246,9 +249,9 @@ windows. #+CAPTION: which-key in a frame with 2 vertical splits [[./img/which-key-bottom-split.png]] -* Status +** Status It requires testing on different platforms with different configurations, which is beyond my capabilities. The default configuration has been reasonably stable for me. -* Thanks +** Thanks Thanks to @bmag for helping with the initial development and finding many bugs. From 4717c8868061c5e6a9449691e486fa25a1b47cf6 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jul 2015 12:27:00 -0400 Subject: [PATCH 182/816] Move badge below header --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index c1ca7558c0b..810deff70cb 100644 --- a/README.org +++ b/README.org @@ -1,5 +1,5 @@ -[[http://melpa.org/packages/which-key-badge.svg]] * which-key +[[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] ** Introduction This is a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]] for emacs. The intention is to provide the following features: From 717fe222a49728aec6e38fbbfba465152f964d33 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jul 2015 13:01:41 -0400 Subject: [PATCH 183/816] Reformat source --- which-key.el | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/which-key.el b/which-key.el index ac57514d491..1d4ef25c43a 100644 --- a/which-key.el +++ b/which-key.el @@ -334,7 +334,8 @@ bottom." (error "KEY and REPL should be strings")) (cond ((null alist) (list (cons key repl))) ((assoc-string key alist) - (message "which-key: the key %s already exists in %s. This addition will override that replacement." + (message "which-key: the key %s already exists in %s. This addition \ +will override that replacement." key alist) (setcdr (assoc-string key alist) repl) alist) @@ -409,13 +410,16 @@ character width as the frame." 3))) (defun which-key--char-enlarged-p (&optional frame) - (> (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) + (> (frame-char-width) + (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) (defun which-key--char-reduced-p (&optional frame) - (< (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) + (< (frame-char-width) + (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) (defun which-key--char-exact-p (&optional frame) - (= (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) + (= (frame-char-width) + (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) (defun which-key--width-or-percentage-to-width (width-or-percentage) "Return window total width. @@ -709,7 +713,8 @@ removing a \"group:\" prefix." "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." - (let ((sep-w-face (propertize which-key-separator 'face 'which-key-separator-face))) + (let ((sep-w-face + (propertize which-key-separator 'face 'which-key-separator-face))) (mapcar (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) @@ -749,7 +754,7 @@ BUFFER that follow the key sequence KEY-SEQ." ;; Functions for laying out which-key buffer pages (defsubst which-key--join-columns (columns) - "Transpose columns into rows, concat rows into lines and concat rows into page." + "Transpose columns into rows, concat rows into lines and rows into page." (let* (;; pad reversed columns to same length (padded (apply (apply-partially #'-pad "") (reverse columns))) ;; transpose columns to rows @@ -774,7 +779,9 @@ keys to be written into the upper left porition of the page." (let* ((n-keys (length keys)) (avl-lines max-lines) ;; we get 1 back for not putting a space after the last column - (avl-width (max 0 (- (+ 1 max-width) prefix-width which-key-unicode-correction))) + (avl-width (max 0 (- (+ 1 max-width) + prefix-width + which-key-unicode-correction))) (rem-keys keys) (n-col-lines (min avl-lines n-keys)) (act-n-lines n-col-lines) ; n-col-lines in first column @@ -821,7 +828,8 @@ keys to be written into the upper left porition of the page." (setq page (which-key--join-columns all-columns)) (list page act-n-lines act-width rem-keys (- n-keys (length rem-keys))))) -(defun which-key--create-page (keys max-lines max-width prefix-width &optional vertical use-status-key page-n) +(defun which-key--create-page (keys max-lines max-width prefix-width + &optional vertical use-status-key page-n) "Create a page of KEYS with parameters MAX-LINES, MAX-WIDTH,PREFIX-WIDTH. Use as many keys as possible. Use as few lines as possible unless VERTICAL is non-nil. USE-STATUS-KEY inserts an informative @@ -829,7 +837,8 @@ message in place of the last key on the page if non-nil. PAGE-N allows for the informative message to reference the current page number." (let* ((n-keys (length keys)) - (first-try (which-key--create-page-vertical keys max-lines max-width prefix-width)) + (first-try (which-key--create-page-vertical + keys max-lines max-width prefix-width)) (n-rem-keys (length (nth 3 first-try))) (status-key-i (- n-keys n-rem-keys 1)) (next-try-lines max-lines) @@ -842,7 +851,7 @@ number." (format "%s keys not shown" (1+ n-rem-keys)) 'face 'font-lock-comment-face))) (which-key--create-page-vertical (-insert-at status-key-i status-key keys) - max-lines max-width prefix-width)) + max-lines max-width prefix-width)) ((or vertical (> n-rem-keys 0) (= 1 max-lines)) first-try) ;; do a simple search for the smallest number of lines @@ -881,9 +890,9 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to max-pages-reached) (while (and keys-rem (not max-pages-reached) (not no-room)) (setq page-n (1+ page-n) - page-res (which-key--create-page keys-rem - max-lines avl-width prefix-width - vertical which-key-show-remaining-keys page-n)) + page-res (which-key--create-page + keys-rem max-lines avl-width prefix-width + vertical which-key-show-remaining-keys page-n)) (push page-res pages) (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) (setq keys-rem (nth 3 page-res) @@ -895,7 +904,8 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to first-page (car pages) first-page-str (concat prefix-string (car first-page))) (cond ((<= (car keys-per-page) 0) ; check first page - (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." prefix-keys) + (message "%s- which-key can't show keys: Settings and/or frame size\ + are too restrictive." prefix-keys) (cons 0 0)) (max-pages-reached (error "Which-key reached the maximum number of pages") From 938bb910dbb40077775781e144229305c203fd0a Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jul 2015 13:06:58 -0400 Subject: [PATCH 184/816] Use string-width instead of length for strings --- which-key.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 1d4ef25c43a..a5b1020915a 100644 --- a/which-key.el +++ b/which-key.el @@ -681,12 +681,12 @@ If KEY contains any \"special keys\" defined in (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)))) + (substring key-w-face end (string-width key-w-face)))) key-w-face)))) (defsubst which-key--truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." - (if (> (length desc) which-key-max-description-length) + (if (> (string-width desc) which-key-max-description-length) (concat (substring desc 0 which-key-max-description-length) "..") desc)) @@ -767,7 +767,7 @@ BUFFER that follow the key sequence KEY-SEQ." element in each list element of KEYS." (cl-reduce (lambda (x y) (max x (if (eq (car y) 'status) - 0 (length (substring-no-properties (nth index y)))))) + 0 (string-width (nth index y))))) keys :initial-value 0)) (defun which-key--create-page-vertical (keys max-lines max-width prefix-width) @@ -813,10 +813,10 @@ keys to be written into the upper left porition of the page." (if (eq (car k) 'status) (concat (s-repeat (+ col-key-width col-sep-width) " ") " " (cdr k)) (concat (s-repeat (- col-key-width - (length (substring-no-properties (nth 0 k)))) " ") + (string-width (nth 0 k))) " ") (nth 0 k) " " (nth 1 k) " " (nth 2 k) (s-repeat (- col-desc-width - (length (substring-no-properties (nth 2 k)))) " ")))) + (string-width (nth 2 k))) " ")))) col-keys)) (if (<= col-width avl-width) (progn (push new-column all-columns) @@ -874,7 +874,7 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to (let* ((vertical (and (eq which-key-popup-type 'side-window) (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-len (+ 2 (string-width prefix-w-face))) (prefix-string (when which-key-show-prefix (if (eq which-key-show-prefix 'left) (concat prefix-w-face " ") From 891fc5f636928926e8d0db2e56bd45603461b8c8 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 17 Jul 2015 09:22:18 -0400 Subject: [PATCH 185/816] Start on new status key impl --- which-key.el | 76 +++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/which-key.el b/which-key.el index a5b1020915a..dea9d6317b2 100644 --- a/which-key.el +++ b/which-key.el @@ -766,9 +766,7 @@ BUFFER that follow the key sequence KEY-SEQ." "Internal function for finding the max length of the INDEX element in each list element of KEYS." (cl-reduce - (lambda (x y) (max x (if (eq (car y) 'status) - 0 (string-width (nth index y))))) - keys :initial-value 0)) + (lambda (x y) (max x (string-width (nth index y)))) keys :initial-value 0)) (defun which-key--create-page-vertical (keys max-lines max-width prefix-width) "Format KEYS into string representing a single page of text. @@ -791,13 +789,12 @@ keys to be written into the upper left porition of the page." (if (> i 1) (s-repeat prefix-width " ") "")) (number-sequence 1 n-col-lines)))) (act-width prefix-width) - (max-iter 100) - (iter-n 0) + (max-iter 100) (iter-n 0) col-keys col-key-width col-desc-width col-width col-split done - new-column page col-sep-width prev-rem-keys) + new-column col-sep-width prev-rem-keys) ;; (message "frame-width %s prefix-width %s avl-width %s max-width %s" ;; (frame-text-cols) prefix-width avl-width max-width) - (while (and (<= iter-n max-iter) (not done)) + (while (and rem-keys (<= iter-n max-iter) (not done)) (setq iter-n (1+ iter-n) col-split (-split-at n-col-lines rem-keys) col-keys (car col-split) @@ -810,23 +807,24 @@ keys to be written into the upper left porition of the page." col-width (+ 3 col-key-width col-sep-width col-desc-width) new-column (mapcar (lambda (k) - (if (eq (car k) 'status) - (concat (s-repeat (+ col-key-width col-sep-width) " ") " " (cdr k)) - (concat (s-repeat (- col-key-width - (string-width (nth 0 k))) " ") - (nth 0 k) " " (nth 1 k) " " (nth 2 k) - (s-repeat (- col-desc-width - (string-width (nth 2 k))) " ")))) - col-keys)) + (concat (s-repeat (- col-key-width + (string-width (nth 0 k))) + " ") + (nth 0 k) " " (nth 1 k) " " (nth 2 k) + (s-repeat (- col-desc-width + (string-width (nth 2 k))) + " "))) col-keys)) (if (<= col-width avl-width) (progn (push new-column all-columns) - (setq act-width (+ act-width col-width) - avl-width (- avl-width col-width))) + (setq act-width (+ act-width col-width) + avl-width (- avl-width col-width))) (setq done t - rem-keys prev-rem-keys)) - (when (<= (length rem-keys) 0) (setq done t))) - (setq page (which-key--join-columns all-columns)) - (list page act-n-lines act-width rem-keys (- n-keys (length rem-keys))))) + rem-keys prev-rem-keys))) + (list :str (which-key--join-columns all-columns) + :height act-n-lines :width act-width + :rem-keys rem-keys :n-rem-keys (length rem-keys) + :n-keys (- n-keys (length rem-keys)) + :last-col-width col-width))) (defun which-key--create-page (keys max-lines max-width prefix-width &optional vertical use-status-key page-n) @@ -839,19 +837,22 @@ number." (let* ((n-keys (length keys)) (first-try (which-key--create-page-vertical keys max-lines max-width prefix-width)) - (n-rem-keys (length (nth 3 first-try))) + (n-rem-keys (plist-get first-try :n-rem-keys)) (status-key-i (- n-keys n-rem-keys 1)) (next-try-lines max-lines) (iter-n 0) (max-iter (+ 1 max-lines)) - prev-try prev-n-rem-keys next-try found status-key) + prev-try prev-n-rem-keys next-try found status-key first-try-str) (cond ((and (> n-rem-keys 0) use-status-key) - (setq status-key - (cons 'status (propertize - (format "%s keys not shown" (1+ n-rem-keys)) - 'face 'font-lock-comment-face))) - (which-key--create-page-vertical (-insert-at status-key-i status-key keys) - max-lines max-width prefix-width)) + (setq status-key (propertize + (format "%s keys not shown" (1+ n-rem-keys)) + 'face 'font-lock-comment-face) + first-try-str (plist-get first-try :str) + first-try-str (substring + first-try-str 0 + (- (length first-try-str) + (plist-get first-try :last-col-width)))) + (plist-put first-try :str (concat first-try-str status-key))) ((or vertical (> n-rem-keys 0) (= 1 max-lines)) first-try) ;; do a simple search for the smallest number of lines @@ -862,7 +863,7 @@ number." next-try-lines (- next-try-lines 1) next-try (which-key--create-page-vertical keys next-try-lines max-width prefix-width) - n-rem-keys (length (nth 3 next-try)) + n-rem-keys (plist-get first-try :n-rem-keys) found (or (= next-try-lines 0) (> n-rem-keys 0)))) prev-try)))) @@ -883,26 +884,27 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to (max-lines (car max-dims)) (avl-width (cdr max-dims)) (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) - (keys-rem formatted-keys) + (rem-keys formatted-keys) (max-pages (+ 1 (length formatted-keys))) (page-n 0) keys-per-page pages first-page first-page-str page-res no-room max-pages-reached) - (while (and keys-rem (not max-pages-reached) (not no-room)) + (while (and rem-keys (not max-pages-reached) (not no-room)) (setq page-n (1+ page-n) page-res (which-key--create-page - keys-rem max-lines avl-width prefix-width + rem-keys max-lines avl-width prefix-width vertical which-key-show-remaining-keys page-n)) (push page-res pages) - (push (if (nth 4 page-res) (nth 4 page-res) 0) keys-per-page) - (setq keys-rem (nth 3 page-res) + (push (if (plist-get page-res :n-keys) + (plist-get page-res :n-keys) 0) keys-per-page) + (setq rem-keys (plist-get page-res :rem-keys) no-room (<= (car keys-per-page) 0) max-pages-reached (>= page-n max-pages))) ;; not doing anything with other pages for now (setq keys-per-page (reverse keys-per-page) pages (reverse pages) first-page (car pages) - first-page-str (concat prefix-string (car first-page))) + first-page-str (concat prefix-string (plist-get first-page :str))) (cond ((<= (car keys-per-page) 0) ; check first page (message "%s- which-key can't show keys: Settings and/or frame size\ are too restrictive." prefix-keys) @@ -920,7 +922,7 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to (erase-buffer) (insert first-page-str) (goto-char (point-min)))) - (cons (nth 1 first-page) (nth 2 first-page)))))) + (cons (plist-get first-page :height) (plist-get first-page :width)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update From 23600ce6e1eecafa5be91820b40ce148a08e557e Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 17 Jul 2015 10:59:13 -0400 Subject: [PATCH 186/816] Fix potential bug when no keys exist Need to check for no keys before checking the number of keys on the first page in case the latter is nil --- which-key.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index ac57514d491..b54aedb883f 100644 --- a/which-key.el +++ b/which-key.el @@ -894,15 +894,15 @@ value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to pages (reverse pages) first-page (car pages) first-page-str (concat prefix-string (car first-page))) - (cond ((<= (car keys-per-page) 0) ; check first page - (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." prefix-keys) - (cons 0 0)) - (max-pages-reached + (cond (max-pages-reached (error "Which-key reached the maximum number of pages") (cons 0 0)) ((<= (length formatted-keys) 0) (message "%s- which-key: no keys to display" prefix-keys) (cons 0 0)) + ((<= (car keys-per-page) 0) ; check first page + (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." prefix-keys) + (cons 0 0)) (t (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" first-page-str)) From 2c6ab4da10070dc6ab304798fbd4d6b24262c42d Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 17 Jul 2015 10:49:11 -0400 Subject: [PATCH 187/816] Add option to sort output by key (off by default) --- which-key.el | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/which-key.el b/which-key.el index b54aedb883f..4cc1272aba7 100644 --- a/which-key.el +++ b/which-key.el @@ -177,6 +177,11 @@ a percentage out of the frame's height." :type '(radio (const :tag "Yes" t) (const :tag "No" nil))) +(defcustom which-key-sort nil + "Sort output by `key-description' if non-nil." + :group 'which-key + :type 'boolean) + ;; Faces (defface which-key-key-face '((t . (:inherit font-lock-constant-face))) @@ -726,6 +731,16 @@ alists. Returns a list (key separator description)." (list key-w-face sep-w-face desc-w-face))) unformatted))) +(defun which-key--key-description< (a b) + "Order key descriptions A and B." + (let ((la (string-width a)) + (lb (string-width b))) + (cond ((and (= la 1) (= lb 1)) (string-lessp a b)) + ((or (= la 1) (= lb 1)) (= la 1)) + ((string-equal (substring a 0 2) (substring b 0 2)) + (which-key--key-description< (substring a 2) (substring b 2))) + (t (string-lessp a b))))) + (defun which-key--get-formatted-key-bindings (buffer key-seq) "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." @@ -743,6 +758,10 @@ BUFFER that follow the key sequence KEY-SEQ." desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted :test (lambda (x y) (string-equal (car x) (car y)))))) + (when which-key-sort + (setq unformatted + (sort unformatted + (lambda (a b) (which-key--key-description< (car a) (car b)))))) (which-key--format-and-replace unformatted (key-description key-seq)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From 9d3ffef3f15e96ddd0efdca1144ee0b56b92b885 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 17 Jul 2015 13:03:00 -0400 Subject: [PATCH 188/816] Add special key handling to key sort order --- which-key.el | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 4cc1272aba7..173b4718220 100644 --- a/which-key.el +++ b/which-key.el @@ -732,13 +732,34 @@ alists. Returns a list (key separator description)." unformatted))) (defun which-key--key-description< (a b) - "Order key descriptions A and B." - (let ((la (string-width a)) - (lb (string-width b))) - (cond ((and (= la 1) (= lb 1)) (string-lessp a b)) - ((or (= la 1) (= lb 1)) (= la 1)) - ((string-equal (substring a 0 2) (substring b 0 2)) - (which-key--key-description< (substring a 2) (substring b 2))) + "Order key descriptions A and B. +Order is lexicographic within a \"class\". Where the classes and +the ordering of classes is listed below. + +special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." + (let* ((aem? (string-equal a "")) + (bem? (string-equal b "")) + (a1? (= 1 (length a))) + (b1? (= 1 (length b))) + (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") + (asp? (string-match-p srgxp a)) + (bsp? (string-match-p srgxp b)) + (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") + (apr? (string-match-p prrgxp a)) + (bpr? (string-match-p prrgxp b))) + (cond ((or aem? bem?) (and aem? (not bem?))) + ((and asp? bsp?) + (if (string-equal (substring a 0 3) (substring b 0 3)) + (which-key--key-description< (substring a 3) (substring b 3)) + (string-lessp a b))) + ((or asp? bsp?) asp?) + ((and a1? b1?) (string-lessp a b)) + ((or a1? b1?) a1?) + ((and apr? bpr?) + (if (string-equal (substring a 0 2) (substring b 0 2)) + (which-key--key-description< (substring a 2) (substring b 2)) + (string-lessp a b))) + ((or apr? bpr?) apr?) (t (string-lessp a b))))) (defun which-key--get-formatted-key-bindings (buffer key-seq) From 5ce4a5cb24f4a83e2259751f6ffebbdf44acc14d Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 17 Jul 2015 13:41:34 -0400 Subject: [PATCH 189/816] Typo in docstring --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 173b4718220..21980d3a5f9 100644 --- a/which-key.el +++ b/which-key.el @@ -733,8 +733,8 @@ alists. Returns a list (key separator description)." (defun which-key--key-description< (a b) "Order key descriptions A and B. -Order is lexicographic within a \"class\". Where the classes and -the ordering of classes is listed below. +Order is lexicographic within a \"class\", where the classes and +the ordering of classes are listed below. special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." (let* ((aem? (string-equal a "")) From 0e6076b44187ea2815c04cc0a44055091fa8d2cc Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 19 Jul 2015 21:59:02 -0400 Subject: [PATCH 190/816] Rewrite of page creation alg --- which-key.el | 401 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 238 insertions(+), 163 deletions(-) diff --git a/which-key.el b/which-key.el index dea9d6317b2..089003a9c64 100644 --- a/which-key.el +++ b/which-key.el @@ -247,6 +247,7 @@ to a non-nil value for the execution of a command. Like this Used when `which-key-popup-type' is frame.") (defvar which-key--echo-keystrokes-backup nil "Internal: Backup the initial value of `echo-keystrokes'.") +(defvar which-key--pages-plist nil) ;;;###autoload (define-minor-mode which-key-mode @@ -755,11 +756,8 @@ BUFFER that follow the key sequence KEY-SEQ." (defsubst which-key--join-columns (columns) "Transpose columns into rows, concat rows into lines and rows into page." - (let* (;; pad reversed columns to same length - (padded (apply (apply-partially #'-pad "") (reverse columns))) - ;; transpose columns to rows + (let* ((padded (apply (apply-partially #'-pad "") (reverse columns))) (rows (apply #'cl-mapcar #'list padded))) - ;; join lines by space and rows by newline (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n"))) (defsubst which-key--max-len (keys index) @@ -768,161 +766,239 @@ element in each list element of KEYS." (cl-reduce (lambda (x y) (max x (string-width (nth index y)))) keys :initial-value 0)) -(defun which-key--create-page-vertical (keys max-lines max-width prefix-width) - "Format KEYS into string representing a single page of text. -Creates columns (padded to be of uniform width) of length -MAX-LINES until keys run out or MAX-WIDTH is reached. A non-zero -PREFIX-WIDTH adds padding on the left side to allow for prefix -keys to be written into the upper left porition of the page." - (let* ((n-keys (length keys)) - (avl-lines max-lines) - ;; we get 1 back for not putting a space after the last column - (avl-width (max 0 (- (+ 1 max-width) - prefix-width - which-key-unicode-correction))) - (rem-keys keys) - (n-col-lines (min avl-lines n-keys)) - (act-n-lines n-col-lines) ; n-col-lines in first column - ;; Initial column for prefix (if used) - (all-columns (list - (mapcar (lambda (i) - (if (> i 1) (s-repeat prefix-width " ") "")) - (number-sequence 1 n-col-lines)))) - (act-width prefix-width) - (max-iter 100) (iter-n 0) - col-keys col-key-width col-desc-width col-width col-split done - new-column col-sep-width prev-rem-keys) - ;; (message "frame-width %s prefix-width %s avl-width %s max-width %s" - ;; (frame-text-cols) prefix-width avl-width max-width) - (while (and rem-keys (<= iter-n max-iter) (not done)) - (setq iter-n (1+ iter-n) - col-split (-split-at n-col-lines rem-keys) - col-keys (car col-split) - prev-rem-keys rem-keys - rem-keys (cadr col-split) - n-col-lines (min avl-lines (length rem-keys)) - col-key-width (which-key--max-len col-keys 0) - col-sep-width (which-key--max-len col-keys 1) - col-desc-width (which-key--max-len col-keys 2) - col-width (+ 3 col-key-width col-sep-width col-desc-width) - new-column (mapcar - (lambda (k) - (concat (s-repeat (- col-key-width - (string-width (nth 0 k))) - " ") - (nth 0 k) " " (nth 1 k) " " (nth 2 k) - (s-repeat (- col-desc-width - (string-width (nth 2 k))) - " "))) col-keys)) - (if (<= col-width avl-width) - (progn (push new-column all-columns) - (setq act-width (+ act-width col-width) - avl-width (- avl-width col-width))) - (setq done t - rem-keys prev-rem-keys))) - (list :str (which-key--join-columns all-columns) - :height act-n-lines :width act-width - :rem-keys rem-keys :n-rem-keys (length rem-keys) - :n-keys (- n-keys (length rem-keys)) - :last-col-width col-width))) +;; (defun which-key--create-page-vertical (keys max-lines max-width prefix-keys) +;; "Format KEYS into string representing a single page of text. +;; Creates columns (padded to be of uniform width) of length +;; MAX-LINES until keys run out or MAX-WIDTH is reached. A non-zero +;; PREFIX-WIDTH adds padding on the left side to allow for prefix +;; keys to be written into the upper left porition of the page." +;; (let* ((prefix-w-face (which-key--propertize-key prefix-keys)) +;; (prefix-width (if (eq which-key-show-prefix 'left) +;; (+ 2 (string-width prefix-w-face)) 0)) +;; (prefix-top (when (eq which-key-show-prefix 'top) +;; (concat prefix-w-face "-\n"))) +;; (avl-lines (if prefix-top (- max-lines 1) max-lines)) +;; (n-col-lines (min avl-lines (length keys))) +;; (prefix-col (when (eq which-key-show-prefix 'left) +;; (append (list (concat prefix-w-face " ")) +;; (-repeat (- n-col-lines 1) prefix-width)))) +;; (all-columns (if prefix-col (list prefix-col) '())) +;; ;; we get 1 back for not putting a space after the last column +;; (avl-width (max 0 (- (+ 1 max-width) +;; prefix-width +;; which-key-unicode-correction))) +;; (act-n-lines (- n-col-lines (if prefix-top 1 0))) +;; (act-width prefix-width) +;; (rem-keys keys) +;; (max-iter 100) (iter-n 0) +;; col-keys col-key-width col-desc-width col-width col-split done +;; new-column col-sep-width prev-rem-keys) +;; ;; (message "frame-width %s prefix-width %s avl-width %s max-width %s" +;; ;; (frame-text-cols) prefix-width avl-width max-width) +;; (while (and rem-keys (<= iter-n max-iter) (not done)) +;; (setq iter-n (1+ iter-n) +;; col-split (-split-at n-col-lines rem-keys) +;; col-keys (car col-split) +;; prev-rem-keys rem-keys +;; rem-keys (cadr col-split) +;; n-col-lines (min avl-lines (length rem-keys)) +;; col-key-width (which-key--max-len col-keys 0) +;; col-sep-width (which-key--max-len col-keys 1) +;; col-desc-width (which-key--max-len col-keys 2) +;; col-width (+ 3 col-key-width col-sep-width col-desc-width) +;; new-column +;; (mapcar (lambda (k) +;; (concat +;; (s-repeat (- col-key-width (string-width (nth 0 k))) " ") +;; (nth 0 k) " " (nth 1 k) " " (nth 2 k) +;; (s-repeat (- col-desc-width (string-width (nth 2 k))) " "))) +;; col-keys)) +;; (if (<= col-width avl-width) +;; (progn (push new-column all-columns) +;; (setq act-width (+ act-width col-width) +;; avl-width (- avl-width col-width))) +;; (setq done t rem-keys prev-rem-keys))) +;; (list :str (if prefix-top +;; (concat prefix-top (which-key--join-columns all-columns)) +;; (which-key--join-columns all-columns)) +;; :height act-n-lines :width act-width +;; :rem-keys rem-keys :n-rem-keys (length rem-keys) +;; :n-keys (- (length keys) (length rem-keys)) +;; :last-col-width col-width))) -(defun which-key--create-page (keys max-lines max-width prefix-width - &optional vertical use-status-key page-n) - "Create a page of KEYS with parameters MAX-LINES, MAX-WIDTH,PREFIX-WIDTH. -Use as many keys as possible. Use as few lines as possible unless -VERTICAL is non-nil. USE-STATUS-KEY inserts an informative -message in place of the last key on the page if non-nil. PAGE-N -allows for the informative message to reference the current page -number." - (let* ((n-keys (length keys)) - (first-try (which-key--create-page-vertical - keys max-lines max-width prefix-width)) - (n-rem-keys (plist-get first-try :n-rem-keys)) - (status-key-i (- n-keys n-rem-keys 1)) - (next-try-lines max-lines) - (iter-n 0) - (max-iter (+ 1 max-lines)) - prev-try prev-n-rem-keys next-try found status-key first-try-str) - (cond ((and (> n-rem-keys 0) use-status-key) - (setq status-key (propertize - (format "%s keys not shown" (1+ n-rem-keys)) - 'face 'font-lock-comment-face) - first-try-str (plist-get first-try :str) - first-try-str (substring - first-try-str 0 - (- (length first-try-str) - (plist-get first-try :last-col-width)))) - (plist-put first-try :str (concat first-try-str status-key))) - ((or vertical (> n-rem-keys 0) (= 1 max-lines)) - first-try) - ;; do a simple search for the smallest number of lines - ;; TODO: Implement binary search - (t (while (and (<= iter-n max-iter) (not found)) - (setq iter-n (1+ iter-n) - prev-try next-try - next-try-lines (- next-try-lines 1) - next-try (which-key--create-page-vertical - keys next-try-lines max-width prefix-width) - n-rem-keys (plist-get first-try :n-rem-keys) - found (or (= next-try-lines 0) (> n-rem-keys 0)))) - prev-try)))) +;; (defun which-key--create-page (keys max-lines max-width prefix-keys +;; &optional vertical use-status-key page-n) +;; "Create a page of KEYS with parameters MAX-LINES, MAX-WIDTH,PREFIX-WIDTH. +;; Use as many keys as possible. Use as few lines as possible unless +;; VERTICAL is non-nil. USE-STATUS-KEY inserts an informative +;; message in place of the last key on the page if non-nil. PAGE-N +;; allows for the informative message to reference the current page +;; number." +;; (let* ((n-keys (length keys)) +;; (first-try (which-key--create-page-vertical +;; keys max-lines max-width prefix-keys)) +;; (n-rem-keys (plist-get first-try :n-rem-keys)) +;; (status-key-i (- n-keys n-rem-keys 1)) +;; (next-try-lines max-lines) +;; (iter-n 0) +;; (max-iter (+ 1 max-lines)) +;; prev-try prev-n-rem-keys next-try found status-key first-try-str) +;; (cond ((and (> n-rem-keys 0) use-status-key) +;; (setq status-key (propertize +;; (format "%s keys not shown" (1+ n-rem-keys)) +;; 'face 'font-lock-comment-face) +;; first-try-str (plist-get first-try :str) +;; first-try-str (substring +;; first-try-str 0 +;; (- (length first-try-str) +;; (plist-get first-try :last-col-width)))) +;; (plist-put first-try :str (concat first-try-str status-key))) +;; ((or vertical (> n-rem-keys 0) (= 1 max-lines)) +;; first-try) +;; ;; do a simple search for the smallest number of lines +;; ;; TODO: Implement binary search +;; (t (while (and (<= iter-n max-iter) (not found)) +;; (setq iter-n (1+ iter-n) +;; prev-try next-try +;; next-try-lines (- next-try-lines 1) +;; next-try (which-key--create-page-vertical +;; keys next-try-lines max-width prefix-keys) +;; n-rem-keys (plist-get first-try :n-rem-keys) +;; found (or (= next-try-lines 0) (> n-rem-keys 0)))) +;; prev-try)))) -(defun which-key--populate-buffer (prefix-keys formatted-keys sel-win-width) - "Insert FORMATTED-KEYS into which-key buffer. -PREFIX-KEYS may be inserted into the buffer depending on the -value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to -`which-key--popup-max-dimensions'." - (let* ((vertical (and (eq which-key-popup-type 'side-window) - (member which-key-side-window-location '(left right)))) - (prefix-w-face (which-key--propertize-key prefix-keys)) - (prefix-len (+ 2 (string-width 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")))) - (max-dims (which-key--popup-max-dimensions sel-win-width)) +;; (defun which-key--create-pages (prefix-keys formatted-keys sel-win-width) +;; "Insert FORMATTED-KEYS into which-key buffer. +;; PREFIX-KEYS may be inserted into the buffer depending on the +;; value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to +;; `which-key--popup-max-dimensions'." +;; (let* ((vertical (and (eq which-key-popup-type 'side-window) +;; (member which-key-side-window-location '(left right)))) +;; (max-dims (which-key--popup-max-dimensions sel-win-width)) +;; (max-lines (car max-dims)) +;; (avl-width (cdr max-dims)) +;; (rem-keys formatted-keys) +;; (max-pages (+ 1 (length formatted-keys))) +;; (page-n 0) +;; keys-per-page pages first-page first-page-str page-res no-room +;; max-pages-reached) +;; (while (and rem-keys (not max-pages-reached) (not no-room)) +;; (setq page-n (1+ page-n) +;; page-res (which-key--create-page +;; rem-keys max-lines avl-width prefix-keys +;; vertical which-key-show-remaining-keys page-n)) +;; (push page-res pages) +;; (push (if (plist-get page-res :n-keys) +;; (plist-get page-res :n-keys) 0) keys-per-page) +;; (setq rem-keys (plist-get page-res :rem-keys) +;; no-room (<= (car keys-per-page) 0) +;; max-pages-reached (>= page-n max-pages))) +;; ;; not doing anything with other pages for now +;; (setq keys-per-page (reverse keys-per-page) +;; pages (reverse pages)) + +;; first-page (car pages) +;; first-page-str (concat prefix-string (plist-get first-page :str))) +;; (cond ((<= (car keys-per-page) 0) ; check first page +;; (message "%s- which-key can't show keys: Settings and/or frame size\ +;; are too restrictive." prefix-keys) +;; (cons 0 0)) +;; (max-pages-reached +;; (error "Which-key reached the maximum number of pages") +;; (cons 0 0)) +;; ((<= (length formatted-keys) 0) +;; (message "%s- which-key: no keys to display" prefix-keys) +;; (cons 0 0)) +;; (t pages))) + +(defun which-key--pad-column (col-keys) + (let* ((col-key-width (which-key--max-len col-keys 0)) + (col-sep-width (which-key--max-len col-keys 1)) + (col-desc-width (which-key--max-len col-keys 2)) + (col-width (+ 3 col-key-width col-sep-width col-desc-width))) + (cons col-width + (mapcar (lambda (k) + (concat + (s-repeat (- col-key-width (string-width (nth 0 k))) " ") + (nth 0 k) " " (nth 1 k) " " (nth 2 k) + (s-repeat (- col-desc-width (string-width (nth 2 k))) " "))) + col-keys)))) + +(defun which-key--partition-columns (keys avl-lines avl-width) + (let ((cols-w-widths (mapcar #'which-key--pad-column + (-partition-all avl-lines keys))) + (page-width 0) (n-pages 0) + page-cols pages keys/page page-widths) + (dolist (col cols-w-widths) + (if (<= (+ (car col) page-width) avl-width) + (progn (push (cdr col) page-cols) + (setq page-width (+ page-width (car col)))) + (push (which-key--join-columns page-cols) pages) + (push (* (length page-cols) avl-lines) keys/page) + (push page-width page-widths) + (setq n-pages (1+ n-pages) page-cols '() page-width 0))) + (when (> (length page-cols) 0) + (push (which-key--join-columns page-cols) pages) + (push (* (length page-cols) avl-lines) keys/page) + (push page-width page-widths) + (setq n-pages (1+ n-pages))) + (list :pages (reverse pages) :page-height avl-lines + :page-widths (reverse page-widths) + :keys/page (reverse keys/page) :n-pages n-pages))) + +(defun which-key--create-pages (prefix-keys keys sel-win-width) + (let* ((max-dims (which-key--popup-max-dimensions sel-win-width)) (max-lines (car max-dims)) - (avl-width (cdr max-dims)) - (prefix-width (if (eq which-key-show-prefix 'left) prefix-len 0)) - (rem-keys formatted-keys) - (max-pages (+ 1 (length formatted-keys))) - (page-n 0) - keys-per-page pages first-page first-page-str page-res no-room - max-pages-reached) - (while (and rem-keys (not max-pages-reached) (not no-room)) - (setq page-n (1+ page-n) - page-res (which-key--create-page - rem-keys max-lines avl-width prefix-width - vertical which-key-show-remaining-keys page-n)) - (push page-res pages) - (push (if (plist-get page-res :n-keys) - (plist-get page-res :n-keys) 0) keys-per-page) - (setq rem-keys (plist-get page-res :rem-keys) - no-room (<= (car keys-per-page) 0) - max-pages-reached (>= page-n max-pages))) - ;; not doing anything with other pages for now - (setq keys-per-page (reverse keys-per-page) - pages (reverse pages) - first-page (car pages) - first-page-str (concat prefix-string (plist-get first-page :str))) - (cond ((<= (car keys-per-page) 0) ; check first page - (message "%s- which-key can't show keys: Settings and/or frame size\ - are too restrictive." prefix-keys) - (cons 0 0)) - (max-pages-reached - (error "Which-key reached the maximum number of pages") - (cons 0 0)) - ((<= (length formatted-keys) 0) - (message "%s- which-key: no keys to display" prefix-keys) - (cons 0 0)) - (t - (if (eq which-key-popup-type 'minibuffer) - (let (message-log-max) (message "%s" first-page-str)) - (with-current-buffer which-key--buffer - (erase-buffer) - (insert first-page-str) - (goto-char (point-min)))) - (cons (plist-get first-page :height) (plist-get first-page :width)))))) + (max-width (cdr max-dims)) + (prefix-w-face (which-key--propertize-key prefix-keys)) + (prefix-left (when (eq which-key-show-prefix 'left) + (+ 2 (string-width prefix-w-face)))) + (prefix-top (when (eq which-key-show-prefix 'top) + (concat prefix-w-face "-\n"))) + (avl-lines (if prefix-top (- max-lines 1) max-lines)) + (avl-width (if prefix-left (- max-width prefix-left) max-width)) + ;; (prefix-col (when prefix-left + ;; (append (list (concat prefix-w-face " ")) + ;; (-repeat (- avl-lines 1) prefix-width)))) + (vertical (and (eq which-key-popup-type 'side-window) + (member which-key-side-window-location '(left right)))) + (result (which-key--partition-columns keys avl-lines avl-width)) + pages keys/page n-pages found prev-result) + ;; (message "FIRST RESULT\n%s" result) + ;; (message "%s %s %s" avl-lines avl-width (plist-get result :n-pages)) + (cond ;; ((and (> n-rem-keys 0) use-status-key) + ;; (setq status-key (propertize + ;; (format "%s keys not shown" (1+ n-rem-keys)) + ;; 'face 'font-lock-comment-face) + ;; first-try-str (plist-get first-try :str) + ;; first-try-str (substring + ;; first-try-str 0 + ;; (- (length first-try-str) + ;; (plist-get first-try :last-col-width)))) + ;; (plist-put first-try :str (concat first-try-str status-key))) + ((or vertical (> (plist-get result :n-pages) 1) (= 1 avl-lines)) + result) + ;; do a simple search for the smallest number of lines + (t (while (and (> avl-lines 1) (not found)) + (setq avl-lines (- avl-lines 1) + prev-result result + result (which-key--partition-columns + keys avl-lines avl-width) + found (> (plist-get result :n-pages) 1))) + (if (and (> avl-lines 1) found) prev-result result))))) + +(defun which-key--show-page (n) + (let* ((i (mod n (length which-key--pages-plist))) + (page (nth i (plist-get which-key--pages-plist :pages))) + (height (plist-get which-key--pages-plist :page-height)) + (width (nth i (plist-get which-key--pages-plist :page-widths)))) + (if (eq which-key-popup-type 'minibuffer) + (let (message-log-max) (message "%s" page)) + (with-current-buffer which-key--buffer + (erase-buffer) + (insert page) + (goto-char (point-min)))) + (which-key--show-popup (cons height width)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update @@ -943,13 +1019,12 @@ Finally, show the buffer." ;; just in case someone uses one of these (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) - (let* ((buf (current-buffer)) - (formatted-keys (which-key--get-formatted-key-bindings - buf prefix-keys)) - (popup-act-dim (which-key--populate-buffer - (key-description prefix-keys) - formatted-keys (window-width)))) - (which-key--show-popup popup-act-dim))))) + (let ((formatted-keys (which-key--get-formatted-key-bindings + (current-buffer) prefix-keys))) + (setq which-key--pages-plist (which-key--create-pages + (key-description prefix-keys) + formatted-keys (window-width))) + (which-key--show-page 0))))) ;; Timers From e2013569302ea2287ec5238d9e89925f9a71ea44 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 19 Jul 2015 22:18:47 -0400 Subject: [PATCH 191/816] Paging works barely --- which-key.el | 51 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/which-key.el b/which-key.el index 089003a9c64..bab617ba2ac 100644 --- a/which-key.el +++ b/which-key.el @@ -933,10 +933,11 @@ element in each list element of KEYS." (if (<= (+ (car col) page-width) avl-width) (progn (push (cdr col) page-cols) (setq page-width (+ page-width (car col)))) - (push (which-key--join-columns page-cols) pages) - (push (* (length page-cols) avl-lines) keys/page) - (push page-width page-widths) - (setq n-pages (1+ n-pages) page-cols '() page-width 0))) + (when (> (length page-cols) 0) + (push (which-key--join-columns page-cols) pages) + (push (* (length page-cols) avl-lines) keys/page) + (push page-width page-widths) + (setq n-pages (1+ n-pages) page-cols '() page-width 0)))) (when (> (length page-cols) 0) (push (which-key--join-columns page-cols) pages) (push (* (length page-cols) avl-lines) keys/page) @@ -987,18 +988,27 @@ element in each list element of KEYS." found (> (plist-get result :n-pages) 1))) (if (and (> avl-lines 1) found) prev-result result))))) -(defun which-key--show-page (n) - (let* ((i (mod n (length which-key--pages-plist))) - (page (nth i (plist-get which-key--pages-plist :pages))) - (height (plist-get which-key--pages-plist :page-height)) - (width (nth i (plist-get which-key--pages-plist :page-widths)))) - (if (eq which-key-popup-type 'minibuffer) - (let (message-log-max) (message "%s" page)) - (with-current-buffer which-key--buffer - (erase-buffer) - (insert page) - (goto-char (point-min)))) - (which-key--show-popup (cons height width)))) +(defun which-key--show-page (n &optional prefix-keys) + (let ((n-pages (plist-get which-key--pages-plist :n-pages))) + (if (= 0 n-pages) + (if prefix-keys + (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." + prefix-keys) + (message "which-key can't show keys: Settings and/or frame size are too restrictive.")) + (let* ((i (mod n n-pages)) + (page (nth i (plist-get which-key--pages-plist :pages))) + (height (plist-get which-key--pages-plist :page-height)) + (width (nth i (plist-get which-key--pages-plist :page-widths)))) + (if (eq which-key-popup-type 'minibuffer) + (let (message-log-max) (message "%s" page)) + (with-current-buffer which-key--buffer + (erase-buffer) + (insert page) + (goto-char (point-min)))) + (which-key--show-popup (cons height width)))))) + +(evil-leader/set-key "C-M-2" (lambda () (interactive) (which-key--show-page 1))) +(evil-leader/set-key "C-M-2" (lambda () (interactive) (which-key--show-page 1))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update @@ -1020,11 +1030,12 @@ Finally, show the buffer." (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) (let ((formatted-keys (which-key--get-formatted-key-bindings - (current-buffer) prefix-keys))) + (current-buffer) prefix-keys)) + (prefix-keys-desc (key-description prefix-keys))) (setq which-key--pages-plist (which-key--create-pages - (key-description prefix-keys) - formatted-keys (window-width))) - (which-key--show-page 0))))) + prefix-keys-desc formatted-keys + (window-width))) + (which-key--show-page 0 prefix-keys-desc))))) ;; Timers From 1bac4b029c07a5f0067a4768a8b4319cc99e9e74 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 19 Jul 2015 23:02:26 -0400 Subject: [PATCH 192/816] Fix prefix code Also delete old code --- which-key.el | 193 +++++++++------------------------------------------ 1 file changed, 32 insertions(+), 161 deletions(-) diff --git a/which-key.el b/which-key.el index bab617ba2ac..941875f0fe4 100644 --- a/which-key.el +++ b/which-key.el @@ -766,151 +766,6 @@ element in each list element of KEYS." (cl-reduce (lambda (x y) (max x (string-width (nth index y)))) keys :initial-value 0)) -;; (defun which-key--create-page-vertical (keys max-lines max-width prefix-keys) -;; "Format KEYS into string representing a single page of text. -;; Creates columns (padded to be of uniform width) of length -;; MAX-LINES until keys run out or MAX-WIDTH is reached. A non-zero -;; PREFIX-WIDTH adds padding on the left side to allow for prefix -;; keys to be written into the upper left porition of the page." -;; (let* ((prefix-w-face (which-key--propertize-key prefix-keys)) -;; (prefix-width (if (eq which-key-show-prefix 'left) -;; (+ 2 (string-width prefix-w-face)) 0)) -;; (prefix-top (when (eq which-key-show-prefix 'top) -;; (concat prefix-w-face "-\n"))) -;; (avl-lines (if prefix-top (- max-lines 1) max-lines)) -;; (n-col-lines (min avl-lines (length keys))) -;; (prefix-col (when (eq which-key-show-prefix 'left) -;; (append (list (concat prefix-w-face " ")) -;; (-repeat (- n-col-lines 1) prefix-width)))) -;; (all-columns (if prefix-col (list prefix-col) '())) -;; ;; we get 1 back for not putting a space after the last column -;; (avl-width (max 0 (- (+ 1 max-width) -;; prefix-width -;; which-key-unicode-correction))) -;; (act-n-lines (- n-col-lines (if prefix-top 1 0))) -;; (act-width prefix-width) -;; (rem-keys keys) -;; (max-iter 100) (iter-n 0) -;; col-keys col-key-width col-desc-width col-width col-split done -;; new-column col-sep-width prev-rem-keys) -;; ;; (message "frame-width %s prefix-width %s avl-width %s max-width %s" -;; ;; (frame-text-cols) prefix-width avl-width max-width) -;; (while (and rem-keys (<= iter-n max-iter) (not done)) -;; (setq iter-n (1+ iter-n) -;; col-split (-split-at n-col-lines rem-keys) -;; col-keys (car col-split) -;; prev-rem-keys rem-keys -;; rem-keys (cadr col-split) -;; n-col-lines (min avl-lines (length rem-keys)) -;; col-key-width (which-key--max-len col-keys 0) -;; col-sep-width (which-key--max-len col-keys 1) -;; col-desc-width (which-key--max-len col-keys 2) -;; col-width (+ 3 col-key-width col-sep-width col-desc-width) -;; new-column -;; (mapcar (lambda (k) -;; (concat -;; (s-repeat (- col-key-width (string-width (nth 0 k))) " ") -;; (nth 0 k) " " (nth 1 k) " " (nth 2 k) -;; (s-repeat (- col-desc-width (string-width (nth 2 k))) " "))) -;; col-keys)) -;; (if (<= col-width avl-width) -;; (progn (push new-column all-columns) -;; (setq act-width (+ act-width col-width) -;; avl-width (- avl-width col-width))) -;; (setq done t rem-keys prev-rem-keys))) -;; (list :str (if prefix-top -;; (concat prefix-top (which-key--join-columns all-columns)) -;; (which-key--join-columns all-columns)) -;; :height act-n-lines :width act-width -;; :rem-keys rem-keys :n-rem-keys (length rem-keys) -;; :n-keys (- (length keys) (length rem-keys)) -;; :last-col-width col-width))) - -;; (defun which-key--create-page (keys max-lines max-width prefix-keys -;; &optional vertical use-status-key page-n) -;; "Create a page of KEYS with parameters MAX-LINES, MAX-WIDTH,PREFIX-WIDTH. -;; Use as many keys as possible. Use as few lines as possible unless -;; VERTICAL is non-nil. USE-STATUS-KEY inserts an informative -;; message in place of the last key on the page if non-nil. PAGE-N -;; allows for the informative message to reference the current page -;; number." -;; (let* ((n-keys (length keys)) -;; (first-try (which-key--create-page-vertical -;; keys max-lines max-width prefix-keys)) -;; (n-rem-keys (plist-get first-try :n-rem-keys)) -;; (status-key-i (- n-keys n-rem-keys 1)) -;; (next-try-lines max-lines) -;; (iter-n 0) -;; (max-iter (+ 1 max-lines)) -;; prev-try prev-n-rem-keys next-try found status-key first-try-str) -;; (cond ((and (> n-rem-keys 0) use-status-key) -;; (setq status-key (propertize -;; (format "%s keys not shown" (1+ n-rem-keys)) -;; 'face 'font-lock-comment-face) -;; first-try-str (plist-get first-try :str) -;; first-try-str (substring -;; first-try-str 0 -;; (- (length first-try-str) -;; (plist-get first-try :last-col-width)))) -;; (plist-put first-try :str (concat first-try-str status-key))) -;; ((or vertical (> n-rem-keys 0) (= 1 max-lines)) -;; first-try) -;; ;; do a simple search for the smallest number of lines -;; ;; TODO: Implement binary search -;; (t (while (and (<= iter-n max-iter) (not found)) -;; (setq iter-n (1+ iter-n) -;; prev-try next-try -;; next-try-lines (- next-try-lines 1) -;; next-try (which-key--create-page-vertical -;; keys next-try-lines max-width prefix-keys) -;; n-rem-keys (plist-get first-try :n-rem-keys) -;; found (or (= next-try-lines 0) (> n-rem-keys 0)))) -;; prev-try)))) - -;; (defun which-key--create-pages (prefix-keys formatted-keys sel-win-width) -;; "Insert FORMATTED-KEYS into which-key buffer. -;; PREFIX-KEYS may be inserted into the buffer depending on the -;; value of `which-key-show-prefix'. SEL-WIN-WIDTH is passed to -;; `which-key--popup-max-dimensions'." -;; (let* ((vertical (and (eq which-key-popup-type 'side-window) -;; (member which-key-side-window-location '(left right)))) -;; (max-dims (which-key--popup-max-dimensions sel-win-width)) -;; (max-lines (car max-dims)) -;; (avl-width (cdr max-dims)) -;; (rem-keys formatted-keys) -;; (max-pages (+ 1 (length formatted-keys))) -;; (page-n 0) -;; keys-per-page pages first-page first-page-str page-res no-room -;; max-pages-reached) -;; (while (and rem-keys (not max-pages-reached) (not no-room)) -;; (setq page-n (1+ page-n) -;; page-res (which-key--create-page -;; rem-keys max-lines avl-width prefix-keys -;; vertical which-key-show-remaining-keys page-n)) -;; (push page-res pages) -;; (push (if (plist-get page-res :n-keys) -;; (plist-get page-res :n-keys) 0) keys-per-page) -;; (setq rem-keys (plist-get page-res :rem-keys) -;; no-room (<= (car keys-per-page) 0) -;; max-pages-reached (>= page-n max-pages))) -;; ;; not doing anything with other pages for now -;; (setq keys-per-page (reverse keys-per-page) -;; pages (reverse pages)) - -;; first-page (car pages) -;; first-page-str (concat prefix-string (plist-get first-page :str))) -;; (cond ((<= (car keys-per-page) 0) ; check first page -;; (message "%s- which-key can't show keys: Settings and/or frame size\ -;; are too restrictive." prefix-keys) -;; (cons 0 0)) -;; (max-pages-reached -;; (error "Which-key reached the maximum number of pages") -;; (cons 0 0)) -;; ((<= (length formatted-keys) 0) -;; (message "%s- which-key: no keys to display" prefix-keys) -;; (cons 0 0)) -;; (t pages))) - (defun which-key--pad-column (col-keys) (let* ((col-key-width (which-key--max-len col-keys 0)) (col-sep-width (which-key--max-len col-keys 1)) @@ -924,11 +779,14 @@ element in each list element of KEYS." (s-repeat (- col-desc-width (string-width (nth 2 k))) " "))) col-keys)))) -(defun which-key--partition-columns (keys avl-lines avl-width) +(defun which-key--partition-columns (keys prefix-col avl-lines avl-width) (let ((cols-w-widths (mapcar #'which-key--pad-column (-partition-all avl-lines keys))) (page-width 0) (n-pages 0) page-cols pages keys/page page-widths) + (when (and prefix-col (<= (car prefix-col) avl-width)) + (push (cdr prefix-col) page-cols) + (setq page-width (car prefix-col))) (dolist (col cols-w-widths) (if (<= (+ (car col) page-width) avl-width) (progn (push (cdr col) page-cols) @@ -937,7 +795,10 @@ element in each list element of KEYS." (push (which-key--join-columns page-cols) pages) (push (* (length page-cols) avl-lines) keys/page) (push page-width page-widths) - (setq n-pages (1+ n-pages) page-cols '() page-width 0)))) + (setq n-pages (1+ n-pages) page-cols '() page-width 0) + (when (and prefix-col (<= (car prefix-col) avl-width)) + (push (cdr prefix-col) page-cols) + (setq page-width (car prefix-col)))))) (when (> (length page-cols) 0) (push (which-key--join-columns page-cols) pages) (push (* (length page-cols) avl-lines) keys/page) @@ -954,19 +815,17 @@ element in each list element of KEYS." (prefix-w-face (which-key--propertize-key prefix-keys)) (prefix-left (when (eq which-key-show-prefix 'left) (+ 2 (string-width prefix-w-face)))) - (prefix-top (when (eq which-key-show-prefix 'top) - (concat prefix-w-face "-\n"))) + (prefix-top (eq which-key-show-prefix 'top)) (avl-lines (if prefix-top (- max-lines 1) max-lines)) (avl-width (if prefix-left (- max-width prefix-left) max-width)) - ;; (prefix-col (when prefix-left - ;; (append (list (concat prefix-w-face " ")) - ;; (-repeat (- avl-lines 1) prefix-width)))) + (prefix-col (when prefix-left + (cons prefix-left + (append (list (concat prefix-w-face " ")) + (-repeat (- avl-lines 1) (s-repeat prefix-left " ")))))) (vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) - (result (which-key--partition-columns keys avl-lines avl-width)) + (result (which-key--partition-columns keys prefix-col avl-lines avl-width)) pages keys/page n-pages found prev-result) - ;; (message "FIRST RESULT\n%s" result) - ;; (message "%s %s %s" avl-lines avl-width (plist-get result :n-pages)) (cond ;; ((and (> n-rem-keys 0) use-status-key) ;; (setq status-key (propertize ;; (format "%s keys not shown" (1+ n-rem-keys)) @@ -983,8 +842,11 @@ element in each list element of KEYS." (t (while (and (> avl-lines 1) (not found)) (setq avl-lines (- avl-lines 1) prev-result result + prefix-col (when prefix-left + (cons prefix-left + (-take avl-lines (cdr prefix-col)))) result (which-key--partition-columns - keys avl-lines avl-width) + keys prefix-col avl-lines avl-width) found (> (plist-get result :n-pages) 1))) (if (and (> avl-lines 1) found) prev-result result))))) @@ -998,17 +860,23 @@ element in each list element of KEYS." (let* ((i (mod n n-pages)) (page (nth i (plist-get which-key--pages-plist :pages))) (height (plist-get which-key--pages-plist :page-height)) - (width (nth i (plist-get which-key--pages-plist :page-widths)))) + (width (nth i (plist-get which-key--pages-plist :page-widths))) + (prefix-w-face (which-key--propertize-key prefix-keys))) (if (eq which-key-popup-type 'minibuffer) - (let (message-log-max) (message "%s" page)) + (if (eq which-key-show-prefix 'top) + (let (message-log-max) (message "%s" (concat prefix-w-face "-\n" page))) + (let (message-log-max) (message "%s" page))) (with-current-buffer which-key--buffer (erase-buffer) - (insert page) + (if (eq which-key-show-prefix 'top) + (insert (concat prefix-w-face "-\n" page)) + (insert page)) (goto-char (point-min)))) (which-key--show-popup (cons height width)))))) -(evil-leader/set-key "C-M-2" (lambda () (interactive) (which-key--show-page 1))) -(evil-leader/set-key "C-M-2" (lambda () (interactive) (which-key--show-page 1))) +;; (setq map (make-sparse-keymap)) +;; (define-key map (kbd "C-M-1") (lambda () (interactive) (which-key--show-page 0))) +;; (define-key map (kbd "C-M-2") (lambda () (interactive) (which-key--show-page 1))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update @@ -1050,5 +918,8 @@ Finally, show the buffer." (when which-key--open-timer (cancel-timer which-key--open-timer))) +;; TODO +;; fix status key + (provide 'which-key) ;;; which-key.el ends here From 589baa51c594ab956ffd825390f765f2264ebd5a Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 19 Jul 2015 23:23:36 -0400 Subject: [PATCH 193/816] Add a couple of docstrings --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d1370268310..926b45668d9 100644 --- a/which-key.el +++ b/which-key.el @@ -252,7 +252,8 @@ to a non-nil value for the execution of a command. Like this Used when `which-key-popup-type' is frame.") (defvar which-key--echo-keystrokes-backup nil "Internal: Backup the initial value of `echo-keystrokes'.") -(defvar which-key--pages-plist nil) +(defvar which-key--pages-plist nil + "Internal: Holds page objects") ;;;###autoload (define-minor-mode which-key-mode @@ -891,6 +892,8 @@ element in each list element of KEYS." (if (and (> avl-lines 1) found) prev-result result))))) (defun which-key--show-page (n &optional prefix-keys) + "Show page N, starting from 0. +PREFIX-KEYS holds the description of the prefix keys." (let ((n-pages (plist-get which-key--pages-plist :n-pages))) (if (= 0 n-pages) (if prefix-keys From 45d6eb6f4f0c24082b8b9cbf4b54e606ebd2832e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 19 Jul 2015 23:37:17 -0400 Subject: [PATCH 194/816] Update README.org --- README.org | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index 810deff70cb..fa85454185a 100644 --- a/README.org +++ b/README.org @@ -1,7 +1,16 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] ** Introduction -This is a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]] for emacs. The intention is to provide the +=which-key= is a minor mode for Emacs that displays the keybindings following your currently +entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode +if you enter =C-x= and wait for the default of 1 second the minibuffer will expand with all of +the available keybindings that follow =C-x= (or as many as space allows given your settings). +This includes prefixes like =C-x 8= which are shown in a different face. Screenshots of what +the popup will look like are included below. =which-key= started as a rewrite of +[[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged +to a certain extent. + +With respect to =guide-key=, the intention is to provide the following features: 1. A different polling mechanism to make it lighter on resources than guide-key 2. An improved display of keys with more keys being shown by default and a nicer From dd63f0a7600762dced5263a4d7109cba56e4ba55 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 00:04:11 -0400 Subject: [PATCH 195/816] Move all prefix adding code to one place --- which-key.el | 42 +++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/which-key.el b/which-key.el index 926b45668d9..59cc51e985a 100644 --- a/which-key.el +++ b/which-key.el @@ -820,14 +820,11 @@ element in each list element of KEYS." (s-repeat (- col-desc-width (string-width (nth 2 k))) " "))) col-keys)))) -(defun which-key--partition-columns (keys prefix-col avl-lines avl-width) +(defun which-key--partition-columns (keys avl-lines avl-width) (let ((cols-w-widths (mapcar #'which-key--pad-column (-partition-all avl-lines keys))) (page-width 0) (n-pages 0) page-cols pages keys/page page-widths) - (when (and prefix-col (<= (car prefix-col) avl-width)) - (push (cdr prefix-col) page-cols) - (setq page-width (car prefix-col))) (dolist (col cols-w-widths) (if (<= (+ (car col) page-width) avl-width) (progn (push (cdr col) page-cols) @@ -836,10 +833,7 @@ element in each list element of KEYS." (push (which-key--join-columns page-cols) pages) (push (* (length page-cols) avl-lines) keys/page) (push page-width page-widths) - (setq n-pages (1+ n-pages) page-cols '() page-width 0) - (when (and prefix-col (<= (car prefix-col) avl-width)) - (push (cdr prefix-col) page-cols) - (setq page-width (car prefix-col)))))) + (setq n-pages (1+ n-pages) page-cols '() page-width 0)))) (when (> (length page-cols) 0) (push (which-key--join-columns page-cols) pages) (push (* (length page-cols) avl-lines) keys/page) @@ -859,13 +853,9 @@ element in each list element of KEYS." (prefix-top (eq which-key-show-prefix 'top)) (avl-lines (if prefix-top (- max-lines 1) max-lines)) (avl-width (if prefix-left (- max-width prefix-left) max-width)) - (prefix-col (when prefix-left - (cons prefix-left - (append (list (concat prefix-w-face " ")) - (-repeat (- avl-lines 1) (s-repeat prefix-left " ")))))) (vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) - (result (which-key--partition-columns keys prefix-col avl-lines avl-width)) + (result (which-key--partition-columns keys avl-lines avl-width)) pages keys/page n-pages found prev-result) (cond ;; ((and (> n-rem-keys 0) use-status-key) ;; (setq status-key (propertize @@ -883,11 +873,8 @@ element in each list element of KEYS." (t (while (and (> avl-lines 1) (not found)) (setq avl-lines (- avl-lines 1) prev-result result - prefix-col (when prefix-left - (cons prefix-left - (-take avl-lines (cdr prefix-col)))) result (which-key--partition-columns - keys prefix-col avl-lines avl-width) + keys avl-lines avl-width) found (> (plist-get result :n-pages) 1))) (if (and (> avl-lines 1) found) prev-result result))))) @@ -904,17 +891,22 @@ PREFIX-KEYS holds the description of the prefix keys." (page (nth i (plist-get which-key--pages-plist :pages))) (height (plist-get which-key--pages-plist :page-height)) (width (nth i (plist-get which-key--pages-plist :page-widths))) - (prefix-w-face (which-key--propertize-key prefix-keys))) + (prefix-w-face (which-key--propertize-key prefix-keys)) + (prefix-width (string-width prefix-w-face)) + spaces) + (cond ((eq which-key-show-prefix 'left) + (setq spaces (s-repeat prefix-width " ") + page (concat + prefix-w-face " " + (s-replace "\n" (concat "\n " spaces) page)))) + ((eq which-key-show-prefix 'top) + (setq page (concat prefix-w-face "-\n" page)))) (if (eq which-key-popup-type 'minibuffer) - (if (eq which-key-show-prefix 'top) - (let (message-log-max) (message "%s" (concat prefix-w-face "-\n" page))) - (let (message-log-max) (message "%s" page))) + (let (message-log-max) (message "%s" page)) (with-current-buffer which-key--buffer (erase-buffer) - (if (eq which-key-show-prefix 'top) - (insert (concat prefix-w-face "-\n" page)) - (insert page)) - (goto-char (point-min)))) + (insert page) + (goto-char (point-max)))) (which-key--show-popup (cons height width)))))) ;; (setq map (make-sparse-keymap)) From 3b1ee3b204ff4151753538c8dc5a974e358e8a8d Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 08:22:21 -0400 Subject: [PATCH 196/816] Add status to mode line --- which-key.el | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/which-key.el b/which-key.el index 59cc51e985a..45bd5d7ba10 100644 --- a/which-key.el +++ b/which-key.el @@ -254,6 +254,8 @@ Used when `which-key-popup-type' is frame.") "Internal: Backup the initial value of `echo-keystrokes'.") (defvar which-key--pages-plist nil "Internal: Holds page objects") +(defvar which-key--lighter-backup nil + "Internal: Holds lighter backup") ;;;###autoload (define-minor-mode which-key-mode @@ -264,12 +266,14 @@ Used when `which-key-popup-type' is frame.") (progn (unless which-key--is-setup (which-key--setup)) (add-hook 'pre-command-hook #'which-key--hide-popup) + (add-hook 'pre-command-hook #'which-key--lighter-restore) (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 'pre-command-hook #'which-key--hide-popup) + (remove-hook 'pre-command-hook #'which-key--lighter-restore) (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))) @@ -841,7 +845,8 @@ element in each list element of KEYS." (setq n-pages (1+ n-pages))) (list :pages (reverse pages) :page-height avl-lines :page-widths (reverse page-widths) - :keys/page (reverse keys/page) :n-pages n-pages))) + :keys/page (reverse keys/page) :n-pages n-pages + :tot-keys (length keys)))) (defun which-key--create-pages (prefix-keys keys sel-win-width) (let* ((max-dims (which-key--popup-max-dimensions sel-win-width)) @@ -857,26 +862,23 @@ element in each list element of KEYS." (member which-key-side-window-location '(left right)))) (result (which-key--partition-columns keys avl-lines avl-width)) pages keys/page n-pages found prev-result) - (cond ;; ((and (> n-rem-keys 0) use-status-key) - ;; (setq status-key (propertize - ;; (format "%s keys not shown" (1+ n-rem-keys)) - ;; 'face 'font-lock-comment-face) - ;; first-try-str (plist-get first-try :str) - ;; first-try-str (substring - ;; first-try-str 0 - ;; (- (length first-try-str) - ;; (plist-get first-try :last-col-width)))) - ;; (plist-put first-try :str (concat first-try-str status-key))) - ((or vertical (> (plist-get result :n-pages) 1) (= 1 avl-lines)) - result) - ;; do a simple search for the smallest number of lines - (t (while (and (> avl-lines 1) (not found)) - (setq avl-lines (- avl-lines 1) - prev-result result - result (which-key--partition-columns - keys avl-lines avl-width) - found (> (plist-get result :n-pages) 1))) - (if (and (> avl-lines 1) found) prev-result result))))) + (cond ((or vertical (> (plist-get result :n-pages) 1) (= 1 avl-lines)) + result) + ;; do a simple search for the smallest number of lines + (t (while (and (> avl-lines 1) (not found)) + (setq avl-lines (- avl-lines 1) + prev-result result + result (which-key--partition-columns + keys avl-lines avl-width) + found (> (plist-get result :n-pages) 1))) + (if (and (> avl-lines 1) found) prev-result result))))) + +(defun which-key--lighter-status (n-shown n-tot) + (setq which-key--lighter-backup (cdr (assq 'which-key-mode minor-mode-alist))) + (setcar (cdr (assq 'which-key-mode minor-mode-alist)) + (format " WK: %s/%s keys" n-shown n-tot))) +(defun which-key--lighter-restore () + (setcar (cdr (assq 'which-key-mode minor-mode-alist)) which-key--lighter-backup)) (defun which-key--show-page (n &optional prefix-keys) "Show page N, starting from 0. @@ -891,6 +893,8 @@ PREFIX-KEYS holds the description of the prefix keys." (page (nth i (plist-get which-key--pages-plist :pages))) (height (plist-get which-key--pages-plist :page-height)) (width (nth i (plist-get which-key--pages-plist :page-widths))) + (n-shown (nth i (plist-get which-key--pages-plist :keys/page))) + (n-tot (plist-get which-key--pages-plist :tot-keys)) (prefix-w-face (which-key--propertize-key prefix-keys)) (prefix-width (string-width prefix-w-face)) spaces) @@ -901,6 +905,8 @@ PREFIX-KEYS holds the description of the prefix keys." (s-replace "\n" (concat "\n " spaces) page)))) ((eq which-key-show-prefix 'top) (setq page (concat prefix-w-face "-\n" page)))) + (when which-key-show-remaining-keys + (which-key--lighter-status n-shown n-tot)) (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" page)) (with-current-buffer which-key--buffer From 1a2ef54cc8d91c231df29383b23d36e993141ab2 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 08:43:59 -0400 Subject: [PATCH 197/816] Fix mode line status --- which-key.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 45bd5d7ba10..75ef0e48230 100644 --- a/which-key.el +++ b/which-key.el @@ -846,7 +846,7 @@ element in each list element of KEYS." (list :pages (reverse pages) :page-height avl-lines :page-widths (reverse page-widths) :keys/page (reverse keys/page) :n-pages n-pages - :tot-keys (length keys)))) + :tot-keys (cl-reduce '+ keys/page :initial-value 0)))) (defun which-key--create-pages (prefix-keys keys sel-win-width) (let* ((max-dims (which-key--popup-max-dimensions sel-win-width)) @@ -874,11 +874,13 @@ element in each list element of KEYS." (if (and (> avl-lines 1) found) prev-result result))))) (defun which-key--lighter-status (n-shown n-tot) - (setq which-key--lighter-backup (cdr (assq 'which-key-mode minor-mode-alist))) - (setcar (cdr (assq 'which-key-mode minor-mode-alist)) - (format " WK: %s/%s keys" n-shown n-tot))) + (when which-key-show-remaining-keys + (setq which-key--lighter-backup (cdr (assq 'which-key-mode minor-mode-alist))) + (setcar (cdr (assq 'which-key-mode minor-mode-alist)) + (format " WK: %s/%s keys" n-shown n-tot)))) (defun which-key--lighter-restore () - (setcar (cdr (assq 'which-key-mode minor-mode-alist)) which-key--lighter-backup)) + (when which-key-show-remaining-keys + (setcar (cdr (assq 'which-key-mode minor-mode-alist)) which-key--lighter-backup))) (defun which-key--show-page (n &optional prefix-keys) "Show page N, starting from 0. @@ -905,8 +907,7 @@ PREFIX-KEYS holds the description of the prefix keys." (s-replace "\n" (concat "\n " spaces) page)))) ((eq which-key-show-prefix 'top) (setq page (concat prefix-w-face "-\n" page)))) - (when which-key-show-remaining-keys - (which-key--lighter-status n-shown n-tot)) + (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" page)) (with-current-buffer which-key--buffer From 9064b941ef197f453ecf867e1e921a259b0260d2 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 10:48:08 -0400 Subject: [PATCH 198/816] Typo in lighter-status function --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 75ef0e48230..7fc1ee93639 100644 --- a/which-key.el +++ b/which-key.el @@ -875,7 +875,7 @@ element in each list element of KEYS." (defun which-key--lighter-status (n-shown n-tot) (when which-key-show-remaining-keys - (setq which-key--lighter-backup (cdr (assq 'which-key-mode minor-mode-alist))) + (setq which-key--lighter-backup (cadr (assq 'which-key-mode minor-mode-alist))) (setcar (cdr (assq 'which-key-mode minor-mode-alist)) (format " WK: %s/%s keys" n-shown n-tot)))) (defun which-key--lighter-restore () From 3c2378db14d8030dc924ddedef82f2d7de3ae538 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 11:05:26 -0400 Subject: [PATCH 199/816] Add description sort and make key order default --- which-key.el | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 7fc1ee93639..2d05724a01f 100644 --- a/which-key.el +++ b/which-key.el @@ -177,10 +177,12 @@ a percentage out of the frame's height." :type '(radio (const :tag "Yes" t) (const :tag "No" nil))) -(defcustom which-key-sort nil - "Sort output by `key-description' if non-nil." +(defcustom which-key-sort-order 'which-key-key-order + "If nil, leave output unsorted. Set to `which-key-key-order' to +order by key or `which-key-description-order' to order by +description." :group 'which-key - :type 'boolean) + :type 'function) ;; Faces (defface which-key-key-face @@ -743,11 +745,6 @@ alists. Returns a list (key separator description)." unformatted))) (defun which-key--key-description< (a b) - "Order key descriptions A and B. -Order is lexicographic within a \"class\", where the classes and -the ordering of classes are listed below. - -special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." (let* ((aem? (string-equal a "")) (bem? (string-equal b "")) (a1? (= 1 (length a))) @@ -773,6 +770,19 @@ special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." ((or apr? bpr?) apr?) (t (string-lessp a b))))) +(defsubst which-key-key-order (alst blst) + "Order key descriptions A and B. +Order is lexicographic within a \"class\", where the classes and +the ordering of classes are listed below. + +special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." + (which-key--key-description< (car alst) (car blst))) + +(defsubst which-key-description-order (alst blst) + "Order descriptions of A and B. +Uses `string-lessp' after applying lowercase." + (string-lessp (downcase (cdr alst)) (downcase (cdr blst)))) + (defun which-key--get-formatted-key-bindings (buffer key-seq) "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." @@ -790,10 +800,9 @@ BUFFER that follow the key sequence KEY-SEQ." desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted :test (lambda (x y) (string-equal (car x) (car y)))))) - (when which-key-sort + (when which-key-sort-order (setq unformatted - (sort unformatted - (lambda (a b) (which-key--key-description< (car a) (car b)))))) + (sort unformatted (lambda (a b) (funcall which-key-sort-order a b))))) (which-key--format-and-replace unformatted (key-description key-seq)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From a2401c8654d02718c1b986cad1667976ef5ba613 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 12:41:30 -0400 Subject: [PATCH 200/816] Start on right-bottom and bottom-right sw impl --- which-key.el | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 2d05724a01f..5cf07b7aea0 100644 --- a/which-key.el +++ b/which-key.el @@ -143,7 +143,9 @@ Should be one of top, bottom, left or right." :type '(radio (const right) (const bottom) (const left) - (const top))) + (const top) + (const right-bottom) + (const bottom-right))) (defcustom which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window and @@ -950,11 +952,40 @@ Finally, show the buffer." (not which-key-inhibit)) (let ((formatted-keys (which-key--get-formatted-key-bindings (current-buffer) prefix-keys)) - (prefix-keys-desc (key-description prefix-keys))) - (setq which-key--pages-plist (which-key--create-pages - prefix-keys-desc formatted-keys - (window-width))) - (which-key--show-page 0 prefix-keys-desc))))) + (prefix-keys-desc (key-description prefix-keys)) + pages-right pages-bottom) + (cond ((and (eq which-key-popup-type 'side-window) + (member which-key-side-window-location '(right-bottom bottom-right))) + (let ((which-key-side-window-location 'right)) + (setq pages-right (which-key--create-pages + prefix-keys-desc formatted-keys + (window-width)))) + (let ((which-key-side-window-location 'bottom)) + (setq pages-bottom (which-key--create-pages + prefix-keys-desc formatted-keys + (window-width)))) + (cond ((and (eq which-key-side-window-location 'right-bottom) + (< 0 (plist-get pages-right :n-pages))) + (setq which-key--pages-plist pages-right) + (let ((which-key-side-window-location 'right)) + (which-key--show-page 0 prefix-keys-desc))) + ((eq which-key-side-window-location 'right-bottom) + (setq which-key--pages-plist pages-bottom) + (let ((which-key-side-window-location 'bottom)) + (which-key--show-page 0 prefix-keys-desc))) + ((and (eq which-key-side-window-location 'bottom-right) + (< 0 (plist-get pages-bottom :n-pages))) + (setq which-key--pages-plist pages-bottom) + (let ((which-key-side-window-location 'bottom)) + (which-key--show-page 0 prefix-keys-desc))) + ((eq which-key-side-window-location 'bottom-right) + (setq which-key--pages-plist pages-bottom) + (let ((which-key-side-window-location 'bottom)) + (which-key--show-page 0 prefix-keys-desc))))) + (t (setq which-key--pages-plist (which-key--create-pages + prefix-keys-desc formatted-keys + (window-width))) + (which-key--show-page 0 prefix-keys-desc))))))) ;; Timers From 4125bc6821c6b7836b434764c67decae0e50eb1c Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 13:35:38 -0400 Subject: [PATCH 201/816] echo-keystrokes might be nil --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 5cf07b7aea0..7e1a4b0c34d 100644 --- a/which-key.el +++ b/which-key.el @@ -302,7 +302,8 @@ set too high) and setup which-key buffer." (defun which-key--setup-echo-keystrokes () "Reduce `echo-keystrokes' if necessary (it will interfer if it's set too high)." - (when (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001) + (when (and echo-keystrokes + (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001)) (setq which-key--echo-keystrokes-backup echo-keystrokes) (if (> which-key-idle-delay which-key-echo-keystrokes) (setq echo-keystrokes which-key-echo-keystrokes) From 6adae6fd772f8894ca29318771668a0614f37487 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 13:53:25 -0400 Subject: [PATCH 202/816] Ability to specify two locations for side-window --- which-key.el | 66 ++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/which-key.el b/which-key.el index 7e1a4b0c34d..cb855e98c23 100644 --- a/which-key.el +++ b/which-key.el @@ -138,14 +138,17 @@ the feature off." (defcustom 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." +Should be one of top, bottom, left or right. You can also specify +a list of two locations, like (right bottom). In this case, the +first location is tried. If there is not enough room, the second +location is tried." :group 'which-key :type '(radio (const right) (const bottom) (const left) (const top) - (const right-bottom) - (const bottom-right))) + (const (right bottom)) + (const (bottom right)))) (defcustom which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window and @@ -925,7 +928,7 @@ PREFIX-KEYS holds the description of the prefix keys." (with-current-buffer which-key--buffer (erase-buffer) (insert page) - (goto-char (point-max)))) + (goto-char (point-min)))) (which-key--show-popup (cons height width)))))) ;; (setq map (make-sparse-keymap)) @@ -935,6 +938,23 @@ PREFIX-KEYS holds the description of the prefix keys." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update +(defun which-key--try-2-side-windows (loc1 loc2) + (let (pages1 pages2) + (let ((which-key-side-window-location loc1)) + (setq pages1 (which-key--create-pages + prefix-keys-desc formatted-keys + (window-width)))) + (if (< 0 (plist-get pages1 :n-pages)) + (progn + (setq which-key--pages-plist pages1) + (let ((which-key-side-window-location loc1)) + (which-key--show-page 0 prefix-keys-desc))) + (let ((which-key-side-window-location loc2)) + (setq which-key--pages-plist (which-key--create-pages + prefix-keys-desc formatted-keys + (window-width))) + (which-key--show-page 0 prefix-keys-desc))))) + (defun which-key--update () "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." @@ -955,38 +975,12 @@ Finally, show the buffer." (current-buffer) prefix-keys)) (prefix-keys-desc (key-description prefix-keys)) pages-right pages-bottom) - (cond ((and (eq which-key-popup-type 'side-window) - (member which-key-side-window-location '(right-bottom bottom-right))) - (let ((which-key-side-window-location 'right)) - (setq pages-right (which-key--create-pages - prefix-keys-desc formatted-keys - (window-width)))) - (let ((which-key-side-window-location 'bottom)) - (setq pages-bottom (which-key--create-pages - prefix-keys-desc formatted-keys - (window-width)))) - (cond ((and (eq which-key-side-window-location 'right-bottom) - (< 0 (plist-get pages-right :n-pages))) - (setq which-key--pages-plist pages-right) - (let ((which-key-side-window-location 'right)) - (which-key--show-page 0 prefix-keys-desc))) - ((eq which-key-side-window-location 'right-bottom) - (setq which-key--pages-plist pages-bottom) - (let ((which-key-side-window-location 'bottom)) - (which-key--show-page 0 prefix-keys-desc))) - ((and (eq which-key-side-window-location 'bottom-right) - (< 0 (plist-get pages-bottom :n-pages))) - (setq which-key--pages-plist pages-bottom) - (let ((which-key-side-window-location 'bottom)) - (which-key--show-page 0 prefix-keys-desc))) - ((eq which-key-side-window-location 'bottom-right) - (setq which-key--pages-plist pages-bottom) - (let ((which-key-side-window-location 'bottom)) - (which-key--show-page 0 prefix-keys-desc))))) - (t (setq which-key--pages-plist (which-key--create-pages - prefix-keys-desc formatted-keys - (window-width))) - (which-key--show-page 0 prefix-keys-desc))))))) + (if (listp which-key-side-window-location) + (apply #'which-key--try-2-side-windows which-key-side-window-location) + (setq which-key--pages-plist (which-key--create-pages + prefix-keys-desc formatted-keys + (window-width))) + (which-key--show-page 0 prefix-keys-desc)))))) ;; Timers From 82ea3f8789aae440edc5e73b33ff31d4b013a987 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 14:05:42 -0400 Subject: [PATCH 203/816] Fix bug in page layout Pages were getting dropped --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index cb855e98c23..972069a36b6 100644 --- a/which-key.el +++ b/which-key.el @@ -852,7 +852,9 @@ element in each list element of KEYS." (push (which-key--join-columns page-cols) pages) (push (* (length page-cols) avl-lines) keys/page) (push page-width page-widths) - (setq n-pages (1+ n-pages) page-cols '() page-width 0)))) + (setq n-pages (1+ n-pages) + page-cols (list (cdr col)) + page-width (car col))))) (when (> (length page-cols) 0) (push (which-key--join-columns page-cols) pages) (push (* (length page-cols) avl-lines) keys/page) @@ -877,6 +879,7 @@ element in each list element of KEYS." (member which-key-side-window-location '(left right)))) (result (which-key--partition-columns keys avl-lines avl-width)) pages keys/page n-pages found prev-result) + (setq int result) (cond ((or vertical (> (plist-get result :n-pages) 1) (= 1 avl-lines)) result) ;; do a simple search for the smallest number of lines From 765136acaf7697be37924693e5b3a563ee9e5f2f Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 14:12:09 -0400 Subject: [PATCH 204/816] Don't show page if first column doesn't fit --- which-key.el | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/which-key.el b/which-key.el index 972069a36b6..c9b7aacdbaa 100644 --- a/which-key.el +++ b/which-key.el @@ -844,26 +844,29 @@ element in each list element of KEYS." (-partition-all avl-lines keys))) (page-width 0) (n-pages 0) page-cols pages keys/page page-widths) - (dolist (col cols-w-widths) - (if (<= (+ (car col) page-width) avl-width) - (progn (push (cdr col) page-cols) - (setq page-width (+ page-width (car col)))) - (when (> (length page-cols) 0) - (push (which-key--join-columns page-cols) pages) - (push (* (length page-cols) avl-lines) keys/page) - (push page-width page-widths) - (setq n-pages (1+ n-pages) - page-cols (list (cdr col)) - page-width (car col))))) - (when (> (length page-cols) 0) - (push (which-key--join-columns page-cols) pages) - (push (* (length page-cols) avl-lines) keys/page) - (push page-width page-widths) - (setq n-pages (1+ n-pages))) - (list :pages (reverse pages) :page-height avl-lines - :page-widths (reverse page-widths) - :keys/page (reverse keys/page) :n-pages n-pages - :tot-keys (cl-reduce '+ keys/page :initial-value 0)))) + (if (> (car (car cols-w-widths)) avl-width) + (list :pages nil :page-height 0 :page-widths '(0) + :keys/page '(0) :n-pages 0 :tot-keys 0) + (dolist (col cols-w-widths) + (if (<= (+ (car col) page-width) avl-width) + (progn (push (cdr col) page-cols) + (setq page-width (+ page-width (car col)))) + (when (> (length page-cols) 0) + (push (which-key--join-columns page-cols) pages) + (push (* (length page-cols) avl-lines) keys/page) + (push page-width page-widths) + (setq n-pages (1+ n-pages) + page-cols (list (cdr col)) + page-width (car col))))) + (when (> (length page-cols) 0) + (push (which-key--join-columns page-cols) pages) + (push (* (length page-cols) avl-lines) keys/page) + (push page-width page-widths) + (setq n-pages (1+ n-pages))) + (list :pages (reverse pages) :page-height avl-lines + :page-widths (reverse page-widths) + :keys/page (reverse keys/page) :n-pages n-pages + :tot-keys (cl-reduce '+ keys/page :initial-value 0))))) (defun which-key--create-pages (prefix-keys keys sel-win-width) (let* ((max-dims (which-key--popup-max-dimensions sel-win-width)) From ee782ebfc52e5cae5b397473732cefcea3c5d8a8 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 20 Jul 2015 16:02:30 -0400 Subject: [PATCH 205/816] Put spaces in separator so they can be changed --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index c9b7aacdbaa..05552b3315e 100644 --- a/which-key.el +++ b/which-key.el @@ -57,7 +57,7 @@ Also adds \"..\"." :group 'which-key :type 'integer) -(defcustom which-key-separator "→" +(defcustom which-key-separator " → " "Separator to use between key and description." :group 'which-key :type 'string) @@ -830,12 +830,12 @@ element in each list element of KEYS." (let* ((col-key-width (which-key--max-len col-keys 0)) (col-sep-width (which-key--max-len col-keys 1)) (col-desc-width (which-key--max-len col-keys 2)) - (col-width (+ 3 col-key-width col-sep-width col-desc-width))) + (col-width (+ 1 col-key-width col-sep-width col-desc-width))) (cons col-width (mapcar (lambda (k) (concat (s-repeat (- col-key-width (string-width (nth 0 k))) " ") - (nth 0 k) " " (nth 1 k) " " (nth 2 k) + (nth 0 k) (nth 1 k) (nth 2 k) (s-repeat (- col-desc-width (string-width (nth 2 k))) " "))) col-keys)))) From d890188573f5efedeb2769753a64ac923f6269ef Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 08:09:41 -0400 Subject: [PATCH 206/816] Show page count with prefix --- which-key.el | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 05552b3315e..5d3ac667ea7 100644 --- a/which-key.el +++ b/which-key.el @@ -845,6 +845,7 @@ element in each list element of KEYS." (page-width 0) (n-pages 0) page-cols pages keys/page page-widths) (if (> (car (car cols-w-widths)) avl-width) + ;; give up if first column doesn't fit (list :pages nil :page-height 0 :page-widths '(0) :keys/page '(0) :n-pages 0 :tot-keys 0) (dolist (col cols-w-widths) @@ -919,15 +920,22 @@ PREFIX-KEYS holds the description of the prefix keys." (n-shown (nth i (plist-get which-key--pages-plist :keys/page))) (n-tot (plist-get which-key--pages-plist :tot-keys)) (prefix-w-face (which-key--propertize-key prefix-keys)) - (prefix-width (string-width prefix-w-face)) - spaces) + (status-left (propertize (format "%s/%s" (1+ i) n-pages) + 'face 'font-lock-comment-face)) + (status-top (propertize (format "[%s/%s]" (1+ i) n-pages) + 'face 'font-lock-comment-face)) + (first-col-width (+ 2 (max (string-width prefix-w-face) + (string-width status-left)))) + (prefix-left (s-pad-right first-col-width " " prefix-w-face)) + (status-left (s-pad-right first-col-width " " status-left)) + new-end lines) (cond ((eq which-key-show-prefix 'left) - (setq spaces (s-repeat prefix-width " ") - page (concat - prefix-w-face " " - (s-replace "\n" (concat "\n " spaces) page)))) + (setq lines (split-string page "\n") + first (concat prefix-left (car lines) "\n" status-left) + new-end (concat "\n" (s-repeat first-col-width " ")) + page (concat first (mapconcat #'identity (cdr lines) new-end)))) ((eq which-key-show-prefix 'top) - (setq page (concat prefix-w-face "-\n" page)))) + (setq page (concat prefix-w-face "- " status-top "\n" page)))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" page)) From c7af70a1cc6d241ad228c2746a204732391de71b Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 09:05:08 -0400 Subject: [PATCH 207/816] Basic paging works --- which-key.el | 106 +++++++++++++++++++++++++++++---------------------- 1 file changed, 60 insertions(+), 46 deletions(-) diff --git a/which-key.el b/which-key.el index 5d3ac667ea7..3b1d1cbbbb3 100644 --- a/which-key.el +++ b/which-key.el @@ -263,6 +263,11 @@ Used when `which-key-popup-type' is frame.") "Internal: Holds page objects") (defvar which-key--lighter-backup nil "Internal: Holds lighter backup") +(defvar which-key--current-prefix nil + "Internal: Holds current prefix") +(defvar which-key--last-prefix nil) +(defvar which-key--current-page-n nil) +(defvar which-key--request-page nil) ;;;###autoload (define-minor-mode which-key-mode @@ -728,7 +733,7 @@ removing a \"group:\" prefix." 'which-key-group-description-face 'which-key-command-description-face)))) -(defun which-key--format-and-replace (unformatted prefix-keys) +(defun which-key--format-and-replace (unformatted) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." @@ -739,7 +744,7 @@ alists. Returns a list (key separator description)." (let* ((key (car key-desc-cons)) (desc (cdr key-desc-cons)) (group (which-key--group-p desc)) - (keys (concat prefix-keys " " key)) + (keys (concat (key-description which-key--current-prefix) " " key)) (key (which-key--maybe-replace key which-key-key-replacement-alist)) (desc (which-key--maybe-replace @@ -789,14 +794,14 @@ special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." Uses `string-lessp' after applying lowercase." (string-lessp (downcase (cdr alst)) (downcase (cdr blst)))) -(defun which-key--get-formatted-key-bindings (buffer key-seq) +(defun which-key--get-formatted-key-bindings (buffer) "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." - (let ((key-str-qt (regexp-quote (key-description key-seq))) + (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) key-match desc-match unformatted format-res formatted column-width) (with-temp-buffer - (describe-buffer-bindings buffer key-seq) + (describe-buffer-bindings buffer which-key--current-prefix) (goto-char (point-max)) ; want to put last keys in first (while (re-search-backward (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" @@ -809,7 +814,7 @@ BUFFER that follow the key sequence KEY-SEQ." (when which-key-sort-order (setq unformatted (sort unformatted (lambda (a b) (funcall which-key-sort-order a b))))) - (which-key--format-and-replace unformatted (key-description key-seq)))) + (which-key--format-and-replace unformatted))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for laying out which-key buffer pages @@ -848,17 +853,17 @@ element in each list element of KEYS." ;; give up if first column doesn't fit (list :pages nil :page-height 0 :page-widths '(0) :keys/page '(0) :n-pages 0 :tot-keys 0) - (dolist (col cols-w-widths) - (if (<= (+ (car col) page-width) avl-width) - (progn (push (cdr col) page-cols) - (setq page-width (+ page-width (car col)))) - (when (> (length page-cols) 0) - (push (which-key--join-columns page-cols) pages) - (push (* (length page-cols) avl-lines) keys/page) - (push page-width page-widths) - (setq n-pages (1+ n-pages) - page-cols (list (cdr col)) - page-width (car col))))) + (dolist (col cols-w-widths) + (if (<= (+ (car col) page-width) avl-width) + (progn (push (cdr col) page-cols) + (setq page-width (+ page-width (car col)))) + (when (> (length page-cols) 0) + (push (which-key--join-columns page-cols) pages) + (push (* (length page-cols) avl-lines) keys/page) + (push page-width page-widths) + (setq n-pages (1+ n-pages) + page-cols (list (cdr col)) + page-width (car col))))) (when (> (length page-cols) 0) (push (which-key--join-columns page-cols) pages) (push (* (length page-cols) avl-lines) keys/page) @@ -869,11 +874,12 @@ element in each list element of KEYS." :keys/page (reverse keys/page) :n-pages n-pages :tot-keys (cl-reduce '+ keys/page :initial-value 0))))) -(defun which-key--create-pages (prefix-keys keys sel-win-width) +(defun which-key--create-pages (keys sel-win-width) (let* ((max-dims (which-key--popup-max-dimensions sel-win-width)) (max-lines (car max-dims)) (max-width (cdr max-dims)) - (prefix-w-face (which-key--propertize-key prefix-keys)) + (prefix-keys-desc (key-description which-key--current-prefix)) + (prefix-w-face (which-key--propertize-key prefix-keys-desc)) (prefix-left (when (eq which-key-show-prefix 'left) (+ 2 (string-width prefix-w-face)))) (prefix-top (eq which-key-show-prefix 'top)) @@ -883,7 +889,6 @@ element in each list element of KEYS." (member which-key-side-window-location '(left right)))) (result (which-key--partition-columns keys avl-lines avl-width)) pages keys/page n-pages found prev-result) - (setq int result) (cond ((or vertical (> (plist-get result :n-pages) 1) (= 1 avl-lines)) result) ;; do a simple search for the smallest number of lines @@ -904,15 +909,14 @@ element in each list element of KEYS." (when which-key-show-remaining-keys (setcar (cdr (assq 'which-key-mode minor-mode-alist)) which-key--lighter-backup))) -(defun which-key--show-page (n &optional prefix-keys) - "Show page N, starting from 0. -PREFIX-KEYS holds the description of the prefix keys." - (let ((n-pages (plist-get which-key--pages-plist :n-pages))) +(defun which-key--show-page (n) + "Show page N, starting from 0." + (let ((n-pages (plist-get which-key--pages-plist :n-pages)) + (prefix-keys (key-description which-key--current-prefix))) (if (= 0 n-pages) - (if prefix-keys - (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." - prefix-keys) - (message "which-key can't show keys: Settings and/or frame size are too restrictive.")) + (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." + prefix-keys) + (setq which-key--current-page-n n) (let* ((i (mod n n-pages)) (page (nth i (plist-get which-key--pages-plist :pages))) (height (plist-get which-key--pages-plist :page-height)) @@ -945,29 +949,33 @@ PREFIX-KEYS holds the description of the prefix keys." (goto-char (point-min)))) (which-key--show-popup (cons height width)))))) +(defun which-key-show-next-page () + "Show the next page of keys." + (interactive) + (setq which-key--request-page (1+ which-key--current-page-n)) + (setq unread-command-events (listify-key-sequence which-key--last-prefix))) + ;; (setq map (make-sparse-keymap)) ;; (define-key map (kbd "C-M-1") (lambda () (interactive) (which-key--show-page 0))) ;; (define-key map (kbd "C-M-2") (lambda () (interactive) (which-key--show-page 1))) +(evil-leader/set-key "" 'which-key-show-next-page) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update -(defun which-key--try-2-side-windows (loc1 loc2) +(defun which-key--try-2-side-windows (page-n loc1 loc2) (let (pages1 pages2) (let ((which-key-side-window-location loc1)) - (setq pages1 (which-key--create-pages - prefix-keys-desc formatted-keys - (window-width)))) + (setq pages1 (which-key--create-pages formatted-keys (window-width)))) (if (< 0 (plist-get pages1 :n-pages)) (progn (setq which-key--pages-plist pages1) (let ((which-key-side-window-location loc1)) - (which-key--show-page 0 prefix-keys-desc))) + (which-key--show-page page-n))) (let ((which-key-side-window-location loc2)) (setq which-key--pages-plist (which-key--create-pages - prefix-keys-desc formatted-keys - (window-width))) - (which-key--show-page 0 prefix-keys-desc))))) + formatted-keys (window-width))) + (which-key--show-page page-n))))) (defun which-key--update () "Fill `which-key--buffer' with key descriptions and reformat. @@ -985,16 +993,22 @@ Finally, show the buffer." ;; just in case someone uses one of these (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (current-buffer) prefix-keys)) - (prefix-keys-desc (key-description prefix-keys)) - pages-right pages-bottom) - (if (listp which-key-side-window-location) - (apply #'which-key--try-2-side-windows which-key-side-window-location) - (setq which-key--pages-plist (which-key--create-pages - prefix-keys-desc formatted-keys - (window-width))) - (which-key--show-page 0 prefix-keys-desc)))))) + (let ((page-n 0)) + (if which-key--request-page + (progn + (setq page-n which-key--request-page + which-key--request-page nil)) + (setq which-key--last-prefix which-key--current-prefix + which-key--current-prefix prefix-keys)) + (let ((formatted-keys (which-key--get-formatted-key-bindings + (current-buffer))) + (prefix-keys-desc (key-description prefix-keys)) + pages-right pages-bottom) + (if (listp which-key-side-window-location) + (apply #'which-key--try-2-side-windows page-n which-key-side-window-location) + (setq which-key--pages-plist (which-key--create-pages formatted-keys + (window-width))) + (which-key--show-page page-n))))))) ;; Timers From bd38bf9ea29f900154f7fd8829cd8e949b5565ac Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 09:41:53 -0400 Subject: [PATCH 208/816] Turn off show remaining keys by default --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 3b1d1cbbbb3..ec3c8299d5c 100644 --- a/which-key.el +++ b/which-key.el @@ -176,7 +176,7 @@ a percentage out of the frame's height." :group 'which-key :type 'integer) -(defcustom which-key-show-remaining-keys t +(defcustom which-key-show-remaining-keys nil "Show remaining keys in last slot, when keys are hidden." :group 'which-key :type '(radio (const :tag "Yes" t) @@ -958,7 +958,7 @@ element in each list element of KEYS." ;; (setq map (make-sparse-keymap)) ;; (define-key map (kbd "C-M-1") (lambda () (interactive) (which-key--show-page 0))) ;; (define-key map (kbd "C-M-2") (lambda () (interactive) (which-key--show-page 1))) -(evil-leader/set-key "" 'which-key-show-next-page) +;; (evil-leader/set-key "" 'which-key-show-next-page) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update From c44b9157b5f5c637cffd3a6c12e179e49b04651b Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 09:44:18 -0400 Subject: [PATCH 209/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ec3c8299d5c..099efefec39 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.2.1 +;; Version: 0.3 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) From 59800730e6b149c75d2b1d218ee01f536c1f7fec Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 09:49:13 -0400 Subject: [PATCH 210/816] Add new setup function for right-bottom --- which-key.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 099efefec39..059b7ea82bd 100644 --- a/which-key.el +++ b/which-key.el @@ -332,6 +332,13 @@ it's set too high)." which-key-side-window-location 'right which-key-show-prefix 'top)) +(defun which-key-setup-side-window-right-bottom () + "Apply suggested settings for side-window that opens on right if there is space and the bottom otherwise." + (interactive) + (setq which-key-popup-type 'side-window + which-key-side-window-location '(right bottom) + which-key-show-prefix 'top)) + ;;;###autoload (defun which-key-setup-side-window-bottom () "Apply suggested settings for side-window that opens on @@ -926,7 +933,7 @@ element in each list element of KEYS." (prefix-w-face (which-key--propertize-key prefix-keys)) (status-left (propertize (format "%s/%s" (1+ i) n-pages) 'face 'font-lock-comment-face)) - (status-top (propertize (format "[%s/%s]" (1+ i) n-pages) + (status-top (propertize (format "(%s of %s)" (1+ i) n-pages) 'face 'font-lock-comment-face)) (first-col-width (+ 2 (max (string-width prefix-w-face) (string-width status-left)))) From 74989c944ab0d955e80a5e135a576653377f5ae1 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 10:09:37 -0400 Subject: [PATCH 211/816] Add check for no keys --- which-key.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 059b7ea82bd..b46a2a27070 100644 --- a/which-key.el +++ b/which-key.el @@ -921,8 +921,8 @@ element in each list element of KEYS." (let ((n-pages (plist-get which-key--pages-plist :n-pages)) (prefix-keys (key-description which-key--current-prefix))) (if (= 0 n-pages) - (message "%s- which-key can't show keys: Settings and/or frame size are too restrictive." - prefix-keys) + (message "%s- which-key can't show keys: There is not \ +enough space based on your settings and frame size." prefix-keys) (setq which-key--current-page-n n) (let* ((i (mod n n-pages)) (page (nth i (plist-get which-key--pages-plist :pages))) @@ -1011,11 +1011,13 @@ Finally, show the buffer." (current-buffer))) (prefix-keys-desc (key-description prefix-keys)) pages-right pages-bottom) - (if (listp which-key-side-window-location) - (apply #'which-key--try-2-side-windows page-n which-key-side-window-location) - (setq which-key--pages-plist (which-key--create-pages formatted-keys - (window-width))) - (which-key--show-page page-n))))))) + (cond ((= (length formatted-keys) 0) + (message "%s- which-key: There are no keys to show" prefix-keys-desc)) + ((listp which-key-side-window-location) + (apply #'which-key--try-2-side-windows page-n which-key-side-window-location)) + (t (setq which-key--pages-plist + (which-key--create-pages formatted-keys (window-width))) + (which-key--show-page page-n)))))))) ;; Timers From b945808fc033f4164dd549349c3681b2bea017e0 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 10:11:34 -0400 Subject: [PATCH 212/816] Fix readme --- README.org | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.org b/README.org index 5ece31c1457..fa85454185a 100644 --- a/README.org +++ b/README.org @@ -1,10 +1,5 @@ -<<<<<<< HEAD -[[http://melpa.org/packages/which-key-badge.svg]] -* which-key -======= * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] ->>>>>>> master ** Introduction =which-key= is a minor mode for Emacs that displays the keybindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode From 481b0b36930121f72937dfae3e28c245a1d6c982 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 12:43:41 -0400 Subject: [PATCH 213/816] Add options for paging (disabled by default) --- which-key.el | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index b46a2a27070..c347f6b4c5f 100644 --- a/which-key.el +++ b/which-key.el @@ -238,6 +238,17 @@ ignored." :group 'which-key :type 'function) +(defcustom which-key-paging-prefixes '() + "Enable paging for these prefixes." + :group 'which-key + :type '(repeat string)) + +(defcustom which-key-paging-key "" + "Key to use for changing pages. Bound after each of the +prefixes in `which-key-paging-prefixes'" + :group 'which-key + :type 'string) + (defvar which-key-inhibit nil "Prevent which-key from popping up momentarily by setting this to a non-nil value for the execution of a command. Like this @@ -274,6 +285,7 @@ Used when `which-key-popup-type' is frame.") "Toggle which-key-mode." :global t :lighter " WK" + :keymap '() (if which-key-mode (progn (unless which-key--is-setup (which-key--setup)) @@ -296,6 +308,11 @@ Reduce `echo-keystrokes' if necessary (it will interfer if it's set too high) and setup which-key buffer." (when (eq which-key-popup-type 'minibuffer) (which-key--setup-echo-keystrokes)) + (mapc (lambda (prefix) + (define-key which-key-mode-map + (kbd (concat prefix " " which-key-paging-key)) + 'which-key-show-next-page)) + which-key-paging-prefixes) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer ;; suppress confusing minibuffer message @@ -959,8 +976,10 @@ enough space based on your settings and frame size." prefix-keys) (defun which-key-show-next-page () "Show the next page of keys." (interactive) - (setq which-key--request-page (1+ which-key--current-page-n)) - (setq unread-command-events (listify-key-sequence which-key--last-prefix))) + (let ((next-page (if which-key--current-page-n + (1+ which-key--current-page-n) 0))) + (setq which-key--request-page next-page) + (setq unread-command-events (listify-key-sequence which-key--current-prefix)))) ;; (setq map (make-sparse-keymap)) ;; (define-key map (kbd "C-M-1") (lambda () (interactive) (which-key--show-page 0))) From b811fcc11dd2a98160ccec56a1aaa71956481686 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 12:47:48 -0400 Subject: [PATCH 214/816] Don't prevent changing paging bindings --- which-key.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index c347f6b4c5f..855d08871bf 100644 --- a/which-key.el +++ b/which-key.el @@ -289,6 +289,12 @@ Used when `which-key-popup-type' is frame.") (if which-key-mode (progn (unless which-key--is-setup (which-key--setup)) + ;; bind keys for paging + (mapc (lambda (prefix) + (define-key which-key-mode-map + (kbd (concat prefix " " which-key-paging-key)) + 'which-key-show-next-page)) + which-key-paging-prefixes) (add-hook 'pre-command-hook #'which-key--hide-popup) (add-hook 'pre-command-hook #'which-key--lighter-restore) (add-hook 'focus-out-hook #'which-key--stop-open-timer) @@ -308,11 +314,6 @@ Reduce `echo-keystrokes' if necessary (it will interfer if it's set too high) and setup which-key buffer." (when (eq which-key-popup-type 'minibuffer) (which-key--setup-echo-keystrokes)) - (mapc (lambda (prefix) - (define-key which-key-mode-map - (kbd (concat prefix " " which-key-paging-key)) - 'which-key-show-next-page)) - which-key-paging-prefixes) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer ;; suppress confusing minibuffer message From ee6d75e52b06c488883d367486061c2e5a28f4bf Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 16:02:30 -0400 Subject: [PATCH 215/816] Much better paging implementation --- which-key.el | 50 +++++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/which-key.el b/which-key.el index 855d08871bf..e30e9001197 100644 --- a/which-key.el +++ b/which-key.el @@ -261,7 +261,7 @@ to a non-nil value for the execution of a command. Like this "Internal: Holds reference to which-key buffer.") (defvar which-key--window nil "Internal: Holds reference to which-key window.") -(defvar which-key--open-timer nil +(defvar which-key--timer nil "Internal: Holds reference to open window timer.") (defvar which-key--is-setup nil "Internal: Non-nil if which-key buffer has been setup.") @@ -276,9 +276,7 @@ Used when `which-key-popup-type' is frame.") "Internal: Holds lighter backup") (defvar which-key--current-prefix nil "Internal: Holds current prefix") -(defvar which-key--last-prefix nil) (defvar which-key--current-page-n nil) -(defvar which-key--request-page nil) ;;;###autoload (define-minor-mode which-key-mode @@ -297,16 +295,16 @@ Used when `which-key-popup-type' is frame.") which-key-paging-prefixes) (add-hook 'pre-command-hook #'which-key--hide-popup) (add-hook 'pre-command-hook #'which-key--lighter-restore) - (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)) + (add-hook 'focus-out-hook #'which-key--stop-timer) + (add-hook 'focus-in-hook #'which-key--start-timer) + (which-key--start-timer)) ;; make sure echo-keystrokes returns to original value (setq echo-keystrokes which-key--echo-keystrokes-backup) (remove-hook 'pre-command-hook #'which-key--hide-popup) (remove-hook 'pre-command-hook #'which-key--lighter-restore) - (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))) + (remove-hook 'focus-out-hook #'which-key--stop-timer) + (remove-hook 'focus-in-hook #'which-key--start-timer) + (which-key--stop-timer))) (defun which-key--setup () "Initial setup for which-key. @@ -979,13 +977,16 @@ enough space based on your settings and frame size." prefix-keys) (interactive) (let ((next-page (if which-key--current-page-n (1+ which-key--current-page-n) 0))) - (setq which-key--request-page next-page) - (setq unread-command-events (listify-key-sequence which-key--current-prefix)))) - -;; (setq map (make-sparse-keymap)) -;; (define-key map (kbd "C-M-1") (lambda () (interactive) (which-key--show-page 0))) -;; (define-key map (kbd "C-M-2") (lambda () (interactive) (which-key--show-page 1))) -;; (evil-leader/set-key "" 'which-key-show-next-page) + (which-key--stop-timer) + (setq unread-command-events (listify-key-sequence which-key--current-prefix)) + (which-key--show-page next-page) + (let (timer) + (setq timer + (run-with-idle-timer 0.1 t + (lambda () + (when (not (eq last-command 'which-key-show-next-page)) + (cancel-timer timer) + (which-key--start-timer)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update @@ -1021,12 +1022,7 @@ Finally, show the buffer." (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) (let ((page-n 0)) - (if which-key--request-page - (progn - (setq page-n which-key--request-page - which-key--request-page nil)) - (setq which-key--last-prefix which-key--current-prefix - which-key--current-prefix prefix-keys)) + (setq which-key--current-prefix prefix-keys) (let ((formatted-keys (which-key--get-formatted-key-bindings (current-buffer))) (prefix-keys-desc (key-description prefix-keys)) @@ -1041,15 +1037,15 @@ Finally, show the buffer." ;; Timers -(defun which-key--start-open-timer () +(defun which-key--start-timer () "Activate idle timer to trigger `which-key--update'." - (which-key--stop-open-timer) ; start over - (setq which-key--open-timer + (which-key--stop-timer) ; start over + (setq which-key--timer (run-with-idle-timer which-key-idle-delay t 'which-key--update))) -(defun which-key--stop-open-timer () +(defun which-key--stop-timer () "Deactivate idle timer for `which-key--update'." - (when which-key--open-timer (cancel-timer which-key--open-timer))) + (when which-key--timer (cancel-timer which-key--timer))) ;; TODO From 0159ec37ce3ca4346f7e2b550cd2936ff85f02dd Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 21:09:06 -0400 Subject: [PATCH 216/816] Update readme with new features --- README.org | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index fa85454185a..0d3b70016ab 100644 --- a/README.org +++ b/README.org @@ -21,6 +21,8 @@ following features: 5. A well configured back-end for displaying keys (removing the popwin dependency) that can be easily customized by writing new display functions +Many of these have been implemented and are described below. + ** Table of Contents :TOC@4: - [[#which-key-][which-key ]] - [[#introduction][Introduction]] @@ -31,6 +33,7 @@ following features: - [[#minibuffer-option][Minibuffer Option]] - [[#side-window-right-option][Side Window Right Option]] - [[#side-window-bottom-option][Side Window Bottom Option]] + - [[#side-window-right-then-bottom][Side Window Right then Bottom]] - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - [[#several-popup-types][Several Popup Types]] - [[#minibuffer][minibuffer]] @@ -40,6 +43,10 @@ following features: - [[#custom-string-replacement][Custom String Replacement]] - [[#key-based-replacement]["Key-Based" replacement]] - [[#key-and-description-replacement][Key and Description replacement]] + - [[#sorting][Sorting]] + - [[#paging][Paging]] + - [[#other-options][Other Options]] + - [[#more-examples][More Examples]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] - [[#status][Status]] - [[#thanks][Thanks]] @@ -47,7 +54,8 @@ following features: ** Install *** MELPA After setting up [[http://melpa.org][MELPA]] as a repository, use =M-x package-install which-key= or -your preferred method. +your preferred method. You will need to call =which-key-mode= to enable the +minor mode of course. *** Manually Add which-key.el to your =load-path= and require. Something like @@ -115,6 +123,15 @@ Popup side window on bottom. For defaults use [[./img/which-key-bottom.png]] +*** Side Window Right then Bottom +This is a combination of the previous two choices. It will try to use the right +side, but if there is no room it will switch to using the bottom, which is +usually easier to fit keys into. + +#+BEGIN_SRC emacs-lisp +(which-key-setup-side-window-right-bottom) +#+END_SRC + ** Special Features and Configuration Options There are more options than the ones described here. All of the configurable variables are available through =M-x customize-group which-key=. @@ -133,7 +150,10 @@ Show keys in the minibuffer. #+END_SRC Show keys in a side window. This popup type has further options: #+BEGIN_SRC emacs-lisp -;; location of which-key window. valid values: top, bottom, left, right +;; location of which-key window. valid values: top, bottom, left, right, +;; or a list of any of the two. If it's a list, which-key will always try +;; the first location first. It will go to the second location if there is +;; not enough room to display any keys in the first location (setq which-key-side-window-location 'bottom) ;; max width of which-key window, when displayed at left or right. @@ -225,6 +245,7 @@ There are two helper functions to add entries to this list, directly or use these. **** Key and Description replacement + The second and third methods target the text used for the keys and the descriptions directly. The relevant variables are =which-key-key-replacement-alist= and =which-key-description-replacement-alist=. @@ -249,6 +270,80 @@ these alists) (add-to-list 'which-key-key-replacement-alist '("left" . "lft")) #+END_SRC +*** Sorting +By default the output is sorted by the key in a custom order. The default order +is to sort lexicographically within each "class" of key, where the classes and +their order are + +Special (SPC, TAB, RET, \ldots) < Single Character (a, b, \ldots) < Modifier (C-, M-, \ldots) < Other + +You can control the order by setting this variable. + +#+BEGIN_SRC emacs-lisp +(setq which-key-sort-order 'which-key-key-order) +;; or (setq which-key-sort-order 'which-key-description-order) +#+END_SRC + +The only other built-in option at the moment (besides using nil to turn off +sorting completely) is =which-key-description-order=, which orders by the key's +description based on the usual ordering of strings after applying =downcase=. + +*** Paging +This is a new feature and may have bugs, so it is disabled by default. There are +at least several prefixes that have many keys bound to them, like =C-x=. +which-key displays as many keys as it can given your settings, but for these +prefixes this may not be enough. The paging feature gives you the ability to +bind a key to the function =which-key-show-next-page= which will cycle through +the pages without changing the key sequence you were in the middle of typing. +Essentially, all you need to do to enable this for a prefix like =C-x= is the +following which will bind == to the command. + +#+BEGIN_SRC emacs-lisp +(define-key which-key-mode-map (kbd "C-x ") 'which-key-show-next-page) +#+END_SRC + +This is completely equivalent to + +#+BEGIN_SRC emacs-lisp +(setq which-key-paging-prefixes '("C-x")) +(setq which-key-paging-key "") +#+END_SRC + +where the latter are provided for convenience if you have a lot of prefixes. + +*** Other Options +The options below are also available through customize. Their defaults are +shown. + +#+BEGIN_SRC emacs-lisp + ;; Set the time delay (in seconds) for the which-key popup to appear. + (setq which-key-idle-delay 1.0) + + ;; Set the maximum length (in characters) for key descriptions (commands or + ;; prefixes). Descriptions that are longer are truncated and have ".." added + (setq which-key-max-description-length 27) + + ;; Set the separator used between keys and descriptions. Change this setting to + ;; an ASCII character if your font does not show the default arrow. The second + ;; setting here allows for extra padding for unicode characters. which-key uses + ;; characters as a means of width measurement, so wide unicode characters can + ;; throw off the calculation. + (setq which-key-separator " → " ) + (setq which-key-unicode-correction 3) + + ;; Set the special keys. These are automatically truncated to one character + ;; and have which-key-special-key-face applied. + (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) + + ;; Show the key prefix on the left or top (nil means hide the prefix). The + ;; prefix consists of the keys you have typed so far. which-key also shows the + ;; page information along with the prefix. + (setq which-key-show-prefix 'left) + + ;; Set to t to show the count of keys shown vs. total keys in the mode line. + (setq which-key-show-remaining-keys nil) +#+END_SRC +** More Examples *** Nice Display with Split Frame Unlike guide-key, which-key looks good even if the frame is split into several windows. From 57980fb2bf01f99a0a60a47938fab2d46d6157d3 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 21:09:29 -0400 Subject: [PATCH 217/816] Move paging defcustoms --- which-key.el | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index e30e9001197..865712e4caa 100644 --- a/which-key.el +++ b/which-key.el @@ -189,6 +189,17 @@ description." :group 'which-key :type 'function) +(defcustom which-key-paging-prefixes '() + "Enable paging for these prefixes." + :group 'which-key + :type '(repeat string)) + +(defcustom which-key-paging-key "" + "Key to use for changing pages. Bound after each of the +prefixes in `which-key-paging-prefixes'" + :group 'which-key + :type 'string) + ;; Faces (defface which-key-key-face '((t . (:inherit font-lock-constant-face))) @@ -238,17 +249,6 @@ ignored." :group 'which-key :type 'function) -(defcustom which-key-paging-prefixes '() - "Enable paging for these prefixes." - :group 'which-key - :type '(repeat string)) - -(defcustom which-key-paging-key "" - "Key to use for changing pages. Bound after each of the -prefixes in `which-key-paging-prefixes'" - :group 'which-key - :type 'string) - (defvar which-key-inhibit nil "Prevent which-key from popping up momentarily by setting this to a non-nil value for the execution of a command. Like this From bd7eb9ee637e2041c0bfbec4677b5aacda3068a1 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 21:11:57 -0400 Subject: [PATCH 218/816] Fix latex in readme --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 0d3b70016ab..9f23c34cf41 100644 --- a/README.org +++ b/README.org @@ -275,7 +275,7 @@ By default the output is sorted by the key in a custom order. The default order is to sort lexicographically within each "class" of key, where the classes and their order are -Special (SPC, TAB, RET, \ldots) < Single Character (a, b, \ldots) < Modifier (C-, M-, \ldots) < Other +=Special (SPC, TAB, RET, ...) < Single Character (a, b, ...) < Modifier (C-, M-, ...) < Other= You can control the order by setting this variable. From ba74099ba1d298c0d46e4de3f690f3f4564c72cd Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 21:13:00 -0400 Subject: [PATCH 219/816] Fix sort order in readme again --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 9f23c34cf41..d282a94a48a 100644 --- a/README.org +++ b/README.org @@ -275,7 +275,7 @@ By default the output is sorted by the key in a custom order. The default order is to sort lexicographically within each "class" of key, where the classes and their order are -=Special (SPC, TAB, RET, ...) < Single Character (a, b, ...) < Modifier (C-, M-, ...) < Other= +=Special (SPC, TAB, ...) < Single Character (a, ...) < Modifier (C-, M-, ...) < Other= You can control the order by setting this variable. From 060e2a2329b4d8f30a545ae3d4d519f6d1b7cf61 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 21 Jul 2015 21:21:45 -0400 Subject: [PATCH 220/816] Fix a default regexp --- README.org | 2 +- which-key.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index d282a94a48a..26a507f47da 100644 --- a/README.org +++ b/README.org @@ -252,7 +252,7 @@ descriptions directly. The relevant variables are Here's an example of one of the default key replacements #+BEGIN_SRC emacs-lisp -("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") +("<\\([[:alnum:]-]+\\)>" . "\\1") #+END_SRC The =car= takes a string which may use emacs regexp and the =cdr= takes a string diff --git a/which-key.el b/which-key.el index 865712e4caa..e128302dcf8 100644 --- a/which-key.el +++ b/which-key.el @@ -79,7 +79,7 @@ of the which-key popup." :type 'integer) (defcustom which-key-key-replacement-alist - '(("<\\(\\(C-\\|M-\\)*.+\\)>" . "\\1") ("left" . "←") ("right" . "→")) + '(("<\\([[:alnum:]-]+\\)>" . "\\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." From 7a30c1e5274e2b6e527a4891c136acfd4e9b075f Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 08:29:22 -0400 Subject: [PATCH 221/816] Use real-last-command instead of last-command for which-key-show-next-page --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e128302dcf8..ac2eaa62b45 100644 --- a/which-key.el +++ b/which-key.el @@ -984,7 +984,7 @@ enough space based on your settings and frame size." prefix-keys) (setq timer (run-with-idle-timer 0.1 t (lambda () - (when (not (eq last-command 'which-key-show-next-page)) + (unless (eq real-last-command 'which-key-show-next-page) (cancel-timer timer) (which-key--start-timer)))))))) From e1b9e7f25e82a5b5b7f8a5219b12fc24497d6dcf Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 08:58:45 -0400 Subject: [PATCH 222/816] No need to call show-popup for minibuffer --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index ac2eaa62b45..0964defe89e 100644 --- a/which-key.el +++ b/which-key.el @@ -969,8 +969,8 @@ enough space based on your settings and frame size." prefix-keys) (with-current-buffer which-key--buffer (erase-buffer) (insert page) - (goto-char (point-min)))) - (which-key--show-popup (cons height width)))))) + (goto-char (point-min))) + (which-key--show-popup (cons height width))))))) (defun which-key-show-next-page () "Show the next page of keys." From 945249f2ee26472e45814dafa0b5bf980c0035f3 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 10:47:07 -0400 Subject: [PATCH 223/816] Fix #50 - Don't show pages if only 1 page --- which-key.el | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 0964defe89e..f58a88abf94 100644 --- a/which-key.el +++ b/which-key.el @@ -956,13 +956,24 @@ enough space based on your settings and frame size." prefix-keys) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) (status-left (s-pad-right first-col-width " " status-left)) new-end lines) - (cond ((eq which-key-show-prefix 'left) + (cond ((and (< 1 n-pages) + (eq which-key-show-prefix 'left)) (setq lines (split-string page "\n") first (concat prefix-left (car lines) "\n" status-left) new-end (concat "\n" (s-repeat first-col-width " ")) page (concat first (mapconcat #'identity (cdr lines) new-end)))) + ((eq which-key-show-prefix 'left) + (if (= 1 height) + (setq page (concat prefix-left page)) + (setq lines (split-string page "\n") + first (concat prefix-left (car lines) "\n" (s-repeat first-col-width " ")) + new-end (concat "\n" (s-repeat first-col-width " ")) + page (concat first (mapconcat #'identity (cdr lines) new-end))))) + ((and (< 1 n-pages) + (eq which-key-show-prefix 'top)) + (setq page (concat prefix-w-face "- " status-top "\n" page))) ((eq which-key-show-prefix 'top) - (setq page (concat prefix-w-face "- " status-top "\n" page)))) + (setq page (concat prefix-w-face "- \n" page)))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" page)) From a693a4931cda8787a185941ee74f0e8c1f977945 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 12:30:48 -0400 Subject: [PATCH 224/816] Fix for #49 Need to check if the prefix has changed when possibly restarting the timer after paging. --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f58a88abf94..897eacb2096 100644 --- a/which-key.el +++ b/which-key.el @@ -995,7 +995,10 @@ enough space based on your settings and frame size." prefix-keys) (setq timer (run-with-idle-timer 0.1 t (lambda () - (unless (eq real-last-command 'which-key-show-next-page) + (when (or (not (eq real-last-command 'which-key-show-next-page)) + (and (< 0 (length (this-single-command-keys))) + (not (equal which-key--current-prefix + (this-single-command-keys))))) (cancel-timer timer) (which-key--start-timer)))))))) From 2fd3464866aac81ff792f8c2821d99be08291e3c Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 12:43:45 -0400 Subject: [PATCH 225/816] Tweak next-page timer --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 897eacb2096..c2c89abc296 100644 --- a/which-key.el +++ b/which-key.el @@ -993,7 +993,7 @@ enough space based on your settings and frame size." prefix-keys) (which-key--show-page next-page) (let (timer) (setq timer - (run-with-idle-timer 0.1 t + (run-with-idle-timer 0.2 t (lambda () (when (or (not (eq real-last-command 'which-key-show-next-page)) (and (< 0 (length (this-single-command-keys))) From 5f35908078125d0f6a28005e8d5705589b996f25 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 12:49:59 -0400 Subject: [PATCH 226/816] Remove show and hide functions for minibuffer --- which-key.el | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/which-key.el b/which-key.el index c2c89abc296..9b2dff0a642 100644 --- a/which-key.el +++ b/which-key.el @@ -494,16 +494,12 @@ total height." (defun which-key--hide-popup () "This function is called to hide the which-key buffer." (cl-case which-key-popup-type - (minibuffer (which-key--hide-buffer-minibuffer)) + ;; Not necessary to hide minibuffer + ;; (minibuffer (which-key--hide-buffer-minibuffer)) (side-window (which-key--hide-buffer-side-window)) (frame (which-key--hide-buffer-frame)) (custom (funcall which-key-custom-hide-popup-function)))) -(defun which-key--hide-buffer-minibuffer () - "Does nothing. -Stub for consistency with other hide-buffer functions." - nil) - (defun which-key--hide-buffer-side-window () "Hide which-key buffer when side-window popup is used." (when (buffer-live-p which-key--buffer) @@ -523,16 +519,12 @@ 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." (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)) + ;; Not called for minibuffer + ;; (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)) (custom (funcall which-key-custom-show-popup-function act-popup-dim))))) -(defun which-key--show-buffer-minibuffer (act-popup-dim) - "Does nothing. -Stub for consistency with other show-buffer functions." - nil) - (defun which-key--fit-buffer-to-window-horizontally (&optional window &rest params) "Slightly modified version of `fit-buffer-to-window'. Use &rest params because `fit-buffer-to-window' has a different From db469b2188c7fbd5a6aea2d3d77b6899b8db568b Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 12:54:16 -0400 Subject: [PATCH 227/816] Protect 2-side-window function from too many args --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 9b2dff0a642..5429eac9824 100644 --- a/which-key.el +++ b/which-key.el @@ -997,7 +997,7 @@ enough space based on your settings and frame size." prefix-keys) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update -(defun which-key--try-2-side-windows (page-n loc1 loc2) +(defun which-key--try-2-side-windows (page-n loc1 loc2 &rest _ignore) (let (pages1 pages2) (let ((which-key-side-window-location loc1)) (setq pages1 (which-key--create-pages formatted-keys (window-width)))) From 66dc4dd2e8af535a47f7d38019e5dec32e55df77 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 12:56:26 -0400 Subject: [PATCH 228/816] Fix some hash quotes --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 5429eac9824..74b068d2e14 100644 --- a/which-key.el +++ b/which-key.el @@ -291,7 +291,7 @@ Used when `which-key-popup-type' is frame.") (mapc (lambda (prefix) (define-key which-key-mode-map (kbd (concat prefix " " which-key-paging-key)) - 'which-key-show-next-page)) + #'which-key-show-next-page)) which-key-paging-prefixes) (add-hook 'pre-command-hook #'which-key--hide-popup) (add-hook 'pre-command-hook #'which-key--lighter-restore) @@ -1047,7 +1047,7 @@ Finally, show the buffer." "Activate idle timer to trigger `which-key--update'." (which-key--stop-timer) ; start over (setq which-key--timer - (run-with-idle-timer which-key-idle-delay t 'which-key--update))) + (run-with-idle-timer which-key-idle-delay t #'which-key--update))) (defun which-key--stop-timer () "Deactivate idle timer for `which-key--update'." From 2b442b17c2a953c33e48125206740ea42ecdef56 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 14:32:00 -0400 Subject: [PATCH 229/816] Factor out paging timer and only start once --- which-key.el | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 74b068d2e14..6024d148427 100644 --- a/which-key.el +++ b/which-key.el @@ -263,6 +263,8 @@ to a non-nil value for the execution of a command. Like this "Internal: Holds reference to which-key window.") (defvar which-key--timer nil "Internal: Holds reference to open window timer.") +(defvar which-key--paging-timer nil + "Internal: Holds reference to timer for paging.") (defvar which-key--is-setup nil "Internal: Non-nil if which-key buffer has been setup.") (defvar which-key--frame nil @@ -983,16 +985,7 @@ enough space based on your settings and frame size." prefix-keys) (which-key--stop-timer) (setq unread-command-events (listify-key-sequence which-key--current-prefix)) (which-key--show-page next-page) - (let (timer) - (setq timer - (run-with-idle-timer 0.2 t - (lambda () - (when (or (not (eq real-last-command 'which-key-show-next-page)) - (and (< 0 (length (this-single-command-keys))) - (not (equal which-key--current-prefix - (this-single-command-keys))))) - (cancel-timer timer) - (which-key--start-timer)))))))) + (which-key--start-paging-timer))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update @@ -1053,6 +1046,18 @@ Finally, show the buffer." "Deactivate idle timer for `which-key--update'." (when which-key--timer (cancel-timer which-key--timer))) +(defun which-key--start-paging-timer () + "Activate timer to restart which-key after paging." + (when which-key--paging-timer (cancel-timer which-key--paging-timer)) + (setq which-key--paging-timer + (run-with-idle-timer + 0.2 t (lambda () + (when (or (not (eq real-last-command 'which-key-show-next-page)) + (and (< 0 (length (this-single-command-keys))) + (not (equal which-key--current-prefix + (this-single-command-keys))))) + (cancel-timer which-key--paging-timer) + (which-key--start-timer)))))) ;; TODO ;; fix status key From f454e02490deeffd1ce53d19933ef1322c33b2ee Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 14:34:29 -0400 Subject: [PATCH 230/816] Add default replacement for next page --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 6024d148427..8a7a671a705 100644 --- a/which-key.el +++ b/which-key.el @@ -87,7 +87,7 @@ in the first example." :type '(alist :key-type regexp :value-type string)) (defcustom which-key-description-replacement-alist - '(("Prefix Command" . "prefix")) + '(("Prefix Command" . "prefix") ("which-key-show-next-page" . "wk next pg")) "See `which-key-key-replacement-alist'. This is a list of lists for replacing descriptions." :group 'which-key From 710b1ef795cfb4f14b94251b4c999d4c562c4ce1 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 14:50:01 -0400 Subject: [PATCH 231/816] Make side-window bottom the default Also adds echo as the new default for the prefix key information (to use the echo area). Making side-window bottom the default location, because it seems to have the best behavior overall after adding paging. Don't want to use the minibuffer because it's misbehaving right now. Change echo-keystrokes if prefix is echo --- README.org | 4 ++-- which-key.el | 30 ++++++++++++++++++------------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/README.org b/README.org index 26a507f47da..2e60e24a4e1 100644 --- a/README.org +++ b/README.org @@ -89,7 +89,7 @@ There are other substitution abilities included, which are quite flexible This functionality is targeting [[https://github.com/syl20bnr/spacemacs][spacemacs]]. *** Minibuffer Option -Take over the minibuffer. Setup by default, but you can also use +Take over the minibuffer. For the recommended configuration use #+BEGIN_SRC emacs-lisp (which-key-setup-minibuffer) @@ -115,7 +115,7 @@ width (see =M-x customize-group which-key=). [[./img/which-key-right.png]] *** Side Window Bottom Option -Popup side window on bottom. For defaults use +Popup side window on bottom. This is the current default. To restore this setup use #+BEGIN_SRC emacs-lisp (which-key-setup-side-window-bottom) diff --git a/which-key.el b/which-key.el index 8a7a671a705..f753b74756a 100644 --- a/which-key.el +++ b/which-key.el @@ -119,16 +119,17 @@ and have `which-key-special-key-face' applied to them." :group 'which-key :type 'string) -(defcustom which-key-show-prefix 'left +(defcustom which-key-show-prefix 'echo "Whether to and where to display the current prefix sequence. -Possible choices are left (the default), top and nil. Nil turns -the feature off." +Possible choices are echo for echo area (the default), left, top +and nil. Nil turns the feature off." :group 'which-key :type '(radio (const :tag "Left of keys" left) (const :tag "In first line" top) + (const :tag "In echo area" echo) (const :tag "Hide" nil))) -(defcustom which-key-popup-type 'minibuffer +(defcustom which-key-popup-type 'side-window "Supported types are minibuffer, side-window, frame, and custom." :group 'which-key :type '(radio (const :tag "Show in minibuffer" minibuffer) @@ -136,7 +137,7 @@ the feature off." (const :tag "Show in popup frame" frame) (const :tag "Use your custom display functions" custom))) -(defcustom which-key-side-window-location 'right +(defcustom 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. You can also specify a list of two locations, like (right bottom). In this case, the @@ -312,7 +313,8 @@ Used when `which-key-popup-type' is frame.") "Initial setup for which-key. Reduce `echo-keystrokes' if necessary (it will interfer if it's set too high) and setup which-key buffer." - (when (eq which-key-popup-type 'minibuffer) + (when (or (eq which-key-show-prefix 'echo) + (eq which-key-popup-type 'minibuffer)) (which-key--setup-echo-keystrokes)) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer @@ -362,9 +364,10 @@ it's set too high)." "Apply suggested settings for side-window that opens on bottom." (interactive) + (which-key--setup-echo-keystrokes) (setq which-key-popup-type 'side-window which-key-side-window-location 'bottom - which-key-show-prefix nil)) + which-key-show-prefix 'echo)) ;;;###autoload (defun which-key-setup-minibuffer () @@ -941,6 +944,7 @@ enough space based on your settings and frame size." prefix-keys) (n-shown (nth i (plist-get which-key--pages-plist :keys/page))) (n-tot (plist-get which-key--pages-plist :tot-keys)) (prefix-w-face (which-key--propertize-key prefix-keys)) + (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ i) n-pages) 'face 'font-lock-comment-face)) (status-top (propertize (format "(%s of %s)" (1+ i) n-pages) @@ -965,9 +969,14 @@ enough space based on your settings and frame size." prefix-keys) page (concat first (mapconcat #'identity (cdr lines) new-end))))) ((and (< 1 n-pages) (eq which-key-show-prefix 'top)) - (setq page (concat prefix-w-face "- " status-top "\n" page))) + (setq page (concat prefix-w-face dash-w-face " " status-top "\n" page))) ((eq which-key-show-prefix 'top) - (setq page (concat prefix-w-face "- \n" page)))) + (setq page (concat prefix-w-face dash-w-face " \n" page))) + ((and (< 1 n-pages) + (eq which-key-show-prefix 'echo)) + (let (message-log-max) (message "%s" (concat prefix-w-face dash-w-face " " status-top)))) + ((eq which-key-show-prefix 'echo) + (let (message-log-max) (message "%s" (concat prefix-w-face dash-w-face " "))))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" page)) @@ -1059,8 +1068,5 @@ Finally, show the buffer." (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) -;; TODO -;; fix status key - (provide 'which-key) ;;; which-key.el ends here From 5d0bb5cab113839cf6f510a88d414c551762d038 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 14:56:50 -0400 Subject: [PATCH 232/816] Bump version for new defaults --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f753b74756a..cc98e2e7cdb 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.3 +;; Version: 0.4 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) From ed30e62cc892bc381477b44c4eb50ce43a63f639 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 16:10:31 -0400 Subject: [PATCH 233/816] Simplify show page a little --- which-key.el | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index cc98e2e7cdb..bff977b0896 100644 --- a/which-key.el +++ b/which-key.el @@ -947,8 +947,9 @@ enough space based on your settings and frame size." prefix-keys) (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ i) n-pages) 'face 'font-lock-comment-face)) - (status-top (propertize (format "(%s of %s)" (1+ i) n-pages) - 'face 'font-lock-comment-face)) + (status-top (when (< 1 n-pages) + (propertize (format "(%s of %s)" (1+ i) n-pages) + 'face 'font-lock-comment-face))) (first-col-width (+ 2 (max (string-width prefix-w-face) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) @@ -967,16 +968,11 @@ enough space based on your settings and frame size." prefix-keys) first (concat prefix-left (car lines) "\n" (s-repeat first-col-width " ")) new-end (concat "\n" (s-repeat first-col-width " ")) page (concat first (mapconcat #'identity (cdr lines) new-end))))) - ((and (< 1 n-pages) - (eq which-key-show-prefix 'top)) - (setq page (concat prefix-w-face dash-w-face " " status-top "\n" page))) ((eq which-key-show-prefix 'top) - (setq page (concat prefix-w-face dash-w-face " \n" page))) - ((and (< 1 n-pages) - (eq which-key-show-prefix 'echo)) - (let (message-log-max) (message "%s" (concat prefix-w-face dash-w-face " " status-top)))) + (setq page (concat prefix-w-face dash-w-face " " status-top "\n" page))) ((eq which-key-show-prefix 'echo) - (let (message-log-max) (message "%s" (concat prefix-w-face dash-w-face " "))))) + (let (message-log-max) + (message "%s" (concat prefix-w-face dash-w-face " " status-top))))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) (let (message-log-max) (message "%s" page)) From ab0dacc305de2294c43826891a3dcd4c516e1907 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 16:31:00 -0400 Subject: [PATCH 234/816] Fix key/page count and bug in create-pages --- which-key.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index bff977b0896..b30e0b7ebd1 100644 --- a/which-key.el +++ b/which-key.el @@ -867,8 +867,8 @@ element in each list element of KEYS." (defun which-key--partition-columns (keys avl-lines avl-width) (let ((cols-w-widths (mapcar #'which-key--pad-column (-partition-all avl-lines keys))) - (page-width 0) (n-pages 0) - page-cols pages keys/page page-widths) + (page-width 0) (n-pages 0) (n-keys 0) + page-cols pages page-widths keys/page) (if (> (car (car cols-w-widths)) avl-width) ;; give up if first column doesn't fit (list :pages nil :page-height 0 :page-widths '(0) @@ -876,17 +876,19 @@ element in each list element of KEYS." (dolist (col cols-w-widths) (if (<= (+ (car col) page-width) avl-width) (progn (push (cdr col) page-cols) - (setq page-width (+ page-width (car col)))) + (setq page-width (+ page-width (car col)) + n-keys (+ (length (cdr col)) n-keys))) (when (> (length page-cols) 0) (push (which-key--join-columns page-cols) pages) - (push (* (length page-cols) avl-lines) keys/page) + (push n-keys keys/page) (push page-width page-widths) (setq n-pages (1+ n-pages) + n-keys (length (cdr col)) page-cols (list (cdr col)) page-width (car col))))) (when (> (length page-cols) 0) (push (which-key--join-columns page-cols) pages) - (push (* (length page-cols) avl-lines) keys/page) + (push n-keys keys/page) (push page-width page-widths) (setq n-pages (1+ n-pages))) (list :pages (reverse pages) :page-height avl-lines @@ -918,7 +920,7 @@ element in each list element of KEYS." result (which-key--partition-columns keys avl-lines avl-width) found (> (plist-get result :n-pages) 1))) - (if (and (> avl-lines 1) found) prev-result result))))) + (if found prev-result result))))) (defun which-key--lighter-status (n-shown n-tot) (when which-key-show-remaining-keys From d896af6371b3b302838ba1de00c30c6a2f67e961 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 17:15:30 -0400 Subject: [PATCH 235/816] Allow side-window bottom to be shorter than 4 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index b30e0b7ebd1..ce65ced8fd7 100644 --- a/which-key.el +++ b/which-key.el @@ -541,7 +541,7 @@ call signature in different emacs versions" "Show which-key buffer when popup type is side-window." (let* ((side which-key-side-window-location) (alist '((window-width . which-key--fit-buffer-to-window-horizontally) - (window-height . fit-window-to-buffer)))) + (window-height . (lambda (w) (fit-window-to-buffer w nil 1)))))) ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' ;; were added in Emacs 24.3 From f5eb098b0ed6f044f10ce60889acc94d11590b8c Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 20:39:35 -0400 Subject: [PATCH 236/816] Hack to fix #48 --- which-key.el | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index ce65ced8fd7..217251674de 100644 --- a/which-key.el +++ b/which-key.el @@ -280,6 +280,7 @@ Used when `which-key-popup-type' is frame.") (defvar which-key--current-prefix nil "Internal: Holds current prefix") (defvar which-key--current-page-n nil) +(defvar which-key--force-next-page-n nil) ;;;###autoload (define-minor-mode which-key-mode @@ -934,23 +935,27 @@ element in each list element of KEYS." (defun which-key--show-page (n) "Show page N, starting from 0." (let ((n-pages (plist-get which-key--pages-plist :n-pages)) - (prefix-keys (key-description which-key--current-prefix))) + (prefix-keys (key-description which-key--current-prefix)) + page-n) (if (= 0 n-pages) (message "%s- which-key can't show keys: There is not \ enough space based on your settings and frame size." prefix-keys) - (setq which-key--current-page-n n) - (let* ((i (mod n n-pages)) - (page (nth i (plist-get which-key--pages-plist :pages))) + (if which-key--force-next-page-n + (setq page-n (mod which-key--force-next-page-n n-pages) + which-key--force-next-page-n nil) + (setq page-n (mod n n-pages))) + (setq which-key--current-page-n page-n) + (let* ((page (nth page-n (plist-get which-key--pages-plist :pages))) (height (plist-get which-key--pages-plist :page-height)) - (width (nth i (plist-get which-key--pages-plist :page-widths))) - (n-shown (nth i (plist-get which-key--pages-plist :keys/page))) + (width (nth page-n (plist-get which-key--pages-plist :page-widths))) + (n-shown (nth page-n (plist-get which-key--pages-plist :keys/page))) (n-tot (plist-get which-key--pages-plist :tot-keys)) (prefix-w-face (which-key--propertize-key prefix-keys)) (dash-w-face (propertize "-" 'face 'which-key-key-face)) - (status-left (propertize (format "%s/%s" (1+ i) n-pages) + (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'font-lock-comment-face)) (status-top (when (< 1 n-pages) - (propertize (format "(%s of %s)" (1+ i) n-pages) + (propertize (format "(%s of %s)" (1+ page-n) n-pages) 'face 'font-lock-comment-face))) (first-col-width (+ 2 (max (string-width prefix-w-face) (string-width status-left)))) @@ -990,9 +995,15 @@ enough space based on your settings and frame size." prefix-keys) (let ((next-page (if which-key--current-page-n (1+ which-key--current-page-n) 0))) (which-key--stop-timer) - (setq unread-command-events (listify-key-sequence which-key--current-prefix)) - (which-key--show-page next-page) - (which-key--start-paging-timer))) + (if (eq which-key-popup-type 'minibuffer) + (progn (setq which-key--force-next-page-n next-page) + (which-key--start-timer) + (setq unread-command-events + (listify-key-sequence which-key--current-prefix))) + (setq unread-command-events + (listify-key-sequence which-key--current-prefix)) + (which-key--show-page next-page) + (which-key--start-paging-timer)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update From 7c5f91db5159497e7f78502be74f92704bdc4583 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 22 Jul 2015 21:20:32 -0400 Subject: [PATCH 237/816] Better strategy for dealing with minibuffer paging --- which-key.el | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index 217251674de..63028765cd7 100644 --- a/which-key.el +++ b/which-key.el @@ -42,8 +42,7 @@ :group 'which-key :type 'float) -(defcustom which-key-echo-keystrokes - (min echo-keystrokes (/ (float which-key-idle-delay) 4)) +(defcustom which-key-echo-keystrokes 0 "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 @@ -932,6 +931,17 @@ element in each list element of KEYS." (when which-key-show-remaining-keys (setcar (cdr (assq 'which-key-mode minor-mode-alist)) which-key--lighter-backup))) +(defun which-key--echo (text) + "Echo TEXT to minibuffer without logging. +Slight delay gets around evil functions that clear the echo +area." + (eval + `(let* ((minibuffer (eq which-key-popup-type 'minibuffer)) + (delay (if minibuffer 0.2 0.01)) + message-log-max) + (unless minibuffer (message "%s" ,text)) + (run-with-idle-timer delay nil (lambda () (message "%s" ,text)))))) + (defun which-key--show-page (n) "Show page N, starting from 0." (let ((n-pages (plist-get which-key--pages-plist :n-pages)) @@ -940,10 +950,7 @@ element in each list element of KEYS." (if (= 0 n-pages) (message "%s- which-key can't show keys: There is not \ enough space based on your settings and frame size." prefix-keys) - (if which-key--force-next-page-n - (setq page-n (mod which-key--force-next-page-n n-pages) - which-key--force-next-page-n nil) - (setq page-n (mod n n-pages))) + (setq page-n (mod n n-pages)) (setq which-key--current-page-n page-n) (let* ((page (nth page-n (plist-get which-key--pages-plist :pages))) (height (plist-get which-key--pages-plist :page-height)) @@ -978,11 +985,10 @@ enough space based on your settings and frame size." prefix-keys) ((eq which-key-show-prefix 'top) (setq page (concat prefix-w-face dash-w-face " " status-top "\n" page))) ((eq which-key-show-prefix 'echo) - (let (message-log-max) - (message "%s" (concat prefix-w-face dash-w-face " " status-top))))) + (which-key--echo (concat prefix-w-face dash-w-face " " status-top)))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) - (let (message-log-max) (message "%s" page)) + (which-key--echo page) (with-current-buffer which-key--buffer (erase-buffer) (insert page) @@ -995,15 +1001,10 @@ enough space based on your settings and frame size." prefix-keys) (let ((next-page (if which-key--current-page-n (1+ which-key--current-page-n) 0))) (which-key--stop-timer) - (if (eq which-key-popup-type 'minibuffer) - (progn (setq which-key--force-next-page-n next-page) - (which-key--start-timer) - (setq unread-command-events - (listify-key-sequence which-key--current-prefix))) (setq unread-command-events (listify-key-sequence which-key--current-prefix)) (which-key--show-page next-page) - (which-key--start-paging-timer)))) + (which-key--start-paging-timer))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update From 4cb5a5c39977d3bd6c2a6ec392f7e11b9f247d33 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 23 Jul 2015 10:21:04 -0400 Subject: [PATCH 238/816] Add suggestion about tiling wm to readme --- README.org | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index 2e60e24a4e1..70a84011c91 100644 --- a/README.org +++ b/README.org @@ -126,7 +126,9 @@ Popup side window on bottom. This is the current default. To restore this setup *** Side Window Right then Bottom This is a combination of the previous two choices. It will try to use the right side, but if there is no room it will switch to using the bottom, which is -usually easier to fit keys into. +usually easier to fit keys into. This setting can be helpful if the size of +the Emacs frame changes frequently, which might be the caes if you are using +a dynamic/tiling window manager. #+BEGIN_SRC emacs-lisp (which-key-setup-side-window-right-bottom) From ffc65fd6df84f9adebc58b1b6809d81dfae72279 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 23 Jul 2015 15:04:29 -0400 Subject: [PATCH 239/816] Fix echo function --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 63028765cd7..ae649c22a73 100644 --- a/which-key.el +++ b/which-key.el @@ -940,7 +940,9 @@ area." (delay (if minibuffer 0.2 0.01)) message-log-max) (unless minibuffer (message "%s" ,text)) - (run-with-idle-timer delay nil (lambda () (message "%s" ,text)))))) + (run-with-idle-timer delay nil + (lambda () (let (message-log-max) + (message "%s" ,text))))))) (defun which-key--show-page (n) "Show page N, starting from 0." From b93e70db7b8e7be5512e9d2455680546343409f4 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 23 Jul 2015 22:47:09 -0400 Subject: [PATCH 240/816] Switch to lexical binding and fix warnings --- which-key.el | 87 +++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/which-key.el b/which-key.el index ae649c22a73..1f3966ba282 100644 --- a/which-key.el +++ b/which-key.el @@ -1,4 +1,4 @@ -;;; which-key.el --- Display available keybindings in popup +;;; which-key.el --- Display available keybindings in popup -*- lexical-binding: t; -*- ;; Copyright (C) 2015 Justin Burkett @@ -279,29 +279,29 @@ Used when `which-key-popup-type' is frame.") (defvar which-key--current-prefix nil "Internal: Holds current prefix") (defvar which-key--current-page-n nil) -(defvar which-key--force-next-page-n nil) +(defvar which-key--last-try-2-loc nil) ;;;###autoload (define-minor-mode which-key-mode "Toggle which-key-mode." :global t :lighter " WK" - :keymap '() + :keymap (let ((map (make-sparse-keymap))) + (mapc + (lambda (prefix) + (define-key map + (kbd (concat prefix " " which-key-paging-key)) + #'which-key-show-next-page)) + which-key-paging-prefixes) + map) (if which-key-mode (progn (unless which-key--is-setup (which-key--setup)) - ;; bind keys for paging - (mapc (lambda (prefix) - (define-key which-key-mode-map - (kbd (concat prefix " " which-key-paging-key)) - #'which-key-show-next-page)) - which-key-paging-prefixes) (add-hook 'pre-command-hook #'which-key--hide-popup) (add-hook 'pre-command-hook #'which-key--lighter-restore) (add-hook 'focus-out-hook #'which-key--stop-timer) (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) - ;; make sure echo-keystrokes returns to original value (setq echo-keystrokes which-key--echo-keystrokes-backup) (remove-hook 'pre-command-hook #'which-key--hide-popup) (remove-hook 'pre-command-hook #'which-key--lighter-restore) @@ -314,7 +314,7 @@ Used when `which-key-popup-type' is frame.") Reduce `echo-keystrokes' if necessary (it will interfer if it's set too high) and setup which-key buffer." (when (or (eq which-key-show-prefix 'echo) - (eq which-key-popup-type 'minibuffer)) + (eq which-key-popup-type 'minibuffer)) (which-key--setup-echo-keystrokes)) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer @@ -461,15 +461,15 @@ character width as the frame." ;; add padding to account for possible wide (unicode) characters 3))) -(defun which-key--char-enlarged-p (&optional frame) +(defun which-key--char-enlarged-p (&optional _frame) (> (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) -(defun which-key--char-reduced-p (&optional frame) +(defun which-key--char-reduced-p (&optional _frame) (< (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) -(defun which-key--char-exact-p (&optional frame) +(defun which-key--char-exact-p (&optional _frame) (= (frame-char-width) (/ (float (frame-pixel-width)) (window-total-width (frame-root-window))))) @@ -563,7 +563,7 @@ call signature in different emacs versions" (defun which-key--show-buffer-frame (act-popup-dim) "Show which-key buffer when popup type is frame." - (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) @@ -818,8 +818,7 @@ Uses `string-lessp' after applying lowercase." "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) - key-match desc-match unformatted format-res - formatted column-width) + key-match desc-match unformatted) (with-temp-buffer (describe-buffer-bindings buffer which-key--current-prefix) (goto-char (point-max)) ; want to put last keys in first @@ -910,7 +909,7 @@ element in each list element of KEYS." (vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) (result (which-key--partition-columns keys avl-lines avl-width)) - pages keys/page n-pages found prev-result) + found prev-result) (cond ((or vertical (> (plist-get result :n-pages) 1) (= 1 avl-lines)) result) ;; do a simple search for the smallest number of lines @@ -935,14 +934,13 @@ element in each list element of KEYS." "Echo TEXT to minibuffer without logging. Slight delay gets around evil functions that clear the echo area." - (eval - `(let* ((minibuffer (eq which-key-popup-type 'minibuffer)) - (delay (if minibuffer 0.2 0.01)) - message-log-max) - (unless minibuffer (message "%s" ,text)) - (run-with-idle-timer delay nil - (lambda () (let (message-log-max) - (message "%s" ,text))))))) + (let* ((minibuffer (eq which-key-popup-type 'minibuffer)) + (delay (if minibuffer 0.2 0.01)) + message-log-max) + (unless minibuffer (message "%s" text)) + (run-with-idle-timer + delay nil (lambda () (let (message-log-max) + (message "%s" text)))))) (defun which-key--show-page (n) "Show page N, starting from 0." @@ -970,7 +968,7 @@ enough space based on your settings and frame size." prefix-keys) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) (status-left (s-pad-right first-col-width " " status-left)) - new-end lines) + new-end lines first) (cond ((and (< 1 n-pages) (eq which-key-show-prefix 'left)) (setq lines (split-string page "\n") @@ -1003,27 +1001,32 @@ enough space based on your settings and frame size." prefix-keys) (let ((next-page (if which-key--current-page-n (1+ which-key--current-page-n) 0))) (which-key--stop-timer) - (setq unread-command-events - (listify-key-sequence which-key--current-prefix)) - (which-key--show-page next-page) - (which-key--start-paging-timer))) + (setq unread-command-events + (listify-key-sequence which-key--current-prefix)) + (if which-key--last-try-2-loc + (let ((which-key-side-window-location which-key--last-try-2-loc)) + (which-key--show-page next-page)) + (which-key--show-page next-page)) + (which-key--start-paging-timer))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update -(defun which-key--try-2-side-windows (page-n loc1 loc2 &rest _ignore) - (let (pages1 pages2) +(defun which-key--try-2-side-windows (keys page-n loc1 loc2 &rest _ignore) + (let (pages1) (let ((which-key-side-window-location loc1)) - (setq pages1 (which-key--create-pages formatted-keys (window-width)))) + (setq pages1 (which-key--create-pages keys (window-width)))) (if (< 0 (plist-get pages1 :n-pages)) (progn (setq which-key--pages-plist pages1) (let ((which-key-side-window-location loc1)) - (which-key--show-page page-n))) + (which-key--show-page page-n)) + loc1) (let ((which-key-side-window-location loc2)) (setq which-key--pages-plist (which-key--create-pages - formatted-keys (window-width))) - (which-key--show-page page-n))))) + keys (window-width))) + (which-key--show-page page-n) + loc2)))) (defun which-key--update () "Fill `which-key--buffer' with key descriptions and reformat. @@ -1042,15 +1045,17 @@ Finally, show the buffer." (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) (let ((page-n 0)) - (setq which-key--current-prefix prefix-keys) + (setq which-key--current-prefix prefix-keys + which-key--last-try-2-loc nil) (let ((formatted-keys (which-key--get-formatted-key-bindings (current-buffer))) - (prefix-keys-desc (key-description prefix-keys)) - pages-right pages-bottom) + (prefix-keys-desc (key-description prefix-keys))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys-desc)) ((listp which-key-side-window-location) - (apply #'which-key--try-2-side-windows page-n which-key-side-window-location)) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + formatted-keys page-n which-key-side-window-location))) (t (setq which-key--pages-plist (which-key--create-pages formatted-keys (window-width))) (which-key--show-page page-n)))))))) From c808fda5a9091b07b07fd14c842e961d1ab4ff69 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 24 Jul 2015 09:52:41 -0400 Subject: [PATCH 241/816] Allow which-key-special-keys to be nil --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 1f3966ba282..2d49e62f13d 100644 --- a/which-key.el +++ b/which-key.el @@ -720,7 +720,8 @@ If KEY contains any \"special keys\" defined in (mapconcat 'identity which-key-special-keys "\\|") "\\)"))) (save-match-data - (if (string-match regexp key) + (if (and which-key-special-keys + (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)) From e80857a4d8df328ab16fe9a0f6a019b46de9c043 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 24 Jul 2015 10:14:58 -0400 Subject: [PATCH 242/816] Add link to README about disabling special keys --- README.org | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.org b/README.org index 70a84011c91..371124b3b61 100644 --- a/README.org +++ b/README.org @@ -80,9 +80,10 @@ 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. +can be turned off (see [[#other-options][Other Options]]), 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. @@ -333,8 +334,9 @@ shown. (setq which-key-separator " → " ) (setq which-key-unicode-correction 3) - ;; Set the special keys. These are automatically truncated to one character - ;; and have which-key-special-key-face applied. + ;; Set the special keys. These are automatically truncated to one character and + ;; have which-key-special-key-face applied. Set this variable to nil to disable + ;; the feature (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) ;; Show the key prefix on the left or top (nil means hide the prefix). The From 39f4bb01f034e2c96da3db403b8f2cd5a1d4d0cc Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 24 Jul 2015 10:17:19 -0400 Subject: [PATCH 243/816] Documentation is better now :-) --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 371124b3b61..9b0faaa95a7 100644 --- a/README.org +++ b/README.org @@ -76,7 +76,7 @@ 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). +settings, most of which are described below. 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 From cf6ffc985b3f91cf207e5c38ef540eb2f7c29c44 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 25 Jul 2015 10:19:24 -0400 Subject: [PATCH 244/816] Fix show-next-page problem with mult events Need to add (t . event) to unread-command-events to force emacs to add each event to the current command's sequence. See docs for unread-command-events. --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 2d49e62f13d..32cf4e3b58a 100644 --- a/which-key.el +++ b/which-key.el @@ -1003,7 +1003,9 @@ enough space based on your settings and frame size." prefix-keys) (1+ which-key--current-page-n) 0))) (which-key--stop-timer) (setq unread-command-events - (listify-key-sequence which-key--current-prefix)) + ;; forces event into current key sequence + (mapcar (lambda (ev) (cons t ev)) + (listify-key-sequence which-key--current-prefix))) (if which-key--last-try-2-loc (let ((which-key-side-window-location which-key--last-try-2-loc)) (which-key--show-page next-page)) From ad0fcac8a3e9c862efed47a106e5c9efdf208da9 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 25 Jul 2015 11:49:19 -0400 Subject: [PATCH 245/816] Add hint for next page key Only shows when using echo for which-key-show-prefix See #53 --- which-key.el | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 32cf4e3b58a..609857de9f9 100644 --- a/which-key.el +++ b/which-key.el @@ -961,14 +961,24 @@ enough space based on your settings and frame size." prefix-keys) (prefix-w-face (which-key--propertize-key prefix-keys)) (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) - 'face 'font-lock-comment-face)) + 'face 'which-key-separator-face)) (status-top (when (< 1 n-pages) (propertize (format "(%s of %s)" (1+ page-n) n-pages) - 'face 'font-lock-comment-face))) + 'face 'which-key-separator-face))) (first-col-width (+ 2 (max (string-width prefix-w-face) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) (status-left (s-pad-right first-col-width " " status-left)) + (nxt-pg-hint (when (and (< 1 n-pages) + (eq 'which-key-show-next-page + (key-binding + (kbd (concat prefix-keys + " " + which-key-paging-key))))) + (propertize (concat "press " + which-key-paging-key + " for next page") + 'face 'which-key-separator-face))) new-end lines first) (cond ((and (< 1 n-pages) (eq which-key-show-prefix 'left)) @@ -986,7 +996,10 @@ enough space based on your settings and frame size." prefix-keys) ((eq which-key-show-prefix 'top) (setq page (concat prefix-w-face dash-w-face " " status-top "\n" page))) ((eq which-key-show-prefix 'echo) - (which-key--echo (concat prefix-w-face dash-w-face " " status-top)))) + (which-key--echo (concat prefix-w-face + dash-w-face " " + status-top + " " nxt-pg-hint)))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) (which-key--echo page) From ae3160876724fca277a53476ce4e5a86ae751b68 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 25 Jul 2015 14:54:33 -0400 Subject: [PATCH 246/816] Add next page hint to show-prefix top Also introduce which-key-note-face for notes and hints, and change format of next page hint slightly. --- which-key.el | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index 609857de9f9..a7a7823e510 100644 --- a/which-key.el +++ b/which-key.el @@ -211,6 +211,11 @@ prefixes in `which-key-paging-prefixes'" "Face for the separator (default separator is an arrow)" :group 'which-key) +(defface which-key-note-face + '((t . (:inherit which-key-separator-face))) + "Face for notes or hints occasionally provided" + :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" @@ -964,7 +969,7 @@ enough space based on your settings and frame size." prefix-keys) 'face 'which-key-separator-face)) (status-top (when (< 1 n-pages) (propertize (format "(%s of %s)" (1+ page-n) n-pages) - 'face 'which-key-separator-face))) + 'face 'which-key-note-face))) (first-col-width (+ 2 (max (string-width prefix-w-face) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) @@ -975,10 +980,10 @@ enough space based on your settings and frame size." prefix-keys) (kbd (concat prefix-keys " " which-key-paging-key))))) - (propertize (concat "press " + (propertize (format "[%s pg %s]" which-key-paging-key - " for next page") - 'face 'which-key-separator-face))) + (1+ (mod (1+ page-n) n-pages))) + 'face 'which-key-note-face))) new-end lines first) (cond ((and (< 1 n-pages) (eq which-key-show-prefix 'left)) @@ -994,12 +999,11 @@ enough space based on your settings and frame size." prefix-keys) new-end (concat "\n" (s-repeat first-col-width " ")) page (concat first (mapconcat #'identity (cdr lines) new-end))))) ((eq which-key-show-prefix 'top) - (setq page (concat prefix-w-face dash-w-face " " status-top "\n" page))) + (setq page (concat prefix-w-face dash-w-face " " + status-top " " nxt-pg-hint "\n" page))) ((eq which-key-show-prefix 'echo) - (which-key--echo (concat prefix-w-face - dash-w-face " " - status-top - " " nxt-pg-hint)))) + (which-key--echo (concat prefix-w-face dash-w-face " " + status-top " " nxt-pg-hint)))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) (which-key--echo page) From 6c206153a35a7dbafbac4ab0b8d2c2314ceded7a Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 26 Jul 2015 09:03:16 -0400 Subject: [PATCH 247/816] C-h for paging is awesome --- README.org | 55 +++++++++++++++++++++++++++++------ which-key.el | 81 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 102 insertions(+), 34 deletions(-) diff --git a/README.org b/README.org index 9b0faaa95a7..c38d0f5c7c3 100644 --- a/README.org +++ b/README.org @@ -1,5 +1,20 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] +** What's new +*** Paging +- Paging is now turned on by default, using any prefix plus =C-h= (this doesn't + affect key sequences that start with =C-h= and will not override any key + sequences that end will =C-h=). See the [[#paging][Paging Section]] for more details and + for other options on using and/or disabling paging. +- This makes which-key function as a replacement for the default behavior of + pressing =C-h= after a prefix which shows the key bindings for any prefix. It + is better though, because it saves the prefix that you just entered. So =C-x + C-h C-h C-x= will popup the which-key buffer for the prefix =C-x= change the + page twice and then execute the command bound to =C-x C-x=. +- =C-h= will also now popup the which-key buffer to the first page if it is + pressed before =which-key-idle-delay= takes effect. This means you can set a + long idle delay if you like and just use =C-h= when you want to see + =which-key=. ** Introduction =which-key= is a minor mode for Emacs that displays the keybindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode @@ -25,6 +40,8 @@ Many of these have been implemented and are described below. ** Table of Contents :TOC@4: - [[#which-key-][which-key ]] + - [[#whats-new][What's new]] + - [[#paging][Paging]] - [[#introduction][Introduction]] - [[#install][Install]] - [[#melpa][MELPA]] @@ -45,6 +62,8 @@ Many of these have been implemented and are described below. - [[#key-and-description-replacement][Key and Description replacement]] - [[#sorting][Sorting]] - [[#paging][Paging]] + - [[#method-1-default-using-c-h-or-help-char][Method 1 (default): Using C-h (or =help-char=)]] + - [[#method-2-bind-your-own-keys][Method 2: Bind your own keys]] - [[#other-options][Other Options]] - [[#more-examples][More Examples]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] @@ -292,14 +311,34 @@ sorting completely) is =which-key-description-order=, which orders by the key's description based on the usual ordering of strings after applying =downcase=. *** Paging -This is a new feature and may have bugs, so it is disabled by default. There are -at least several prefixes that have many keys bound to them, like =C-x=. -which-key displays as many keys as it can given your settings, but for these -prefixes this may not be enough. The paging feature gives you the ability to -bind a key to the function =which-key-show-next-page= which will cycle through -the pages without changing the key sequence you were in the middle of typing. -Essentially, all you need to do to enable this for a prefix like =C-x= is the -following which will bind == to the command. + +There are at least several prefixes that have many keys bound to them, like +=C-x=. which-key displays as many keys as it can given your settings, but for +these prefixes this may not be enough. The paging feature gives you the ability +to bind a key to the function =which-key-show-next-page= which will cycle +through the pages without changing the key sequence you were in the middle of +typing. There are two slightly different ways of doing this. + +**** Method 1 (default): Using C-h (or =help-char=) +This is the easiest way, and is turned on by default. Use +#+BEGIN_SRC emacs-lisp +(setq which-key-use-C-h-for-paging nil) +#+END_SRC +to disable the behavior (this will only take effect after toggling +which-key-mode if it is already enabled). =C-h= can be used with any prefix to +switch pages when there are multiple pages of keys. This changes the default +behavior of emacs which is to show a list of keybindings that apply to a prefix. +For example, if you were to type =C-x C-h= you would get a list of commands that +follow =C-x=. This uses which-key instead to show those keys, and unlike the +emacs default saves the incomplete prefix that you just entered so that the next +keystroke can complete the command. As a bonus you can type =C-x C-h= and the +which-key buffer will pop up immediately (i.e., before =which-key-idle-delay= +kicks in). + +**** Method 2: Bind your own keys + +Essentially, all you need to do for a prefix like =C-x= is the following which +will bind == to the relevant command. #+BEGIN_SRC emacs-lisp (define-key which-key-mode-map (kbd "C-x ") 'which-key-show-next-page) diff --git a/which-key.el b/which-key.el index a7a7823e510..5291b7bdd3d 100644 --- a/which-key.el +++ b/which-key.el @@ -200,6 +200,13 @@ prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'string) +(defcustom which-key-use-C-h-for-paging t + "Use C-h for paging if non-nil. Normally C-h after a prefix + calls `describe-prefix-bindings'. This changes that command to + a which-key paging command when which-key-mode is active." + :group 'which-key + :type 'boolean) + ;; Faces (defface which-key-key-face '((t . (:inherit font-lock-constant-face))) @@ -277,6 +284,8 @@ to a non-nil value for the execution of a command. Like this Used when `which-key-popup-type' is frame.") (defvar which-key--echo-keystrokes-backup nil "Internal: Backup the initial value of `echo-keystrokes'.") +(defvar which-key--prefix-help-cmd-backup nil + "Internal: Backup the value of `prefix-help-command'.") (defvar which-key--pages-plist nil "Internal: Holds page objects") (defvar which-key--lighter-backup nil @@ -302,12 +311,17 @@ Used when `which-key-popup-type' is frame.") (if which-key-mode (progn (unless which-key--is-setup (which-key--setup)) + (when which-key-use-C-h-for-paging + (setq which-key--prefix-help-cmd-backup prefix-help-command + prefix-help-command #'which-key-show-next-page)) (add-hook 'pre-command-hook #'which-key--hide-popup) (add-hook 'pre-command-hook #'which-key--lighter-restore) (add-hook 'focus-out-hook #'which-key--stop-timer) (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) + (when which-key-use-C-h-for-paging + (setq prefix-help-command which-key--prefix-help-cmd-backup)) (remove-hook 'pre-command-hook #'which-key--hide-popup) (remove-hook 'pre-command-hook #'which-key--lighter-restore) (remove-hook 'focus-out-hook #'which-key--stop-timer) @@ -382,7 +396,6 @@ bottom." (setq which-key-popup-type 'minibuffer which-key-show-prefix 'left)) - ;; Helper functions to modify replacement lists. (defun which-key--add-key-based-replacements (alist key repl) @@ -974,16 +987,22 @@ enough space based on your settings and frame size." prefix-keys) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) (status-left (s-pad-right first-col-width " " status-left)) - (nxt-pg-hint (when (and (< 1 n-pages) - (eq 'which-key-show-next-page - (key-binding - (kbd (concat prefix-keys - " " - which-key-paging-key))))) - (propertize (format "[%s pg %s]" - which-key-paging-key - (1+ (mod (1+ page-n) n-pages))) - 'face 'which-key-note-face))) + (nxt-pg-hint (cond ((and (< 1 n-pages) + which-key-use-C-h-for-paging) + (propertize (format "[C-h pg %s]" + (1+ (mod (1+ page-n) n-pages))) + 'face 'which-key-note-face)) + ((and (< 1 n-pages) + (eq 'which-key-show-next-page + (key-binding + (kbd (concat prefix-keys + " " + which-key-paging-key))))) + (propertize (format "[%s pg %s]" + which-key-paging-key + (1+ (mod (1+ page-n) n-pages))) + 'face 'which-key-note-face)) + (t nil))) new-end lines first) (cond ((and (< 1 n-pages) (eq which-key-show-prefix 'left)) @@ -1029,6 +1048,16 @@ enough space based on your settings and frame size." prefix-keys) (which-key--show-page next-page)) (which-key--start-paging-timer))) + +;; (defun which-key-show-first-page () +;; "Show the first page of keys." +;; ;; (which-key--stop-timer) +;; ;; (setq which-key--prefix-help-cmd-backup prefix-help-command +;; ;; prefix-help-command 'which-key-show-next-page) +;; (which-key--show-page 0) +;; ) +;; ;; (which-key--start-paging-timer)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update @@ -1064,21 +1093,20 @@ Finally, show the buffer." ;; just in case someone uses one of these (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) - (let ((page-n 0)) - (setq which-key--current-prefix prefix-keys - which-key--last-try-2-loc nil) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (current-buffer))) - (prefix-keys-desc (key-description prefix-keys))) - (cond ((= (length formatted-keys) 0) - (message "%s- which-key: There are no keys to show" prefix-keys-desc)) - ((listp which-key-side-window-location) - (setq which-key--last-try-2-loc - (apply #'which-key--try-2-side-windows - formatted-keys page-n which-key-side-window-location))) - (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys (window-width))) - (which-key--show-page page-n)))))))) + (setq which-key--current-prefix prefix-keys + which-key--last-try-2-loc nil) + (let ((formatted-keys (which-key--get-formatted-key-bindings + (current-buffer))) + (prefix-keys-desc (key-description prefix-keys))) + (cond ((= (length formatted-keys) 0) + (message "%s- which-key: There are no keys to show" prefix-keys-desc)) + ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + formatted-keys 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages formatted-keys (window-width))) + (which-key--show-page 0))))))) ;; Timers @@ -1102,6 +1130,7 @@ Finally, show the buffer." (and (< 0 (length (this-single-command-keys))) (not (equal which-key--current-prefix (this-single-command-keys))))) + (setq which-key--current-page-n nil) (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) From a5413c2b8af110225fabbe64bcad4703c353327c Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 26 Jul 2015 20:45:42 -0400 Subject: [PATCH 248/816] Fix some parts of readme --- README.org | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.org b/README.org index c38d0f5c7c3..3db0bed0bbc 100644 --- a/README.org +++ b/README.org @@ -11,10 +11,6 @@ is better though, because it saves the prefix that you just entered. So =C-x C-h C-h C-x= will popup the which-key buffer for the prefix =C-x= change the page twice and then execute the command bound to =C-x C-x=. -- =C-h= will also now popup the which-key buffer to the first page if it is - pressed before =which-key-idle-delay= takes effect. This means you can set a - long idle delay if you like and just use =C-h= when you want to see - =which-key=. ** Introduction =which-key= is a minor mode for Emacs that displays the keybindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode @@ -293,6 +289,7 @@ these alists) #+END_SRC *** Sorting + By default the output is sorted by the key in a custom order. The default order is to sort lexicographically within each "class" of key, where the classes and their order are @@ -310,6 +307,7 @@ The only other built-in option at the moment (besides using nil to turn off sorting completely) is =which-key-description-order=, which orders by the key's description based on the usual ordering of strings after applying =downcase=. +#+NAME: paging *** Paging There are at least several prefixes that have many keys bound to them, like @@ -331,9 +329,7 @@ behavior of emacs which is to show a list of keybindings that apply to a prefix. For example, if you were to type =C-x C-h= you would get a list of commands that follow =C-x=. This uses which-key instead to show those keys, and unlike the emacs default saves the incomplete prefix that you just entered so that the next -keystroke can complete the command. As a bonus you can type =C-x C-h= and the -which-key buffer will pop up immediately (i.e., before =which-key-idle-delay= -kicks in). +keystroke can complete the command. **** Method 2: Bind your own keys From cf5b9a7cf09c0c59ed66a730ccf7fbd490e54908 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 26 Jul 2015 22:04:03 -0400 Subject: [PATCH 249/816] Add a docstring --- which-key.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/which-key.el b/which-key.el index 5291b7bdd3d..262544f234f 100644 --- a/which-key.el +++ b/which-key.el @@ -870,6 +870,9 @@ element in each list element of KEYS." (lambda (x y) (max x (string-width (nth index y)))) keys :initial-value 0)) (defun which-key--pad-column (col-keys) + "Take a column of (key separator description) COL-KEYS, +calculate the max width in the column and pad all cells out to +that width." (let* ((col-key-width (which-key--max-len col-keys 0)) (col-sep-width (which-key--max-len col-keys 1)) (col-desc-width (which-key--max-len col-keys 2)) From 754051475afcaa1149ab49b7ac7a71a931572488 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 27 Jul 2015 21:47:06 -0400 Subject: [PATCH 250/816] Allow show-next-page to force update before timer --- which-key.el | 81 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/which-key.el b/which-key.el index 262544f234f..4570a4a9a13 100644 --- a/which-key.el +++ b/which-key.el @@ -516,12 +516,14 @@ total height." (defun which-key--hide-popup () "This function is called to hide the which-key buffer." - (cl-case which-key-popup-type - ;; Not necessary to hide minibuffer - ;; (minibuffer (which-key--hide-buffer-minibuffer)) - (side-window (which-key--hide-buffer-side-window)) - (frame (which-key--hide-buffer-frame)) - (custom (funcall which-key-custom-hide-popup-function)))) + (unless (eq real-this-command 'which-key-show-next-page) + (setq which-key--current-page-n nil) + (cl-case which-key-popup-type + ;; Not necessary to hide minibuffer + ;; (minibuffer (which-key--hide-buffer-minibuffer)) + (side-window (which-key--hide-buffer-side-window)) + (frame (which-key--hide-buffer-frame)) + (custom (funcall which-key-custom-hide-popup-function))))) (defun which-key--hide-buffer-side-window () "Hide which-key buffer when side-window popup is used." @@ -1038,19 +1040,28 @@ enough space based on your settings and frame size." prefix-keys) (defun which-key-show-next-page () "Show the next page of keys." (interactive) - (let ((next-page (if which-key--current-page-n - (1+ which-key--current-page-n) 0))) - (which-key--stop-timer) - (setq unread-command-events - ;; forces event into current key sequence - (mapcar (lambda (ev) (cons t ev)) - (listify-key-sequence which-key--current-prefix))) - (if which-key--last-try-2-loc - (let ((which-key-side-window-location which-key--last-try-2-loc)) + (if which-key--current-page-n + ;; triggered after timer shows buffer + (let ((next-page (1+ which-key--current-page-n))) + (which-key--stop-timer) + (setq unread-command-events + ;; forces event into current key sequence + (mapcar (lambda (ev) (cons t ev)) + (listify-key-sequence which-key--current-prefix))) + (if which-key--last-try-2-loc + (let ((which-key-side-window-location which-key--last-try-2-loc)) + (which-key--show-page next-page)) (which-key--show-page next-page)) - (which-key--show-page next-page)) - (which-key--start-paging-timer))) - + (which-key--start-paging-timer)) + ;; triggered before buffer is showing + (let* ((keysbl (vconcat (butlast (append (this-single-command-keys) nil))))) + (which-key--stop-timer) + (setq unread-command-events + ;; forces event into current key sequence + (mapcar (lambda (ev) (cons t ev)) + (listify-key-sequence keysbl))) + (which-key--create-buffer-and-show keysbl) + (which-key--start-timer)))) ;; (defun which-key-show-first-page () ;; "Show the first page of keys." @@ -1080,9 +1091,26 @@ enough space based on your settings and frame size." prefix-keys) (which-key--show-page page-n) loc2)))) -(defun which-key--update () +(defun which-key--create-buffer-and-show (prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." + (setq which-key--current-prefix prefix-keys + which-key--last-try-2-loc nil) + (let ((formatted-keys (which-key--get-formatted-key-bindings + (current-buffer))) + (prefix-keys-desc (key-description prefix-keys))) + (cond ((= (length formatted-keys) 0) + (message "%s- which-key: There are no keys to show" prefix-keys-desc)) + ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + formatted-keys 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages formatted-keys (window-width))) + (which-key--show-page 0))))) + +(defun which-key--update () + "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." (let ((prefix-keys (this-single-command-keys))) ;; (when (> (length prefix-keys) 0) ;; (message "key: %s" (key-description prefix-keys))) @@ -1096,20 +1124,7 @@ Finally, show the buffer." ;; just in case someone uses one of these (keymapp (lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) - (setq which-key--current-prefix prefix-keys - which-key--last-try-2-loc nil) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (current-buffer))) - (prefix-keys-desc (key-description prefix-keys))) - (cond ((= (length formatted-keys) 0) - (message "%s- which-key: There are no keys to show" prefix-keys-desc)) - ((listp which-key-side-window-location) - (setq which-key--last-try-2-loc - (apply #'which-key--try-2-side-windows - formatted-keys 0 which-key-side-window-location))) - (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys (window-width))) - (which-key--show-page 0))))))) + (which-key--create-buffer-and-show prefix-keys)))) ;; Timers From 5bdffa6b082965d5d0970293511ae235d483f7be Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 27 Jul 2015 21:57:42 -0400 Subject: [PATCH 251/816] More docstrings --- which-key.el | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 4570a4a9a13..3233f4efb4d 100644 --- a/which-key.el +++ b/which-key.el @@ -292,8 +292,12 @@ Used when `which-key-popup-type' is frame.") "Internal: Holds lighter backup") (defvar which-key--current-prefix nil "Internal: Holds current prefix") -(defvar which-key--current-page-n nil) -(defvar which-key--last-try-2-loc nil) +(defvar which-key--current-page-n nil + "Internal: Current pages of showing buffer. Nil means no buffer +showing.") +(defvar which-key--last-try-2-loc nil + "Internal: Last location of side-window when two locations +used.") ;;;###autoload (define-minor-mode which-key-mode @@ -797,6 +801,7 @@ alists. Returns a list (key separator description)." unformatted))) (defun which-key--key-description< (a b) + "Sorting function used for `which-key-key-order'." (let* ((aem? (string-equal a "")) (bem? (string-equal b "")) (a1? (= 1 (length a))) @@ -888,6 +893,8 @@ that width." col-keys)))) (defun which-key--partition-columns (keys avl-lines avl-width) + "Convert list of KEYS to columns based on dimensions AVL-LINES and AVL-WIDTH. +Returns a plist that holds the page strings, as well as metadata." (let ((cols-w-widths (mapcar #'which-key--pad-column (-partition-all avl-lines keys))) (page-width 0) (n-pages 0) (n-keys 0) @@ -920,6 +927,10 @@ that width." :tot-keys (cl-reduce '+ keys/page :initial-value 0))))) (defun which-key--create-pages (keys sel-win-width) + "Create page strings using `which-key--partition-columns'. +Will try to find the best number of rows and columns using the +given dimensions and the length and wdiths of KEYS. SEL-WIN-WIDTH +is the width of the live window." (let* ((max-dims (which-key--popup-max-dimensions sel-win-width)) (max-lines (car max-dims)) (max-width (cdr max-dims)) @@ -946,11 +957,13 @@ that width." (if found prev-result result))))) (defun which-key--lighter-status (n-shown n-tot) + "Possibly show N-SHOWN keys and N-TOT keys in the mode line." (when which-key-show-remaining-keys (setq which-key--lighter-backup (cadr (assq 'which-key-mode minor-mode-alist))) (setcar (cdr (assq 'which-key-mode minor-mode-alist)) (format " WK: %s/%s keys" n-shown n-tot)))) (defun which-key--lighter-restore () + "Restore the lighter for which-key." (when which-key-show-remaining-keys (setcar (cdr (assq 'which-key-mode minor-mode-alist)) which-key--lighter-backup))) @@ -1038,7 +1051,8 @@ enough space based on your settings and frame size." prefix-keys) (which-key--show-popup (cons height width))))))) (defun which-key-show-next-page () - "Show the next page of keys." + "Show the next page of keys. +Will force an update if called before `which-key--update'." (interactive) (if which-key--current-page-n ;; triggered after timer shows buffer @@ -1076,6 +1090,7 @@ enough space based on your settings and frame size." prefix-keys) ;; Update (defun which-key--try-2-side-windows (keys page-n loc1 loc2 &rest _ignore) + "Try to show KEYS (PAGE-N) in LOC1 first. Only if no keys fit fallback to LOC2." (let (pages1) (let ((which-key-side-window-location loc1)) (setq pages1 (which-key--create-pages keys (window-width)))) From 9f56b94677943cd48f5d8555760f68128092f214 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 27 Jul 2015 22:00:42 -0400 Subject: [PATCH 252/816] Revert "Fix some parts of readme" This reverts commit a5413c2b8af110225fabbe64bcad4703c353327c. --- README.org | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index 3db0bed0bbc..fe97841df7d 100644 --- a/README.org +++ b/README.org @@ -11,6 +11,10 @@ is better though, because it saves the prefix that you just entered. So =C-x C-h C-h C-x= will popup the which-key buffer for the prefix =C-x= change the page twice and then execute the command bound to =C-x C-x=. +- =C-h= will also now popup the which-key buffer to the first page if it is + pressed before =which-key-idle-delay= takes effect. This means you can set a + long idle delay if you like and just use =C-h= when you want to see + =which-key=. ** Introduction =which-key= is a minor mode for Emacs that displays the keybindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode @@ -289,7 +293,6 @@ these alists) #+END_SRC *** Sorting - By default the output is sorted by the key in a custom order. The default order is to sort lexicographically within each "class" of key, where the classes and their order are @@ -329,7 +332,9 @@ behavior of emacs which is to show a list of keybindings that apply to a prefix. For example, if you were to type =C-x C-h= you would get a list of commands that follow =C-x=. This uses which-key instead to show those keys, and unlike the emacs default saves the incomplete prefix that you just entered so that the next -keystroke can complete the command. +keystroke can complete the command. As a bonus you can type =C-x C-h= and the +which-key buffer will pop up immediately (i.e., before =which-key-idle-delay= +kicks in). **** Method 2: Bind your own keys From 6af1756751c440004941265fdd17e2065b3c3ba2 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 27 Jul 2015 22:04:40 -0400 Subject: [PATCH 253/816] Add note to readme --- README.org | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.org b/README.org index fe97841df7d..472607da282 100644 --- a/README.org +++ b/README.org @@ -7,14 +7,17 @@ sequences that end will =C-h=). See the [[#paging][Paging Section]] for more details and for other options on using and/or disabling paging. - This makes which-key function as a replacement for the default behavior of - pressing =C-h= after a prefix which shows the key bindings for any prefix. It - is better though, because it saves the prefix that you just entered. So =C-x - C-h C-h C-x= will popup the which-key buffer for the prefix =C-x= change the - page twice and then execute the command bound to =C-x C-x=. + pressing =C-h= after a prefix which shows the key bindings for any prefix + (this default command is =describe-prefix-bindings=). It is better though, + because it saves the prefix that you just entered. So =C-x C-h C-h C-x= will + popup the which-key buffer for the prefix =C-x= change the page twice and then + execute the command bound to =C-x C-x=. - =C-h= will also now popup the which-key buffer to the first page if it is pressed before =which-key-idle-delay= takes effect. This means you can set a long idle delay if you like and just use =C-h= when you want to see =which-key=. +- Note that this behavior is easily disabled, and you have the ability to choose + another binding of course. ** Introduction =which-key= is a minor mode for Emacs that displays the keybindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode From a413d7412751da987f76f4d49113915cfc6cebfb Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 27 Jul 2015 22:24:48 -0400 Subject: [PATCH 254/816] Minor wording change to readme --- README.org | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.org b/README.org index 472607da282..1f8be5751cf 100644 --- a/README.org +++ b/README.org @@ -8,8 +8,7 @@ for other options on using and/or disabling paging. - This makes which-key function as a replacement for the default behavior of pressing =C-h= after a prefix which shows the key bindings for any prefix - (this default command is =describe-prefix-bindings=). It is better though, - because it saves the prefix that you just entered. So =C-x C-h C-h C-x= will + (this default command is =describe-prefix-bindings=). It will also save the prefix that you just entered. So =C-x C-h C-h C-x= will popup the which-key buffer for the prefix =C-x= change the page twice and then execute the command bound to =C-x C-x=. - =C-h= will also now popup the which-key buffer to the first page if it is From 768ed25eba4295a50410eed6b34b6363ff9c3cc8 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 27 Jul 2015 22:34:56 -0400 Subject: [PATCH 255/816] Reorg README and new pictures --- README.org | 43 ++++++++++++++++++----------------- img/which-key-bottom.png | Bin 36238 -> 61162 bytes img/which-key-minibuffer.png | Bin 35292 -> 60889 bytes img/which-key-right.png | Bin 72576 -> 74802 bytes 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/README.org b/README.org index 1f8be5751cf..67facfdbddb 100644 --- a/README.org +++ b/README.org @@ -8,9 +8,10 @@ for other options on using and/or disabling paging. - This makes which-key function as a replacement for the default behavior of pressing =C-h= after a prefix which shows the key bindings for any prefix - (this default command is =describe-prefix-bindings=). It will also save the prefix that you just entered. So =C-x C-h C-h C-x= will - popup the which-key buffer for the prefix =C-x= change the page twice and then - execute the command bound to =C-x C-x=. + (this default command is =describe-prefix-bindings=). It will also save the + prefix that you just entered. So =C-x C-h C-h C-x= will popup the which-key + buffer for the prefix =C-x= change the page twice and then execute the command + bound to =C-x C-x=. - =C-h= will also now popup the which-key buffer to the first page if it is pressed before =which-key-idle-delay= takes effect. This means you can set a long idle delay if you like and just use =C-h= when you want to see @@ -49,10 +50,10 @@ Many of these have been implemented and are described below. - [[#melpa][MELPA]] - [[#manually][Manually]] - [[#initial-setup][Initial Setup]] - - [[#minibuffer-option][Minibuffer Option]] - - [[#side-window-right-option][Side Window Right Option]] - [[#side-window-bottom-option][Side Window Bottom Option]] + - [[#side-window-right-option][Side Window Right Option]] - [[#side-window-right-then-bottom][Side Window Right then Bottom]] + - [[#minibuffer-option][Minibuffer Option]] - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - [[#several-popup-types][Several Popup Types]] - [[#minibuffer][minibuffer]] @@ -110,17 +111,14 @@ 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. For the recommended configuration use +*** Side Window Bottom Option +Popup side window on bottom. This is the current default. To restore this setup use #+BEGIN_SRC emacs-lisp -(which-key-setup-minibuffer) +(which-key-setup-side-window-bottom) #+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=. +[[./img/which-key-bottom.png]] *** Side Window Right Option Popup side window on right. For defaults use @@ -136,15 +134,6 @@ width (see =M-x customize-group which-key=). [[./img/which-key-right.png]] -*** Side Window Bottom Option -Popup side window on bottom. This is the current default. To restore this setup use - -#+BEGIN_SRC emacs-lisp -(which-key-setup-side-window-bottom) -#+END_SRC - -[[./img/which-key-bottom.png]] - *** Side Window Right then Bottom This is a combination of the previous two choices. It will try to use the right side, but if there is no room it will switch to using the bottom, which is @@ -156,6 +145,18 @@ a dynamic/tiling window manager. (which-key-setup-side-window-right-bottom) #+END_SRC +*** Minibuffer Option +Take over the minibuffer. For the recommended configuration 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=. + ** Special Features and Configuration Options There are more options than the ones described here. All of the configurable variables are available through =M-x customize-group which-key=. diff --git a/img/which-key-bottom.png b/img/which-key-bottom.png index 00d372aef060e9b742e1585c3fca786180eea78e..386fe1af69d9930d04076a1481d075b77370d7d4 100644 GIT binary patch literal 61162 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�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 literal 36238 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 z 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 diff --git a/img/which-key-minibuffer.png b/img/which-key-minibuffer.png index 0ce5263b14dac6a604a4b54ad5deb29d8d998ad7..0b83860f6baf9b65d4f825f3a9843c3ba4080ccf 100644 GIT binary patch literal 60889 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

)+N=DHjn6LrgN+y4xc-2o-VO4< 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 Nk~~zd=$Yw<{{v>KrK11< diff --git a/img/which-key-right.png b/img/which-key-right.png index 7342863c80121cbd398dddfe3d10b086a6258d25..aae2ed07f0a874e1bc4383bc9557936409993445 100644 GIT binary patch literal 74802 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 literal 72576 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 qYa*0RE?4{vhWKBf6G~D5 From 9e5d5fb969367881a64c3dc4f2ab3e56e7ff4c06 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 27 Jul 2015 22:41:39 -0400 Subject: [PATCH 256/816] README typos --- README.org | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.org b/README.org index 67facfdbddb..9efa7e2e255 100644 --- a/README.org +++ b/README.org @@ -19,10 +19,10 @@ - Note that this behavior is easily disabled, and you have the ability to choose another binding of course. ** Introduction -=which-key= is a minor mode for Emacs that displays the keybindings following your currently +=which-key= is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode if you enter =C-x= and wait for the default of 1 second the minibuffer will expand with all of -the available keybindings that follow =C-x= (or as many as space allows given your settings). +the available key bindings that follow =C-x= (or as many as space allows given your settings). This includes prefixes like =C-x 8= which are shown in a different face. Screenshots of what the popup will look like are included below. =which-key= started as a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged @@ -97,7 +97,7 @@ 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 +your Emacs settings, the size of the current Emacs frame, and the which-key settings, most of which are described below. By default which-key makes substitutions for text all with the aim of saving @@ -138,7 +138,7 @@ width (see =M-x customize-group which-key=). This is a combination of the previous two choices. It will try to use the right side, but if there is no room it will switch to using the bottom, which is usually easier to fit keys into. This setting can be helpful if the size of -the Emacs frame changes frequently, which might be the caes if you are using +the Emacs frame changes frequently, which might be the case if you are using a dynamic/tiling window manager. #+BEGIN_SRC emacs-lisp @@ -280,7 +280,7 @@ Here's an example of one of the default key replacements ("<\\([[:alnum:]-]+\\)>" . "\\1") #+END_SRC -The =car= takes a string which may use emacs regexp and the =cdr= takes a string +The =car= takes a string which may use Emacs regexp and the =cdr= takes a string with the replacement text. As shown, you can specify a sub-expression of the match. The replacements do not need to use regexp and can be as simple as @@ -331,10 +331,10 @@ This is the easiest way, and is turned on by default. Use to disable the behavior (this will only take effect after toggling which-key-mode if it is already enabled). =C-h= can be used with any prefix to switch pages when there are multiple pages of keys. This changes the default -behavior of emacs which is to show a list of keybindings that apply to a prefix. +behavior of Emacs which is to show a list of key bindings that apply to a prefix. For example, if you were to type =C-x C-h= you would get a list of commands that follow =C-x=. This uses which-key instead to show those keys, and unlike the -emacs default saves the incomplete prefix that you just entered so that the next +Emacs default saves the incomplete prefix that you just entered so that the next keystroke can complete the command. As a bonus you can type =C-x C-h= and the which-key buffer will pop up immediately (i.e., before =which-key-idle-delay= kicks in). @@ -371,8 +371,8 @@ shown. ;; Set the separator used between keys and descriptions. Change this setting to ;; an ASCII character if your font does not show the default arrow. The second - ;; setting here allows for extra padding for unicode characters. which-key uses - ;; characters as a means of width measurement, so wide unicode characters can + ;; setting here allows for extra padding for Unicode characters. which-key uses + ;; characters as a means of width measurement, so wide Unicode characters can ;; throw off the calculation. (setq which-key-separator " → " ) (setq which-key-unicode-correction 3) From 4d4dc93067d921bf1e6c6d4adc2d55fea13fc4d7 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 28 Jul 2015 22:41:35 -0400 Subject: [PATCH 257/816] README fixes --- img/which-key-bottom.png | Bin 61162 -> 54157 bytes img/which-key-minibuffer.png | Bin 60889 -> 53881 bytes img/which-key-right.png | Bin 74802 -> 66506 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/img/which-key-bottom.png b/img/which-key-bottom.png index 386fe1af69d9930d04076a1481d075b77370d7d4..d7e725b3a22ef8d7534f4812e52787fa56d5d4ce 100644 GIT binary patch literal 54157 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 HH01vQE%RiG literal 61162 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�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 diff --git a/img/which-key-minibuffer.png b/img/which-key-minibuffer.png index 0b83860f6baf9b65d4f825f3a9843c3ba4080ccf..bb5d00bf26b70532a67c5033608dff6f734e754d 100644 GIT binary patch literal 53881 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 ME8+<;8vS53_5^|`fG|2`9j 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 KVTHcyEzN*{ba(e1 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

|NC&}CDCnK}ju~u*Om#MX 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¶?8TwY|A;K4(c`;1b#@!!A-b$( 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 literal 74802 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 From 1e88120ab59ac4a0875a96f01e3863544ab5a8a8 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 28 Jul 2015 22:42:23 -0400 Subject: [PATCH 258/816] Add local-map face Possible solution for #45. Does not change any default settings. --- which-key.el | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index 3233f4efb4d..99d101c99c3 100644 --- a/which-key.el +++ b/which-key.el @@ -228,6 +228,11 @@ prefixes in `which-key-paging-prefixes'" "Face for the key description when it is a command" :group 'which-key) +(defface which-key-local-map-description-face + '((t . (:inherit which-key-command-description-face))) + "Face for the key description when it is found in `current-local-map'" + :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" @@ -763,7 +768,7 @@ If KEY contains any \"special keys\" defined in (or (string-match-p "^\\(group:\\|Prefix\\)" description) (keymapp (intern description)))) -(defun which-key--propertize-description (description group) +(defun which-key--propertize-description (description group local) "Add face to DESCRIPTION where the face chosen depends on whether the description represents a group or a command. Also make some minor adjustments to the description string, like @@ -774,29 +779,31 @@ removing a \"group:\" prefix." (desc (if group (concat "+" desc) desc)) (desc (which-key--truncate-description desc))) (propertize desc 'face - (if group - 'which-key-group-description-face - 'which-key-command-description-face)))) + (cond (group 'which-key-group-description-face) + (local 'which-key-local-map-description-face) + (t 'which-key-command-description-face))))) (defun which-key--format-and-replace (unformatted) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." (let ((sep-w-face - (propertize which-key-separator 'face 'which-key-separator-face))) + (propertize which-key-separator 'face 'which-key-separator-face)) + (local-map (current-local-map))) (mapcar (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) (desc (cdr key-desc-cons)) (group (which-key--group-p desc)) (keys (concat (key-description which-key--current-prefix) " " key)) + (local (eq (lookup-key local-map (kbd keys)) (intern desc))) (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)) (key-w-face (which-key--propertize-key key)) - (desc-w-face (which-key--propertize-description desc group))) + (desc-w-face (which-key--propertize-description desc group local))) (list key-w-face sep-w-face desc-w-face))) unformatted))) @@ -840,10 +847,11 @@ special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." Uses `string-lessp' after applying lowercase." (string-lessp (downcase (cdr alst)) (downcase (cdr blst)))) -(defun which-key--get-formatted-key-bindings (buffer) +(defun which-key--get-formatted-key-bindings () "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) + (buffer (current-buffer)) key-match desc-match unformatted) (with-temp-buffer (describe-buffer-bindings buffer which-key--current-prefix) @@ -1111,8 +1119,7 @@ Will force an update if called before `which-key--update'." Finally, show the buffer." (setq which-key--current-prefix prefix-keys which-key--last-try-2-loc nil) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (current-buffer))) + (let ((formatted-keys (which-key--get-formatted-key-bindings)) (prefix-keys-desc (key-description prefix-keys))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys-desc)) From 2e7744cc783cd2de58438c12ab9f4e9343582f1f Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 30 Jul 2015 15:52:21 -0400 Subject: [PATCH 259/816] Add local-map face to readme --- README.org | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/README.org b/README.org index 9efa7e2e255..650b9f82543 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,12 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] ** What's new +*** Local map face +- The face =which-key-local-map-description-face= is now available. This face + will be applied to any commands that are found using =(current-local-map)= + (commands defined for the major mode are usually here). This allows you to + distinguish between local and global bindings visually. See [[#faces][Face Customization]] + for more information. *** Paging - Paging is now turned on by default, using any prefix plus =C-h= (this doesn't affect key sequences that start with =C-h= and will not override any key @@ -44,6 +50,7 @@ Many of these have been implemented and are described below. ** Table of Contents :TOC@4: - [[#which-key-][which-key ]] - [[#whats-new][What's new]] + - [[#local-map-face][Local map face]] - [[#paging][Paging]] - [[#introduction][Introduction]] - [[#install][Install]] @@ -67,6 +74,7 @@ Many of these have been implemented and are described below. - [[#paging][Paging]] - [[#method-1-default-using-c-h-or-help-char][Method 1 (default): Using C-h (or =help-char=)]] - [[#method-2-bind-your-own-keys][Method 2: Bind your own keys]] + - [[#face-customization][Face Customization]] - [[#other-options][Other Options]] - [[#more-examples][More Examples]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] @@ -341,6 +349,8 @@ kicks in). **** Method 2: Bind your own keys + + Essentially, all you need to do for a prefix like =C-x= is the following which will bind == to the relevant command. @@ -357,6 +367,39 @@ This is completely equivalent to where the latter are provided for convenience if you have a lot of prefixes. +#+NAME: faces +*** Face Customization +The faces that which-key uses are +| Face | Applied To | Default Definition | +|----------------------------------------+-------------------------------+-------------------------------------------------------------| +| =which-key-key-face= | Every key sequence | =:inherit font-lock-constant-face= | +| =which-key-separator-face= | The separator (→) | =:inherit font-lock-comment-face= | +| =which-key-note-face= | Hints and notes | =:inherit which-key-separator-face= | +| =which-key-special-key-face= | User-defined special keys | =:inherit which-key-key-face :inverse-video t :weight bold= | +| =which-key-group-description-face= | Command groups (i.e, keymaps) | =:inherit font-lock-keyword-face= | +| =which-key-command-description-face= | Commands not in local-map | =:inherit font-lock-function-name-face= | +| =which-key-local-map-description-face= | Commands in local-map | =:inherit which-key-command-description-face= | + +The last two deserve some explanation. A command lives in one of many possible +keymaps. You can distinguish between local maps, which depend on the buffer you +are in, which modes are active, etc., and the global map which applies +everywhere. It might be useful for you to distinguish between the two. One way +to do this is to remove the default face from +=which-key-command-description-face= like this + +#+BEGIN_SRC emacs-lisp + (set-face-attribute 'which-key-command-description-face nil :inherit nil) +#+END_SRC + +another is to make the local map keys appear in bold + +#+BEGIN_SRC emacs-lisp + (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) +#+END_SRC + +You can also use =M-x customize-face= to customize any of the above faces to +your liking. + *** Other Options The options below are also available through customize. Their defaults are shown. From f32bbf0adbd9bab2bdb2e0ddffc1f2c61f712d57 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 30 Jul 2015 16:05:26 -0400 Subject: [PATCH 260/816] Fix a link in readme --- README.org | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.org b/README.org index 650b9f82543..76aae582082 100644 --- a/README.org +++ b/README.org @@ -5,12 +5,12 @@ - The face =which-key-local-map-description-face= is now available. This face will be applied to any commands that are found using =(current-local-map)= (commands defined for the major mode are usually here). This allows you to - distinguish between local and global bindings visually. See [[#faces][Face Customization]] - for more information. + distinguish between local and global bindings visually. See [[Face Customization]] + for more information. *** Paging - Paging is now turned on by default, using any prefix plus =C-h= (this doesn't affect key sequences that start with =C-h= and will not override any key - sequences that end will =C-h=). See the [[#paging][Paging Section]] for more details and + sequences that end will =C-h=). See the [[paging][Paging Section]] for more details and for other options on using and/or disabling paging. - This makes which-key function as a replacement for the default behavior of pressing =C-h= after a prefix which shows the key bindings for any prefix @@ -321,8 +321,8 @@ The only other built-in option at the moment (besides using nil to turn off sorting completely) is =which-key-description-order=, which orders by the key's description based on the usual ordering of strings after applying =downcase=. -#+NAME: paging *** Paging +<> There are at least several prefixes that have many keys bound to them, like =C-x=. which-key displays as many keys as it can given your settings, but for @@ -349,8 +349,6 @@ kicks in). **** Method 2: Bind your own keys - - Essentially, all you need to do for a prefix like =C-x= is the following which will bind == to the relevant command. @@ -367,7 +365,6 @@ This is completely equivalent to where the latter are provided for convenience if you have a lot of prefixes. -#+NAME: faces *** Face Customization The faces that which-key uses are | Face | Applied To | Default Definition | From 4b5ade3d49825889f00542846346d2c82ea1fd5e Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 30 Jul 2015 16:10:15 -0400 Subject: [PATCH 261/816] Second try to fix links --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 76aae582082..500fe440431 100644 --- a/README.org +++ b/README.org @@ -5,7 +5,7 @@ - The face =which-key-local-map-description-face= is now available. This face will be applied to any commands that are found using =(current-local-map)= (commands defined for the major mode are usually here). This allows you to - distinguish between local and global bindings visually. See [[Face Customization]] + distinguish between local and global bindings visually. See [[#face-customization][Face Customization]] for more information. *** Paging - Paging is now turned on by default, using any prefix plus =C-h= (this doesn't From d613dfe3959e000e81f87cb68b1a4c049d476540 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 30 Jul 2015 16:51:01 -0400 Subject: [PATCH 262/816] README links working again --- README.org | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/README.org b/README.org index 500fe440431..d0e15e4328f 100644 --- a/README.org +++ b/README.org @@ -5,12 +5,12 @@ - The face =which-key-local-map-description-face= is now available. This face will be applied to any commands that are found using =(current-local-map)= (commands defined for the major mode are usually here). This allows you to - distinguish between local and global bindings visually. See [[#face-customization][Face Customization]] + distinguish between local and global bindings visually. See [[#face-customization-options][Face Customization]] for more information. *** Paging - Paging is now turned on by default, using any prefix plus =C-h= (this doesn't affect key sequences that start with =C-h= and will not override any key - sequences that end will =C-h=). See the [[paging][Paging Section]] for more details and + sequences that end will =C-h=). See the [[#paging-options][Paging Section]] for more details and for other options on using and/or disabling paging. - This makes which-key function as a replacement for the default behavior of pressing =C-h= after a prefix which shows the key bindings for any prefix @@ -62,19 +62,19 @@ Many of these have been implemented and are described below. - [[#side-window-right-then-bottom][Side Window Right then Bottom]] - [[#minibuffer-option][Minibuffer Option]] - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - - [[#several-popup-types][Several Popup Types]] + - [[#popup-type-options][Popup Type Options]] - [[#minibuffer][minibuffer]] - [[#side-window][side window]] - [[#frame][frame]] - [[#custom][custom]] - - [[#custom-string-replacement][Custom String Replacement]] + - [[#custom-string-replacement-options][Custom String Replacement Options]] - [[#key-based-replacement]["Key-Based" replacement]] - [[#key-and-description-replacement][Key and Description replacement]] - - [[#sorting][Sorting]] - - [[#paging][Paging]] + - [[#sorting-options][Sorting Options]] + - [[#paging-options][Paging Options]] - [[#method-1-default-using-c-h-or-help-char][Method 1 (default): Using C-h (or =help-char=)]] - [[#method-2-bind-your-own-keys][Method 2: Bind your own keys]] - - [[#face-customization][Face Customization]] + - [[#face-customization-options][Face Customization Options]] - [[#other-options][Other Options]] - [[#more-examples][More Examples]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] @@ -168,7 +168,7 @@ variable =max-mini-window-height=. ** Special Features and Configuration Options There are more options than the ones described here. All of the configurable variables are available through =M-x customize-group which-key=. -*** Several Popup Types +*** Popup Type Options There are three different popup types that which-key can use by default to display the available keys. The variable =which-key-popup-type= decides which one is used. @@ -244,7 +244,7 @@ current implementation of side-window bottom). (quit-windows-on which-key--buffer))) #+END_SRC -*** Custom String Replacement +*** Custom String Replacement Options You can customize the way the keys show in the buffer using three different replacement methods, each of which corresponds replacement alist. The basic idea of behind each alist is that you specify a selection string in the =car= of each @@ -303,7 +303,7 @@ these alists) (add-to-list 'which-key-key-replacement-alist '("left" . "lft")) #+END_SRC -*** Sorting +*** Sorting Options By default the output is sorted by the key in a custom order. The default order is to sort lexicographically within each "class" of key, where the classes and their order are @@ -321,9 +321,7 @@ The only other built-in option at the moment (besides using nil to turn off sorting completely) is =which-key-description-order=, which orders by the key's description based on the usual ordering of strings after applying =downcase=. -*** Paging -<> - +*** Paging Options There are at least several prefixes that have many keys bound to them, like =C-x=. which-key displays as many keys as it can given your settings, but for these prefixes this may not be enough. The paging feature gives you the ability @@ -365,7 +363,7 @@ This is completely equivalent to where the latter are provided for convenience if you have a lot of prefixes. -*** Face Customization +*** Face Customization Options The faces that which-key uses are | Face | Applied To | Default Definition | |----------------------------------------+-------------------------------+-------------------------------------------------------------| From 32c57075a33db05447fc7d1d86b2c798dab35e32 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 1 Aug 2015 07:16:29 -0400 Subject: [PATCH 263/816] Allow for nil local-map. Fixes #57 --- which-key.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 99d101c99c3..a07f5e2c3bd 100644 --- a/which-key.el +++ b/which-key.el @@ -712,6 +712,10 @@ width) in lines and characters respectively." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for retrieving and formatting keys +(defsubst which-key--safe-lookup-key (keymap key) + "Version of `lookup-key' that allows KEYMAP to be nil. KEY is not checked." + (when (keymapp keymap) (lookup-key keymap key))) + (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 @@ -796,7 +800,7 @@ alists. Returns a list (key separator description)." (desc (cdr key-desc-cons)) (group (which-key--group-p desc)) (keys (concat (key-description which-key--current-prefix) " " key)) - (local (eq (lookup-key local-map (kbd keys)) (intern desc))) + (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern desc))) (key (which-key--maybe-replace key which-key-key-replacement-alist)) (desc (which-key--maybe-replace @@ -1142,9 +1146,9 @@ Finally, show the buffer." (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map - (keymapp (lookup-key key-translation-map prefix-keys)) + (keymapp (which-key--safe-lookup-key key-translation-map prefix-keys)) ;; just in case someone uses one of these - (keymapp (lookup-key function-key-map prefix-keys))) + (keymapp (which-key--safe-lookup-key function-key-map prefix-keys))) (not which-key-inhibit)) (which-key--create-buffer-and-show prefix-keys)))) From 91f7470a7c3edc91521089ee07b166b94e280543 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 2 Aug 2015 19:27:23 -0400 Subject: [PATCH 264/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index a07f5e2c3bd..a1bab6ed629 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.4 +;; Version: 0.5.1 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) From 3effbaf08027f8fd88f9e92d22e2f7f359491e7e Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 2 Aug 2015 19:33:24 -0400 Subject: [PATCH 265/816] Add README intro to commentary section. --- which-key.el | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index a1bab6ed629..f992a5435d8 100644 --- a/which-key.el +++ b/which-key.el @@ -23,8 +23,18 @@ ;;; Commentary: -;; This is a rewrite of guide-key https://github.com/kai2nenobu/guide-key. See -;; https://github.com/justbur/emacs-which-key for more information. +;; which-key is a minor mode for Emacs that displays the key bindings following +;; your currently entered incomplete command (a prefix) in a popup. For example, +;; after enabling the minor mode if you enter C-x and wait for the default of 1 +;; second the minibuffer will expand with all of the available key bindings that +;; follow C-x (or as many as space allows given your settings). This includes +;; prefixes like C-x 8 which are shown in a different face. Screenshots of what +;; the popup will look like along with information about additional features can +;; be found at https://github.com/justbur/emacs-which-key. +;; +;; which-key started as a rewrite of guide-key +;; (https://github.com/kai2nenobu/guide-key), but the feature sets have since +;; diverged. ;;; Code: From af9e3425ecf3ec2b1ecc3446c8262d53f4f29ec0 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 3 Aug 2015 11:26:56 -0400 Subject: [PATCH 266/816] Clean-up partition-columns implementation --- which-key.el | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/which-key.el b/which-key.el index f992a5435d8..321baf0a95d 100644 --- a/which-key.el +++ b/which-key.el @@ -921,32 +921,28 @@ Returns a plist that holds the page strings, as well as metadata." (-partition-all avl-lines keys))) (page-width 0) (n-pages 0) (n-keys 0) page-cols pages page-widths keys/page) - (if (> (car (car cols-w-widths)) avl-width) - ;; give up if first column doesn't fit + (if (> (apply #'max (mapcar #'car cols-w-widths)) avl-width) + ;; give up if any columns don't fit (list :pages nil :page-height 0 :page-widths '(0) :keys/page '(0) :n-pages 0 :tot-keys 0) - (dolist (col cols-w-widths) - (if (<= (+ (car col) page-width) avl-width) - (progn (push (cdr col) page-cols) - (setq page-width (+ page-width (car col)) - n-keys (+ (length (cdr col)) n-keys))) - (when (> (length page-cols) 0) - (push (which-key--join-columns page-cols) pages) - (push n-keys keys/page) - (push page-width page-widths) - (setq n-pages (1+ n-pages) - n-keys (length (cdr col)) - page-cols (list (cdr col)) - page-width (car col))))) - (when (> (length page-cols) 0) + (while cols-w-widths + (when (not (<= (+ (caar cols-w-widths) page-width) avl-width)) + (error "which-key: error in partition-columns")) + (while (and cols-w-widths + (<= (+ (caar cols-w-widths) page-width) avl-width)) + (setq col (pop cols-w-widths) + page-width (+ page-width (car col)) + n-keys (+ (length (cdr col)) n-keys)) + (push (cdr col) page-cols)) (push (which-key--join-columns page-cols) pages) (push n-keys keys/page) (push page-width page-widths) - (setq n-pages (1+ n-pages))) + (setq n-pages (1+ n-pages) + n-keys 0 page-cols '() page-width 0)) (list :pages (reverse pages) :page-height avl-lines :page-widths (reverse page-widths) :keys/page (reverse keys/page) :n-pages n-pages - :tot-keys (cl-reduce '+ keys/page :initial-value 0))))) + :tot-keys (apply #'+ keys/page))))) (defun which-key--create-pages (keys sel-win-width) "Create page strings using `which-key--partition-columns'. From bfe1e5c9b553736dea735fbce6dd2f64aca85172 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 3 Aug 2015 13:46:20 -0400 Subject: [PATCH 267/816] Replace ?? with lambda by default --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 321baf0a95d..cb68ec06af5 100644 --- a/which-key.el +++ b/which-key.el @@ -96,7 +96,8 @@ in the first example." :type '(alist :key-type regexp :value-type string)) (defcustom which-key-description-replacement-alist - '(("Prefix Command" . "prefix") ("which-key-show-next-page" . "wk next pg")) + '(("Prefix Command" . "prefix") ("which-key-show-next-page" . "wk next pg") + ("\\`\\?\\?\\'" . "lambda")) "See `which-key-key-replacement-alist'. This is a list of lists for replacing descriptions." :group 'which-key From 90e54815b537d2ddc56a3b5c7f19b21a9e0900ec Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 3 Aug 2015 14:54:20 -0400 Subject: [PATCH 268/816] Fix ref to free var --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index cb68ec06af5..6ec03c22ecf 100644 --- a/which-key.el +++ b/which-key.el @@ -921,7 +921,7 @@ Returns a plist that holds the page strings, as well as metadata." (let ((cols-w-widths (mapcar #'which-key--pad-column (-partition-all avl-lines keys))) (page-width 0) (n-pages 0) (n-keys 0) - page-cols pages page-widths keys/page) + page-cols pages page-widths keys/page col) (if (> (apply #'max (mapcar #'car cols-w-widths)) avl-width) ;; give up if any columns don't fit (list :pages nil :page-height 0 :page-widths '(0) From 833d17cf1e4c7382845fa7a29c250cb5e2791b90 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 3 Aug 2015 15:11:46 -0400 Subject: [PATCH 269/816] Tweak partition-columns --- which-key.el | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 6ec03c22ecf..81873eb486c 100644 --- a/which-key.el +++ b/which-key.el @@ -923,23 +923,26 @@ Returns a plist that holds the page strings, as well as metadata." (page-width 0) (n-pages 0) (n-keys 0) page-cols pages page-widths keys/page col) (if (> (apply #'max (mapcar #'car cols-w-widths)) avl-width) - ;; give up if any columns don't fit + ;; give up if no columns fit (list :pages nil :page-height 0 :page-widths '(0) :keys/page '(0) :n-pages 0 :tot-keys 0) (while cols-w-widths - (when (not (<= (+ (caar cols-w-widths) page-width) avl-width)) - (error "which-key: error in partition-columns")) + ;; start new page + (cl-incf n-pages) + (setq col (pop cols-w-widths) + page-cols (list (cdr col)) + page-width (car col) + n-keys (length (cdr col))) + ;; add additional columns as long as they fit (while (and cols-w-widths (<= (+ (caar cols-w-widths) page-width) avl-width)) - (setq col (pop cols-w-widths) - page-width (+ page-width (car col)) - n-keys (+ (length (cdr col)) n-keys)) - (push (cdr col) page-cols)) + (setq col (pop cols-w-widths)) + (push (cdr col) page-cols) + (cl-incf page-width (car col)) + (cl-incf n-keys (length (cdr col)))) (push (which-key--join-columns page-cols) pages) (push n-keys keys/page) - (push page-width page-widths) - (setq n-pages (1+ n-pages) - n-keys 0 page-cols '() page-width 0)) + (push page-width page-widths)) (list :pages (reverse pages) :page-height avl-lines :page-widths (reverse page-widths) :keys/page (reverse keys/page) :n-pages n-pages From 8e4602ad131946e6869c55f601894d142358a8f2 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 10 Aug 2015 09:09:59 -0400 Subject: [PATCH 270/816] Add missing save-match-data call --- which-key.el | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 81873eb486c..79f51c576a2 100644 --- a/which-key.el +++ b/which-key.el @@ -868,17 +868,18 @@ BUFFER that follow the key sequence KEY-SEQ." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) (buffer (current-buffer)) key-match desc-match unformatted) - (with-temp-buffer - (describe-buffer-bindings buffer which-key--current-prefix) - (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 (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)))))) + (save-match-data + (with-temp-buffer + (describe-buffer-bindings buffer which-key--current-prefix) + (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 (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))))))) (when which-key-sort-order (setq unformatted (sort unformatted (lambda (a b) (funcall which-key-sort-order a b))))) From cb2e4a92f9d83b785dd0071c448ea4d59d8117c7 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 10 Aug 2015 11:05:04 -0400 Subject: [PATCH 271/816] show-remaining-keys cleanup --- which-key.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 79f51c576a2..1da7bf85aad 100644 --- a/which-key.el +++ b/which-key.el @@ -334,16 +334,18 @@ used.") (when which-key-use-C-h-for-paging (setq which-key--prefix-help-cmd-backup prefix-help-command prefix-help-command #'which-key-show-next-page)) + (when which-key-show-remaining-keys + (add-hook 'pre-command-hook #'which-key--lighter-restore)) (add-hook 'pre-command-hook #'which-key--hide-popup) - (add-hook 'pre-command-hook #'which-key--lighter-restore) (add-hook 'focus-out-hook #'which-key--stop-timer) (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) (when which-key-use-C-h-for-paging (setq prefix-help-command which-key--prefix-help-cmd-backup)) + (when which-key-show-remaining-keys + (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) - (remove-hook 'pre-command-hook #'which-key--lighter-restore) (remove-hook 'focus-out-hook #'which-key--stop-timer) (remove-hook 'focus-in-hook #'which-key--start-timer) (which-key--stop-timer))) @@ -985,6 +987,7 @@ is the width of the live window." (setq which-key--lighter-backup (cadr (assq 'which-key-mode minor-mode-alist))) (setcar (cdr (assq 'which-key-mode minor-mode-alist)) (format " WK: %s/%s keys" n-shown n-tot)))) + (defun which-key--lighter-restore () "Restore the lighter for which-key." (when which-key-show-remaining-keys From 14892bbf5696de4f766ec792e0778f352dad4ac6 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 15 Aug 2015 13:03:09 -0400 Subject: [PATCH 272/816] Add support for "prefix titles". See #58 --- which-key.el | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 1da7bf85aad..9a5b42e0d3e 100644 --- a/which-key.el +++ b/which-key.el @@ -118,6 +118,15 @@ same way using the alist matched when `major-mode' is emacs-lisp-mode." :group 'which-key) +(defcustom which-key-prefix-title-alist '() + "An alist with elements f the form (key-sequence . prefix-title). +key-sequence and prefix-title are both strings. key-sequence is a +string suitable for calling the `kbd' function on. The title is +displayed alongside the actual current key sequence when +`which-key-show-prefix' is set to either top or echo." + :group 'which-key + :type '(alist :key-type string :value-type string)) + (defcustom 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." @@ -1024,9 +1033,15 @@ enough space based on your settings and frame size." prefix-keys) (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) - (status-top (when (< 1 n-pages) - (propertize (format "(%s of %s)" (1+ page-n) n-pages) - 'face 'which-key-note-face))) + (status-top (when (assoc prefix-keys which-key-prefix-title-alist) + (propertize + (cdr (assoc prefix-keys which-key-prefix-title-alist)) + 'face 'which-key-note-face))) + (status-top (concat status-top + (when (< 1 n-pages) + (propertize (format " (%s of %s)" + (1+ page-n) n-pages) + 'face 'which-key-note-face)))) (first-col-width (+ 2 (max (string-width prefix-w-face) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) @@ -1062,10 +1077,10 @@ enough space based on your settings and frame size." prefix-keys) new-end (concat "\n" (s-repeat first-col-width " ")) page (concat first (mapconcat #'identity (cdr lines) new-end))))) ((eq which-key-show-prefix 'top) - (setq page (concat prefix-w-face dash-w-face " " + (setq page (concat prefix-w-face dash-w-face " " status-top " " nxt-pg-hint "\n" page))) ((eq which-key-show-prefix 'echo) - (which-key--echo (concat prefix-w-face dash-w-face " " + (which-key--echo (concat prefix-w-face dash-w-face " " status-top " " nxt-pg-hint)))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) From 5e1d53000a9777fb68904222ea42800006caac0c Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 15 Aug 2015 20:26:14 -0400 Subject: [PATCH 273/816] Switch prefix-titles to key-seq as key --- which-key.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 9a5b42e0d3e..c1c1793a058 100644 --- a/which-key.el +++ b/which-key.el @@ -119,11 +119,11 @@ emacs-lisp-mode." :group 'which-key) (defcustom which-key-prefix-title-alist '() - "An alist with elements f the form (key-sequence . prefix-title). -key-sequence and prefix-title are both strings. key-sequence is a -string suitable for calling the `kbd' function on. The title is -displayed alongside the actual current key sequence when -`which-key-show-prefix' is set to either top or echo." + "An alist with elements of the form (key-sequence . prefix-title). +key-sequence is a sequence of the sort produced by `kbd'. +prefix-title is a both string. The title is displayed alongside +the actual current key sequence when `which-key-show-prefix' is +set to either top or echo." :group 'which-key :type '(alist :key-type string :value-type string)) @@ -1033,9 +1033,11 @@ enough space based on your settings and frame size." prefix-keys) (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) - (status-top (when (assoc prefix-keys which-key-prefix-title-alist) + (status-top (when (assoc which-key--current-prefix + which-key-prefix-title-alist) (propertize - (cdr (assoc prefix-keys which-key-prefix-title-alist)) + (cdr (assoc which-key--current-prefix + which-key-prefix-title-alist)) 'face 'which-key-note-face))) (status-top (concat status-top (when (< 1 n-pages) From 64083cee087463c1aab4c487cf2044560615656a Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 15 Aug 2015 21:10:49 -0400 Subject: [PATCH 274/816] One more change to format of prefix-title-alist --- which-key.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index c1c1793a058..444ec11ae81 100644 --- a/which-key.el +++ b/which-key.el @@ -120,10 +120,11 @@ emacs-lisp-mode." (defcustom which-key-prefix-title-alist '() "An alist with elements of the form (key-sequence . prefix-title). -key-sequence is a sequence of the sort produced by `kbd'. -prefix-title is a both string. The title is displayed alongside -the actual current key sequence when `which-key-show-prefix' is -set to either top or echo." +key-sequence is a sequence of the sort produced by applying `kbd' +then `listify-key-sequence' to create a canonical version of the +key sequence. prefix-title is a string. The title is displayed +alongside the actual current key sequence when +`which-key-show-prefix' is set to either top or echo." :group 'which-key :type '(alist :key-type string :value-type string)) @@ -1033,10 +1034,10 @@ enough space based on your settings and frame size." prefix-keys) (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) - (status-top (when (assoc which-key--current-prefix + (status-top (when (assoc (listify-key-sequence which-key--current-prefix) which-key-prefix-title-alist) (propertize - (cdr (assoc which-key--current-prefix + (cdr (assoc (listify-key-sequence which-key--current-prefix) which-key-prefix-title-alist)) 'face 'which-key-note-face))) (status-top (concat status-top From 54fd3bbb557e79e1a6cb36a4b1c5003f747a19e5 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 16 Aug 2015 18:19:30 -0400 Subject: [PATCH 275/816] Add helper function for prefix titles --- which-key.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/which-key.el b/which-key.el index 444ec11ae81..4ecd4d30811 100644 --- a/which-key.el +++ b/which-key.el @@ -478,6 +478,19 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) +;;;###autoload +(defun which-key-add-prefix-title (key-seq-str name &optional force) + "Add title for KEY-SEQ-STR given by TITLE. +FORCE, if non-nil, will add the new title even if one already +exists. KEY-SEQ-STR should be a key sequence string suitable for +`kbd' and NAME should be a string." + (interactive) + (let ((key-seq-lst (listify-key-sequence (kbd key-seq-str)))) + (if (and (null force) + (assoc key-seq-lst which-key-prefix-title-alist)) + (message "which-key: Prefix title not added. A title exists for this prefix.") + (push (cons key-seq-lst name) which-key-prefix-title-alist)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes From 5eee7e8228f95c9495c4643cdda0bc839c8a3fa5 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 27 Aug 2015 08:37:41 -0400 Subject: [PATCH 276/816] Fix which-key-echo-keystrokes docstring --- which-key.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 4ecd4d30811..024d155301d 100644 --- a/which-key.el +++ b/which-key.el @@ -54,9 +54,10 @@ (defcustom which-key-echo-keystrokes 0 "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." +This only applies if `which-key-popup-type' is minibuffer or +`which-key-show-prefix' is echo. It needs to be less than +`which-key-idle-delay' or else the keystroke echo will erase the +which-key popup." :group 'which-key :type 'float) From a251b4e4c53d61f7e8627c01b463e9025dd25d52 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 27 Aug 2015 08:43:55 -0400 Subject: [PATCH 277/816] Fix echo-keystrokes backup --- which-key.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 024d155301d..09ab2e886c4 100644 --- a/which-key.el +++ b/which-key.el @@ -341,6 +341,7 @@ used.") map) (if which-key-mode (progn + (setq which-key--echo-keystrokes-backup echo-keystrokes) (unless which-key--is-setup (which-key--setup)) (when which-key-use-C-h-for-paging (setq which-key--prefix-help-cmd-backup prefix-help-command @@ -382,16 +383,15 @@ set too high) and setup which-key buffer." (defun which-key--setup-echo-keystrokes () "Reduce `echo-keystrokes' if necessary (it will interfer if it's set too high)." - (when (and echo-keystrokes - (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001)) - (setq which-key--echo-keystrokes-backup echo-keystrokes) - (if (> which-key-idle-delay which-key-echo-keystrokes) - (setq echo-keystrokes which-key-echo-keystrokes) - (setq which-key-echo-keystrokes - (min echo-keystrokes (/ (float which-key-idle-delay) 4)) - echo-keystrokes which-key-echo-keystrokes)) - (message "which-key: echo-keystrokes changed from %s to %s" - which-key--echo-keystrokes-backup echo-keystrokes))) + (let ((previous echo-keystrokes)) + (when (and echo-keystrokes + (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001)) + (if (> which-key-idle-delay which-key-echo-keystrokes) + (setq echo-keystrokes which-key-echo-keystrokes) + (setq which-key-echo-keystrokes (/ (float which-key-idle-delay) 4) + echo-keystrokes which-key-echo-keystrokes)) + (message "which-key: echo-keystrokes changed from %s to %s" + previous echo-keystrokes)))) ;; Default configuration functions for use by users. Should be the "best" ;; configurations From 353ab03968bb3a706e7eccfa4e8e9a45e33fb5a0 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 1 Sep 2015 00:16:19 -0400 Subject: [PATCH 278/816] Add experimental support for using descbinds Adds a new variable which is disabled by default, called which-key-prevent-C-h-from-cycling. If both this new variable and which-key-use-C-h-for-paging are t, then C-h will page through to the last page, but then drop into the default emacs behavior of calling describe-prefix-bindings instead of cycling to page 1 again. --- which-key.el | 53 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index 09ab2e886c4..8bd40e47b73 100644 --- a/which-key.el +++ b/which-key.el @@ -229,6 +229,16 @@ prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'boolean) +(defcustom which-key-prevent-C-h-from-cycling nil + "Experimental: When using C-h for paging, which-key overrides + the default behavior of calling `describe-prefix-bindings'. + Setting this variable to t makes it so that when on the last + page, pressing C-h calls the default function instead of + cycling pages. If you want which-key to cycle, set this to + nil." + :group 'which-key + :type 'boolean) + ;; Faces (defface which-key-key-face '((t . (:inherit font-lock-constant-face))) @@ -343,9 +353,9 @@ used.") (progn (setq which-key--echo-keystrokes-backup echo-keystrokes) (unless which-key--is-setup (which-key--setup)) + (setq which-key--prefix-help-cmd-backup prefix-help-command) (when which-key-use-C-h-for-paging - (setq which-key--prefix-help-cmd-backup prefix-help-command - prefix-help-command #'which-key-show-next-page)) + (setq prefix-help-command #'which-key-show-next-page)) (when which-key-show-remaining-keys (add-hook 'pre-command-hook #'which-key--lighter-restore)) (add-hook 'pre-command-hook #'which-key--hide-popup) @@ -353,8 +363,7 @@ used.") (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) - (when which-key-use-C-h-for-paging - (setq prefix-help-command which-key--prefix-help-cmd-backup)) + (setq prefix-help-command which-key--prefix-help-cmd-backup) (when which-key-show-remaining-keys (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) @@ -1063,7 +1072,12 @@ enough space based on your settings and frame size." prefix-keys) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) (status-left (s-pad-right first-col-width " " status-left)) - (nxt-pg-hint (cond ((and (< 1 n-pages) + (nxt-pg-hint (cond ((and (< 1 n-pages) (= (1+ page-n) n-pages) + which-key-prevent-C-h-from-cycling + which-key-use-C-h-for-paging) + (propertize "[C-h desc-binds]" + 'face 'which-key-note-face)) + ((and (< 1 n-pages) which-key-use-C-h-for-paging) (propertize (format "[C-h pg %s]" (1+ (mod (1+ page-n) n-pages))) @@ -1114,17 +1128,24 @@ Will force an update if called before `which-key--update'." (interactive) (if which-key--current-page-n ;; triggered after timer shows buffer - (let ((next-page (1+ which-key--current-page-n))) - (which-key--stop-timer) - (setq unread-command-events - ;; forces event into current key sequence - (mapcar (lambda (ev) (cons t ev)) - (listify-key-sequence which-key--current-prefix))) - (if which-key--last-try-2-loc - (let ((which-key-side-window-location which-key--last-try-2-loc)) - (which-key--show-page next-page)) - (which-key--show-page next-page)) - (which-key--start-paging-timer)) + (let ((n-pages (plist-get which-key--pages-plist :n-pages)) + (next-page (1+ which-key--current-page-n))) + (if (and which-key-prevent-C-h-from-cycling + which-key-use-C-h-for-paging + (>= next-page n-pages)) + (progn + (which-key--hide-popup) + (describe-prefix-bindings)) + (which-key--stop-timer) + (setq unread-command-events + ;; forces event into current key sequence + (mapcar (lambda (ev) (cons t ev)) + (listify-key-sequence which-key--current-prefix))) + (if which-key--last-try-2-loc + (let ((which-key-side-window-location which-key--last-try-2-loc)) + (which-key--show-page next-page)) + (which-key--show-page next-page)) + (which-key--start-paging-timer))) ;; triggered before buffer is showing (let* ((keysbl (vconcat (butlast (append (this-single-command-keys) nil))))) (which-key--stop-timer) From aefca12690013abcf2fa443ce9d5ca18c9cd25ae Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 1 Sep 2015 10:53:04 -0400 Subject: [PATCH 279/816] Fix implementation of prevent-C-h-from-cycling --- which-key.el | 89 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 33 deletions(-) diff --git a/which-key.el b/which-key.el index 8bd40e47b73..325e1438e0a 100644 --- a/which-key.el +++ b/which-key.el @@ -332,6 +332,8 @@ Used when `which-key-popup-type' is frame.") (defvar which-key--current-page-n nil "Internal: Current pages of showing buffer. Nil means no buffer showing.") +(defvar which-key--on-last-page nil + "Internal: Non-nil if showing last page.") (defvar which-key--last-try-2-loc nil "Internal: Last location of side-window when two locations used.") @@ -572,7 +574,8 @@ total height." (defun which-key--hide-popup () "This function is called to hide the which-key buffer." (unless (eq real-this-command 'which-key-show-next-page) - (setq which-key--current-page-n nil) + (setq which-key--current-page-n nil + which-key--on-last-page nil) (cl-case which-key-popup-type ;; Not necessary to hide minibuffer ;; (minibuffer (which-key--hide-buffer-minibuffer)) @@ -580,6 +583,14 @@ total height." (frame (which-key--hide-buffer-frame)) (custom (funcall which-key-custom-hide-popup-function))))) +(defun which-key--hide-popup-ignore-command () + "Version of `which-key--hide-popup' without the check of +`real-this-command'." + (cl-case which-key-popup-type + (side-window (which-key--hide-buffer-side-window)) + (frame (which-key--hide-buffer-frame)) + (custom (funcall which-key-custom-hide-popup-function)))) + (defun which-key--hide-buffer-side-window () "Hide which-key buffer when side-window popup is used." (when (buffer-live-p which-key--buffer) @@ -1046,8 +1057,9 @@ area." (if (= 0 n-pages) (message "%s- which-key can't show keys: There is not \ enough space based on your settings and frame size." prefix-keys) - (setq page-n (mod n n-pages)) - (setq which-key--current-page-n page-n) + (setq page-n (mod n n-pages) + which-key--current-page-n page-n) + (when (= n-pages (1+ n)) (setq which-key--on-last-page t)) (let* ((page (nth page-n (plist-get which-key--pages-plist :pages))) (height (plist-get which-key--pages-plist :page-height)) (width (nth page-n (plist-get which-key--pages-plist :page-widths))) @@ -1072,14 +1084,16 @@ enough space based on your settings and frame size." prefix-keys) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) (status-left (s-pad-right first-col-width " " status-left)) - (nxt-pg-hint (cond ((and (< 1 n-pages) (= (1+ page-n) n-pages) + (nxt-pg-hint (cond ((and which-key--on-last-page which-key-prevent-C-h-from-cycling which-key-use-C-h-for-paging) - (propertize "[C-h desc-binds]" + (propertize (format "[C-h or ?%shelp]" + which-key-separator) 'face 'which-key-note-face)) ((and (< 1 n-pages) which-key-use-C-h-for-paging) - (propertize (format "[C-h pg %s]" + (propertize (format "[C-h or ?%spg %s]" + which-key-separator (1+ (mod (1+ page-n) n-pages))) 'face 'which-key-note-face)) ((and (< 1 n-pages) @@ -1126,35 +1140,43 @@ enough space based on your settings and frame size." prefix-keys) "Show the next page of keys. Will force an update if called before `which-key--update'." (interactive) - (if which-key--current-page-n - ;; triggered after timer shows buffer - (let ((n-pages (plist-get which-key--pages-plist :n-pages)) - (next-page (1+ which-key--current-page-n))) - (if (and which-key-prevent-C-h-from-cycling - which-key-use-C-h-for-paging - (>= next-page n-pages)) - (progn - (which-key--hide-popup) - (describe-prefix-bindings)) - (which-key--stop-timer) - (setq unread-command-events - ;; forces event into current key sequence - (mapcar (lambda (ev) (cons t ev)) - (listify-key-sequence which-key--current-prefix))) - (if which-key--last-try-2-loc - (let ((which-key-side-window-location which-key--last-try-2-loc)) - (which-key--show-page next-page)) - (which-key--show-page next-page)) - (which-key--start-paging-timer))) - ;; triggered before buffer is showing - (let* ((keysbl (vconcat (butlast (append (this-single-command-keys) nil))))) - (which-key--stop-timer) - (setq unread-command-events + (if (and which-key--current-page-n + which-key--on-last-page + which-key-use-C-h-for-paging + which-key-prevent-C-h-from-cycling) + (progn + (which-key--hide-popup-ignore-command) + (which-key--stop-timer) + (funcall which-key--prefix-help-cmd-backup) + (which-key--start-timer)) + (let* ((next-event-if-showing ;; forces event into current key sequence + (mapcar (lambda (ev) (cons t ev)) + (listify-key-sequence which-key--current-prefix))) + (keysbl + (vconcat (butlast (append (this-single-command-keys) nil)))) + (next-event-if-not-showing (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence keysbl))) - (which-key--create-buffer-and-show keysbl) - (which-key--start-timer)))) + (n-pages + (plist-get which-key--pages-plist :n-pages)) + (next-page + (if which-key--current-page-n (1+ which-key--current-page-n) 0))) + (cond + ;; buffer not showing + ((null which-key--current-page-n) + (which-key--stop-timer) + (setq unread-command-events next-event-if-not-showing) + (which-key--create-buffer-and-show keysbl) + (which-key--start-timer)) + (t + (which-key--stop-timer) + (setq unread-command-events next-event-if-showing) + (if which-key--last-try-2-loc + (let ((which-key-side-window-location which-key--last-try-2-loc)) + (which-key--show-page next-page)) + (which-key--show-page next-page)) + (which-key--start-paging-timer)))))) ;; (defun which-key-show-first-page () ;; "Show the first page of keys." @@ -1241,7 +1263,8 @@ Finally, show the buffer." (and (< 0 (length (this-single-command-keys))) (not (equal which-key--current-prefix (this-single-command-keys))))) - (setq which-key--current-page-n nil) + (setq which-key--current-page-n nil + which-key--on-last-page nil) (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) From fa202a53ff3defcb9aff1bfffec9a599745d399f Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 1 Sep 2015 13:00:51 -0400 Subject: [PATCH 280/816] Fix compiler warning --- which-key.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/which-key.el b/which-key.el index 325e1438e0a..51e03c64826 100644 --- a/which-key.el +++ b/which-key.el @@ -1158,8 +1158,6 @@ Will force an update if called before `which-key--update'." (next-event-if-not-showing (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence keysbl))) - (n-pages - (plist-get which-key--pages-plist :n-pages)) (next-page (if which-key--current-page-n (1+ which-key--current-page-n) 0))) (cond From 156bd61f46eb054ccbd863539d05c7e5d892b321 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 1 Sep 2015 13:56:48 -0400 Subject: [PATCH 281/816] Describe new paging options in readme --- README.org | 164 ++++++++++++++++++++++++++++------------------------- 1 file changed, 87 insertions(+), 77 deletions(-) diff --git a/README.org b/README.org index d0e15e4328f..893d36dee3b 100644 --- a/README.org +++ b/README.org @@ -1,29 +1,23 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] ** What's new -*** Local map face -- The face =which-key-local-map-description-face= is now available. This face - will be applied to any commands that are found using =(current-local-map)= - (commands defined for the major mode are usually here). This allows you to - distinguish between local and global bindings visually. See [[#face-customization-options][Face Customization]] - for more information. *** Paging -- Paging is now turned on by default, using any prefix plus =C-h= (this doesn't - affect key sequences that start with =C-h= and will not override any key - sequences that end will =C-h=). See the [[#paging-options][Paging Section]] for more details and - for other options on using and/or disabling paging. -- This makes which-key function as a replacement for the default behavior of - pressing =C-h= after a prefix which shows the key bindings for any prefix - (this default command is =describe-prefix-bindings=). It will also save the - prefix that you just entered. So =C-x C-h C-h C-x= will popup the which-key - buffer for the prefix =C-x= change the page twice and then execute the command - bound to =C-x C-x=. -- =C-h= will also now popup the which-key buffer to the first page if it is - pressed before =which-key-idle-delay= takes effect. This means you can set a - long idle delay if you like and just use =C-h= when you want to see - =which-key=. -- Note that this behavior is easily disabled, and you have the ability to choose - another binding of course. +- The new option =which-key-prevent-C-h-from-cycling=, which is =nil= by default + allows one to take advantage of using =C-h= for paging as well as the default + Emacs behavior of using =C-h= to describe the bindings for the current key + sequence prefix. +- The configuration below will allow you to switch paging using =C-h= until you + reach the last page of keys in the which-key buffer. The next press of =C-h= + will close the which-key buffer and trigger the default Emacs behavior on + =C-h=. + #+BEGIN_SRC Emacs-lisp + (setq which-key-use-C-h-for-paging t + which-key-prevent-C-h-from-cycling t) + #+END_SRC +- This is especially useful for those who like =helm-descbinds= but also want to + use =C-h= as their which-key paging key. +- Note =C-h= is by default equivalent to =?= in this context. + ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode @@ -49,37 +43,36 @@ Many of these have been implemented and are described below. ** Table of Contents :TOC@4: - [[#which-key-][which-key ]] - - [[#whats-new][What's new]] - - [[#local-map-face][Local map face]] - - [[#paging][Paging]] - - [[#introduction][Introduction]] - - [[#install][Install]] - - [[#melpa][MELPA]] - - [[#manually][Manually]] - - [[#initial-setup][Initial Setup]] - - [[#side-window-bottom-option][Side Window Bottom Option]] - - [[#side-window-right-option][Side Window Right Option]] - - [[#side-window-right-then-bottom][Side Window Right then Bottom]] - - [[#minibuffer-option][Minibuffer Option]] - - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - - [[#popup-type-options][Popup Type Options]] - - [[#minibuffer][minibuffer]] - - [[#side-window][side window]] - - [[#frame][frame]] - - [[#custom][custom]] - - [[#custom-string-replacement-options][Custom String Replacement Options]] - - [[#key-based-replacement]["Key-Based" replacement]] - - [[#key-and-description-replacement][Key and Description replacement]] - - [[#sorting-options][Sorting Options]] - - [[#paging-options][Paging Options]] - - [[#method-1-default-using-c-h-or-help-char][Method 1 (default): Using C-h (or =help-char=)]] - - [[#method-2-bind-your-own-keys][Method 2: Bind your own keys]] - - [[#face-customization-options][Face Customization Options]] - - [[#other-options][Other Options]] - - [[#more-examples][More Examples]] - - [[#nice-display-with-split-frame][Nice Display with Split Frame]] - - [[#status][Status]] - - [[#thanks][Thanks]] + - [[#whats-new][What's new]] + - [[#paging][Paging]] + - [[#introduction][Introduction]] + - [[#install][Install]] + - [[#melpa][MELPA]] + - [[#manually][Manually]] + - [[#initial-setup][Initial Setup]] + - [[#side-window-bottom-option][Side Window Bottom Option]] + - [[#side-window-right-option][Side Window Right Option]] + - [[#side-window-right-then-bottom][Side Window Right then Bottom]] + - [[#minibuffer-option][Minibuffer Option]] + - [[#special-features-and-configuration-options][Special Features and Configuration Options]] + - [[#popup-type-options][Popup Type Options]] + - [[#minibuffer][minibuffer]] + - [[#side-window][side window]] + - [[#frame][frame]] + - [[#custom][custom]] + - [[#custom-string-replacement-options][Custom String Replacement Options]] + - [[#key-based-replacement]["Key-Based" replacement]] + - [[#key-and-description-replacement][Key and Description replacement]] + - [[#sorting-options][Sorting Options]] + - [[#paging-options][Paging Options]] + - [[#method-1-default-using-c-h-or-help-char][Method 1 (default): Using C-h (or =help-char=)]] + - [[#method-2-bind-your-own-keys][Method 2: Bind your own keys]] + - [[#face-customization-options][Face Customization Options]] + - [[#other-options][Other Options]] + - [[#more-examples][More Examples]] + - [[#nice-display-with-split-frame][Nice Display with Split Frame]] + - [[#status][Status]] + - [[#thanks][Thanks]] ** Install *** MELPA @@ -90,7 +83,7 @@ minor mode of course. *** Manually Add which-key.el to your =load-path= and require. Something like -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (add-to-list 'load-path "path/to/which-key.el") (require 'which-key) (which-key-mode) @@ -117,12 +110,12 @@ 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]]. +This functionality is targeting [[https://github.com/syl20bnr/spacemacs][spacEmacs]]. *** Side Window Bottom Option Popup side window on bottom. This is the current default. To restore this setup use -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (which-key-setup-side-window-bottom) #+END_SRC @@ -131,7 +124,7 @@ Popup side window on bottom. This is the current default. To restore this setup *** Side Window Right Option Popup side window on right. For defaults use -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (which-key-setup-side-window-right) #+END_SRC @@ -149,14 +142,14 @@ usually easier to fit keys into. This setting can be helpful if the size of the Emacs frame changes frequently, which might be the case if you are using a dynamic/tiling window manager. -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (which-key-setup-side-window-right-bottom) #+END_SRC *** Minibuffer Option Take over the minibuffer. For the recommended configuration use -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (which-key-setup-minibuffer) #+END_SRC @@ -173,16 +166,16 @@ There are three different popup types that which-key can use by default to display the available keys. The variable =which-key-popup-type= decides which one is used. **** minibuffer -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (setq which-key-popup-type 'minibuffer) #+END_SRC Show keys in the minibuffer. **** side window -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (setq which-key-popup-type 'side-window) #+END_SRC Show keys in a side window. This popup type has further options: -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp ;; location of which-key window. valid values: top, bottom, left, right, ;; or a list of any of the two. If it's a list, which-key will always try ;; the first location first. It will go to the second location if there is @@ -201,13 +194,13 @@ Show keys in a side window. This popup type has further options: #+END_SRC **** frame -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (setq which-key-popup-type 'frame) #+END_SRC Show keys in a popup frame. This popup won't work very well in a terminal, where only one frame can be shown at any given moment. This popup type has further options: -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp ;; max width of which-key frame: number of columns (an integer) (setq which-key-frame-max-width 60) @@ -224,7 +217,7 @@ variables for more information, but here is a working example (this is the current implementation of side-window bottom). -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (setq which-key-popup-type 'custom) (defun which-key-custom-popup-max-dimensions-function (ignore) (cons @@ -255,7 +248,7 @@ The relevant variable is the awkwardly named =which-key-key-based-description-replacement-alist=. In this alist you can have cons cells of two types. An example of the first type is -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp ("C-x C-f" . "find files") #+END_SRC @@ -264,7 +257,7 @@ to replace. For that key combination, which-key overwrites the description with the second string, "find files". In the second type of entry you can restrict the replacements to a major-mode. For example, -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (org-mode . (("C-c C-c" . "Org C-c C-c") ("C-c C-a" . "Org Attach")) #+END_SRC @@ -284,7 +277,7 @@ descriptions directly. The relevant variables are =which-key-key-replacement-alist= and =which-key-description-replacement-alist=. Here's an example of one of the default key replacements -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp ("<\\([[:alnum:]-]+\\)>" . "\\1") #+END_SRC @@ -292,14 +285,14 @@ The =car= takes a string which may use Emacs regexp and the =cdr= takes a string with the replacement text. As shown, you can specify a sub-expression of the match. The replacements do not need to use regexp and can be as simple as -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp ("left" . "lft") #+END_SRC You can add this element to the key list with (there are no helper functions for these alists) -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (add-to-list 'which-key-key-replacement-alist '("left" . "lft")) #+END_SRC @@ -312,7 +305,7 @@ their order are You can control the order by setting this variable. -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (setq which-key-sort-order 'which-key-key-order) ;; or (setq which-key-sort-order 'which-key-description-order) #+END_SRC @@ -331,7 +324,7 @@ typing. There are two slightly different ways of doing this. **** Method 1 (default): Using C-h (or =help-char=) This is the easiest way, and is turned on by default. Use -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (setq which-key-use-C-h-for-paging nil) #+END_SRC to disable the behavior (this will only take effect after toggling @@ -345,18 +338,35 @@ keystroke can complete the command. As a bonus you can type =C-x C-h= and the which-key buffer will pop up immediately (i.e., before =which-key-idle-delay= kicks in). +The option =which-key-prevent-C-h-from-cycling=, which is =nil= by default +allows one to take advantage of using =C-h= for paging as well as the default +Emacs behavior of using =C-h= to describe the bindings for the current key +sequence prefix. + +The configuration below will allow you to switch paging using =C-h= until you +reach the last page of keys in the which-key buffer. The next press of =C-h= +will close the which-key buffer and trigger the default Emacs behavior on =C-h=. +#+BEGIN_SRC Emacs-lisp +(setq which-key-use-C-h-for-paging t + which-key-prevent-C-h-from-cycling t) +#+END_SRC +This is especially useful for those who like =helm-descbinds= but also want to +use =C-h= as their which-key paging key. + +Note =C-h= is by default equivalent to =?= in this context. + **** Method 2: Bind your own keys Essentially, all you need to do for a prefix like =C-x= is the following which will bind == to the relevant command. -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (define-key which-key-mode-map (kbd "C-x ") 'which-key-show-next-page) #+END_SRC This is completely equivalent to -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (setq which-key-paging-prefixes '("C-x")) (setq which-key-paging-key "") #+END_SRC @@ -382,13 +392,13 @@ everywhere. It might be useful for you to distinguish between the two. One way to do this is to remove the default face from =which-key-command-description-face= like this -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (set-face-attribute 'which-key-command-description-face nil :inherit nil) #+END_SRC another is to make the local map keys appear in bold -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) #+END_SRC @@ -399,7 +409,7 @@ your liking. The options below are also available through customize. Their defaults are shown. -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC Emacs-lisp ;; Set the time delay (in seconds) for the which-key popup to appear. (setq which-key-idle-delay 1.0) From 6bfda0168e4b947551d65d825b310635f9987403 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 07:21:48 -0400 Subject: [PATCH 282/816] Add missing autoload Fix #60 --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 51e03c64826..12d69e11a4e 100644 --- a/which-key.el +++ b/which-key.el @@ -415,8 +415,10 @@ it's set too high)." which-key-side-window-location 'right which-key-show-prefix 'top)) +;;;###autoload (defun which-key-setup-side-window-right-bottom () - "Apply suggested settings for side-window that opens on right if there is space and the bottom otherwise." + "Apply suggested settings for side-window that opens on right +if there is space and the bottom otherwise." (interactive) (setq which-key-popup-type 'side-window which-key-side-window-location '(right bottom) From c1458b621ad79e97cfdec15fd10b5326bcc63655 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 08:01:17 -0400 Subject: [PATCH 283/816] Change wording of hint --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 12d69e11a4e..b55635f2b82 100644 --- a/which-key.el +++ b/which-key.el @@ -1089,7 +1089,7 @@ enough space based on your settings and frame size." prefix-keys) (nxt-pg-hint (cond ((and which-key--on-last-page which-key-prevent-C-h-from-cycling which-key-use-C-h-for-paging) - (propertize (format "[C-h or ?%shelp]" + (propertize (format "[C-h or ?%sdescribe bindings]" which-key-separator) 'face 'which-key-note-face)) ((and (< 1 n-pages) From 5f5fcc4282179c6181d3b3f4c5910fad24bb999f Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 08:28:46 -0400 Subject: [PATCH 284/816] Factor out next page hint --- which-key.el | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/which-key.el b/which-key.el index b55635f2b82..879a54d2b4e 100644 --- a/which-key.el +++ b/which-key.el @@ -1051,6 +1051,22 @@ area." delay nil (lambda () (let (message-log-max) (message "%s" text)))))) +(defun which-key--next-page-hint (prefix-keys page-n n-pages) + "Return string for next page hint." + (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) + (paging-key-bound (eq 'which-key-show-next-page + (key-binding (kbd paging-key)))) + (key (if paging-key-bound which-key-paging-key "C-h or ?")) + (next-page-n (format "pg %s" (1+ (mod (1+ page-n) n-pages)))) + (use-descbind (and which-key--on-last-page which-key-use-C-h-for-paging + which-key-prevent-C-h-from-cycling))) + (when (or (and (< 1 n-pages) which-key-use-C-h-for-paging) + (and (< 1 n-pages) paging-key-bound) + use-descbind) + (propertize (format "[%s%s%s]" key which-key-separator + (if use-descbind "describe bindings" next-page-n)) + 'face 'which-key-note-face)))) + (defun which-key--show-page (n) "Show page N, starting from 0." (let ((n-pages (plist-get which-key--pages-plist :n-pages)) @@ -1076,7 +1092,7 @@ enough space based on your settings and frame size." prefix-keys) (propertize (cdr (assoc (listify-key-sequence which-key--current-prefix) which-key-prefix-title-alist)) - 'face 'which-key-note-face))) + 'face 'which-key-note-face))) (status-top (concat status-top (when (< 1 n-pages) (propertize (format " (%s of %s)" @@ -1086,29 +1102,7 @@ enough space based on your settings and frame size." prefix-keys) (string-width status-left)))) (prefix-left (s-pad-right first-col-width " " prefix-w-face)) (status-left (s-pad-right first-col-width " " status-left)) - (nxt-pg-hint (cond ((and which-key--on-last-page - which-key-prevent-C-h-from-cycling - which-key-use-C-h-for-paging) - (propertize (format "[C-h or ?%sdescribe bindings]" - which-key-separator) - 'face 'which-key-note-face)) - ((and (< 1 n-pages) - which-key-use-C-h-for-paging) - (propertize (format "[C-h or ?%spg %s]" - which-key-separator - (1+ (mod (1+ page-n) n-pages))) - 'face 'which-key-note-face)) - ((and (< 1 n-pages) - (eq 'which-key-show-next-page - (key-binding - (kbd (concat prefix-keys - " " - which-key-paging-key))))) - (propertize (format "[%s pg %s]" - which-key-paging-key - (1+ (mod (1+ page-n) n-pages))) - 'face 'which-key-note-face)) - (t nil))) + (nxt-pg-hint (which-key--next-page-hint prefix-keys page-n n-pages)) new-end lines first) (cond ((and (< 1 n-pages) (eq which-key-show-prefix 'left)) From b015716afc3d621170c81f6859d754ae5ef28d3e Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 08:51:53 -0400 Subject: [PATCH 285/816] Shorten next page hint It's too long with the buffer on the right --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 879a54d2b4e..c46dbff9663 100644 --- a/which-key.el +++ b/which-key.el @@ -1056,15 +1056,15 @@ area." (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) (paging-key-bound (eq 'which-key-show-next-page (key-binding (kbd paging-key)))) - (key (if paging-key-bound which-key-paging-key "C-h or ?")) + (key (if paging-key-bound which-key-paging-key "C-h")) (next-page-n (format "pg %s" (1+ (mod (1+ page-n) n-pages)))) (use-descbind (and which-key--on-last-page which-key-use-C-h-for-paging which-key-prevent-C-h-from-cycling))) (when (or (and (< 1 n-pages) which-key-use-C-h-for-paging) (and (< 1 n-pages) paging-key-bound) use-descbind) - (propertize (format "[%s%s%s]" key which-key-separator - (if use-descbind "describe bindings" next-page-n)) + (propertize (format "[%s %s]" key + (if use-descbind "help" next-page-n)) 'face 'which-key-note-face)))) (defun which-key--show-page (n) From 13c1feaeeb36eb6d77b252c25f95e7cd1b306a6e Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 12:04:37 -0400 Subject: [PATCH 286/816] Add min-display-lines option Ref #60 --- which-key.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index c46dbff9663..37d8bb6a9aa 100644 --- a/which-key.el +++ b/which-key.el @@ -158,6 +158,12 @@ and nil. Nil turns the feature off." (const :tag "Show in popup frame" frame) (const :tag "Use your custom display functions" custom))) +(defcustom which-key-min-display-lines 1 + "The minimum number of horizontal lines to display in the + which-key buffer." + :group 'which-key + :type 'integer) + (defcustom 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. You can also specify @@ -1011,6 +1017,7 @@ is the width of the live window." (+ 2 (string-width prefix-w-face)))) (prefix-top (eq which-key-show-prefix 'top)) (avl-lines (if prefix-top (- max-lines 1) max-lines)) + (min-lines (min avl-lines which-key-min-display-lines)) (avl-width (if prefix-left (- max-width prefix-left) max-width)) (vertical (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right)))) @@ -1019,7 +1026,7 @@ is the width of the live window." (cond ((or vertical (> (plist-get result :n-pages) 1) (= 1 avl-lines)) result) ;; do a simple search for the smallest number of lines - (t (while (and (> avl-lines 1) (not found)) + (t (while (and (> avl-lines min-lines) (not found)) (setq avl-lines (- avl-lines 1) prev-result result result (which-key--partition-columns From f248e9093e6f54477a7639feed4b77894c45b00c Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 12:51:47 -0400 Subject: [PATCH 287/816] Allow disabling truncation --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 37d8bb6a9aa..e57a63f1f3d 100644 --- a/which-key.el +++ b/which-key.el @@ -63,7 +63,7 @@ which-key popup." (defcustom which-key-max-description-length 27 "Truncate the description of keys to this length. -Also adds \"..\"." +Also adds \"..\". If nil, disable any truncation." :group 'which-key :type 'integer) @@ -829,7 +829,8 @@ If KEY contains any \"special keys\" defined in (defsubst which-key--truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." - (if (> (string-width desc) which-key-max-description-length) + (if (and which-key-max-description-length + (> (string-width desc) which-key-max-description-length)) (concat (substring desc 0 which-key-max-description-length) "..") desc)) From 73ff071ec3c9af48bb5d9db15e6be607205503b2 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 12:57:46 -0400 Subject: [PATCH 288/816] Make preventing C-h cycling the default --- README.org | 10 +++++----- which-key.el | 13 ++++++------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/README.org b/README.org index 893d36dee3b..d8eb11c459a 100644 --- a/README.org +++ b/README.org @@ -2,14 +2,14 @@ [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] ** What's new *** Paging -- The new option =which-key-prevent-C-h-from-cycling=, which is =nil= by default +- The new option =which-key-prevent-C-h-from-cycling=, which is =t= by default allows one to take advantage of using =C-h= for paging as well as the default Emacs behavior of using =C-h= to describe the bindings for the current key sequence prefix. -- The configuration below will allow you to switch paging using =C-h= until you - reach the last page of keys in the which-key buffer. The next press of =C-h= - will close the which-key buffer and trigger the default Emacs behavior on - =C-h=. +- The (default) configuration below will allow you to switch paging using =C-h= + until you reach the last page of keys in the which-key buffer. The next press + of =C-h= will close the which-key buffer and trigger the default Emacs + behavior on =C-h=. #+BEGIN_SRC Emacs-lisp (setq which-key-use-C-h-for-paging t which-key-prevent-C-h-from-cycling t) diff --git a/which-key.el b/which-key.el index e57a63f1f3d..86fe9fb2156 100644 --- a/which-key.el +++ b/which-key.el @@ -235,13 +235,12 @@ prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'boolean) -(defcustom which-key-prevent-C-h-from-cycling nil - "Experimental: When using C-h for paging, which-key overrides - the default behavior of calling `describe-prefix-bindings'. - Setting this variable to t makes it so that when on the last - page, pressing C-h calls the default function instead of - cycling pages. If you want which-key to cycle, set this to - nil." +(defcustom which-key-prevent-C-h-from-cycling t + "When using C-h for paging, which-key overrides the default + behavior of calling `describe-prefix-bindings'. Setting this + variable to t makes it so that when on the last page, pressing + C-h calls the default function instead of cycling pages. If you + want which-key to cycle, set this to nil." :group 'which-key :type 'boolean) From 35717ee18b119c03d1bce79887aee9cab90c38b2 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 19:51:21 -0400 Subject: [PATCH 289/816] Add support for prefix-names --- which-key.el | 96 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 86fe9fb2156..d259bb53dd5 100644 --- a/which-key.el +++ b/which-key.el @@ -119,6 +119,14 @@ same way using the alist matched when `major-mode' is emacs-lisp-mode." :group 'which-key) +(defcustom which-key-prefix-name-alist '() + "An alist with elements of the form (key-sequence . prefix-name). +key-sequence is a sequence of the sort produced by applying `kbd' +then `listify-key-sequence' to create a canonical version of the +key sequence. prefix-name is a string." + :group 'which-key + :type '(alist :key-type string :value-type string)) + (defcustom which-key-prefix-title-alist '() "An alist with elements of the form (key-sequence . prefix-title). key-sequence is a sequence of the sort produced by applying `kbd' @@ -498,17 +506,63 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) ;;;###autoload -(defun which-key-add-prefix-title (key-seq-str name &optional force) +(defun which-key-add-prefix-title (key-seq-str title &optional force) "Add title for KEY-SEQ-STR given by TITLE. FORCE, if non-nil, will add the new title even if one already exists. KEY-SEQ-STR should be a key sequence string suitable for -`kbd' and NAME should be a string." +`kbd' and TITLE should be a string." (interactive) (let ((key-seq-lst (listify-key-sequence (kbd key-seq-str)))) (if (and (null force) (assoc key-seq-lst which-key-prefix-title-alist)) (message "which-key: Prefix title not added. A title exists for this prefix.") - (push (cons key-seq-lst name) which-key-prefix-title-alist)))) + (push (cons key-seq-lst title) which-key-prefix-title-alist)))) + +(defun which-key--declare-prefix-names (alist key name) + "Internal function to add (KEY . NAME) to ALIST." + (when (or (not (stringp key)) (not (stringp name))) + (error "KEY and NAME should be strings")) + (let ((key-lst (listify-key-sequence (kbd key)))) + (cond ((null alist) (list (cons key-lst name))) + ((assoc key-lst alist) + (message "which-key: the key %s already exists in %s. This addition \ +will override that prefix-name." + key-lst alist) + (setcdr (assoc key-lst alist) name) + alist) + (t (cons (cons key-lst name) alist))))) + +;;;###autoload +(defun which-key-declare-prefix-names (key-sequence name &rest more) + "Name the KEY-SEQUENCE prefix NAME. +Both KEY-SEQUENCE and NAME should be strings. For Example, + +\(which-key-declare-prefix-names \"C-x 8\" \"unicode\"\) + +MORE allows you to specifcy additional KEY-SEQUENCE NAME pairs. All +names are added to `which-key-prefix-names-alist'." + (while key-sequence + (setq which-key-prefix-name-alist + (which-key--declare-prefix-names which-key-prefix-name-alist + key-sequence name)) + (setq key-sequence (pop more) name (pop more)))) + +;;;###autoload +(defun which-key-declare-prefix-names-for-mode (mode key-sequence name &rest more) + "Functions like `which-key-declare-prefix-names'. +The difference is that MODE specifies the `major-mode' that must +be active for KEY-SEQUENCE and NAME (MORE contains +addition KEY-SEQUENCE NAME pairs) to apply." + (when (not (symbolp mode)) + (error "MODE should be a symbol corresponding to a value of major-mode")) + (let ((mode-alist (cdr (assq mode which-key-prefix-name-alist)))) + (while key-sequence + (setq mode-alist (which-key--declare-prefix-names + mode-alist key-sequence name)) + (setq key-sequence (pop more) name (pop more))) + (if (assq mode which-key-prefix-name-alist) + (setcdr (assq mode which-key-prefix-name-alist) mode-alist) + (push (cons mode mode-alist) which-key-prefix-name-alist)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes @@ -794,6 +848,24 @@ replacement occurs return the new STRING." (replace-match (cdr repl) t literal new-string)))) new-string))) +(defsubst which-key--current-key-list (key-str) + (append (listify-key-sequence which-key--current-prefix) + (listify-key-sequence (kbd key-str)))) + +(defsubst which-key--current-key-string (key-str) + (key-description + (append (listify-key-sequence which-key--current-prefix) + (listify-key-sequence (kbd key-str))))) + +(defun which-key--maybe-get-prefix-name (key-lst desc) + (let* ((alist which-key-prefix-name-alist) + (res (assoc key-lst alist)) + (mode-alist (assq major-mode alist)) + (mode-res (when mode-alist (assoc key-lst mode-alist)))) + (cond (mode-res (cdr mode-res)) + (res (cdr res)) + (t desc)))) + (defun which-key--maybe-replace-key-based (string keys) "KEYS is a key sequence like \"C-c C-c\" and STRING is the description that is possibly replaced using the @@ -864,13 +936,18 @@ alists. Returns a list (key separator description)." (let* ((key (car key-desc-cons)) (desc (cdr key-desc-cons)) (group (which-key--group-p desc)) - (keys (concat (key-description which-key--current-prefix) " " key)) - (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern desc))) + (keys (which-key--current-key-string key)) + (key-lst (which-key--current-key-list key)) + (local (eq (which-key--safe-lookup-key local-map (kbd keys)) + (intern desc))) (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)) + (desc (if group + (which-key--maybe-get-prefix-name key-lst desc) + desc)) (key-w-face (which-key--propertize-key key)) (desc-w-face (which-key--propertize-description desc group local))) (list key-w-face sep-w-face desc-w-face))) @@ -1094,10 +1171,10 @@ enough space based on your settings and frame size." prefix-keys) (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) - (status-top (when (assoc (listify-key-sequence which-key--current-prefix) + (status-top (when (assoc (which-key--current-key-list "") which-key-prefix-title-alist) (propertize - (cdr (assoc (listify-key-sequence which-key--current-prefix) + (cdr (assoc (which-key--current-key-list "") which-key-prefix-title-alist)) 'face 'which-key-note-face))) (status-top (concat status-top @@ -1155,12 +1232,11 @@ Will force an update if called before `which-key--update'." (let* ((next-event-if-showing ;; forces event into current key sequence (mapcar (lambda (ev) (cons t ev)) - (listify-key-sequence which-key--current-prefix))) + (which-key--current-key-list ""))) (keysbl (vconcat (butlast (append (this-single-command-keys) nil)))) (next-event-if-not-showing - (mapcar (lambda (ev) (cons t ev)) - (listify-key-sequence keysbl))) + (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence keysbl))) (next-page (if which-key--current-page-n (1+ which-key--current-page-n) 0))) (cond From 2f45969ca972e0eabe92b25f91ecbf7c7c162fff Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 20:36:39 -0400 Subject: [PATCH 290/816] Change default indentation of helpers --- which-key.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/which-key.el b/which-key.el index d259bb53dd5..3c7c3c00139 100644 --- a/which-key.el +++ b/which-key.el @@ -487,6 +487,7 @@ replacements are added to which-key-key-based-description-replacement-alist key-sequence replacement)) (setq key-sequence (pop more) replacement (pop more)))) +(put 'which-key-add-key-based-replacements 'lisp-indent-function 'defun) ;;;###autoload (defun which-key-add-major-mode-key-based-replacements (mode key-sequence replacement &rest more) @@ -504,6 +505,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (if (assq mode which-key-key-based-description-replacement-alist) (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) +(put 'which-key-add-major-mode-key-based-replacements 'lisp-indent-function 'defun) ;;;###autoload (defun which-key-add-prefix-title (key-seq-str title &optional force) @@ -546,6 +548,7 @@ names are added to `which-key-prefix-names-alist'." (which-key--declare-prefix-names which-key-prefix-name-alist key-sequence name)) (setq key-sequence (pop more) name (pop more)))) +(put 'which-key-declare-prefix-names 'lisp-indent-function 'defun) ;;;###autoload (defun which-key-declare-prefix-names-for-mode (mode key-sequence name &rest more) @@ -563,6 +566,7 @@ addition KEY-SEQUENCE NAME pairs) to apply." (if (assq mode which-key-prefix-name-alist) (setcdr (assq mode which-key-prefix-name-alist) mode-alist) (push (cons mode mode-alist) which-key-prefix-name-alist)))) +(put 'which-key-declare-prefix-names-for-mode 'lisp-indent-function 'defun) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes From e5ed7de51003751831555db8622b2ecf304e8e1a Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Sep 2015 20:50:18 -0400 Subject: [PATCH 291/816] Minor changes to key-seq functions --- which-key.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 3c7c3c00139..a9b394e46b4 100644 --- a/which-key.el +++ b/which-key.el @@ -852,14 +852,16 @@ replacement occurs return the new STRING." (replace-match (cdr repl) t literal new-string)))) new-string))) -(defsubst which-key--current-key-list (key-str) +(defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence which-key--current-prefix) - (listify-key-sequence (kbd key-str)))) + (when key-str + (listify-key-sequence (kbd key-str))))) -(defsubst which-key--current-key-string (key-str) +(defsubst which-key--current-key-string (&optional key-str) (key-description (append (listify-key-sequence which-key--current-prefix) - (listify-key-sequence (kbd key-str))))) + (when key-str + (listify-key-sequence (kbd key-str)))))) (defun which-key--maybe-get-prefix-name (key-lst desc) (let* ((alist which-key-prefix-name-alist) @@ -1175,10 +1177,10 @@ enough space based on your settings and frame size." prefix-keys) (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) - (status-top (when (assoc (which-key--current-key-list "") + (status-top (when (assoc (which-key--current-key-list) which-key-prefix-title-alist) (propertize - (cdr (assoc (which-key--current-key-list "") + (cdr (assoc (which-key--current-key-list) which-key-prefix-title-alist)) 'face 'which-key-note-face))) (status-top (concat status-top @@ -1236,7 +1238,7 @@ Will force an update if called before `which-key--update'." (let* ((next-event-if-showing ;; forces event into current key sequence (mapcar (lambda (ev) (cons t ev)) - (which-key--current-key-list ""))) + (which-key--current-key-list))) (keysbl (vconcat (butlast (append (this-single-command-keys) nil)))) (next-event-if-not-showing From 34dbf351234b4a477e3b0d8f46781f35b0a48c19 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Sep 2015 09:11:34 -0400 Subject: [PATCH 292/816] Common interface for prefix names and titles --- which-key.el | 141 +++++++++++++++++++++++++++++---------------------- 1 file changed, 80 insertions(+), 61 deletions(-) diff --git a/which-key.el b/which-key.el index a9b394e46b4..44553931643 100644 --- a/which-key.el +++ b/which-key.el @@ -457,18 +457,19 @@ bottom." ;; Helper functions to modify replacement lists. -(defun which-key--add-key-based-replacements (alist key repl) - "Internal function to add (KEY . REPL) to ALIST." - (when (or (not (stringp key)) (not (stringp repl))) - (error "KEY and REPL should be strings")) - (cond ((null alist) (list (cons key repl))) - ((assoc-string key alist) - (message "which-key: the key %s already exists in %s. This addition \ -will override that replacement." - key alist) - (setcdr (assoc-string key alist) repl) - alist) - (t (cons (cons key repl) alist)))) +(defun which-key--add-key-val-to-alist (alist key value) + "Internal function to add (KEY . VALUE) to ALIST." + (when (or (not (stringp key)) (not (stringp value))) + (error "KEY and VALUE should be strings")) + (let ((key-lst (listify-key-sequence (kbd key)))) + (cond ((null alist) (list (cons key-lst value))) + ((assoc key-lst alist) + (message "which-key: the key %s already exists in %s. This addition \ +will override that value." + key alist) + (setcdr (assoc key-lst alist) value) + alist) + (t (cons (cons key-lst value) alist))))) ;;;###autoload (defun which-key-add-key-based-replacements (key-sequence replacement &rest more) @@ -483,7 +484,7 @@ replacements are added to ;; TODO: Make interactive (while key-sequence (setq which-key-key-based-description-replacement-alist - (which-key--add-key-based-replacements + (which-key--add-key-val-to-alist which-key-key-based-description-replacement-alist key-sequence replacement)) (setq key-sequence (pop more) replacement (pop more)))) @@ -500,7 +501,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (error "MODE should be a symbol corresponding to a value of major-mode")) (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) (while key-sequence - (setq mode-alist (which-key--add-key-based-replacements mode-alist key-sequence replacement)) + (setq mode-alist (which-key--add-key-val-to-alist mode-alist key-sequence replacement)) (setq key-sequence (pop more) replacement (pop more))) (if (assq mode which-key-key-based-description-replacement-alist) (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) @@ -509,63 +510,68 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." ;;;###autoload (defun which-key-add-prefix-title (key-seq-str title &optional force) - "Add title for KEY-SEQ-STR given by TITLE. -FORCE, if non-nil, will add the new title even if one already -exists. KEY-SEQ-STR should be a key sequence string suitable for -`kbd' and TITLE should be a string." - (interactive) + "Deprecated in favor of `which-key-declare-prefixes'. + +Add title for KEY-SEQ-STR given by TITLE. FORCE, if non-nil, will +add the new title even if one already exists. KEY-SEQ-STR should +be a key sequence string suitable for `kbd' and TITLE should be a +string." (let ((key-seq-lst (listify-key-sequence (kbd key-seq-str)))) (if (and (null force) (assoc key-seq-lst which-key-prefix-title-alist)) (message "which-key: Prefix title not added. A title exists for this prefix.") (push (cons key-seq-lst title) which-key-prefix-title-alist)))) -(defun which-key--declare-prefix-names (alist key name) - "Internal function to add (KEY . NAME) to ALIST." - (when (or (not (stringp key)) (not (stringp name))) - (error "KEY and NAME should be strings")) - (let ((key-lst (listify-key-sequence (kbd key)))) - (cond ((null alist) (list (cons key-lst name))) - ((assoc key-lst alist) - (message "which-key: the key %s already exists in %s. This addition \ -will override that prefix-name." - key-lst alist) - (setcdr (assoc key-lst alist) name) - alist) - (t (cons (cons key-lst name) alist))))) - ;;;###autoload -(defun which-key-declare-prefix-names (key-sequence name &rest more) +(defun which-key-declare-prefixes (key-sequence name &rest more) "Name the KEY-SEQUENCE prefix NAME. -Both KEY-SEQUENCE and NAME should be strings. For Example, +KEY-SEQUENCE should be a string, acceptable to `kbd'. NAME can be +a string or a cons cell of two strings. In the first case, the +string is used as both the name and the title (the title is +displayed in the echo area only). For Example, -\(which-key-declare-prefix-names \"C-x 8\" \"unicode\"\) +\(which-key-declare-prefixes \"C-x 8\" \"unicode\"\) -MORE allows you to specifcy additional KEY-SEQUENCE NAME pairs. All -names are added to `which-key-prefix-names-alist'." +or + +\(which-key-declare-prefixes \"C-x 8\" (\"unicode\" . \"Unicode Chararcters\")\) + +MORE allows you to specifcy additional KEY-SEQUENCE NAME pairs. +All names are added to `which-key-prefix-names-alist' and titles +to `which-key-prefix-title-alist'." (while key-sequence - (setq which-key-prefix-name-alist - (which-key--declare-prefix-names which-key-prefix-name-alist - key-sequence name)) + (let ((-name (if (consp name) (car name) name)) + (-title (if (consp name) (cdr name) name))) + (setq which-key-prefix-name-alist + (which-key--add-key-val-to-alist which-key-prefix-name-alist + key-sequence -name) + which-key-prefix-title-alist + (which-key--add-key-val-to-alist which-key-prefix-title-alist + key-sequence -title))) (setq key-sequence (pop more) name (pop more)))) (put 'which-key-declare-prefix-names 'lisp-indent-function 'defun) ;;;###autoload -(defun which-key-declare-prefix-names-for-mode (mode key-sequence name &rest more) +(defun which-key-declare-prefixes-for-mode (mode key-sequence name &rest more) "Functions like `which-key-declare-prefix-names'. The difference is that MODE specifies the `major-mode' that must be active for KEY-SEQUENCE and NAME (MORE contains addition KEY-SEQUENCE NAME pairs) to apply." (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) - (let ((mode-alist (cdr (assq mode which-key-prefix-name-alist)))) + (let ((mode-name-alist (cdr (assq mode which-key-prefix-name-alist))) + (mode-title-alist (cdr (assq mode which-key-prefix-title-alist))) + (-name (if (consp name) (car name) name)) + (-title (if (consp name) (cdr name) name))) (while key-sequence - (setq mode-alist (which-key--declare-prefix-names - mode-alist key-sequence name)) + (setq mode-name-alist (which-key--add-key-val-to-list + mode-name-alist key-sequence -name) + mode-title-alist (which-key--add-key-val-to-list + mode-title-alist key-sequence -title)) (setq key-sequence (pop more) name (pop more))) (if (assq mode which-key-prefix-name-alist) - (setcdr (assq mode which-key-prefix-name-alist) mode-alist) - (push (cons mode mode-alist) which-key-prefix-name-alist)))) + (setcdr (assq mode which-key-prefix-name-alist) mode-name-alist) + (push (cons mode mode-name-alist) which-key-prefix-name-alist)))) (put 'which-key-declare-prefix-names-for-mode 'lisp-indent-function 'defun) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -863,7 +869,11 @@ replacement occurs return the new STRING." (when key-str (listify-key-sequence (kbd key-str)))))) -(defun which-key--maybe-get-prefix-name (key-lst desc) +(defun which-key--maybe-replace-prefix-name (key-lst desc) + "KEY-LST is a list of keys produced by `listify-key-sequences' +and DESC is the description that is possibly replaced using the +`which-key-prefix-name-alist'. Whether or not a replacement +occurs return the new STRING." (let* ((alist which-key-prefix-name-alist) (res (assoc key-lst alist)) (mode-alist (assq major-mode alist)) @@ -872,15 +882,27 @@ replacement occurs return the new STRING." (res (cdr res)) (t desc)))) -(defun which-key--maybe-replace-key-based (string keys) - "KEYS is a key sequence like \"C-c C-c\" and STRING is the -description that is possibly replaced using the +(defun which-key--maybe-get-prefix-title (key-lst) + "KEY-LST is a list of keys produced by `listify-key-sequences'. +A title is possibly returned using `which-key-prefix-title-alist'. +An empty stiring is returned if no title exists." + (let* ((alist which-key-prefix-title-alist) + (res (assoc key-lst alist)) + (mode-alist (assq major-mode alist)) + (mode-res (when mode-alist (assoc key-lst mode-alist)))) + (cond (mode-res (cdr mode-res)) + (res (cdr res)) + (t "")))) + +(defun which-key--maybe-replace-key-based (string key-lst) + "KEY-LST is a list of keys produced by `listify-key-sequences' +and STRING is the description that is possibly replaced using the `which-key-key-based-description-replacement-alist'. Whether or not a replacement occurs return the new STRING." (let* ((alist which-key-key-based-description-replacement-alist) - (str-res (assoc-string keys alist)) + (str-res (assoc key-lst alist)) (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist (assoc-string keys mode-alist)))) + (mode-res (when mode-alist (assoc key-lst mode-alist)))) (cond (mode-res (cdr mode-res)) (str-res (cdr str-res)) (t string)))) @@ -950,9 +972,9 @@ alists. Returns a list (key separator description)." 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)) + (desc (which-key--maybe-replace-key-based desc key-lst)) (desc (if group - (which-key--maybe-get-prefix-name key-lst desc) + (which-key--maybe-replace-prefix-name key-lst desc) desc)) (key-w-face (which-key--propertize-key key)) (desc-w-face (which-key--propertize-description desc group local))) @@ -1177,12 +1199,9 @@ enough space based on your settings and frame size." prefix-keys) (dash-w-face (propertize "-" 'face 'which-key-key-face)) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) - (status-top (when (assoc (which-key--current-key-list) - which-key-prefix-title-alist) - (propertize - (cdr (assoc (which-key--current-key-list) - which-key-prefix-title-alist)) - 'face 'which-key-note-face))) + (status-top (propertize (which-key--maybe-get-prefix-title + (which-key--current-key-list)) + 'face 'which-key-note-face)) (status-top (concat status-top (when (< 1 n-pages) (propertize (format " (%s of %s)" From 5cfc20646f3158a41ac7b5708ef83fda97e2c15d Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Sep 2015 13:11:12 -0400 Subject: [PATCH 293/816] Minor fix on last commit --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 44553931643..d4ab3183306 100644 --- a/which-key.el +++ b/which-key.el @@ -549,7 +549,7 @@ to `which-key-prefix-title-alist'." (which-key--add-key-val-to-alist which-key-prefix-title-alist key-sequence -title))) (setq key-sequence (pop more) name (pop more)))) -(put 'which-key-declare-prefix-names 'lisp-indent-function 'defun) +(put 'which-key-declare-prefixes 'lisp-indent-function 'defun) ;;;###autoload (defun which-key-declare-prefixes-for-mode (mode key-sequence name &rest more) @@ -572,7 +572,7 @@ addition KEY-SEQUENCE NAME pairs) to apply." (if (assq mode which-key-prefix-name-alist) (setcdr (assq mode which-key-prefix-name-alist) mode-name-alist) (push (cons mode mode-name-alist) which-key-prefix-name-alist)))) -(put 'which-key-declare-prefix-names-for-mode 'lisp-indent-function 'defun) +(put 'which-key-declare-prefixes-for-mode 'lisp-indent-function 'defun) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes From 8b5d4c1dd2fc5c932d3d894d647ae82a415b2b4c Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Sep 2015 13:19:42 -0400 Subject: [PATCH 294/816] Fix typo --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index d4ab3183306..d9e7b3a2ffe 100644 --- a/which-key.el +++ b/which-key.el @@ -564,9 +564,9 @@ addition KEY-SEQUENCE NAME pairs) to apply." (-name (if (consp name) (car name) name)) (-title (if (consp name) (cdr name) name))) (while key-sequence - (setq mode-name-alist (which-key--add-key-val-to-list + (setq mode-name-alist (which-key--add-key-val-to-alist mode-name-alist key-sequence -name) - mode-title-alist (which-key--add-key-val-to-list + mode-title-alist (which-key--add-key-val-to-alist mode-title-alist key-sequence -title)) (setq key-sequence (pop more) name (pop more))) (if (assq mode which-key-prefix-name-alist) From e0c80e3ab5367aabeeaf6e815609be6f393bf329 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Sep 2015 15:22:16 -0400 Subject: [PATCH 295/816] Better warning for add-key-val-to-alist --- which-key.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index d9e7b3a2ffe..506a95c9a2c 100644 --- a/which-key.el +++ b/which-key.el @@ -464,9 +464,8 @@ bottom." (let ((key-lst (listify-key-sequence (kbd key)))) (cond ((null alist) (list (cons key-lst value))) ((assoc key-lst alist) - (message "which-key: the key %s already exists in %s. This addition \ -will override that value." - key alist) + (message "which-key: changing %s name from %s to %s" + key (cdr (assoc key-lst alist)) value) (setcdr (assoc key-lst alist) value) alist) (t (cons (cons key-lst value) alist))))) From 358ebaca5dc16917ff827f5b42b9cf07775580e4 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 8 Sep 2015 06:31:52 -0400 Subject: [PATCH 296/816] Mute echo-keystrokes message It seems to be too much information to display on *every* startup --- which-key.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 506a95c9a2c..581c4a73186 100644 --- a/which-key.el +++ b/which-key.el @@ -407,15 +407,17 @@ set too high) and setup which-key buffer." (defun which-key--setup-echo-keystrokes () "Reduce `echo-keystrokes' if necessary (it will interfer if it's set too high)." - (let ((previous echo-keystrokes)) + (let (;(previous echo-keystrokes) + ) (when (and echo-keystrokes (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001)) (if (> which-key-idle-delay which-key-echo-keystrokes) (setq echo-keystrokes which-key-echo-keystrokes) (setq which-key-echo-keystrokes (/ (float which-key-idle-delay) 4) echo-keystrokes which-key-echo-keystrokes)) - (message "which-key: echo-keystrokes changed from %s to %s" - previous echo-keystrokes)))) + ;; (message "which-key: echo-keystrokes changed from %s to %s" + ;; previous echo-keystrokes) + ))) ;; Default configuration functions for use by users. Should be the "best" ;; configurations From 5761b07b57715046da026406510c983e7493c9fb Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 9 Sep 2015 11:21:50 -0400 Subject: [PATCH 297/816] typo in readme --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index d8eb11c459a..ffc899f90b8 100644 --- a/README.org +++ b/README.org @@ -338,7 +338,7 @@ keystroke can complete the command. As a bonus you can type =C-x C-h= and the which-key buffer will pop up immediately (i.e., before =which-key-idle-delay= kicks in). -The option =which-key-prevent-C-h-from-cycling=, which is =nil= by default +The option =which-key-prevent-C-h-from-cycling=, which is =t= by default allows one to take advantage of using =C-h= for paging as well as the default Emacs behavior of using =C-h= to describe the bindings for the current key sequence prefix. From 4d7363df197894ca5fcdc0c1f9e509d8f16aaedf Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 16 Sep 2015 12:16:34 -0400 Subject: [PATCH 298/816] Add ability to highlight certain commands Adds `which-key-highlighted-command-list` and `which-key-highlighted-command-face` as user-customizable means of highlighting arbitrary commands (selected through regexp) with arbitrary faces. --- which-key.el | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 581c4a73186..95bdca90666 100644 --- a/which-key.el +++ b/which-key.el @@ -117,7 +117,16 @@ 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." -:group 'which-key) + :group 'which-key) + +(defcustom which-key-highlighted-command-list '() + "A list of strings and/or cons cells used to highlight certain +commands. If the element is a string, assume it is a regexp +pattern for matching command names and use +`which-key-highlighted-command-face' for any matching names. If +the element is a cons cell, it should take the form (regexp . +face to apply)." + :group 'which-key-key-based-description-replacement-alist) (defcustom which-key-prefix-name-alist '() "An alist with elements of the form (key-sequence . prefix-name). @@ -278,6 +287,12 @@ prefixes in `which-key-paging-prefixes'" "Face for the key description when it is found in `current-local-map'" :group 'which-key) +(defface which-key-highlighted-command-face + '((t . (:inherit which-key-command-description-face :underline t))) + "Default face for the command description when it is a command +and it matches a string in `which-key-highlighted-command-face'." + :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" @@ -938,7 +953,24 @@ If KEY contains any \"special keys\" defined in (or (string-match-p "^\\(group:\\|Prefix\\)" description) (keymapp (intern description)))) -(defun which-key--propertize-description (description group local) +(defun which-key--highlight-face (description) + "Return the highlight face for DESCRIPTION if it has one." + (let (face) + (dolist (el which-key-highlighted-command-list) + (unless face + (cond ((consp el) + (when (string-match-p (car el) description) + (setq face (cdr el)))) + ((stringp el) + (when (string-match-p el description) + (setq face 'which-key-highlighted-command-face))) + (t + (message "which-key: warning: element %s of \ +which-key-highlighted-command-list is not a string or a cons +cell" el))))) + face)) + +(defun which-key--propertize-description (description group local hl-face) "Add face to DESCRIPTION where the face chosen depends on whether the description represents a group or a command. Also make some minor adjustments to the description string, like @@ -949,7 +981,8 @@ removing a \"group:\" prefix." (desc (if group (concat "+" desc) desc)) (desc (which-key--truncate-description desc))) (propertize desc 'face - (cond (group 'which-key-group-description-face) + (cond (hl-face hl-face) + (group 'which-key-group-description-face) (local 'which-key-local-map-description-face) (t 'which-key-command-description-face))))) @@ -969,6 +1002,7 @@ alists. Returns a list (key separator description)." (key-lst (which-key--current-key-list key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern desc))) + (hl-face (which-key--highlight-face desc)) (key (which-key--maybe-replace key which-key-key-replacement-alist)) (desc (which-key--maybe-replace @@ -978,7 +1012,7 @@ alists. Returns a list (key separator description)." (which-key--maybe-replace-prefix-name key-lst desc) desc)) (key-w-face (which-key--propertize-key key)) - (desc-w-face (which-key--propertize-description desc group local))) + (desc-w-face (which-key--propertize-description desc group local hl-face))) (list key-w-face sep-w-face desc-w-face))) unformatted))) From f865977df3e7dd2898e7fdc19a3968133f3b449f Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 18 Sep 2015 11:20:00 -0400 Subject: [PATCH 299/816] Update README for key-based replacements --- README.org | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/README.org b/README.org index ffc899f90b8..ed9c48457fb 100644 --- a/README.org +++ b/README.org @@ -245,30 +245,40 @@ cons cell and the replacement string in the =cdr=. **** "Key-Based" replacement The relevant variable is the awkwardly named -=which-key-key-based-description-replacement-alist=. In this alist you can have -cons cells of two types. An example of the first type is +=which-key-key-based-description-replacement-alist= (Note on 3/9/2015 the +internal format of this list changed). In this alist you can have cons cells of +two types. An example of the first type is #+BEGIN_SRC Emacs-lisp -("C-x C-f" . "find files") +((listify-key-sequence (kbd "C-x C-f")) . "find files") #+END_SRC where the string on the left is the key combination whose description you want -to replace. For that key combination, which-key overwrites the description with -the second string, "find files". In the second type of entry you can restrict -the replacements to a major-mode. For example, +to replace, stored in a canonical form. For that key combination, which-key +overwrites the description with the second string, "find files". In the second +type of entry you can restrict the replacements to a major-mode. For example, #+BEGIN_SRC Emacs-lisp -(org-mode . (("C-c C-c" . "Org C-c C-c") ("C-c C-a" . "Org Attach")) +(org-mode . (((listify-key-sequence (kbd "C-c C-c")) . "Org C-c C-c") + ((listify-key-sequence (kbd "C-c C-a")) . "Org Attach")) #+END_SRC Here the first entry is the major-mode and the second is a list of the first type of entries. In case the same key combination is listed under a major-mode and by itself, the major-mode version will take precedence. -There are two helper functions to add entries to this list, -=which-key-add-key-based-replacements= and -=which-key-add-major-mode-key-based-replacements=. You can modify the alist -directly or use these. +To simplify adding these entries, there are two helper functions to add entries +to this list, =which-key-add-key-based-replacements= and +=which-key-add-major-mode-key-based-replacements=. With these functions the +above examples become + +#+BEGIN_SRC Emacs-lisp +(which-key-add-key-based-replacements + "C-x C-f" "find files") +(which-key-add-major-mode-key-based-replacements 'org-mode + "C-c C-c" "Org C-c C-c" + "C-c C-a" "Org Attach") +#+END_SRC **** Key and Description replacement From acf30ee10a84c8069fec2f37c97e1a84e62a38a5 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 18 Sep 2015 13:19:48 -0400 Subject: [PATCH 300/816] Remove some alists from customize and update docs The helper functions should be used now due to the nature of the lists. Removing the variables from customize should encourage this. Also add automatic conversion of old format of `which-key-key-based-description-replacement-alist`. --- README.org | 44 +++++++++++--------------- which-key.el | 88 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 72 insertions(+), 60 deletions(-) diff --git a/README.org b/README.org index ed9c48457fb..e8329347164 100644 --- a/README.org +++ b/README.org @@ -244,42 +244,34 @@ of behind each alist is that you specify a selection string in the =car= of each cons cell and the replacement string in the =cdr=. **** "Key-Based" replacement -The relevant variable is the awkwardly named -=which-key-key-based-description-replacement-alist= (Note on 3/9/2015 the -internal format of this list changed). In this alist you can have cons cells of -two types. An example of the first type is +[Note on 2015-9-3 the format of +=which-key-key-based-description-replacement-alist= changed. It will be easier +to use the functions below in your configuration, instead of modifying this +variable directly.] -#+BEGIN_SRC Emacs-lisp -((listify-key-sequence (kbd "C-x C-f")) . "find files") -#+END_SRC - -where the string on the left is the key combination whose description you want -to replace, stored in a canonical form. For that key combination, which-key -overwrites the description with the second string, "find files". In the second -type of entry you can restrict the replacements to a major-mode. For example, - -#+BEGIN_SRC Emacs-lisp -(org-mode . (((listify-key-sequence (kbd "C-c C-c")) . "Org C-c C-c") - ((listify-key-sequence (kbd "C-c C-a")) . "Org Attach")) -#+END_SRC - -Here the first entry is the major-mode and the second is a list of the first -type of entries. In case the same key combination is listed under a major-mode -and by itself, the major-mode version will take precedence. - -To simplify adding these entries, there are two helper functions to add entries -to this list, =which-key-add-key-based-replacements= and -=which-key-add-major-mode-key-based-replacements=. With these functions the -above examples become +Using this method, the description of a key is replaced using a string that you +provide. Here's an example #+BEGIN_SRC Emacs-lisp (which-key-add-key-based-replacements "C-x C-f" "find files") +#+END_SRC + +where the first string is the key combination whose description you want to +replace, in a form suitable for =kbd=. For that key combination, which-key +overwrites the description with the second string, "find files". In the second +type of entry you can restrict the replacements to a major-mode. For example, + +#+BEGIN_SRC Emacs-lisp (which-key-add-major-mode-key-based-replacements 'org-mode "C-c C-c" "Org C-c C-c" "C-c C-a" "Org Attach") #+END_SRC +Here the first entry is the major-mode followed by a list of the first type of +entries. In case the same key combination is listed under a major-mode and by +itself, the major-mode version takes precedence. + **** Key and Description replacement The second and third methods target the text used for the keys and the diff --git a/which-key.el b/which-key.el index 95bdca90666..028a99629aa 100644 --- a/which-key.el +++ b/which-key.el @@ -104,21 +104,6 @@ This is a list of lists for replacing descriptions." :group 'which-key :type '(alist :key-type regexp :value-type string)) -(defcustom 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." - :group 'which-key) - (defcustom which-key-highlighted-command-list '() "A list of strings and/or cons cells used to highlight certain commands. If the element is a string, assume it is a regexp @@ -126,25 +111,7 @@ pattern for matching command names and use `which-key-highlighted-command-face' for any matching names. If the element is a cons cell, it should take the form (regexp . face to apply)." - :group 'which-key-key-based-description-replacement-alist) - -(defcustom which-key-prefix-name-alist '() - "An alist with elements of the form (key-sequence . prefix-name). -key-sequence is a sequence of the sort produced by applying `kbd' -then `listify-key-sequence' to create a canonical version of the -key sequence. prefix-name is a string." - :group 'which-key - :type '(alist :key-type string :value-type string)) - -(defcustom which-key-prefix-title-alist '() - "An alist with elements of the form (key-sequence . prefix-title). -key-sequence is a sequence of the sort produced by applying `kbd' -then `listify-key-sequence' to create a canonical version of the -key sequence. prefix-title is a string. The title is displayed -alongside the actual current key sequence when -`which-key-show-prefix' is set to either top or echo." - :group 'which-key - :type '(alist :key-type string :value-type string)) + :group 'which-key) (defcustom which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL") "These keys will automatically be truncated to one character @@ -366,6 +333,28 @@ showing.") "Internal: Last location of side-window when two locations used.") +(defvar which-key-key-based-description-replacement-alist '() + "New version of +`which-key-key-based-description-replacement-alist'. Use +`which-key-add-key-based-replacements' or +`which-key-add-major-mode-key-based-replacements' to set this +variable.") + +(defvar which-key-prefix-name-alist '() + "An alist with elements of the form (key-sequence . prefix-name). +key-sequence is a sequence of the sort produced by applying `kbd' +then `listify-key-sequence' to create a canonical version of the +key sequence. prefix-name is a string.") + +(defvar which-key-prefix-title-alist '() + "An alist with elements of the form (key-sequence . prefix-title). +key-sequence is a sequence of the sort produced by applying `kbd' +then `listify-key-sequence' to create a canonical version of the +key sequence. prefix-title is a string. The title is displayed +alongside the actual current key sequence when +`which-key-show-prefix' is set to either top or echo.") + + ;;;###autoload (define-minor-mode which-key-mode "Toggle which-key-mode." @@ -408,6 +397,7 @@ set too high) and setup which-key buffer." (when (or (eq which-key-show-prefix 'echo) (eq which-key-popup-type 'minibuffer)) (which-key--setup-echo-keystrokes)) + (which-key--check-key-based-alist) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer ;; suppress confusing minibuffer message @@ -434,6 +424,36 @@ it's set too high)." ;; previous echo-keystrokes) ))) +(defun which-key--check-key-based-alist () + "Check (and fix if necessary) `which-key-key-based-description-replacement-alist'" + (let ((alist which-key-key-based-description-replacement-alist) + old-style res) + (dolist (cns alist) + (cond ((listp (car cns)) + (push cns res)) + ((stringp (car cns)) + (setq old-style t) + (push (cons (listify-key-sequence (kbd (car cns))) (cdr cns)) res)) + ((symbolp (car cns)) + (let (new-mode-alist) + (dolist (cns2 (cdr cns)) + (cond ((listp (car cns2)) + (push cns2 new-mode-alist)) + ((stringp (car cns2)) + (setq old-style t) + (push (cons (listify-key-sequence (kbd (car cns2))) (cdr cns2)) + new-mode-alist)))) + (push (cons (car cns) new-mode-alist) res))) + (t (message "which-key: there's a problem with the \ +entry %s in which-key-key-based-replacement-alist" cns)))) + (setq which-key-key-based-description-replacement-alist res) + (when old-style + (message "which-key: \ + `which-key-key-based-description-replacement-alist' has changed format and you\ + seem to be using the old format. Please use the functions \ +`which-key-add-key-based-replacements' and \ +`which-key-add-major-mode-key-based-replacements' instead.")))) + ;; Default configuration functions for use by users. Should be the "best" ;; configurations From db263bc2d6ef1d0490f859d70cf03887fed7d639 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 19 Sep 2015 11:10:58 -0400 Subject: [PATCH 301/816] Better messages for add-key-val-to-alist --- which-key.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 028a99629aa..4bd59f572e6 100644 --- a/which-key.el +++ b/which-key.el @@ -497,12 +497,13 @@ bottom." (defun which-key--add-key-val-to-alist (alist key value) "Internal function to add (KEY . VALUE) to ALIST." (when (or (not (stringp key)) (not (stringp value))) - (error "KEY and VALUE should be strings")) + (error "which-key: Error %s (key) and %s (value) should be strings" + key value)) (let ((key-lst (listify-key-sequence (kbd key)))) (cond ((null alist) (list (cons key-lst value))) ((assoc key-lst alist) - (message "which-key: changing %s name from %s to %s" - key (cdr (assoc key-lst alist)) value) + (message "which-key: changing %s name from %s to %s in %s" + key (cdr (assoc key-lst alist)) value alist) (setcdr (assoc key-lst alist) value) alist) (t (cons (cons key-lst value) alist))))) From 6a5c2410dd01a811226480c93cfde3263d7ee43c Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 20 Sep 2015 20:59:01 -0400 Subject: [PATCH 302/816] Add faces group --- which-key.el | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 4bd59f572e6..960077f3c04 100644 --- a/which-key.el +++ b/which-key.el @@ -229,46 +229,51 @@ prefixes in `which-key-paging-prefixes'" :type 'boolean) ;; Faces +(defgroup which-key-faces nil + "Faces for which-key-mode" + :group 'which-key + :prefix "which-key-") + (defface which-key-key-face '((t . (:inherit font-lock-constant-face))) "Face for which-key keys" - :group 'which-key) + :group 'which-key-faces) (defface which-key-separator-face '((t . (:inherit font-lock-comment-face))) "Face for the separator (default separator is an arrow)" - :group 'which-key) + :group 'which-key-faces) (defface which-key-note-face '((t . (:inherit which-key-separator-face))) "Face for notes or hints occasionally provided" - :group 'which-key) + :group 'which-key-faces) (defface which-key-command-description-face '((t . (:inherit font-lock-function-name-face))) "Face for the key description when it is a command" - :group 'which-key) + :group 'which-key-faces) (defface which-key-local-map-description-face '((t . (:inherit which-key-command-description-face))) "Face for the key description when it is found in `current-local-map'" - :group 'which-key) + :group 'which-key-faces) (defface which-key-highlighted-command-face '((t . (:inherit which-key-command-description-face :underline t))) "Default face for the command description when it is a command and it matches a string in `which-key-highlighted-command-face'." - :group 'which-key) + :group 'which-key-faces) (defface which-key-group-description-face '((t . (:inherit font-lock-keyword-face))) "Face for the key description when it is a group or prefix" - :group 'which-key) + :group 'which-key-faces) (defface which-key-special-key-face '((t . (:inherit which-key-key-face :inverse-video t :weight bold))) "Face for special keys (SPC, TAB, RET)" - :group 'which-key) + :group 'which-key-faces) ;; Custom popup (defcustom which-key-custom-popup-max-dimensions-function nil From 74a372468ea13f5331752a8661cdcd90fd7a4500 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 20 Sep 2015 21:26:11 -0400 Subject: [PATCH 303/816] Add alist-name arg to add-key-val-to-alist Otherwise the name of the alist is not available to this function --- which-key.el | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 960077f3c04..91200c75083 100644 --- a/which-key.el +++ b/which-key.el @@ -499,7 +499,7 @@ bottom." ;; Helper functions to modify replacement lists. -(defun which-key--add-key-val-to-alist (alist key value) +(defun which-key--add-key-val-to-alist (alist key value &optional alist-name) "Internal function to add (KEY . VALUE) to ALIST." (when (or (not (stringp key)) (not (stringp value))) (error "which-key: Error %s (key) and %s (value) should be strings" @@ -507,8 +507,8 @@ bottom." (let ((key-lst (listify-key-sequence (kbd key)))) (cond ((null alist) (list (cons key-lst value))) ((assoc key-lst alist) - (message "which-key: changing %s name from %s to %s in %s" - key (cdr (assoc key-lst alist)) value alist) + (message "which-key: changing %s name from %s to %s in the %s alist" + key (cdr (assoc key-lst alist)) value alist-name) (setcdr (assoc key-lst alist) value) alist) (t (cons (cons key-lst value) alist))))) @@ -528,7 +528,7 @@ replacements are added to (setq which-key-key-based-description-replacement-alist (which-key--add-key-val-to-alist which-key-key-based-description-replacement-alist - key-sequence replacement)) + key-sequence replacement "key-based")) (setq key-sequence (pop more) replacement (pop more)))) (put 'which-key-add-key-based-replacements 'lisp-indent-function 'defun) @@ -543,7 +543,9 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (error "MODE should be a symbol corresponding to a value of major-mode")) (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) (while key-sequence - (setq mode-alist (which-key--add-key-val-to-alist mode-alist key-sequence replacement)) + (setq mode-alist (which-key--add-key-val-to-alist + mode-alist key-sequence replacement + (format "key-based-%s" mode))) (setq key-sequence (pop more) replacement (pop more))) (if (assq mode which-key-key-based-description-replacement-alist) (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) @@ -585,11 +587,11 @@ to `which-key-prefix-title-alist'." (let ((-name (if (consp name) (car name) name)) (-title (if (consp name) (cdr name) name))) (setq which-key-prefix-name-alist - (which-key--add-key-val-to-alist which-key-prefix-name-alist - key-sequence -name) + (which-key--add-key-val-to-alist + which-key-prefix-name-alist key-sequence -name "prefix-name") which-key-prefix-title-alist - (which-key--add-key-val-to-alist which-key-prefix-title-alist - key-sequence -title))) + (which-key--add-key-val-to-alist + which-key-prefix-title-alist key-sequence -title "prefix-title"))) (setq key-sequence (pop more) name (pop more)))) (put 'which-key-declare-prefixes 'lisp-indent-function 'defun) @@ -607,9 +609,11 @@ addition KEY-SEQUENCE NAME pairs) to apply." (-title (if (consp name) (cdr name) name))) (while key-sequence (setq mode-name-alist (which-key--add-key-val-to-alist - mode-name-alist key-sequence -name) + mode-name-alist key-sequence -name + (format "prefix-name-%s" mode)) mode-title-alist (which-key--add-key-val-to-alist - mode-title-alist key-sequence -title)) + mode-title-alist key-sequence -title + (format "prefix-name-%s" mode))) (setq key-sequence (pop more) name (pop more))) (if (assq mode which-key-prefix-name-alist) (setcdr (assq mode which-key-prefix-name-alist) mode-name-alist) From df53b5d11cf507b68c2b8ec9d566981d241667f4 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 22 Sep 2015 09:07:11 -0400 Subject: [PATCH 304/816] Fix docstring typo Thanks @hmelman --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 91200c75083..e4d809815d4 100644 --- a/which-key.el +++ b/which-key.el @@ -262,7 +262,7 @@ prefixes in `which-key-paging-prefixes'" (defface which-key-highlighted-command-face '((t . (:inherit which-key-command-description-face :underline t))) "Default face for the command description when it is a command -and it matches a string in `which-key-highlighted-command-face'." +and it matches a string in `which-key-highlighted-command-list'." :group 'which-key-faces) (defface which-key-group-description-face From c1873df76dc8d1907405ccb8af8ef7a0da1c63e9 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 23 Sep 2015 14:00:46 -0400 Subject: [PATCH 305/816] Fix #65 Don't try to backup the value of `prefix-help-command` because it was getting set to `which-key-show-next-page` somehow creating an infinite recursion error. Just call `describe-prefix-bindings` directly, which should cover almost all cases. --- which-key.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index e4d809815d4..53a2574251f 100644 --- a/which-key.el +++ b/which-key.el @@ -321,8 +321,8 @@ to a non-nil value for the execution of a command. Like this Used when `which-key-popup-type' is frame.") (defvar which-key--echo-keystrokes-backup nil "Internal: Backup the initial value of `echo-keystrokes'.") -(defvar which-key--prefix-help-cmd-backup nil - "Internal: Backup the value of `prefix-help-command'.") +;; (defvar which-key--prefix-help-cmd-backup nil +;; "Internal: Backup the value of `prefix-help-command'.") (defvar which-key--pages-plist nil "Internal: Holds page objects") (defvar which-key--lighter-backup nil @@ -377,7 +377,6 @@ alongside the actual current key sequence when (progn (setq which-key--echo-keystrokes-backup echo-keystrokes) (unless which-key--is-setup (which-key--setup)) - (setq which-key--prefix-help-cmd-backup prefix-help-command) (when which-key-use-C-h-for-paging (setq prefix-help-command #'which-key-show-next-page)) (when which-key-show-remaining-keys @@ -387,7 +386,6 @@ alongside the actual current key sequence when (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) - (setq prefix-help-command which-key--prefix-help-cmd-backup) (when which-key-show-remaining-keys (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) @@ -1317,7 +1315,7 @@ Will force an update if called before `which-key--update'." (progn (which-key--hide-popup-ignore-command) (which-key--stop-timer) - (funcall which-key--prefix-help-cmd-backup) + (describe-prefix-bindings) (which-key--start-timer)) (let* ((next-event-if-showing ;; forces event into current key sequence From e5e5f7c978b024badbf17704f19e6d5b0dbb000f Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 24 Sep 2015 10:22:29 -0400 Subject: [PATCH 306/816] Revert "Fix #65" This reverts commit c1873df76dc8d1907405ccb8af8ef7a0da1c63e9. --- which-key.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 53a2574251f..e4d809815d4 100644 --- a/which-key.el +++ b/which-key.el @@ -321,8 +321,8 @@ to a non-nil value for the execution of a command. Like this Used when `which-key-popup-type' is frame.") (defvar which-key--echo-keystrokes-backup nil "Internal: Backup the initial value of `echo-keystrokes'.") -;; (defvar which-key--prefix-help-cmd-backup nil -;; "Internal: Backup the value of `prefix-help-command'.") +(defvar which-key--prefix-help-cmd-backup nil + "Internal: Backup the value of `prefix-help-command'.") (defvar which-key--pages-plist nil "Internal: Holds page objects") (defvar which-key--lighter-backup nil @@ -377,6 +377,7 @@ alongside the actual current key sequence when (progn (setq which-key--echo-keystrokes-backup echo-keystrokes) (unless which-key--is-setup (which-key--setup)) + (setq which-key--prefix-help-cmd-backup prefix-help-command) (when which-key-use-C-h-for-paging (setq prefix-help-command #'which-key-show-next-page)) (when which-key-show-remaining-keys @@ -386,6 +387,7 @@ alongside the actual current key sequence when (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) + (setq prefix-help-command which-key--prefix-help-cmd-backup) (when which-key-show-remaining-keys (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) @@ -1315,7 +1317,7 @@ Will force an update if called before `which-key--update'." (progn (which-key--hide-popup-ignore-command) (which-key--stop-timer) - (describe-prefix-bindings) + (funcall which-key--prefix-help-cmd-backup) (which-key--start-timer)) (let* ((next-event-if-showing ;; forces event into current key sequence From 4ddf2777da0d9325a922cbc5671f7f60775e11af Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 24 Sep 2015 10:27:33 -0400 Subject: [PATCH 307/816] Better fix for #65 Go back to using the original strategy of backing up `prefix-help-command` but make sure it never gets set to `which-key-show-next-page`. --- which-key.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 53a2574251f..ddc1dc90bbd 100644 --- a/which-key.el +++ b/which-key.el @@ -321,8 +321,8 @@ to a non-nil value for the execution of a command. Like this Used when `which-key-popup-type' is frame.") (defvar which-key--echo-keystrokes-backup nil "Internal: Backup the initial value of `echo-keystrokes'.") -;; (defvar which-key--prefix-help-cmd-backup nil -;; "Internal: Backup the value of `prefix-help-command'.") +(defvar which-key--prefix-help-cmd-backup nil + "Internal: Backup the value of `prefix-help-command'.") (defvar which-key--pages-plist nil "Internal: Holds page objects") (defvar which-key--lighter-backup nil @@ -377,6 +377,8 @@ alongside the actual current key sequence when (progn (setq which-key--echo-keystrokes-backup echo-keystrokes) (unless which-key--is-setup (which-key--setup)) + (unless (eq prefix-help-command 'which-key-show-next-page) + (setq which-key--prefix-help-cmd-backup prefix-help-command)) (when which-key-use-C-h-for-paging (setq prefix-help-command #'which-key-show-next-page)) (when which-key-show-remaining-keys @@ -386,6 +388,8 @@ alongside the actual current key sequence when (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) + (when which-key--prefix-help-cmd-backup + (setq prefix-help-command which-key--prefix-help-cmd-backup)) (when which-key-show-remaining-keys (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) @@ -1315,7 +1319,7 @@ Will force an update if called before `which-key--update'." (progn (which-key--hide-popup-ignore-command) (which-key--stop-timer) - (describe-prefix-bindings) + (funcall which-key--prefix-help-cmd-backup) (which-key--start-timer)) (let* ((next-event-if-showing ;; forces event into current key sequence From 86d0613c7fcd0cc18a2e15940fcf1eca43a129cd Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 24 Sep 2015 10:33:52 -0400 Subject: [PATCH 308/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ddc1dc90bbd..6c7bb050c5a 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.5.1 +;; Version: 0.6.1 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) From 4b54f3e045eccfd40cf0817e54069d3f0a93e4b8 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 27 Sep 2015 12:52:02 -0400 Subject: [PATCH 309/816] Don't fail if buffer was killed somehow --- which-key.el | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index 6c7bb050c5a..be2db0c06c1 100644 --- a/which-key.el +++ b/which-key.el @@ -397,6 +397,19 @@ alongside the actual current key sequence when (remove-hook 'focus-in-hook #'which-key--start-timer) (which-key--stop-timer))) +(defun which-key--init-buffer () + "Initialize which-key buffer" + (unless (buffer-live-p which-key--buffer) + (setq which-key--buffer (get-buffer-create which-key-buffer-name)) + (with-current-buffer which-key--buffer + ;; suppress confusing minibuffer message + (let (message-log-max) + (toggle-truncate-lines 1) + (message "")) + (setq-local cursor-type nil) + (setq-local cursor-in-non-selected-windows nil) + (setq-local mode-line-format nil)))) + (defun which-key--setup () "Initial setup for which-key. Reduce `echo-keystrokes' if necessary (it will interfer if it's @@ -405,15 +418,7 @@ set too high) and setup which-key buffer." (eq which-key-popup-type 'minibuffer)) (which-key--setup-echo-keystrokes)) (which-key--check-key-based-alist) - (setq which-key--buffer (get-buffer-create which-key-buffer-name)) - (with-current-buffer which-key--buffer - ;; suppress confusing minibuffer message - (let (message-log-max) - (toggle-truncate-lines 1) - (message "")) - (setq-local cursor-type nil) - (setq-local cursor-in-non-selected-windows nil) - (setq-local mode-line-format nil)) + (which-key--init-buffer) (setq which-key--is-setup t)) (defun which-key--setup-echo-keystrokes () @@ -1248,6 +1253,7 @@ area." (defun which-key--show-page (n) "Show page N, starting from 0." + (which-key--init-buffer) ;; in case it was killed (let ((n-pages (plist-get which-key--pages-plist :n-pages)) (prefix-keys (key-description which-key--current-prefix)) page-n) From 26ec90203ab954a15a36e6fcf4ca0ee496adeb14 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 29 Sep 2015 10:54:29 -0400 Subject: [PATCH 310/816] Add preserve-size option to side-window display Beginning of fix for #67 --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index be2db0c06c1..fa827f5b49b 100644 --- a/which-key.el +++ b/which-key.el @@ -751,7 +751,8 @@ call signature in different emacs versions" "Show which-key buffer when popup type is side-window." (let* ((side which-key-side-window-location) (alist '((window-width . which-key--fit-buffer-to-window-horizontally) - (window-height . (lambda (w) (fit-window-to-buffer w nil 1)))))) + (window-height . (lambda (w) (fit-window-to-buffer w nil 1))) + (preserve-size . (t . t))))) ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' ;; were added in Emacs 24.3 From 48fd060b7675aee8c4a6cd31cc6a69f8fcf577ac Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 29 Sep 2015 11:36:48 -0400 Subject: [PATCH 311/816] Let bind golden-ratio-mode when showing window Prevents golden-ratio from changing size of which-key buffer Fix #67 --- which-key.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index fa827f5b49b..b7d8bb04f9f 100644 --- a/which-key.el +++ b/which-key.el @@ -732,13 +732,14 @@ total height." 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." - (when (and (> (car act-popup-dim) 0) (> (cdr act-popup-dim) 0)) - (cl-case which-key-popup-type - ;; Not called for minibuffer - ;; (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)) - (custom (funcall which-key-custom-show-popup-function act-popup-dim))))) + (let (golden-ratio-mode) + (when (and (> (car act-popup-dim) 0) (> (cdr act-popup-dim) 0)) + (cl-case which-key-popup-type + ;; Not called for minibuffer + ;; (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)) + (custom (funcall which-key-custom-show-popup-function act-popup-dim)))))) (defun which-key--fit-buffer-to-window-horizontally (&optional window &rest params) "Slightly modified version of `fit-buffer-to-window'. From 9493f2c425977f6c1b1ce4408e8d26e24beaacb6 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 1 Oct 2015 20:22:37 -0400 Subject: [PATCH 312/816] Revert preserve-size setting on buffer It's preventing the buffer from automatically shrinking --- which-key.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index b7d8bb04f9f..524517cae28 100644 --- a/which-key.el +++ b/which-key.el @@ -752,8 +752,7 @@ call signature in different emacs versions" "Show which-key buffer when popup type is side-window." (let* ((side which-key-side-window-location) (alist '((window-width . which-key--fit-buffer-to-window-horizontally) - (window-height . (lambda (w) (fit-window-to-buffer w nil 1))) - (preserve-size . (t . t))))) + (window-height . (lambda (w) (fit-window-to-buffer w nil 1)))))) ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' ;; were added in Emacs 24.3 From b96481da28df1e9c54ed5075fcdec56fc2be1144 Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Fri, 2 Oct 2015 17:02:25 +0530 Subject: [PATCH 313/816] Run `which-key--hide-popup` in post-command-hook also --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index 524517cae28..b0d50991ecf 100644 --- a/which-key.el +++ b/which-key.el @@ -384,6 +384,7 @@ alongside the actual current key sequence when (when which-key-show-remaining-keys (add-hook 'pre-command-hook #'which-key--lighter-restore)) (add-hook 'pre-command-hook #'which-key--hide-popup) + (add-hook 'post-command-hook #'which-key--hide-popup) (add-hook 'focus-out-hook #'which-key--stop-timer) (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) From 6d20c00c0a1a977b70912db536c104babef9f628 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 2 Oct 2015 09:04:51 -0400 Subject: [PATCH 314/816] Add remove-hook to previous commit --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index b0d50991ecf..3412a50a648 100644 --- a/which-key.el +++ b/which-key.el @@ -394,6 +394,7 @@ alongside the actual current key sequence when (when which-key-show-remaining-keys (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) + (remove-hook 'post-command-hook #'which-key--hide-popup) (remove-hook 'focus-out-hook #'which-key--stop-timer) (remove-hook 'focus-in-hook #'which-key--start-timer) (which-key--stop-timer))) From b07a24311082c810c953f67d77d5d121f2b06346 Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Fri, 2 Oct 2015 19:31:15 +0530 Subject: [PATCH 315/816] Do not display which-key popup if an interactive command is in progress This prevents the which-key popup from being displayed if `read-key-sequence` is invoked from a command as opposed to the editor's main loop. The changes introduced in #b96481 and #6d20c0 have been removed since they are not needed now --- which-key.el | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index 3412a50a648..b5ac9be3d6c 100644 --- a/which-key.el +++ b/which-key.el @@ -384,7 +384,6 @@ alongside the actual current key sequence when (when which-key-show-remaining-keys (add-hook 'pre-command-hook #'which-key--lighter-restore)) (add-hook 'pre-command-hook #'which-key--hide-popup) - (add-hook 'post-command-hook #'which-key--hide-popup) (add-hook 'focus-out-hook #'which-key--stop-timer) (add-hook 'focus-in-hook #'which-key--start-timer) (which-key--start-timer)) @@ -394,7 +393,6 @@ alongside the actual current key sequence when (when which-key-show-remaining-keys (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) - (remove-hook 'post-command-hook #'which-key--hide-popup) (remove-hook 'focus-out-hook #'which-key--stop-timer) (remove-hook 'focus-in-hook #'which-key--start-timer) (which-key--stop-timer))) @@ -1404,20 +1402,22 @@ Finally, show the buffer." (defun which-key--update () "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." - (let ((prefix-keys (this-single-command-keys))) - ;; (when (> (length prefix-keys) 0) - ;; (message "key: %s" (key-description prefix-keys))) - ;; (when (> (length prefix-keys) 0) - ;; (message "key binding: %s" (key-binding prefix-keys))) - (when (and (> (length prefix-keys) 0) - (or - (keymapp (key-binding prefix-keys)) - ;; Some keymaps are stored here like iso-transl-ctl-x-8-map - (keymapp (which-key--safe-lookup-key key-translation-map prefix-keys)) - ;; just in case someone uses one of these - (keymapp (which-key--safe-lookup-key function-key-map prefix-keys))) - (not which-key-inhibit)) - (which-key--create-buffer-and-show prefix-keys)))) + ;; Do not display the popup if a command is currently being executed + (unless this-command + (let ((prefix-keys (this-single-command-keys))) + ;; (when (> (length prefix-keys) 0) + ;; (message "key: %s" (key-description prefix-keys))) + ;; (when (> (length prefix-keys) 0) + ;; (message "key binding: %s" (key-binding prefix-keys))) + (when (and (> (length prefix-keys) 0) + (or + (keymapp (key-binding prefix-keys)) + ;; Some keymaps are stored here like iso-transl-ctl-x-8-map + (keymapp (which-key--safe-lookup-key key-translation-map prefix-keys)) + ;; just in case someone uses one of these + (keymapp (which-key--safe-lookup-key function-key-map prefix-keys))) + (not which-key-inhibit)) + (which-key--create-buffer-and-show prefix-keys))))) ;; Timers From 0533cdc2bb46f186a137df730eb43b4c868513b3 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 3 Oct 2015 13:20:35 -0400 Subject: [PATCH 316/816] Move golden-ratio-mode let binding Let bind golden-ratio-mode earlier in show-page function which may help prevent golden-ratio from moving the whihc-key buffer --- which-key.el | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index b5ac9be3d6c..f2fe6c51918 100644 --- a/which-key.el +++ b/which-key.el @@ -732,14 +732,13 @@ total height." 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." - (let (golden-ratio-mode) - (when (and (> (car act-popup-dim) 0) (> (cdr act-popup-dim) 0)) - (cl-case which-key-popup-type - ;; Not called for minibuffer - ;; (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)) - (custom (funcall which-key-custom-show-popup-function act-popup-dim)))))) + (when (and (> (car act-popup-dim) 0) (> (cdr act-popup-dim) 0)) + (cl-case which-key-popup-type + ;; Not called for minibuffer + ;; (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)) + (custom (funcall which-key-custom-show-popup-function act-popup-dim))))) (defun which-key--fit-buffer-to-window-horizontally (&optional window &rest params) "Slightly modified version of `fit-buffer-to-window'. @@ -1257,7 +1256,7 @@ area." (which-key--init-buffer) ;; in case it was killed (let ((n-pages (plist-get which-key--pages-plist :n-pages)) (prefix-keys (key-description which-key--current-prefix)) - page-n) + page-n golden-ratio-mode) (if (= 0 n-pages) (message "%s- which-key can't show keys: There is not \ enough space based on your settings and frame size." prefix-keys) From a1806395820ed99154ba09160d159717abf7eb20 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 3 Oct 2015 13:41:00 -0400 Subject: [PATCH 317/816] Refactor show-next-page --- which-key.el | 108 ++++++++++++++++++++++++--------------------------- 1 file changed, 50 insertions(+), 58 deletions(-) diff --git a/which-key.el b/which-key.el index f2fe6c51918..37a1412b96d 100644 --- a/which-key.el +++ b/which-key.el @@ -1318,49 +1318,39 @@ enough space based on your settings and frame size." prefix-keys) "Show the next page of keys. Will force an update if called before `which-key--update'." (interactive) - (if (and which-key--current-page-n - which-key--on-last-page - which-key-use-C-h-for-paging - which-key-prevent-C-h-from-cycling) - (progn - (which-key--hide-popup-ignore-command) - (which-key--stop-timer) - (funcall which-key--prefix-help-cmd-backup) - (which-key--start-timer)) - (let* ((next-event-if-showing - ;; forces event into current key sequence - (mapcar (lambda (ev) (cons t ev)) - (which-key--current-key-list))) - (keysbl + (cond + ;; on last page and want default C-h behavior + ((and which-key--current-page-n + which-key--on-last-page + which-key-use-C-h-for-paging + which-key-prevent-C-h-from-cycling) + (which-key--hide-popup-ignore-command) + (which-key--stop-timer) + (funcall which-key--prefix-help-cmd-backup) + (which-key--start-timer)) + ;; No which-key buffer showing + ((null which-key--current-page-n) + (let* ((keysbl (vconcat (butlast (append (this-single-command-keys) nil)))) - (next-event-if-not-showing - (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence keysbl))) - (next-page - (if which-key--current-page-n (1+ which-key--current-page-n) 0))) - (cond - ;; buffer not showing - ((null which-key--current-page-n) - (which-key--stop-timer) - (setq unread-command-events next-event-if-not-showing) - (which-key--create-buffer-and-show keysbl) - (which-key--start-timer)) - (t - (which-key--stop-timer) - (setq unread-command-events next-event-if-showing) - (if which-key--last-try-2-loc - (let ((which-key-side-window-location which-key--last-try-2-loc)) - (which-key--show-page next-page)) - (which-key--show-page next-page)) - (which-key--start-paging-timer)))))) - -;; (defun which-key-show-first-page () -;; "Show the first page of keys." -;; ;; (which-key--stop-timer) -;; ;; (setq which-key--prefix-help-cmd-backup prefix-help-command -;; ;; prefix-help-command 'which-key-show-next-page) -;; (which-key--show-page 0) -;; ) -;; ;; (which-key--start-paging-timer)) + (next-event + (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence keysbl)))) + (which-key--stop-timer) + (setq unread-command-events next-event) + (which-key--create-buffer-and-show keysbl) + (which-key--start-timer))) + ;; which-key buffer showing. turn page + (t + (let ((next-event + (mapcar (lambda (ev) (cons t ev)) (which-key--current-key-list))) + (next-page + (if which-key--current-page-n (1+ which-key--current-page-n) 0))) + (which-key--stop-timer) + (setq unread-command-events next-event) + (if which-key--last-try-2-loc + (let ((which-key-side-window-location which-key--last-try-2-loc)) + (which-key--show-page next-page)) + (which-key--show-page next-page)) + (which-key--start-paging-timer))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update @@ -1401,22 +1391,24 @@ Finally, show the buffer." (defun which-key--update () "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." - ;; Do not display the popup if a command is currently being executed - (unless this-command - (let ((prefix-keys (this-single-command-keys))) - ;; (when (> (length prefix-keys) 0) - ;; (message "key: %s" (key-description prefix-keys))) - ;; (when (> (length prefix-keys) 0) - ;; (message "key binding: %s" (key-binding prefix-keys))) - (when (and (> (length prefix-keys) 0) - (or - (keymapp (key-binding prefix-keys)) - ;; Some keymaps are stored here like iso-transl-ctl-x-8-map - (keymapp (which-key--safe-lookup-key key-translation-map prefix-keys)) - ;; just in case someone uses one of these - (keymapp (which-key--safe-lookup-key function-key-map prefix-keys))) - (not which-key-inhibit)) - (which-key--create-buffer-and-show prefix-keys))))) + (let ((prefix-keys (this-single-command-keys))) + ;; (when (> (length prefix-keys) 0) + ;; (message "key: %s" (key-description prefix-keys))) + ;; (when (> (length prefix-keys) 0) + ;; (message "key binding: %s" (key-binding prefix-keys))) + (when (and (> (length prefix-keys) 0) + (or (keymapp (key-binding prefix-keys)) + ;; Some keymaps are stored here like iso-transl-ctl-x-8-map + (keymapp (which-key--safe-lookup-key + key-translation-map prefix-keys)) + ;; just in case someone uses one of these + (keymapp (which-key--safe-lookup-key + function-key-map prefix-keys))) + (not which-key-inhibit) + ;; Do not display the popup if a command is currently being + ;; executed + (null this-command)) + (which-key--create-buffer-and-show prefix-keys)))) ;; Timers From 1ef76a93417367eda500c32693e35d58e62c35a6 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 3 Oct 2015 14:22:29 -0400 Subject: [PATCH 318/816] Remove comment --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 37a1412b96d..f16ee70ccc2 100644 --- a/which-key.el +++ b/which-key.el @@ -1414,7 +1414,7 @@ Finally, show the buffer." (defun which-key--start-timer () "Activate idle timer to trigger `which-key--update'." - (which-key--stop-timer) ; start over + (which-key--stop-timer) (setq which-key--timer (run-with-idle-timer which-key-idle-delay t #'which-key--update))) From caa70fe652e01d931208c428b350710f8456ef6a Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 5 Oct 2015 07:29:56 -0400 Subject: [PATCH 319/816] readme: Remove what's new and add dependency note --- README.org | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/README.org b/README.org index e8329347164..2e3231f1cff 100644 --- a/README.org +++ b/README.org @@ -1,22 +1,5 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] -** What's new -*** Paging -- The new option =which-key-prevent-C-h-from-cycling=, which is =t= by default - allows one to take advantage of using =C-h= for paging as well as the default - Emacs behavior of using =C-h= to describe the bindings for the current key - sequence prefix. -- The (default) configuration below will allow you to switch paging using =C-h= - until you reach the last page of keys in the which-key buffer. The next press - of =C-h= will close the which-key buffer and trigger the default Emacs - behavior on =C-h=. - #+BEGIN_SRC Emacs-lisp - (setq which-key-use-C-h-for-paging t - which-key-prevent-C-h-from-cycling t) - #+END_SRC -- This is especially useful for those who like =helm-descbinds= but also want to - use =C-h= as their which-key paging key. -- Note =C-h= is by default equivalent to =?= in this context. ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following your currently @@ -43,12 +26,11 @@ Many of these have been implemented and are described below. ** Table of Contents :TOC@4: - [[#which-key-][which-key ]] - - [[#whats-new][What's new]] - - [[#paging][Paging]] - [[#introduction][Introduction]] - [[#install][Install]] - [[#melpa][MELPA]] - [[#manually][Manually]] + - [[#dependencies][Dependencies]] - [[#initial-setup][Initial Setup]] - [[#side-window-bottom-option][Side Window Bottom Option]] - [[#side-window-right-option][Side Window Right Option]] @@ -89,6 +71,11 @@ Add which-key.el to your =load-path= and require. Something like (which-key-mode) #+END_SRC +**** Dependencies + +Which-key requires recent versions of the packages [[https://github.com/magnars/dash.el][dash]] and [[https://github.com/magnars/s.el][s]]. These are +installed automatically if installed via MELPA. + ** Initial Setup No further setup is required if you are happy with the default setup. To try other options, there are 3 choices of default configs that are preconfigured @@ -345,9 +332,10 @@ allows one to take advantage of using =C-h= for paging as well as the default Emacs behavior of using =C-h= to describe the bindings for the current key sequence prefix. -The configuration below will allow you to switch paging using =C-h= until you -reach the last page of keys in the which-key buffer. The next press of =C-h= -will close the which-key buffer and trigger the default Emacs behavior on =C-h=. +The default configuration below will allow you to switch paging using =C-h= +until you reach the last page of keys in the which-key buffer. The next press of +=C-h= will close the which-key buffer and trigger the default Emacs behavior on +=C-h=. #+BEGIN_SRC Emacs-lisp (setq which-key-use-C-h-for-paging t which-key-prevent-C-h-from-cycling t) From 0982ad358c12e602205cfdd98515b1c21b64bf77 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 6 Oct 2015 10:25:32 -0400 Subject: [PATCH 320/816] Bump version to 0.6.2 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f16ee70ccc2..9672d3c8ecf 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.6.1 +;; Version: 0.6.2 ;; Keywords: ;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) From e9aa7c37b8e48c4f187d5584cd04b26616fa2c23 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 6 Oct 2015 21:55:48 -0400 Subject: [PATCH 321/816] Add new sort function As suggested by @hmelman, sort by whether a key is a prefix or not (no prefix takes priority) then by key. --- which-key.el | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 9672d3c8ecf..862a2bf61eb 100644 --- a/which-key.el +++ b/which-key.el @@ -195,9 +195,16 @@ a percentage out of the frame's height." (const :tag "No" nil))) (defcustom which-key-sort-order 'which-key-key-order - "If nil, leave output unsorted. Set to `which-key-key-order' to -order by key or `which-key-description-order' to order by -description." + "If nil, do not resort the output from +`describe-buffer-bindings' which groups by mode. Ordering options +are + +1. `which-key-key-order': by key (default) +2. `which-key-description-order': by description +3. `which-key-prefix-then-key-order': prefix (no prefix first) then key + +See the README and the docstrings for those functions for more +information." :group 'which-key :type 'function) @@ -1080,18 +1087,28 @@ alists. Returns a list (key separator description)." ((or apr? bpr?) apr?) (t (string-lessp a b))))) -(defsubst which-key-key-order (alst blst) +(defsubst which-key-key-order (acons bcons) "Order key descriptions A and B. Order is lexicographic within a \"class\", where the classes and the ordering of classes are listed below. special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." - (which-key--key-description< (car alst) (car blst))) + (which-key--key-description< (car acons) (car bcons))) -(defsubst which-key-description-order (alst blst) +(defsubst which-key-description-order (acons bcons) "Order descriptions of A and B. Uses `string-lessp' after applying lowercase." - (string-lessp (downcase (cdr alst)) (downcase (cdr blst)))) + (string-lessp (downcase (cdr acons)) (downcase (cdr bcons)))) + +(defsubst which-key-prefix-then-key-order (acons bcons) + "Order first by whether A and/or B is a prefix with no prefix +coming before a prefix. Within these categories order using +`which-key-key-order'." + (let ((apref? (which-key--group-p (cdr acons))) + (bpref? (which-key--group-p (cdr bcons)))) + (if (not (eq apref? bpref?)) + (and (not apref?) bpref?) + (which-key-key-order acons bcons)))) (defun which-key--get-formatted-key-bindings () "Uses `describe-buffer-bindings' to collect the key bindings in From 3a71cc13037b79cac802d4dc56db1f70bd957460 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 6 Oct 2015 22:05:23 -0400 Subject: [PATCH 322/816] Switch to defun in last commit --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 862a2bf61eb..76c14442879 100644 --- a/which-key.el +++ b/which-key.el @@ -1100,7 +1100,7 @@ special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." Uses `string-lessp' after applying lowercase." (string-lessp (downcase (cdr acons)) (downcase (cdr bcons)))) -(defsubst which-key-prefix-then-key-order (acons bcons) +(defun which-key-prefix-then-key-order (acons bcons) "Order first by whether A and/or B is a prefix with no prefix coming before a prefix. Within these categories order using `which-key-key-order'." From ac33130bc8dac37bacec2a5a6e8f47256b780240 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 7 Oct 2015 09:01:28 -0400 Subject: [PATCH 323/816] Fix problem with two locations for side-window Can't always reuse the same window in this case when we go to a deeper set of keybindings, because we may need to switch sides. --- which-key.el | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 76c14442879..274bea5f562 100644 --- a/which-key.el +++ b/which-key.el @@ -344,6 +344,7 @@ showing.") (defvar which-key--last-try-2-loc nil "Internal: Last location of side-window when two locations used.") +(defvar which-key--multiple-locations nil) (defvar which-key-key-based-description-replacement-alist '() "New version of @@ -774,9 +775,15 @@ call signature in different emacs versions" ;; +------------+------------+ +------------+------------+ ;; (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)))) + (cond + ((eq which-key--multiple-locations t) + ;; possibly want to switch sides in this case so we can't reuse the window + (delete-windows-on which-key--buffer) + (display-buffer-in-major-side-window which-key--buffer side 0 alist)) + ((get-buffer-window which-key--buffer) + (display-buffer-reuse-window which-key--buffer alist)) + (t + (display-buffer-in-major-side-window which-key--buffer side 0 alist))))) (defun which-key--show-buffer-frame (act-popup-dim) "Show which-key buffer when popup type is frame." @@ -1364,7 +1371,8 @@ Will force an update if called before `which-key--update'." (which-key--stop-timer) (setq unread-command-events next-event) (if which-key--last-try-2-loc - (let ((which-key-side-window-location which-key--last-try-2-loc)) + (let ((which-key-side-window-location which-key--last-try-2-loc) + (which-key--multiple-locations t)) (which-key--show-page next-page)) (which-key--show-page next-page)) (which-key--start-paging-timer))))) @@ -1375,15 +1383,18 @@ Will force an update if called before `which-key--update'." (defun which-key--try-2-side-windows (keys page-n loc1 loc2 &rest _ignore) "Try to show KEYS (PAGE-N) in LOC1 first. Only if no keys fit fallback to LOC2." (let (pages1) - (let ((which-key-side-window-location loc1)) + (let ((which-key-side-window-location loc1) + (which-key--multiple-locations t)) (setq pages1 (which-key--create-pages keys (window-width)))) (if (< 0 (plist-get pages1 :n-pages)) (progn (setq which-key--pages-plist pages1) - (let ((which-key-side-window-location loc1)) + (let ((which-key-side-window-location loc1) + (which-key--multiple-locations t)) (which-key--show-page page-n)) loc1) - (let ((which-key-side-window-location loc2)) + (let ((which-key-side-window-location loc2) + (which-key--multiple-locations t)) (setq which-key--pages-plist (which-key--create-pages keys (window-width))) (which-key--show-page page-n) From f91ebdad78d91b04318ce4a8f6661a8f118c1ff0 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 8 Oct 2015 08:16:26 -0400 Subject: [PATCH 324/816] Add new sort function for testing This is a variation on key order, which uses alphabetical sorting for characters, putting lowercase before uppercase. @syl20bnr --- which-key.el | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/which-key.el b/which-key.el index 274bea5f562..621586ae867 100644 --- a/which-key.el +++ b/which-key.el @@ -1067,6 +1067,50 @@ alists. Returns a list (key separator description)." (list key-w-face sep-w-face desc-w-face))) unformatted))) +(defun which-key--alpha< (a b) + (let ((da (downcase a)) + (db (downcase b))) + (if (string-equal da db) + (not (string-lessp a b)) + (string-lessp da db)))) + +(defun which-key--key-description-alpha< (a b) + "Sorting function used for `which-key-key-order-alpha'." + (let* ((aem? (string-equal a "")) + (bem? (string-equal b "")) + (a1? (= 1 (length a))) + (b1? (= 1 (length b))) + (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") + (asp? (string-match-p srgxp a)) + (bsp? (string-match-p srgxp b)) + (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") + (apr? (string-match-p prrgxp a)) + (bpr? (string-match-p prrgxp b))) + (cond ((or aem? bem?) (and aem? (not bem?))) + ((and asp? bsp?) + (if (string-equal (substring a 0 3) (substring b 0 3)) + (which-key--key-description< (substring a 3) (substring b 3)) + (string-lessp a b))) + ((or asp? bsp?) asp?) + ((and a1? b1?) (which-key--alpha< a b)) + ((or a1? b1?) a1?) + ((and apr? bpr?) + (if (string-equal (substring a 0 2) (substring b 0 2)) + (which-key--key-description< (substring a 2) (substring b 2)) + (string-lessp a b))) + ((or apr? bpr?) apr?) + (t (string-lessp a b))))) + +(defsubst which-key-key-order-alpha (acons bcons) + "Order key descriptions A and B. +Order is lexicographic within a \"class\", where the classes and +the ordering of classes are listed below. + +special (SPC,TAB,...) < single char < mod (C-,M-,...) < other. +Sorts single characters alphabetically with lowercase coming +before upper." + (which-key--key-description-alpha< (car acons) (car bcons))) + (defun which-key--key-description< (a b) "Sorting function used for `which-key-key-order'." (let* ((aem? (string-equal a "")) From 8f23bd79c6bf44245925dddacb56a4f485117928 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 8 Oct 2015 21:59:40 -0400 Subject: [PATCH 325/816] Preliminary support for undo --- which-key.el | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/which-key.el b/which-key.el index 621586ae867..49731d71d0f 100644 --- a/which-key.el +++ b/which-key.el @@ -219,6 +219,17 @@ prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'string) +;; (defcustom which-key-undo-key nil +;; "Key (string) to use for undoing keypresses. Bound recursively +;; in each of the maps in `which-key-undo-keymaps'." +;; :group 'which-key +;; :type 'string) + +;; (defcustom which-key-undo-keymaps '() +;; "Keymaps in which to bind `which-key-undo-key'" +;; :group 'which-key +;; :type '(repeat symbol)) + (defcustom which-key-use-C-h-for-paging t "Use C-h for paging if non-nil. Normally C-h after a prefix calls `describe-prefix-bindings'. This changes that command to @@ -426,6 +437,7 @@ set too high) and setup which-key buffer." (eq which-key-popup-type 'minibuffer)) (which-key--setup-echo-keystrokes)) (which-key--check-key-based-alist) + ;; (which-key--setup-undo-key) (which-key--init-buffer) (setq which-key--is-setup t)) @@ -444,6 +456,13 @@ it's set too high)." ;; previous echo-keystrokes) ))) +;; (defun which-key--setup-undo-key () +;; "Bind `which-key-undo-key' in `which-key-undo-keymaps'." +;; (when (and which-key-undo-key which-key-undo-keymaps) +;; (dolist (map which-key-undo-keymaps) +;; (which-key-define-key-recursively +;; map (kbd which-key-undo-key) 'which-key-undo)))) + (defun which-key--check-key-based-alist () "Check (and fix if necessary) `which-key-key-based-description-replacement-alist'" (let ((alist which-key-key-based-description-replacement-alist) @@ -635,6 +654,16 @@ addition KEY-SEQUENCE NAME pairs) to apply." (push (cons mode mode-name-alist) which-key-prefix-name-alist)))) (put 'which-key-declare-prefixes-for-mode 'lisp-indent-function 'defun) +(defun which-key-define-key-recursively (map key def &optional recursing) + "Recursively bind KEY in MAP to DEF on every level of MAP except the first. +RECURSING is for internal use." + (when recursing (define-key map key def)) + (map-keymap + (lambda (ev df) + (when (keymapp df) + (which-key-define-key-recursively df key def t))) + map)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for computing window sizes @@ -1421,6 +1450,17 @@ Will force an update if called before `which-key--update'." (which-key--show-page next-page)) (which-key--start-paging-timer))))) +(defun which-key-undo () + "Undo last keypress and force which-key update." + (interactive) + (let* ((key-str (this-command-keys)) + (key-str (substring key-str 0 (- (length key-str) 2))) + (ev (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence key-str)))) + (which-key--stop-timer) + (setq unread-command-events ev) + (which-key--create-buffer-and-show key-str) + (which-key--start-timer))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update From 2ea4c91d97d90dbc918e9a123b80e7a4376ee0b7 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 15 Oct 2015 10:52:48 -0400 Subject: [PATCH 326/816] Satisfy compiler for golden-ratio-mode --- which-key.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 49731d71d0f..7008f1bb64b 100644 --- a/which-key.el +++ b/which-key.el @@ -42,6 +42,9 @@ (require 's) (require 'dash) +(eval-when-compile + (defvar golden-ratio-mode)) + (defgroup which-key nil "Customization options for which-key-mode" :group 'help @@ -659,7 +662,7 @@ addition KEY-SEQUENCE NAME pairs) to apply." RECURSING is for internal use." (when recursing (define-key map key def)) (map-keymap - (lambda (ev df) + (lambda (_ev df) (when (keymapp df) (which-key-define-key-recursively df key def t))) map)) @@ -1484,6 +1487,7 @@ Will force an update if called before `which-key--update'." (which-key--show-page page-n) loc2)))) + (defun which-key--create-buffer-and-show (prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." From d63ce4f19698b57191a220b09672cc2a81ec640b Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 18 Oct 2015 12:31:40 -0400 Subject: [PATCH 327/816] Remove s.el dependency --- which-key.el | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 7008f1bb64b..58caeb64c7a 100644 --- a/which-key.el +++ b/which-key.el @@ -6,7 +6,7 @@ ;; URL: https://github.com/justbur/emacs-which-key ;; Version: 0.6.2 ;; Keywords: -;; Package-Requires: ((emacs "24.3") (s "1.9.0") (dash "2.11.0")) +;; Package-Requires: ((emacs "24.3") (dash "2.11.0")) ;; 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 @@ -39,7 +39,6 @@ ;;; Code: (require 'cl-lib) -(require 's) (require 'dash) (eval-when-compile @@ -1241,10 +1240,9 @@ that width." (col-width (+ 1 col-key-width col-sep-width col-desc-width))) (cons col-width (mapcar (lambda (k) - (concat - (s-repeat (- col-key-width (string-width (nth 0 k))) " ") - (nth 0 k) (nth 1 k) (nth 2 k) - (s-repeat (- col-desc-width (string-width (nth 2 k))) " "))) + (format (concat "%" (int-to-string col-key-width) + "s%s%-" (int-to-string col-desc-width) "s") + (nth 0 k) (nth 1 k) (nth 2 k))) col-keys)))) (defun which-key--partition-columns (keys avl-lines avl-width) @@ -1382,22 +1380,25 @@ enough space based on your settings and frame size." prefix-keys) 'face 'which-key-note-face)))) (first-col-width (+ 2 (max (string-width prefix-w-face) (string-width status-left)))) - (prefix-left (s-pad-right first-col-width " " prefix-w-face)) - (status-left (s-pad-right first-col-width " " status-left)) + (prefix-left (format (concat "%-" (int-to-string first-col-width) "s") + prefix-w-face)) + (status-left (format (concat "%-" (int-to-string first-col-width) "s") + status-left)) (nxt-pg-hint (which-key--next-page-hint prefix-keys page-n n-pages)) new-end lines first) (cond ((and (< 1 n-pages) (eq which-key-show-prefix 'left)) (setq lines (split-string page "\n") first (concat prefix-left (car lines) "\n" status-left) - new-end (concat "\n" (s-repeat first-col-width " ")) + new-end (concat "\n" (make-string first-col-width 32)) page (concat first (mapconcat #'identity (cdr lines) new-end)))) ((eq which-key-show-prefix 'left) (if (= 1 height) (setq page (concat prefix-left page)) (setq lines (split-string page "\n") - first (concat prefix-left (car lines) "\n" (s-repeat first-col-width " ")) - new-end (concat "\n" (s-repeat first-col-width " ")) + first (concat prefix-left (car lines) + "\n" (make-string first-col-width 32)) + new-end (concat "\n" (make-string first-col-width 32)) page (concat first (mapconcat #'identity (cdr lines) new-end))))) ((eq which-key-show-prefix 'top) (setq page (concat prefix-w-face dash-w-face " " From 61be00149a25d6ef5f81ea5724426ac50b5f0e6e Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 18 Oct 2015 13:31:11 -0400 Subject: [PATCH 328/816] Remove dash.el dependency --- which-key.el | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 58caeb64c7a..0397722bc45 100644 --- a/which-key.el +++ b/which-key.el @@ -6,7 +6,7 @@ ;; URL: https://github.com/justbur/emacs-which-key ;; Version: 0.6.2 ;; Keywords: -;; Package-Requires: ((emacs "24.3") (dash "2.11.0")) +;; Package-Requires: ((emacs "24.3")) ;; 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 @@ -39,7 +39,6 @@ ;;; Code: (require 'cl-lib) -(require 'dash) (eval-when-compile (defvar golden-ratio-mode)) @@ -1218,9 +1217,27 @@ BUFFER that follow the key sequence KEY-SEQ." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for laying out which-key buffer pages +(defun which-key--n-empty-strings (n) + "Produce a list of N empty strings." + (let (res) + (dotimes (_i n) + (setq res (cons "" res))) + res)) + +(defun which-key--pad (columns) + "Pad COLUMNS to the same length using empty strings." + (let ((max-len (cl-reduce (lambda (a x) (max a (length x))) columns + :initial-value 0))) + (mapcar + (lambda (c) + (if (< (length c) max-len) + (append c (which-key--n-empty-strings (- max-len (length c)))) + c)) + columns))) + (defsubst which-key--join-columns (columns) "Transpose columns into rows, concat rows into lines and rows into page." - (let* ((padded (apply (apply-partially #'-pad "") (reverse columns))) + (let* ((padded (which-key--pad (reverse columns))) (rows (apply #'cl-mapcar #'list padded))) (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n"))) @@ -1245,11 +1262,19 @@ that width." (nth 0 k) (nth 1 k) (nth 2 k))) col-keys)))) +(defun which-key--partition-list (n list) + "Partition LIST into N-sized sublists" + (let (res) + (while list + (setq res (cons (cl-subseq list 0 (min n (length list))) res) + list (nthcdr n list))) + (reverse res))) + (defun which-key--partition-columns (keys avl-lines avl-width) "Convert list of KEYS to columns based on dimensions AVL-LINES and AVL-WIDTH. Returns a plist that holds the page strings, as well as metadata." (let ((cols-w-widths (mapcar #'which-key--pad-column - (-partition-all avl-lines keys))) + (which-key--partition-list avl-lines keys))) (page-width 0) (n-pages 0) (n-keys 0) page-cols pages page-widths keys/page col) (if (> (apply #'max (mapcar #'car cols-w-widths)) avl-width) From 8e0e11347914ade692516ef9bc3d9b9de6ceb99e Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 18 Oct 2015 14:15:48 -0400 Subject: [PATCH 329/816] Cleanup previous commit --- which-key.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 0397722bc45..d6c198b2947 100644 --- a/which-key.el +++ b/which-key.el @@ -1220,9 +1220,8 @@ BUFFER that follow the key sequence KEY-SEQ." (defun which-key--n-empty-strings (n) "Produce a list of N empty strings." (let (res) - (dotimes (_i n) - (setq res (cons "" res))) - res)) + (dotimes (_i n res) + (setq res (cons "" res))))) (defun which-key--pad (columns) "Pad COLUMNS to the same length using empty strings." From 3cdf8a476c911b704d3d1724ea8dacbc1dbfc098 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 18 Oct 2015 19:48:04 -0400 Subject: [PATCH 330/816] Better choices for built-in functions Thanks @xuchunyang! --- which-key.el | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index d6c198b2947..45d509929b4 100644 --- a/which-key.el +++ b/which-key.el @@ -1217,12 +1217,6 @@ BUFFER that follow the key sequence KEY-SEQ." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for laying out which-key buffer pages -(defun which-key--n-empty-strings (n) - "Produce a list of N empty strings." - (let (res) - (dotimes (_i n res) - (setq res (cons "" res))))) - (defun which-key--pad (columns) "Pad COLUMNS to the same length using empty strings." (let ((max-len (cl-reduce (lambda (a x) (max a (length x))) columns @@ -1230,13 +1224,13 @@ BUFFER that follow the key sequence KEY-SEQ." (mapcar (lambda (c) (if (< (length c) max-len) - (append c (which-key--n-empty-strings (- max-len (length c)))) + (append c (make-list (- max-len (length c)) "")) c)) columns))) (defsubst which-key--join-columns (columns) "Transpose columns into rows, concat rows into lines and rows into page." - (let* ((padded (which-key--pad (reverse columns))) + (let* ((padded (which-key--pad (nreverse columns))) (rows (apply #'cl-mapcar #'list padded))) (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n"))) @@ -1262,12 +1256,12 @@ that width." col-keys)))) (defun which-key--partition-list (n list) - "Partition LIST into N-sized sublists" + "Partition LIST into N-sized sublists." (let (res) (while list (setq res (cons (cl-subseq list 0 (min n (length list))) res) list (nthcdr n list))) - (reverse res))) + (nreverse res))) (defun which-key--partition-columns (keys avl-lines avl-width) "Convert list of KEYS to columns based on dimensions AVL-LINES and AVL-WIDTH. @@ -1297,9 +1291,9 @@ Returns a plist that holds the page strings, as well as metadata." (push (which-key--join-columns page-cols) pages) (push n-keys keys/page) (push page-width page-widths)) - (list :pages (reverse pages) :page-height avl-lines - :page-widths (reverse page-widths) - :keys/page (reverse keys/page) :n-pages n-pages + (list :pages (nreverse pages) :page-height avl-lines + :page-widths (nreverse page-widths) + :keys/page (nreverse keys/page) :n-pages n-pages :tot-keys (apply #'+ keys/page))))) (defun which-key--create-pages (keys sel-win-width) From 7226967e4ffbc0c9ed185ce922c0de86de9c5ab5 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 20 Oct 2015 09:26:07 -0400 Subject: [PATCH 331/816] Move sorting functions and add to readme --- README.org | 17 +++-- which-key.el | 191 ++++++++++++++++++++++++++------------------------- 2 files changed, 107 insertions(+), 101 deletions(-) diff --git a/README.org b/README.org index 2e3231f1cff..10df9b07c75 100644 --- a/README.org +++ b/README.org @@ -290,19 +290,22 @@ By default the output is sorted by the key in a custom order. The default order is to sort lexicographically within each "class" of key, where the classes and their order are -=Special (SPC, TAB, ...) < Single Character (a, ...) < Modifier (C-, M-, ...) < Other= +=Special (SPC, TAB, ...) < Single Character (ASCII) (a, ...) < Modifier (C-, M-, ...) < Other= -You can control the order by setting this variable. +You can control the order by setting this variable. This also shows the other +available options. #+BEGIN_SRC Emacs-lisp +;; default (setq which-key-sort-order 'which-key-key-order) -;; or (setq which-key-sort-order 'which-key-description-order) +;; same as default, except single characters are sorted alphabetically +;; (setq which-key-sort-order 'which-key-key-order-alpha) +;; same as default, except all prefix keys are grouped together at the end +;; (setq which-key-sort-order 'which-key-prefix-then-key-order) +;; sort based on the key description ignoring case +;; (setq which-key-sort-order 'which-key-description-order) #+END_SRC -The only other built-in option at the moment (besides using nil to turn off -sorting completely) is =which-key-description-order=, which orders by the key's -description based on the usual ordering of strings after applying =downcase=. - *** Paging Options There are at least several prefixes that have many keys bound to them, like =C-x=. which-key displays as many keys as it can given your settings, but for diff --git a/which-key.el b/which-key.el index 45d509929b4..81f6b272f7a 100644 --- a/which-key.el +++ b/which-key.el @@ -934,6 +934,103 @@ width) in lines and characters respectively." width) in lines and characters respectively." (cons which-key-frame-max-height which-key-frame-max-width)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Sorting functions + +(defun which-key--alpha< (a b) + (let ((da (downcase a)) + (db (downcase b))) + (if (string-equal da db) + (not (string-lessp a b)) + (string-lessp da db)))) + +(defun which-key--key-description-alpha< (a b) + "Sorting function used for `which-key-key-order-alpha'." + (let* ((aem? (string-equal a "")) + (bem? (string-equal b "")) + (a1? (= 1 (length a))) + (b1? (= 1 (length b))) + (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") + (asp? (string-match-p srgxp a)) + (bsp? (string-match-p srgxp b)) + (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") + (apr? (string-match-p prrgxp a)) + (bpr? (string-match-p prrgxp b))) + (cond ((or aem? bem?) (and aem? (not bem?))) + ((and asp? bsp?) + (if (string-equal (substring a 0 3) (substring b 0 3)) + (which-key--key-description< (substring a 3) (substring b 3)) + (string-lessp a b))) + ((or asp? bsp?) asp?) + ((and a1? b1?) (which-key--alpha< a b)) + ((or a1? b1?) a1?) + ((and apr? bpr?) + (if (string-equal (substring a 0 2) (substring b 0 2)) + (which-key--key-description< (substring a 2) (substring b 2)) + (string-lessp a b))) + ((or apr? bpr?) apr?) + (t (string-lessp a b))))) + +(defsubst which-key-key-order-alpha (acons bcons) + "Order key descriptions A and B. +Order is lexicographic within a \"class\", where the classes and +the ordering of classes are listed below. + +special (SPC,TAB,...) < single char < mod (C-,M-,...) < other. +Sorts single characters alphabetically with lowercase coming +before upper." + (which-key--key-description-alpha< (car acons) (car bcons))) + +(defun which-key--key-description< (a b) + "Sorting function used for `which-key-key-order'." + (let* ((aem? (string-equal a "")) + (bem? (string-equal b "")) + (a1? (= 1 (length a))) + (b1? (= 1 (length b))) + (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") + (asp? (string-match-p srgxp a)) + (bsp? (string-match-p srgxp b)) + (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") + (apr? (string-match-p prrgxp a)) + (bpr? (string-match-p prrgxp b))) + (cond ((or aem? bem?) (and aem? (not bem?))) + ((and asp? bsp?) + (if (string-equal (substring a 0 3) (substring b 0 3)) + (which-key--key-description< (substring a 3) (substring b 3)) + (string-lessp a b))) + ((or asp? bsp?) asp?) + ((and a1? b1?) (string-lessp a b)) + ((or a1? b1?) a1?) + ((and apr? bpr?) + (if (string-equal (substring a 0 2) (substring b 0 2)) + (which-key--key-description< (substring a 2) (substring b 2)) + (string-lessp a b))) + ((or apr? bpr?) apr?) + (t (string-lessp a b))))) + +(defsubst which-key-key-order (acons bcons) + "Order key descriptions A and B. +Order is lexicographic within a \"class\", where the classes and +the ordering of classes are listed below. + +special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." + (which-key--key-description< (car acons) (car bcons))) + +(defsubst which-key-description-order (acons bcons) + "Order descriptions of A and B. +Uses `string-lessp' after applying lowercase." + (string-lessp (downcase (cdr acons)) (downcase (cdr bcons)))) + +(defun which-key-prefix-then-key-order (acons bcons) + "Order first by whether A and/or B is a prefix with no prefix +coming before a prefix. Within these categories order using +`which-key-key-order'." + (let ((apref? (which-key--group-p (cdr acons))) + (bpref? (which-key--group-p (cdr bcons)))) + (if (not (eq apref? bpref?)) + (and (not apref?) bpref?) + (which-key-key-order acons bcons)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for retrieving and formatting keys @@ -1097,100 +1194,6 @@ alists. Returns a list (key separator description)." (list key-w-face sep-w-face desc-w-face))) unformatted))) -(defun which-key--alpha< (a b) - (let ((da (downcase a)) - (db (downcase b))) - (if (string-equal da db) - (not (string-lessp a b)) - (string-lessp da db)))) - -(defun which-key--key-description-alpha< (a b) - "Sorting function used for `which-key-key-order-alpha'." - (let* ((aem? (string-equal a "")) - (bem? (string-equal b "")) - (a1? (= 1 (length a))) - (b1? (= 1 (length b))) - (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") - (asp? (string-match-p srgxp a)) - (bsp? (string-match-p srgxp b)) - (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") - (apr? (string-match-p prrgxp a)) - (bpr? (string-match-p prrgxp b))) - (cond ((or aem? bem?) (and aem? (not bem?))) - ((and asp? bsp?) - (if (string-equal (substring a 0 3) (substring b 0 3)) - (which-key--key-description< (substring a 3) (substring b 3)) - (string-lessp a b))) - ((or asp? bsp?) asp?) - ((and a1? b1?) (which-key--alpha< a b)) - ((or a1? b1?) a1?) - ((and apr? bpr?) - (if (string-equal (substring a 0 2) (substring b 0 2)) - (which-key--key-description< (substring a 2) (substring b 2)) - (string-lessp a b))) - ((or apr? bpr?) apr?) - (t (string-lessp a b))))) - -(defsubst which-key-key-order-alpha (acons bcons) - "Order key descriptions A and B. -Order is lexicographic within a \"class\", where the classes and -the ordering of classes are listed below. - -special (SPC,TAB,...) < single char < mod (C-,M-,...) < other. -Sorts single characters alphabetically with lowercase coming -before upper." - (which-key--key-description-alpha< (car acons) (car bcons))) - -(defun which-key--key-description< (a b) - "Sorting function used for `which-key-key-order'." - (let* ((aem? (string-equal a "")) - (bem? (string-equal b "")) - (a1? (= 1 (length a))) - (b1? (= 1 (length b))) - (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") - (asp? (string-match-p srgxp a)) - (bsp? (string-match-p srgxp b)) - (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") - (apr? (string-match-p prrgxp a)) - (bpr? (string-match-p prrgxp b))) - (cond ((or aem? bem?) (and aem? (not bem?))) - ((and asp? bsp?) - (if (string-equal (substring a 0 3) (substring b 0 3)) - (which-key--key-description< (substring a 3) (substring b 3)) - (string-lessp a b))) - ((or asp? bsp?) asp?) - ((and a1? b1?) (string-lessp a b)) - ((or a1? b1?) a1?) - ((and apr? bpr?) - (if (string-equal (substring a 0 2) (substring b 0 2)) - (which-key--key-description< (substring a 2) (substring b 2)) - (string-lessp a b))) - ((or apr? bpr?) apr?) - (t (string-lessp a b))))) - -(defsubst which-key-key-order (acons bcons) - "Order key descriptions A and B. -Order is lexicographic within a \"class\", where the classes and -the ordering of classes are listed below. - -special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." - (which-key--key-description< (car acons) (car bcons))) - -(defsubst which-key-description-order (acons bcons) - "Order descriptions of A and B. -Uses `string-lessp' after applying lowercase." - (string-lessp (downcase (cdr acons)) (downcase (cdr bcons)))) - -(defun which-key-prefix-then-key-order (acons bcons) - "Order first by whether A and/or B is a prefix with no prefix -coming before a prefix. Within these categories order using -`which-key-key-order'." - (let ((apref? (which-key--group-p (cdr acons))) - (bpref? (which-key--group-p (cdr bcons)))) - (if (not (eq apref? bpref?)) - (and (not apref?) bpref?) - (which-key-key-order acons bcons)))) - (defun which-key--get-formatted-key-bindings () "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." From 777c28444a2497733a2fb62308fa5e2ef434f427 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 22 Oct 2015 09:59:36 -0400 Subject: [PATCH 332/816] Don't warn when same cons is added to alist twice --- which-key.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 81f6b272f7a..2e2c03b010c 100644 --- a/which-key.el +++ b/which-key.el @@ -542,9 +542,10 @@ bottom." (let ((key-lst (listify-key-sequence (kbd key)))) (cond ((null alist) (list (cons key-lst value))) ((assoc key-lst alist) - (message "which-key: changing %s name from %s to %s in the %s alist" - key (cdr (assoc key-lst alist)) value alist-name) - (setcdr (assoc key-lst alist) value) + (when (not (string-equal (cdr (assoc key-lst alist)) value)) + (message "which-key: changing %s name from %s to %s in the %s alist" + key (cdr (assoc key-lst alist)) value alist-name) + (setcdr (assoc key-lst alist) value)) alist) (t (cons (cons key-lst value) alist))))) From 8b4b1ee05685a58fb8edad76517937ada0864594 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 28 Oct 2015 22:52:28 -0400 Subject: [PATCH 333/816] Add melpa stable banner --- README.org | 3 +-- which-key.el | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/README.org b/README.org index 10df9b07c75..a9a70d8c3f2 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,5 @@ * which-key -[[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] - +[[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode diff --git a/which-key.el b/which-key.el index 2e2c03b010c..74cd627f4a1 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.6.2 +;; Version: 0.7 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 8740f0f4e6651eebb06c56a37c90e0fbc087070c Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 29 Oct 2015 20:51:09 -0400 Subject: [PATCH 334/816] Add option to show popup for evil operators Default is to enable if evil is loaded before which-key. Otherwise, it is disabled. --- which-key.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 74cd627f4a1..ddced1974f8 100644 --- a/which-key.el +++ b/which-key.el @@ -247,6 +247,13 @@ prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'boolean) +(defcustom which-key-allow-evil-operators (boundp 'evil-this-operator) + "Allow popup to show for evil operators. The popup is normally + inhibited in the middle of commands, but setting this to + non-nil will override this behavior for evil operators." + :group 'which-key + :type 'boolean) + ;; Faces (defgroup which-key-faces nil "Faces for which-key-mode" @@ -1546,7 +1553,8 @@ Finally, show the buffer." (not which-key-inhibit) ;; Do not display the popup if a command is currently being ;; executed - (null this-command)) + (or (and which-key-allow-evil-operators evil-this-operator) + (null this-command))) (which-key--create-buffer-and-show prefix-keys)))) ;; Timers From d777bb50fdb3a80ce7c1d35d36590a75199adef8 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 29 Oct 2015 21:06:48 -0400 Subject: [PATCH 335/816] Don't show help hint for evil operators Paging and help doesn't work for these, so don't offer --- which-key.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index ddced1974f8..fa240388ef5 100644 --- a/which-key.el +++ b/which-key.el @@ -1371,9 +1371,12 @@ area." (next-page-n (format "pg %s" (1+ (mod (1+ page-n) n-pages)))) (use-descbind (and which-key--on-last-page which-key-use-C-h-for-paging which-key-prevent-C-h-from-cycling))) - (when (or (and (< 1 n-pages) which-key-use-C-h-for-paging) - (and (< 1 n-pages) paging-key-bound) - use-descbind) + (when (and (or (and (< 1 n-pages) which-key-use-C-h-for-paging) + (and (< 1 n-pages) paging-key-bound) + use-descbind) + (not (and which-key-allow-evil-operators + (boundp 'evil-this-operator) + evil-this-operator))) (propertize (format "[%s %s]" key (if use-descbind "help" next-page-n)) 'face 'which-key-note-face)))) From 864218b307e0017acebfbc71ecea7d5e2391a0c6 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 3 Nov 2015 20:03:29 -0500 Subject: [PATCH 336/816] Add example of adding Unicode replacements in README Thanks @epitzer for the suggestion. https://github.com/justbur/emacs-which-key/issues/52 --- README.org | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.org b/README.org index a9a70d8c3f2..8e56c9dbcf6 100644 --- a/README.org +++ b/README.org @@ -277,11 +277,16 @@ match. The replacements do not need to use regexp and can be as simple as ("left" . "lft") #+END_SRC -You can add this element to the key list with (there are no helper functions for -these alists) +Here is an example of using key replacement to include Unicode characters in the +results. Unfortunately, using Unicode characters may upset the alignment of the +which-key buffer, because Unicode characters can have different widths even in a +monospace font and alignment is based on character width. #+BEGIN_SRC Emacs-lisp -(add-to-list 'which-key-key-replacement-alist '("left" . "lft")) +(add-to-list 'which-key-key-replacement-alist '("TAB" . "↹")) +(add-to-list 'which-key-key-replacement-alist '("RET" . "⏎")) +(add-to-list 'which-key-key-replacement-alist '("DEL" . "⇤")) +(add-to-list 'which-key-key-replacement-alist '("SPC" . "␣")) #+END_SRC *** Sorting Options From e447eaf944f41fa00e83ce079a6793e6644116a7 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 3 Nov 2015 20:26:48 -0500 Subject: [PATCH 337/816] Fix #79 Explicitly set word-wrap in which-key buffer. Fix unicode correction --- which-key.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index fa240388ef5..f24f0d156dc 100644 --- a/which-key.el +++ b/which-key.el @@ -435,7 +435,8 @@ alongside the actual current key sequence when (message "")) (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) - (setq-local mode-line-format nil)))) + (setq-local mode-line-format nil) + (setq-local word-wrap nil)))) (defun which-key--setup () "Initial setup for which-key. @@ -918,7 +919,7 @@ Measured in lines and characters respectively." max-mini-window-height)) max-mini-window-height) ;; width - (frame-text-cols))) + (max 0 (- (frame-text-cols) which-key-unicode-correction)))) (defun which-key--side-window-max-dimensions () "Return max-dimensions of the side-window popup (height . @@ -932,10 +933,12 @@ width) in lines and characters respectively." ;; FIXME: change to something like (min which-*-height (calculate-max-height)) (which-key--height-or-percentage-to-height which-key-side-window-max-height)) ;; width - (if (member which-key-side-window-location '(left right)) - (which-key--total-width-to-text (which-key--width-or-percentage-to-width - which-key-side-window-max-width)) - (frame-width)))) + (max 0 + (- (if (member which-key-side-window-location '(left right)) + (which-key--total-width-to-text (which-key--width-or-percentage-to-width + which-key-side-window-max-width)) + (frame-width)) + which-key-unicode-correction)))) (defun which-key--frame-max-dimensions () "Return max-dimensions of the frame popup (height . From 51044ea80b6623f513fb3772ffdb4fed44f76636 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 12 Nov 2015 13:23:59 -0500 Subject: [PATCH 338/816] Add option to pad key columns on the left Allows you to make more space between the columns if you think the layout is too tight. --- README.org | 6 +++++- which-key.el | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index 8e56c9dbcf6..4a7a4e3daac 100644 --- a/README.org +++ b/README.org @@ -411,9 +411,13 @@ shown. (setq which-key-idle-delay 1.0) ;; Set the maximum length (in characters) for key descriptions (commands or - ;; prefixes). Descriptions that are longer are truncated and have ".." added + ;; prefixes). Descriptions that are longer are truncated and have ".." added. (setq which-key-max-description-length 27) + ;; Use additonal padding between columns of keys. This variable specifies the + ;; number of spaces to add to the left of each column. + (setq which-key-add-column-padding 0) + ;; Set the separator used between keys and descriptions. Change this setting to ;; an ASCII character if your font does not show the default arrow. The second ;; setting here allows for extra padding for Unicode characters. which-key uses diff --git a/which-key.el b/which-key.el index f24f0d156dc..d875ffff2ea 100644 --- a/which-key.el +++ b/which-key.el @@ -68,6 +68,12 @@ Also adds \"..\". If nil, disable any truncation." :group 'which-key :type 'integer) +(defcustom which-key-add-column-padding 0 + "Additional padding (number of spaces) to add to the left of +each key column." + :group 'which-key + :type 'integer) + (defcustom which-key-separator " → " "Separator to use between key and description." :group 'which-key @@ -1258,7 +1264,8 @@ element in each list element of KEYS." "Take a column of (key separator description) COL-KEYS, calculate the max width in the column and pad all cells out to that width." - (let* ((col-key-width (which-key--max-len col-keys 0)) + (let* ((col-key-width (+ which-key-add-column-padding + (which-key--max-len col-keys 0))) (col-sep-width (which-key--max-len col-keys 1)) (col-desc-width (which-key--max-len col-keys 2)) (col-width (+ 1 col-key-width col-sep-width col-desc-width))) From b0a13d88dffe9a729d79b7098ee670a505711d73 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 12 Nov 2015 13:29:42 -0500 Subject: [PATCH 339/816] Bump minor version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d875ffff2ea..f4786e6706e 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.7 +;; Version: 0.7.1 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From fd8681828e30f49d1f2e73ef919a7caa3be32bc8 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 13 Nov 2015 08:55:20 -0500 Subject: [PATCH 340/816] Don't use face for prefix if using echo area With some themes the switch from the text from echo-keystrokes with no face to the which-key text with a face is annoying. --- which-key.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index f4786e6706e..7025fc5dc46 100644 --- a/which-key.el +++ b/which-key.el @@ -1408,8 +1408,10 @@ enough space based on your settings and frame size." prefix-keys) (width (nth page-n (plist-get which-key--pages-plist :page-widths))) (n-shown (nth page-n (plist-get which-key--pages-plist :keys/page))) (n-tot (plist-get which-key--pages-plist :tot-keys)) - (prefix-w-face (which-key--propertize-key prefix-keys)) - (dash-w-face (propertize "-" 'face 'which-key-key-face)) + (prefix-w-face (if (eq which-key-show-prefix 'echo) prefix-keys + (which-key--propertize-key prefix-keys))) + (dash-w-face (if (eq which-key-show-prefix 'echo) "-" + (propertize "-" 'face 'which-key-key-face))) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) (status-top (propertize (which-key--maybe-get-prefix-title From 65f0755dd8a2a5bb560c86b09d1c45b3006b2fdc Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 13 Nov 2015 12:03:26 -0500 Subject: [PATCH 341/816] Fix sort order of function keys --- which-key.el | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 7025fc5dc46..caf1744c8b9 100644 --- a/which-key.el +++ b/which-key.el @@ -972,18 +972,23 @@ width) in lines and characters respectively." (bsp? (string-match-p srgxp b)) (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") (apr? (string-match-p prrgxp a)) - (bpr? (string-match-p prrgxp b))) + (bpr? (string-match-p prrgxp b)) + (afn? (string-match-p "" a)) + (bfn? (string-match-p "" b))) (cond ((or aem? bem?) (and aem? (not bem?))) ((and asp? bsp?) (if (string-equal (substring a 0 3) (substring b 0 3)) - (which-key--key-description< (substring a 3) (substring b 3)) + (which-key--key-description-alpha< (substring a 3) (substring b 3)) (string-lessp a b))) ((or asp? bsp?) asp?) ((and a1? b1?) (which-key--alpha< a b)) ((or a1? b1?) a1?) + ((and afn? bfn?) + (< (string-to-number (replace-regexp-in-string "" "\\1" a)) + (string-to-number (replace-regexp-in-string "" "\\1" b)))) ((and apr? bpr?) (if (string-equal (substring a 0 2) (substring b 0 2)) - (which-key--key-description< (substring a 2) (substring b 2)) + (which-key--key-description-alpha< (substring a 2) (substring b 2)) (string-lessp a b))) ((or apr? bpr?) apr?) (t (string-lessp a b))))) @@ -1009,7 +1014,9 @@ before upper." (bsp? (string-match-p srgxp b)) (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") (apr? (string-match-p prrgxp a)) - (bpr? (string-match-p prrgxp b))) + (bpr? (string-match-p prrgxp b)) + (afn? (string-match-p "" a)) + (bfn? (string-match-p "" b))) (cond ((or aem? bem?) (and aem? (not bem?))) ((and asp? bsp?) (if (string-equal (substring a 0 3) (substring b 0 3)) @@ -1018,6 +1025,9 @@ before upper." ((or asp? bsp?) asp?) ((and a1? b1?) (string-lessp a b)) ((or a1? b1?) a1?) + ((and afn? bfn?) + (< (string-to-number (replace-regexp-in-string "" "\\1" a)) + (string-to-number (replace-regexp-in-string "" "\\1" b)))) ((and apr? bpr?) (if (string-equal (substring a 0 2) (substring b 0 2)) (which-key--key-description< (substring a 2) (substring b 2)) From bbe4817313434e36621152c5160ce39571acf725 Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Thu, 8 Oct 2015 08:41:52 +0530 Subject: [PATCH 342/816] Change code to handle nil which-key--current-prefix This would happen when viewing toplevel bindings --- which-key.el | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index caf1744c8b9..23a51a5d94a 100644 --- a/which-key.el +++ b/which-key.el @@ -260,6 +260,15 @@ prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'boolean) +(defcustom which-key-hide-alt-key-translations t + "Should key translations using Alt key be hidden. +These translations are not relevant most of the times since a lot +of terminals issue META modifier for the Alt key. + +See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" + :group 'which-key + :type 'boolean) + ;; Faces (defgroup which-key-faces nil "Faces for which-key-mode" @@ -1224,17 +1233,22 @@ alists. Returns a list (key separator description)." (defun which-key--get-formatted-key-bindings () "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." - (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) - (buffer (current-buffer)) - key-match desc-match unformatted) + (let* ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) + (buffer (current-buffer)) + (indent-tabs-mode t) + (keybinding-regex (if which-key--current-prefix + (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" + key-str-qt) + "^\\([^ <>\t]+\\)[\t]+\\([^\n]+\\)$")) + key-match desc-match unformatted) (save-match-data (with-temp-buffer (describe-buffer-bindings buffer which-key--current-prefix) + (when which-key-hide-alt-key-translations + (goto-char (point-min)) + (flush-lines "^A-")) (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) + (while (re-search-backward keybinding-regex nil t) (setq key-match (match-string 1) desc-match (match-string 2)) (cl-pushnew (cons key-match desc-match) unformatted @@ -1382,6 +1396,11 @@ area." delay nil (lambda () (let (message-log-max) (message "%s" text)))))) +(defun which-key--prefix-keys-description (prefix-keys) + (if prefix-keys + (key-description prefix-keys) + "Toplevel ")) + (defun which-key--next-page-hint (prefix-keys page-n n-pages) "Return string for next page hint." (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) @@ -1405,7 +1424,7 @@ area." "Show page N, starting from 0." (which-key--init-buffer) ;; in case it was killed (let ((n-pages (plist-get which-key--pages-plist :n-pages)) - (prefix-keys (key-description which-key--current-prefix)) + (prefix-keys (which-key--prefix-keys-description which-key--current-prefix)) page-n golden-ratio-mode) (if (= 0 n-pages) (message "%s- which-key can't show keys: There is not \ @@ -1542,14 +1561,13 @@ Will force an update if called before `which-key--update'." (which-key--show-page page-n) loc2)))) - -(defun which-key--create-buffer-and-show (prefix-keys) +(defun which-key--create-buffer-and-show (&optional prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." (setq which-key--current-prefix prefix-keys which-key--last-try-2-loc nil) (let ((formatted-keys (which-key--get-formatted-key-bindings)) - (prefix-keys-desc (key-description prefix-keys))) + (prefix-keys (which-key--prefix-keys-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys-desc)) ((listp which-key-side-window-location) From 652af436e84c1dcb9746d574c0408570cdc64a24 Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Sat, 10 Oct 2015 18:04:02 +0530 Subject: [PATCH 343/816] Improve regexp to match toplevel bindings --- which-key.el | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 23a51a5d94a..d14e13dba04 100644 --- a/which-key.el +++ b/which-key.el @@ -1235,11 +1235,27 @@ alists. Returns a list (key separator description)." BUFFER that follow the key sequence KEY-SEQ." (let* ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) (buffer (current-buffer)) + ;; Temporarily use tabs to indent (indent-tabs-mode t) (keybinding-regex (if which-key--current-prefix (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" key-str-qt) - "^\\([^ <>\t]+\\)[\t]+\\([^\n]+\\)$")) + ;; For toplevel binding, we search for lines which + ;; start with a sequence of characters other than + ;; space and tab and '<', '>' (these are ignored + ;; since mostly these are the keyboard input + ;; definitions provided by iso-transl or (mouse) + ;; bindings for the `fringe' or `modeline' which + ;; might not be as interesting), the initial + ;; sequence should be followed by one or more + ;; tab/space which are then followed by a sequence + ;; of non newline/tab characters + ;; For example the following should match + ;; C-x Prefix Command + ;; But following should not + ;; C-x 8 Prefix Command + ;; Prefix Command + "^\\([^ <>\t]+\\)[ \t]+\\([^\t\n]+\\)$")) key-match desc-match unformatted) (save-match-data (with-temp-buffer From 09aff8b342f3b9a1b39e9f2b7712ec3c44e17c89 Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Sat, 10 Oct 2015 18:05:00 +0530 Subject: [PATCH 344/816] Fix some minor bugs --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index d14e13dba04..a7222ea0a6a 100644 --- a/which-key.el +++ b/which-key.el @@ -1159,7 +1159,7 @@ If KEY contains any \"special keys\" defined in (defsubst which-key--truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." (if (and which-key-max-description-length - (> (string-width desc) which-key-max-description-length)) + (> (length desc) which-key-max-description-length)) (concat (substring desc 0 which-key-max-description-length) "..") desc)) @@ -1585,7 +1585,7 @@ Finally, show the buffer." (let ((formatted-keys (which-key--get-formatted-key-bindings)) (prefix-keys (which-key--prefix-keys-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) - (message "%s- which-key: There are no keys to show" prefix-keys-desc)) + (message "%s- which-key: There are no keys to show" prefix-keys)) ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows From 95788e94c14af6fd95cd00c84f217947484c3f4b Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Sat, 10 Oct 2015 18:05:09 +0530 Subject: [PATCH 345/816] Add a command to popup toplevel bindings --- which-key.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/which-key.el b/which-key.el index a7222ea0a6a..a66d4fcac96 100644 --- a/which-key.el +++ b/which-key.el @@ -555,6 +555,11 @@ bottom." (setq which-key-popup-type 'minibuffer which-key-show-prefix 'left)) +;;;###autoload +(defun which-key-toplevel () + (interactive) + (which-key--create-buffer-and-show nil)) + ;; Helper functions to modify replacement lists. (defun which-key--add-key-val-to-alist (alist key value &optional alist-name) From cdd2934d0dc9d90b897d7a7028501ef2e918df41 Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Sat, 10 Oct 2015 18:37:04 +0530 Subject: [PATCH 346/816] Allow function key bindings to be displayed in toplevel help --- which-key.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index a66d4fcac96..14fc5b050d4 100644 --- a/which-key.el +++ b/which-key.el @@ -1247,20 +1247,21 @@ BUFFER that follow the key sequence KEY-SEQ." key-str-qt) ;; For toplevel binding, we search for lines which ;; start with a sequence of characters other than - ;; space and tab and '<', '>' (these are ignored - ;; since mostly these are the keyboard input - ;; definitions provided by iso-transl or (mouse) - ;; bindings for the `fringe' or `modeline' which - ;; might not be as interesting), the initial - ;; sequence should be followed by one or more - ;; tab/space which are then followed by a sequence - ;; of non newline/tab characters + ;; space and tab and '<', '>' except function keys + ;; (these are ignored since mostly these + ;; are the keyboard input definitions provided by + ;; iso-transl or (mouse) bindings for the `fringe' + ;; or `modeline' which might not be as interesting) + ;; the initial sequence should be followed by one + ;; or more tab/space which are then followed by a + ;; sequence of non newline/tab characters ;; For example the following should match ;; C-x Prefix Command + ;; Some command ;; But following should not ;; C-x 8 Prefix Command ;; Prefix Command - "^\\([^ <>\t]+\\)[ \t]+\\([^\t\n]+\\)$")) + "^\\([^ <>\t]+\\|\\)[ \t]+\\([^\t\n]+\\)$")) key-match desc-match unformatted) (save-match-data (with-temp-buffer From 26ca465bd168555b450c707159a5a29addb03bf6 Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Sat, 10 Oct 2015 18:38:08 +0530 Subject: [PATCH 347/816] Manually flush headings for keybindings --- which-key.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/which-key.el b/which-key.el index 14fc5b050d4..7e07631e7b4 100644 --- a/which-key.el +++ b/which-key.el @@ -1262,6 +1262,7 @@ BUFFER that follow the key sequence KEY-SEQ." ;; C-x 8 Prefix Command ;; Prefix Command "^\\([^ <>\t]+\\|\\)[ \t]+\\([^\t\n]+\\)$")) + (lines-to-flush'("[bB]inding[s]?[:]?$" "translations:$" "-------$")) key-match desc-match unformatted) (save-match-data (with-temp-buffer @@ -1269,6 +1270,9 @@ BUFFER that follow the key sequence KEY-SEQ." (when which-key-hide-alt-key-translations (goto-char (point-min)) (flush-lines "^A-")) + (goto-char (point-min)) + (dolist (line-to-flush lines-to-flush) + (save-excursion (flush-lines line-to-flush))) (goto-char (point-max)) ; want to put last keys in first (while (re-search-backward keybinding-regex nil t) (setq key-match (match-string 1) From 6aec4bd9f4bbad6ebdd703f916bd73851274ae3e Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Fri, 13 Nov 2015 08:21:47 +0530 Subject: [PATCH 348/816] Use `set-temporary-overlay-map` to setup paging keys for toplevel popup --- which-key.el | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 7e07631e7b4..ed156794468 100644 --- a/which-key.el +++ b/which-key.el @@ -401,7 +401,6 @@ key sequence. prefix-title is a string. The title is displayed alongside the actual current key sequence when `which-key-show-prefix' is set to either top or echo.") - ;;;###autoload (define-minor-mode which-key-mode "Toggle which-key-mode." @@ -1446,6 +1445,15 @@ area." (if use-descbind "help" next-page-n)) 'face 'which-key-note-face)))) +(defun which-key--get-popup-map () + (unless which-key--current-prefix + (let ((map (make-sparse-keymap))) + (define-key map (kbd which-key-paging-key) #'which-key-show-next-page) + (when which-key-use-C-h-for-paging + ;; Show next page even when C-h is pressed + (define-key map (kbd "C-h") #'which-key-show-next-page)) + map))) + (defun which-key--show-page (n) "Show page N, starting from 0." (which-key--init-buffer) ;; in case it was killed @@ -1512,7 +1520,11 @@ enough space based on your settings and frame size." prefix-keys) (erase-buffer) (insert page) (goto-char (point-min))) - (which-key--show-popup (cons height width))))))) + (which-key--show-popup (cons height width))))) + + ;; TODO: Replace this with `set-transient-map' when we drop support for + ;; Emacs v24.3 + (set-temporary-overlay-map (which-key--get-popup-map)))) (defun which-key-show-next-page () "Show the next page of keys. From 25d006eac1d10ab81a3c197875e1b3cf286918bb Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Fri, 13 Nov 2015 08:53:24 +0530 Subject: [PATCH 349/816] Include keybindings of the form 'a .. z' in which key popup --- which-key.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index ed156794468..fea86ab304a 100644 --- a/which-key.el +++ b/which-key.el @@ -1253,14 +1253,17 @@ BUFFER that follow the key sequence KEY-SEQ." ;; or `modeline' which might not be as interesting) ;; the initial sequence should be followed by one ;; or more tab/space which are then followed by a - ;; sequence of non newline/tab characters + ;; sequence of non newline/tab characters. + ;; Additionally keybindings of the form [a-z] + ;; .. [a-z] are also matched ;; For example the following should match ;; C-x Prefix Command ;; Some command + ;; a .. z Some command ;; But following should not ;; C-x 8 Prefix Command ;; Prefix Command - "^\\([^ <>\t]+\\|\\)[ \t]+\\([^\t\n]+\\)$")) + "^\\([^ <>\t]+\\|\\|\\w \\.\\. \\w\\)[ \t]+\\([^\t\n]+\\)$")) (lines-to-flush'("[bB]inding[s]?[:]?$" "translations:$" "-------$")) key-match desc-match unformatted) (save-match-data From d3fe7b2e2aefcb09a22985d01f1e7b8cb5461b42 Mon Sep 17 00:00:00 2001 From: Iqbal Ansari Date: Fri, 13 Nov 2015 21:38:16 +0530 Subject: [PATCH 350/816] Ignore self-insert-command bindings --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index fea86ab304a..41d6875a885 100644 --- a/which-key.el +++ b/which-key.el @@ -1264,7 +1264,7 @@ BUFFER that follow the key sequence KEY-SEQ." ;; C-x 8 Prefix Command ;; Prefix Command "^\\([^ <>\t]+\\|\\|\\w \\.\\. \\w\\)[ \t]+\\([^\t\n]+\\)$")) - (lines-to-flush'("[bB]inding[s]?[:]?$" "translations:$" "-------$")) + (lines-to-flush'("[bB]inding[s]?[:]?$" "translations:$" "-------$" "self-insert-command$")) key-match desc-match unformatted) (save-match-data (with-temp-buffer From b2c7d25dde96ca13e4d0d1f92191ca5cf962c3f5 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 13 Nov 2015 13:05:28 -0500 Subject: [PATCH 351/816] Minor stylistic changes to previous pr --- which-key.el | 81 ++++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/which-key.el b/which-key.el index 41d6875a885..ce38096f3cd 100644 --- a/which-key.el +++ b/which-key.el @@ -261,7 +261,7 @@ prefixes in `which-key-paging-prefixes'" :type 'boolean) (defcustom which-key-hide-alt-key-translations t - "Should key translations using Alt key be hidden. + "Hide key translations using Alt key if non nil. These translations are not relevant most of the times since a lot of terminals issue META modifier for the Alt key. @@ -554,11 +554,6 @@ bottom." (setq which-key-popup-type 'minibuffer which-key-show-prefix 'left)) -;;;###autoload -(defun which-key-toplevel () - (interactive) - (which-key--create-buffer-and-show nil)) - ;; Helper functions to modify replacement lists. (defun which-key--add-key-val-to-alist (alist key value &optional alist-name) @@ -1241,30 +1236,34 @@ BUFFER that follow the key sequence KEY-SEQ." (buffer (current-buffer)) ;; Temporarily use tabs to indent (indent-tabs-mode t) - (keybinding-regex (if which-key--current-prefix - (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" - key-str-qt) - ;; For toplevel binding, we search for lines which - ;; start with a sequence of characters other than - ;; space and tab and '<', '>' except function keys - ;; (these are ignored since mostly these - ;; are the keyboard input definitions provided by - ;; iso-transl or (mouse) bindings for the `fringe' - ;; or `modeline' which might not be as interesting) - ;; the initial sequence should be followed by one - ;; or more tab/space which are then followed by a - ;; sequence of non newline/tab characters. - ;; Additionally keybindings of the form [a-z] - ;; .. [a-z] are also matched - ;; For example the following should match - ;; C-x Prefix Command - ;; Some command - ;; a .. z Some command - ;; But following should not - ;; C-x 8 Prefix Command - ;; Prefix Command - "^\\([^ <>\t]+\\|\\|\\w \\.\\. \\w\\)[ \t]+\\([^\t\n]+\\)$")) - (lines-to-flush'("[bB]inding[s]?[:]?$" "translations:$" "-------$" "self-insert-command$")) + (keybinding-regex + (if which-key--current-prefix + (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" + key-str-qt) + ;; For toplevel binding, we search for lines which + ;; start with a sequence of characters other than + ;; space and tab and '<', '>' except function keys + ;; (these are ignored since mostly these + ;; are the keyboard input definitions provided by + ;; iso-transl or (mouse) bindings for the `fringe' + ;; or `modeline' which might not be as interesting) + ;; the initial sequence should be followed by one + ;; or more tab/space which are then followed by a + ;; sequence of non newline/tab characters. + ;; Additionally keybindings of the form [a-z] + ;; .. [a-z] are also matched + ;; For example the following should match + ;; C-x Prefix Command + ;; Some command + ;; a .. z Some command + ;; But following should not + ;; C-x 8 Prefix Command + ;; Prefix Command + "^\\([^ <>\t]+\\|\\|\\w \\.\\. \\w\\)[ \t]+\\([^\t\n]+\\)$")) + (lines-to-flush '("[bB]inding[s]?[:]?$" + "translations:$" + "-------$" + "self-insert-command$")) key-match desc-match unformatted) (save-match-data (with-temp-buffer @@ -1427,7 +1426,7 @@ area." (defun which-key--prefix-keys-description (prefix-keys) (if prefix-keys (key-description prefix-keys) - "Toplevel ")) + "Top-level bindings")) (defun which-key--next-page-hint (prefix-keys page-n n-pages) "Return string for next page hint." @@ -1476,8 +1475,10 @@ enough space based on your settings and frame size." prefix-keys) (n-tot (plist-get which-key--pages-plist :tot-keys)) (prefix-w-face (if (eq which-key-show-prefix 'echo) prefix-keys (which-key--propertize-key prefix-keys))) - (dash-w-face (if (eq which-key-show-prefix 'echo) "-" - (propertize "-" 'face 'which-key-key-face))) + (dash-w-face (if which-key--current-prefix + (if (eq which-key-show-prefix 'echo) "-" + (propertize "-" 'face 'which-key-key-face)) + "")) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) (status-top (propertize (which-key--maybe-get-prefix-title @@ -1524,10 +1525,10 @@ enough space based on your settings and frame size." prefix-keys) (insert page) (goto-char (point-min))) (which-key--show-popup (cons height width))))) - - ;; TODO: Replace this with `set-transient-map' when we drop support for - ;; Emacs v24.3 - (set-temporary-overlay-map (which-key--get-popup-map)))) + ;; used for paging at top-level + (if (fboundp 'set-transient-map) + (set-transient-map (which-key--get-popup-map)) + (set-temporary-overlay-map (which-key--get-popup-map))))) (defun which-key-show-next-page () "Show the next page of keys. @@ -1568,6 +1569,12 @@ Will force an update if called before `which-key--update'." (which-key--show-page next-page)) (which-key--start-paging-timer))))) +;;;###autoload +(defun which-key-show-top-level () + "Show top-level bindings." + (interactive) + (which-key--create-buffer-and-show nil)) + (defun which-key-undo () "Undo last keypress and force which-key update." (interactive) From b0f9f580f3a04f4fe75754f1f2a32d2cf3532d9b Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 15 Nov 2015 21:39:33 -0500 Subject: [PATCH 352/816] Mention show-top-level in the README --- README.org | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index 4a7a4e3daac..542a91218d5 100644 --- a/README.org +++ b/README.org @@ -1,5 +1,11 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] +** What's New +- The function =which-key-show-top-level= was implemented by @iqbalansari + (thanks!) to show top-level key bindings (those not behind a prefix). You can + use =M-x which-key-show-top-level= to try it and bind it to a key if you like. + It should function just like any other which-key popup once it's called. + ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode @@ -25,6 +31,7 @@ Many of these have been implemented and are described below. ** Table of Contents :TOC@4: - [[#which-key-][which-key ]] + - [[#whats-new][What's New]] - [[#introduction][Introduction]] - [[#install][Install]] - [[#melpa][MELPA]] @@ -35,6 +42,7 @@ Many of these have been implemented and are described below. - [[#side-window-right-option][Side Window Right Option]] - [[#side-window-right-then-bottom][Side Window Right then Bottom]] - [[#minibuffer-option][Minibuffer Option]] + - [[#additional-commands][Additional Commands]] - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - [[#popup-type-options][Popup Type Options]] - [[#minibuffer][minibuffer]] @@ -144,6 +152,13 @@ Take over the minibuffer. For the recommended configuration use Note the maximum height of the minibuffer is controlled through the built-in variable =max-mini-window-height=. +** Additional Commands +- =which-key-show-top-level= will show most key bindings without a prefix. It is + most and not all, because many are probably not interesting to most users. +- =which-key-show-next-page= is the command used for paging. +- =which-key-undo= can be used to undo the last keypress when in the middle of a + key sequence. + ** Special Features and Configuration Options There are more options than the ones described here. All of the configurable variables are available through =M-x customize-group which-key=. @@ -454,4 +469,8 @@ It requires testing on different platforms with different configurations, which is beyond my capabilities. The default configuration has been reasonably stable for me. ** Thanks -Thanks to @bmag for helping with the initial development and finding many bugs. +Special thanks to +- @bmag for helping with the initial development and finding many + bugs. +- @iqbalansari who among other things adapted the code to make + =which-key-show-top-level= possible. From 7068ebd224509f02c6a857f5df5ac72070c1ff76 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 Nov 2015 16:17:10 -0500 Subject: [PATCH 353/816] Bring in new describe-buffer-bindings parsing func based on similar function in helm-descbinds. This parses the output of describe-buffer-bindings line by line, and is easier to follow and manipulate than the previous one that uses complicated regexp expressions. --- which-key.el | 101 ++++++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 46 deletions(-) diff --git a/which-key.el b/which-key.el index ce38096f3cd..721fe561451 100644 --- a/which-key.el +++ b/which-key.el @@ -1229,57 +1229,66 @@ alists. Returns a list (key separator description)." (list key-w-face sep-w-face desc-w-face))) unformatted))) +;; adapted from helm-descbinds +(defun which-key--get-current-bindings () + (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) + (buffer (current-buffer)) + (ignore-bindings '("self-insert-command" "ignore" "ignore-event" "company-ignore")) + (ignore-keys-regexp "mouse-\\|wheel-\\|remap\\|drag-\\|scroll-bar\\|select-window\\|switch-frame")) + (with-temp-buffer + (let ((indent-tabs-mode t)) + (describe-buffer-bindings buffer which-key--current-prefix)) + (goto-char (point-min)) + (let ((header-p (not (= (char-after) ?\f))) + sections header section) + (while (not (eobp)) + (cond + (header-p + (setq header (buffer-substring-no-properties + (point) + (line-end-position))) + (setq header-p nil) + (forward-line 3)) + ((= (char-after) ?\f) + ;; (push (cons header (nreverse section)) sections) + (setq section nil) + (setq header-p t)) + ((looking-at "^[ \t]*$") + ;; ignore + ) + ((not (string-match-p "translations:" header)) + (let ((binding-start (save-excursion + (and (re-search-forward "\t+" nil t) + (match-end 0)))) + key binding) + (when binding-start + (setq key (buffer-substring-no-properties (point) binding-start) + ;; key (replace-regexp-in-string"^[ \t\n]+" "" key) + ;; key (replace-regexp-in-string"[ \t\n]+$" "" key) + ) + (setq binding (buffer-substring-no-properties + binding-start + (line-end-position))) + (save-match-data + (cond + ((member binding ignore-bindings)) + ((string-match-p ignore-keys-regexp key)) + ((and which-key--current-prefix + (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt) key)) + (unless (assoc-string (match-string 1 key) sections) + (push (cons (match-string 1 key) binding) sections))) + ((string-match "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$" key) + (unless (assoc-string (match-string 1 key) sections) + (push (cons (match-string 1 key) binding) sections))))))))) + (forward-line)) + (nreverse sections))))) + (defun which-key--get-formatted-key-bindings () "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let* ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) (buffer (current-buffer)) - ;; Temporarily use tabs to indent - (indent-tabs-mode t) - (keybinding-regex - (if which-key--current-prefix - (format "^%s \\([^ \t]+\\)[ \t]+\\(\\(?:[^ \t\n]+ ?\\)+\\)$" - key-str-qt) - ;; For toplevel binding, we search for lines which - ;; start with a sequence of characters other than - ;; space and tab and '<', '>' except function keys - ;; (these are ignored since mostly these - ;; are the keyboard input definitions provided by - ;; iso-transl or (mouse) bindings for the `fringe' - ;; or `modeline' which might not be as interesting) - ;; the initial sequence should be followed by one - ;; or more tab/space which are then followed by a - ;; sequence of non newline/tab characters. - ;; Additionally keybindings of the form [a-z] - ;; .. [a-z] are also matched - ;; For example the following should match - ;; C-x Prefix Command - ;; Some command - ;; a .. z Some command - ;; But following should not - ;; C-x 8 Prefix Command - ;; Prefix Command - "^\\([^ <>\t]+\\|\\|\\w \\.\\. \\w\\)[ \t]+\\([^\t\n]+\\)$")) - (lines-to-flush '("[bB]inding[s]?[:]?$" - "translations:$" - "-------$" - "self-insert-command$")) - key-match desc-match unformatted) - (save-match-data - (with-temp-buffer - (describe-buffer-bindings buffer which-key--current-prefix) - (when which-key-hide-alt-key-translations - (goto-char (point-min)) - (flush-lines "^A-")) - (goto-char (point-min)) - (dolist (line-to-flush lines-to-flush) - (save-excursion (flush-lines line-to-flush))) - (goto-char (point-max)) ; want to put last keys in first - (while (re-search-backward keybinding-regex nil t) - (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))))))) + (unformatted (which-key--get-current-bindings))) (when which-key-sort-order (setq unformatted (sort unformatted (lambda (a b) (funcall which-key-sort-order a b))))) From b0991a8a91d0d2d606fc5fa05a84db1c6d1ce774 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 Nov 2015 20:13:58 -0500 Subject: [PATCH 354/816] Satisfy compiler --- which-key.el | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 721fe561451..93cda2c8e25 100644 --- a/which-key.el +++ b/which-key.el @@ -1240,7 +1240,7 @@ alists. Returns a list (key separator description)." (describe-buffer-bindings buffer which-key--current-prefix)) (goto-char (point-min)) (let ((header-p (not (= (char-after) ?\f))) - sections header section) + bindings header) (while (not (eobp)) (cond (header-p @@ -1250,8 +1250,8 @@ alists. Returns a list (key separator description)." (setq header-p nil) (forward-line 3)) ((= (char-after) ?\f) - ;; (push (cons header (nreverse section)) sections) - (setq section nil) + ;; (push (cons header (nreverse section)) bindings) + ;; (setq section nil) (setq header-p t)) ((looking-at "^[ \t]*$") ;; ignore @@ -1275,20 +1275,18 @@ alists. Returns a list (key separator description)." ((string-match-p ignore-keys-regexp key)) ((and which-key--current-prefix (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt) key)) - (unless (assoc-string (match-string 1 key) sections) - (push (cons (match-string 1 key) binding) sections))) + (unless (assoc-string (match-string 1 key) bindings) + (push (cons (match-string 1 key) binding) bindings))) ((string-match "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$" key) - (unless (assoc-string (match-string 1 key) sections) - (push (cons (match-string 1 key) binding) sections))))))))) + (unless (assoc-string (match-string 1 key) bindings) + (push (cons (match-string 1 key) binding) bindings))))))))) (forward-line)) - (nreverse sections))))) + (nreverse bindings))))) (defun which-key--get-formatted-key-bindings () "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." - (let* ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) - (buffer (current-buffer)) - (unformatted (which-key--get-current-bindings))) + (let* ((unformatted (which-key--get-current-bindings))) (when which-key-sort-order (setq unformatted (sort unformatted (lambda (a b) (funcall which-key-sort-order a b))))) From 39fb658dbf57c5063ded560332d19d45a34078ad Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 Nov 2015 21:57:59 -0500 Subject: [PATCH 355/816] Turn on case-sensitivity in replacements Should avoid situations like #84 --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 93cda2c8e25..1243bc02806 100644 --- a/which-key.el +++ b/which-key.el @@ -1080,7 +1080,8 @@ to replace and the cdr is the replacement text. Unless LITERAL is non-nil regexp is used in the replacements. Whether or not a replacement occurs return the new STRING." (save-match-data - (let ((new-string string)) + (let ((new-string string) + case-fold-search) (dolist (repl repl-alist) (when (string-match (car repl) new-string) (setq new-string From 0bddd2db10e03f531e4bc4be2edb36e00b05e9df Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 Nov 2015 22:02:18 -0500 Subject: [PATCH 356/816] Silence warnings for obsolete function --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 1243bc02806..6f131f08985 100644 --- a/which-key.el +++ b/which-key.el @@ -1536,7 +1536,8 @@ enough space based on your settings and frame size." prefix-keys) ;; used for paging at top-level (if (fboundp 'set-transient-map) (set-transient-map (which-key--get-popup-map)) - (set-temporary-overlay-map (which-key--get-popup-map))))) + (with-no-warnings + (set-temporary-overlay-map (which-key--get-popup-map)))))) (defun which-key-show-next-page () "Show the next page of keys. From 25bd62aa49117eb9c99b751a569399f404ee3d15 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 Nov 2015 22:13:16 -0500 Subject: [PATCH 357/816] Refactor sorting functions and move fn keys up --- which-key.el | 60 ++++++++++++++-------------------------------------- 1 file changed, 16 insertions(+), 44 deletions(-) diff --git a/which-key.el b/which-key.el index 6f131f08985..175832175f6 100644 --- a/which-key.el +++ b/which-key.el @@ -962,15 +962,18 @@ width) in lines and characters respectively." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Sorting functions -(defun which-key--alpha< (a b) - (let ((da (downcase a)) - (db (downcase b))) - (if (string-equal da db) - (not (string-lessp a b)) - (string-lessp da db)))) +(defun which-key--string< (a b &optional alpha) + (if alpha + (let ((da (downcase a)) + (db (downcase b))) + (if (string-equal da db) + (not (string-lessp a b)) + (string-lessp da db))) + (string-lessp a b))) -(defun which-key--key-description-alpha< (a b) - "Sorting function used for `which-key-key-order-alpha'." +(defun which-key--key-description< (a b &optional alpha) + "Sorting function used for `which-key-key-order' and +`which-key-key-order-alpha'." (let* ((aem? (string-equal a "")) (bem? (string-equal b "")) (a1? (= 1 (length a))) @@ -986,17 +989,18 @@ width) in lines and characters respectively." (cond ((or aem? bem?) (and aem? (not bem?))) ((and asp? bsp?) (if (string-equal (substring a 0 3) (substring b 0 3)) - (which-key--key-description-alpha< (substring a 3) (substring b 3)) + (which-key--key-description< (substring a 3) (substring b 3) alpha) (string-lessp a b))) ((or asp? bsp?) asp?) - ((and a1? b1?) (which-key--alpha< a b)) + ((and a1? b1?) (which-key--string< a b alpha)) ((or a1? b1?) a1?) ((and afn? bfn?) (< (string-to-number (replace-regexp-in-string "" "\\1" a)) (string-to-number (replace-regexp-in-string "" "\\1" b)))) + ((or afn? bfn?) afn?) ((and apr? bpr?) (if (string-equal (substring a 0 2) (substring b 0 2)) - (which-key--key-description-alpha< (substring a 2) (substring b 2)) + (which-key--key-description< (substring a 2) (substring b 2) alpha) (string-lessp a b))) ((or apr? bpr?) apr?) (t (string-lessp a b))))) @@ -1009,39 +1013,7 @@ the ordering of classes are listed below. special (SPC,TAB,...) < single char < mod (C-,M-,...) < other. Sorts single characters alphabetically with lowercase coming before upper." - (which-key--key-description-alpha< (car acons) (car bcons))) - -(defun which-key--key-description< (a b) - "Sorting function used for `which-key-key-order'." - (let* ((aem? (string-equal a "")) - (bem? (string-equal b "")) - (a1? (= 1 (length a))) - (b1? (= 1 (length b))) - (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") - (asp? (string-match-p srgxp a)) - (bsp? (string-match-p srgxp b)) - (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") - (apr? (string-match-p prrgxp a)) - (bpr? (string-match-p prrgxp b)) - (afn? (string-match-p "" a)) - (bfn? (string-match-p "" b))) - (cond ((or aem? bem?) (and aem? (not bem?))) - ((and asp? bsp?) - (if (string-equal (substring a 0 3) (substring b 0 3)) - (which-key--key-description< (substring a 3) (substring b 3)) - (string-lessp a b))) - ((or asp? bsp?) asp?) - ((and a1? b1?) (string-lessp a b)) - ((or a1? b1?) a1?) - ((and afn? bfn?) - (< (string-to-number (replace-regexp-in-string "" "\\1" a)) - (string-to-number (replace-regexp-in-string "" "\\1" b)))) - ((and apr? bpr?) - (if (string-equal (substring a 0 2) (substring b 0 2)) - (which-key--key-description< (substring a 2) (substring b 2)) - (string-lessp a b))) - ((or apr? bpr?) apr?) - (t (string-lessp a b))))) + (which-key--key-description< (car acons) (car bcons) t)) (defsubst which-key-key-order (acons bcons) "Order key descriptions A and B. From aa60a2364e9c1ae511b7f43714c5996a6673e456 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 Nov 2015 22:31:10 -0500 Subject: [PATCH 358/816] Make special-key matching case sensitive --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 175832175f6..af8e88edd69 100644 --- a/which-key.el +++ b/which-key.el @@ -1117,7 +1117,8 @@ If KEY contains any \"special keys\" defined in (let ((key-w-face (propertize key 'face 'which-key-key-face)) (regexp (concat "\\(" (mapconcat 'identity which-key-special-keys - "\\|") "\\)"))) + "\\|") "\\)")) + case-fold-search) (save-match-data (if (and which-key-special-keys (string-match regexp key)) From ef44d0771abcc433bed6c164a62d2e5abbe5957f Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 17 Nov 2015 21:50:55 -0500 Subject: [PATCH 359/816] Sort character ranges properly Fix #85 --- which-key.el | 64 ++++++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/which-key.el b/which-key.el index af8e88edd69..257d9511eb6 100644 --- a/which-key.el +++ b/which-key.el @@ -974,36 +974,40 @@ width) in lines and characters respectively." (defun which-key--key-description< (a b &optional alpha) "Sorting function used for `which-key-key-order' and `which-key-key-order-alpha'." - (let* ((aem? (string-equal a "")) - (bem? (string-equal b "")) - (a1? (= 1 (length a))) - (b1? (= 1 (length b))) - (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") - (asp? (string-match-p srgxp a)) - (bsp? (string-match-p srgxp b)) - (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") - (apr? (string-match-p prrgxp a)) - (bpr? (string-match-p prrgxp b)) - (afn? (string-match-p "" a)) - (bfn? (string-match-p "" b))) - (cond ((or aem? bem?) (and aem? (not bem?))) - ((and asp? bsp?) - (if (string-equal (substring a 0 3) (substring b 0 3)) - (which-key--key-description< (substring a 3) (substring b 3) alpha) - (string-lessp a b))) - ((or asp? bsp?) asp?) - ((and a1? b1?) (which-key--string< a b alpha)) - ((or a1? b1?) a1?) - ((and afn? bfn?) - (< (string-to-number (replace-regexp-in-string "" "\\1" a)) - (string-to-number (replace-regexp-in-string "" "\\1" b)))) - ((or afn? bfn?) afn?) - ((and apr? bpr?) - (if (string-equal (substring a 0 2) (substring b 0 2)) - (which-key--key-description< (substring a 2) (substring b 2) alpha) - (string-lessp a b))) - ((or apr? bpr?) apr?) - (t (string-lessp a b))))) + (save-match-data + (let* ((rngrgxp "^\\([^ ]+\\) \\.\\. [^ ]+") + (a (if (string-match rngrgxp a) (match-string 1 a) a)) + (b (if (string-match rngrgxp b) (match-string 1 b) b)) + (aem? (string-equal a "")) + (bem? (string-equal b "")) + (a1? (= 1 (length a))) + (b1? (= 1 (length b))) + (srgxp "^\\(RET\\|SPC\\|TAB\\|DEL\\|LFD\\|ESC\\|NUL\\)") + (asp? (string-match-p srgxp a)) + (bsp? (string-match-p srgxp b)) + (prrgxp "^\\(M\\|C\\|S\\|A\\|H\\|s\\)-") + (apr? (string-match-p prrgxp a)) + (bpr? (string-match-p prrgxp b)) + (afn? (string-match-p "" a)) + (bfn? (string-match-p "" b))) + (cond ((or aem? bem?) (and aem? (not bem?))) + ((and asp? bsp?) + (if (string-equal (substring a 0 3) (substring b 0 3)) + (which-key--key-description< (substring a 3) (substring b 3) alpha) + (string-lessp a b))) + ((or asp? bsp?) asp?) + ((and a1? b1?) (which-key--string< a b alpha)) + ((or a1? b1?) a1?) + ((and afn? bfn?) + (< (string-to-number (replace-regexp-in-string "" "\\1" a)) + (string-to-number (replace-regexp-in-string "" "\\1" b)))) + ((or afn? bfn?) afn?) + ((and apr? bpr?) + (if (string-equal (substring a 0 2) (substring b 0 2)) + (which-key--key-description< (substring a 2) (substring b 2) alpha) + (string-lessp a b))) + ((or apr? bpr?) apr?) + (t (string-lessp a b)))))) (defsubst which-key-key-order-alpha (acons bcons) "Order key descriptions A and B. From e888ee885a9923af34ad1126fc13eb00e4e39f92 Mon Sep 17 00:00:00 2001 From: Syohei YOSHIDA Date: Wed, 18 Nov 2015 12:54:31 +0900 Subject: [PATCH 360/816] Move definition position for byte-compile warning --- which-key.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 257d9511eb6..919fe5478d8 100644 --- a/which-key.el +++ b/which-key.el @@ -1032,6 +1032,10 @@ special (SPC,TAB,...) < single char < mod (C-,M-,...) < other." Uses `string-lessp' after applying lowercase." (string-lessp (downcase (cdr acons)) (downcase (cdr bcons)))) +(defsubst which-key--group-p (description) + (or (string-match-p "^\\(group:\\|Prefix\\)" description) + (keymapp (intern description)))) + (defun which-key-prefix-then-key-order (acons bcons) "Order first by whether A and/or B is a prefix with no prefix coming before a prefix. Within these categories order using @@ -1140,10 +1144,6 @@ If KEY contains any \"special keys\" defined in (concat (substring desc 0 which-key-max-description-length) "..") desc)) -(defsubst which-key--group-p (description) - (or (string-match-p "^\\(group:\\|Prefix\\)" description) - (keymapp (intern description)))) - (defun which-key--highlight-face (description) "Return the highlight face for DESCRIPTION if it has one." (let (face) From 3af2f25803dbd578e1c6264ba47212a94018757b Mon Sep 17 00:00:00 2001 From: Syohei YOSHIDA Date: Wed, 18 Nov 2015 12:55:56 +0900 Subject: [PATCH 361/816] Use bound-and-true-p for byte compile warning --- which-key.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 919fe5478d8..7c57ccfdea1 100644 --- a/which-key.el +++ b/which-key.el @@ -1426,8 +1426,7 @@ area." (and (< 1 n-pages) paging-key-bound) use-descbind) (not (and which-key-allow-evil-operators - (boundp 'evil-this-operator) - evil-this-operator))) + (bound-and-true-p evil-this-operator)))) (propertize (format "[%s %s]" key (if use-descbind "help" next-page-n)) 'face 'which-key-note-face)))) @@ -1630,7 +1629,7 @@ Finally, show the buffer." (not which-key-inhibit) ;; Do not display the popup if a command is currently being ;; executed - (or (and which-key-allow-evil-operators evil-this-operator) + (or (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator)) (null this-command))) (which-key--create-buffer-and-show prefix-keys)))) From fe5be11e6ec06be7b2c83cc4b262b41153426524 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 10:21:49 -0500 Subject: [PATCH 362/816] Option to remove default unicode characters --- which-key.el | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 7c57ccfdea1..75bd580d87d 100644 --- a/which-key.el +++ b/which-key.el @@ -74,11 +74,6 @@ each key column." :group 'which-key :type 'integer) -(defcustom which-key-separator " → " - "Separator to use between key and description." - :group 'which-key - :type 'string) - (defcustom which-key-unicode-correction 3 "Correction for wide unicode characters. Since we measure width in terms of the number of characters, @@ -95,8 +90,21 @@ of the which-key popup." :group 'which-key :type 'integer) +(defcustom which-key-dont-use-unicode nil + "If non-nil, don't use any unicode characters in default setup." + :group 'which-key + :type 'integer) + +(defcustom which-key-separator + (if which-key-dont-use-unicode " : " " → ") + "Separator to use between key and description." + :group 'which-key + :type 'string) + (defcustom which-key-key-replacement-alist - '(("<\\([[:alnum:]-]+\\)>" . "\\1") ("left" . "←") ("right" . "→")) + (if which-key-dont-use-unicode + '(("<\\([[:alnum:]-]+\\)>" . "\\1")) + '(("<\\([[:alnum:]-]+\\)>" . "\\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." @@ -479,6 +487,18 @@ it's set too high)." ;; previous echo-keystrokes) ))) +(defun which-key-remove-default-unicode-chars () + "Use of `which-key-dont-use-unicode' is preferred to this +function, but it's included here in case someone cannot set that +variable early enough in their configuration, if they are using a +starter kit for example." + (when (string-equal which-key-separator " → ") + (setq which-key-separator " : ")) + (setq which-key-key-replacement-alist + (delete '("left" . "←") which-key-key-replacement-alist)) + (setq which-key-key-replacement-alist + (delete '("right" . "→") which-key-key-replacement-alist))) + ;; (defun which-key--setup-undo-key () ;; "Bind `which-key-undo-key' in `which-key-undo-keymaps'." ;; (when (and which-key-undo-key which-key-undo-keymaps) From 6cb95565d65db56ef6292b41415951e72922e532 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 10:49:23 -0500 Subject: [PATCH 363/816] Ignore key translations only at top-level C-x 8 is a valid place to put translations for example --- which-key.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 75bd580d87d..7dea2c32139 100644 --- a/which-key.el +++ b/which-key.el @@ -1232,7 +1232,8 @@ alists. Returns a list (key separator description)." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) (buffer (current-buffer)) (ignore-bindings '("self-insert-command" "ignore" "ignore-event" "company-ignore")) - (ignore-keys-regexp "mouse-\\|wheel-\\|remap\\|drag-\\|scroll-bar\\|select-window\\|switch-frame")) + (ignore-keys-regexp "mouse-\\|wheel-\\|remap\\|drag-\\|scroll-bar\\|select-window\\|switch-frame") + (ignore-sections-regexp "\\(Key translations\\|Function key map translations\\|Input decoding map translations\\)")) (with-temp-buffer (let ((indent-tabs-mode t)) (describe-buffer-bindings buffer which-key--current-prefix)) @@ -1254,7 +1255,8 @@ alists. Returns a list (key separator description)." ((looking-at "^[ \t]*$") ;; ignore ) - ((not (string-match-p "translations:" header)) + ((or (not (string-match-p ignore-sections-regexp header)) + which-key--current-prefix) (let ((binding-start (save-excursion (and (re-search-forward "\t+" nil t) (match-end 0)))) From cf8052d6caf9f09615452c822990c2a8031e6562 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 13:36:51 -0500 Subject: [PATCH 364/816] Add show-prfx 'bottom and change top-level msg 'bottom is a "safer" default because it's impossible to control the echo area completely, so the message gets wiped out occasionally. Use prefix-titles for the top-level bindings message, since top-level is not really a key --- which-key.el | 55 +++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/which-key.el b/which-key.el index 7dea2c32139..46934790fef 100644 --- a/which-key.el +++ b/which-key.el @@ -139,14 +139,15 @@ and have `which-key-special-key-face' applied to them." :group 'which-key :type 'string) -(defcustom which-key-show-prefix 'echo +(defcustom which-key-show-prefix 'bottom "Whether to and where to display the current prefix sequence. Possible choices are echo for echo area (the default), left, top and nil. Nil turns the feature off." :group 'which-key - :type '(radio (const :tag "Left of keys" left) - (const :tag "In first line" top) - (const :tag "In echo area" echo) + :type '(radio (const :tag "Left of the keys" left) + (const :tag "In the first line" top) + (const :tag "In the last line" bottom) + (const :tag "In the echo area" echo) (const :tag "Hide" nil))) (defcustom which-key-popup-type 'side-window @@ -561,10 +562,9 @@ if there is space and the bottom otherwise." "Apply suggested settings for side-window that opens on bottom." (interactive) - (which-key--setup-echo-keystrokes) (setq which-key-popup-type 'side-window which-key-side-window-location 'bottom - which-key-show-prefix 'echo)) + which-key-show-prefix 'bottom)) ;;;###autoload (defun which-key-setup-minibuffer () @@ -1116,13 +1116,18 @@ occurs return the new STRING." "KEY-LST is a list of keys produced by `listify-key-sequences'. A title is possibly returned using `which-key-prefix-title-alist'. An empty stiring is returned if no title exists." - (let* ((alist which-key-prefix-title-alist) - (res (assoc key-lst alist)) - (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist (assoc key-lst mode-alist)))) - (cond (mode-res (cdr mode-res)) - (res (cdr res)) - (t "")))) + (if key-lst + (let* ((alist which-key-prefix-title-alist) + (res (assoc key-lst alist)) + (mode-alist (assq major-mode alist)) + (mode-res (when mode-alist (assoc key-lst mode-alist)))) + (cond (mode-res (cdr mode-res)) + (res (cdr res)) + ((and (eq which-key-show-prefix 'bottom) + echo-keystrokes) + (concat (key-description key-lst) "-")) + (t ""))) + "Top-level bindings")) (defun which-key--maybe-replace-key-based (string key-lst) "KEY-LST is a list of keys produced by `listify-key-sequences' @@ -1387,8 +1392,8 @@ is the width of the live window." (prefix-w-face (which-key--propertize-key prefix-keys-desc)) (prefix-left (when (eq which-key-show-prefix 'left) (+ 2 (string-width prefix-w-face)))) - (prefix-top (eq which-key-show-prefix 'top)) - (avl-lines (if prefix-top (- max-lines 1) max-lines)) + (prefix-top-bottom (member which-key-show-prefix '(bottom top))) + (avl-lines (if prefix-top-bottom (- max-lines 1) max-lines)) (min-lines (min avl-lines which-key-min-display-lines)) (avl-width (if prefix-left (- max-width prefix-left) max-width)) (vertical (and (eq which-key-popup-type 'side-window) @@ -1430,11 +1435,6 @@ area." delay nil (lambda () (let (message-log-max) (message "%s" text)))))) -(defun which-key--prefix-keys-description (prefix-keys) - (if prefix-keys - (key-description prefix-keys) - "Top-level bindings")) - (defun which-key--next-page-hint (prefix-keys page-n n-pages) "Return string for next page hint." (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) @@ -1466,7 +1466,7 @@ area." "Show page N, starting from 0." (which-key--init-buffer) ;; in case it was killed (let ((n-pages (plist-get which-key--pages-plist :n-pages)) - (prefix-keys (which-key--prefix-keys-description which-key--current-prefix)) + (prefix-keys (key-description which-key--current-prefix)) page-n golden-ratio-mode) (if (= 0 n-pages) (message "%s- which-key can't show keys: There is not \ @@ -1520,9 +1520,16 @@ enough space based on your settings and frame size." prefix-keys) ((eq which-key-show-prefix 'top) (setq page (concat prefix-w-face dash-w-face " " status-top " " nxt-pg-hint "\n" page))) + ((eq which-key-show-prefix 'bottom) + (setq page (concat page "\n" + (when (null echo-keystrokes) + (concat prefix-w-face dash-w-face " ")) + status-top " " nxt-pg-hint))) ((eq which-key-show-prefix 'echo) - (which-key--echo (concat prefix-w-face dash-w-face " " - status-top " " nxt-pg-hint)))) + (which-key--echo (concat prefix-w-face dash-w-face + (when prefix-keys " ") + status-top (when status-top " ") + nxt-pg-hint)))) (which-key--lighter-status n-shown n-tot) (if (eq which-key-popup-type 'minibuffer) (which-key--echo page) @@ -1622,7 +1629,7 @@ Finally, show the buffer." (setq which-key--current-prefix prefix-keys which-key--last-try-2-loc nil) (let ((formatted-keys (which-key--get-formatted-key-bindings)) - (prefix-keys (which-key--prefix-keys-description which-key--current-prefix))) + (prefix-keys (key-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys)) ((listp which-key-side-window-location) From 8f9bd782f7fa48095cad283e00e7d7cf8680e42a Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 14:57:01 -0500 Subject: [PATCH 365/816] Mention new show-prefix option and format README --- README.org | 69 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/README.org b/README.org index 542a91218d5..59a5af46f94 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,19 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] ** What's New +- Implemented =bottom= as an option for =which-key-show-prefix=, which will show + the key, page number, and next page key information on the last line of the + which-key buffer. +- This is the new default for =which-key-setup-side-window-bottom=. The old + default, which is still available, used the echo area for this information. + The echo area is not a good default, because it's not possible to completely + control what shows there without doing something ugly, so occasionally the + which-key information will be overwritten. To restore the old default simply + + #+BEGIN_SRC emacs-lisp + (setq which-key-show-prefix 'echo) + #+END_SRC + - The function =which-key-show-top-level= was implemented by @iqbalansari (thanks!) to show top-level key bindings (those not behind a prefix). You can use =M-x which-key-show-top-level= to try it and bind it to a key if you like. @@ -72,7 +85,7 @@ minor mode of course. *** Manually Add which-key.el to your =load-path= and require. Something like -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (add-to-list 'load-path "path/to/which-key.el") (require 'which-key) (which-key-mode) @@ -109,7 +122,7 @@ This functionality is targeting [[https://github.com/syl20bnr/spacemacs][spacEma *** Side Window Bottom Option Popup side window on bottom. This is the current default. To restore this setup use -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (which-key-setup-side-window-bottom) #+END_SRC @@ -118,7 +131,7 @@ Popup side window on bottom. This is the current default. To restore this setup *** Side Window Right Option Popup side window on right. For defaults use -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (which-key-setup-side-window-right) #+END_SRC @@ -136,14 +149,14 @@ usually easier to fit keys into. This setting can be helpful if the size of the Emacs frame changes frequently, which might be the case if you are using a dynamic/tiling window manager. -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (which-key-setup-side-window-right-bottom) #+END_SRC *** Minibuffer Option Take over the minibuffer. For the recommended configuration use -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (which-key-setup-minibuffer) #+END_SRC @@ -167,16 +180,16 @@ There are three different popup types that which-key can use by default to display the available keys. The variable =which-key-popup-type= decides which one is used. **** minibuffer -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'minibuffer) #+END_SRC Show keys in the minibuffer. **** side window -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'side-window) #+END_SRC Show keys in a side window. This popup type has further options: -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp ;; location of which-key window. valid values: top, bottom, left, right, ;; or a list of any of the two. If it's a list, which-key will always try ;; the first location first. It will go to the second location if there is @@ -195,13 +208,13 @@ Show keys in a side window. This popup type has further options: #+END_SRC **** frame -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'frame) #+END_SRC Show keys in a popup frame. This popup won't work very well in a terminal, where only one frame can be shown at any given moment. This popup type has further options: -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp ;; max width of which-key frame: number of columns (an integer) (setq which-key-frame-max-width 60) @@ -218,7 +231,7 @@ variables for more information, but here is a working example (this is the current implementation of side-window bottom). -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'custom) (defun which-key-custom-popup-max-dimensions-function (ignore) (cons @@ -253,7 +266,7 @@ variable directly.] Using this method, the description of a key is replaced using a string that you provide. Here's an example -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (which-key-add-key-based-replacements "C-x C-f" "find files") #+END_SRC @@ -263,7 +276,7 @@ replace, in a form suitable for =kbd=. For that key combination, which-key overwrites the description with the second string, "find files". In the second type of entry you can restrict the replacements to a major-mode. For example, -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (which-key-add-major-mode-key-based-replacements 'org-mode "C-c C-c" "Org C-c C-c" "C-c C-a" "Org Attach") @@ -280,7 +293,7 @@ descriptions directly. The relevant variables are =which-key-key-replacement-alist= and =which-key-description-replacement-alist=. Here's an example of one of the default key replacements -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp ("<\\([[:alnum:]-]+\\)>" . "\\1") #+END_SRC @@ -288,7 +301,7 @@ The =car= takes a string which may use Emacs regexp and the =cdr= takes a string with the replacement text. As shown, you can specify a sub-expression of the match. The replacements do not need to use regexp and can be as simple as -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp ("left" . "lft") #+END_SRC @@ -297,7 +310,7 @@ results. Unfortunately, using Unicode characters may upset the alignment of the which-key buffer, because Unicode characters can have different widths even in a monospace font and alignment is based on character width. -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (add-to-list 'which-key-key-replacement-alist '("TAB" . "↹")) (add-to-list 'which-key-key-replacement-alist '("RET" . "⏎")) (add-to-list 'which-key-key-replacement-alist '("DEL" . "⇤")) @@ -314,7 +327,7 @@ their order are You can control the order by setting this variable. This also shows the other available options. -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp ;; default (setq which-key-sort-order 'which-key-key-order) ;; same as default, except single characters are sorted alphabetically @@ -335,7 +348,7 @@ typing. There are two slightly different ways of doing this. **** Method 1 (default): Using C-h (or =help-char=) This is the easiest way, and is turned on by default. Use -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (setq which-key-use-C-h-for-paging nil) #+END_SRC to disable the behavior (this will only take effect after toggling @@ -358,7 +371,7 @@ The default configuration below will allow you to switch paging using =C-h= until you reach the last page of keys in the which-key buffer. The next press of =C-h= will close the which-key buffer and trigger the default Emacs behavior on =C-h=. -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (setq which-key-use-C-h-for-paging t which-key-prevent-C-h-from-cycling t) #+END_SRC @@ -372,13 +385,13 @@ Note =C-h= is by default equivalent to =?= in this context. Essentially, all you need to do for a prefix like =C-x= is the following which will bind == to the relevant command. -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (define-key which-key-mode-map (kbd "C-x ") 'which-key-show-next-page) #+END_SRC This is completely equivalent to -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (setq which-key-paging-prefixes '("C-x")) (setq which-key-paging-key "") #+END_SRC @@ -404,13 +417,13 @@ everywhere. It might be useful for you to distinguish between the two. One way to do this is to remove the default face from =which-key-command-description-face= like this -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (set-face-attribute 'which-key-command-description-face nil :inherit nil) #+END_SRC another is to make the local map keys appear in bold -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) #+END_SRC @@ -421,9 +434,9 @@ your liking. The options below are also available through customize. Their defaults are shown. -#+BEGIN_SRC Emacs-lisp +#+BEGIN_SRC emacs-lisp ;; Set the time delay (in seconds) for the which-key popup to appear. - (setq which-key-idle-delay 1.0) + (setq which-key-idle-delay 1.0) ;; Set the maximum length (in characters) for key descriptions (commands or ;; prefixes). Descriptions that are longer are truncated and have ".." added. @@ -446,9 +459,9 @@ shown. ;; the feature (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) - ;; Show the key prefix on the left or top (nil means hide the prefix). The - ;; prefix consists of the keys you have typed so far. which-key also shows the - ;; page information along with the prefix. + ;; Show the key prefix on the left, top, or bottom (nil means hide the prefix). + ;; The prefix consists of the keys you have typed so far. which-key also shows + ;; the page information along with the prefix. (setq which-key-show-prefix 'left) ;; Set to t to show the count of keys shown vs. total keys in the mode line. From 24839e665d974d93c4ed038538c5887dc3d54dbd Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 14:58:35 -0500 Subject: [PATCH 366/816] Fix spacing in last commit --- README.org | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.org b/README.org index 59a5af46f94..bf56704cdfc 100644 --- a/README.org +++ b/README.org @@ -9,11 +9,9 @@ The echo area is not a good default, because it's not possible to completely control what shows there without doing something ugly, so occasionally the which-key information will be overwritten. To restore the old default simply - #+BEGIN_SRC emacs-lisp (setq which-key-show-prefix 'echo) #+END_SRC - - The function =which-key-show-top-level= was implemented by @iqbalansari (thanks!) to show top-level key bindings (those not behind a prefix). You can use =M-x which-key-show-top-level= to try it and bind it to a key if you like. From 279b318cc698ab89d3db19231865590bb548f350 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 20:24:23 -0500 Subject: [PATCH 367/816] Provide alternative for prefix-title If echo-keystrokes is non nil, we're showing in the bottom window, and the prefix is shown in the top or bottom line, there's not much reason to show the prefix again since it's so close to the echo area. --- which-key.el | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 46934790fef..34483c46ab7 100644 --- a/which-key.el +++ b/which-key.el @@ -1123,9 +1123,12 @@ An empty stiring is returned if no title exists." (mode-res (when mode-alist (assoc key-lst mode-alist)))) (cond (mode-res (cdr mode-res)) (res (cdr res)) - ((and (eq which-key-show-prefix 'bottom) + ((and (member which-key-show-prefix '(bottom top)) + (eq which-key-side-window-location 'bottom) echo-keystrokes) - (concat (key-description key-lst) "-")) + (if (symbolp (key-binding (apply #'vector key-lst))) + (symbol-name (key-binding (apply #'vector key-lst))) + (concat "Following " (key-description key-lst)))) (t ""))) "Top-level bindings")) @@ -1377,7 +1380,7 @@ Returns a plist that holds the page strings, as well as metadata." (push page-width page-widths)) (list :pages (nreverse pages) :page-height avl-lines :page-widths (nreverse page-widths) - :keys/page (nreverse keys/page) :n-pages n-pages + :keys/page (reverse keys/page) :n-pages n-pages :tot-keys (apply #'+ keys/page))))) (defun which-key--create-pages (keys sel-win-width) @@ -1482,8 +1485,8 @@ enough space based on your settings and frame size." prefix-keys) (prefix-w-face (if (eq which-key-show-prefix 'echo) prefix-keys (which-key--propertize-key prefix-keys))) (dash-w-face (if which-key--current-prefix - (if (eq which-key-show-prefix 'echo) "-" - (propertize "-" 'face 'which-key-key-face)) + (if (eq which-key-show-prefix 'echo) "-" + (propertize "-" 'face 'which-key-key-face)) "")) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) @@ -1518,13 +1521,20 @@ enough space based on your settings and frame size." prefix-keys) new-end (concat "\n" (make-string first-col-width 32)) page (concat first (mapconcat #'identity (cdr lines) new-end))))) ((eq which-key-show-prefix 'top) - (setq page (concat prefix-w-face dash-w-face " " - status-top " " nxt-pg-hint "\n" page))) + (setq page + (concat + (when (or (null echo-keystrokes) + (not (eq which-key-side-window-location 'bottom))) + (concat prefix-w-face dash-w-face " ")) + status-top " " nxt-pg-hint "\n" page))) ((eq which-key-show-prefix 'bottom) - (setq page (concat page "\n" - (when (null echo-keystrokes) - (concat prefix-w-face dash-w-face " ")) - status-top " " nxt-pg-hint))) + (setq page + (concat + page "\n" + (when (or (null echo-keystrokes) + (not (eq which-key-side-window-location 'bottom))) + (concat prefix-w-face dash-w-face " ")) + status-top " " nxt-pg-hint))) ((eq which-key-show-prefix 'echo) (which-key--echo (concat prefix-w-face dash-w-face (when prefix-keys " ") From 841f461b22848d1b7167803c9b1e345055b1adf8 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 20:57:51 -0500 Subject: [PATCH 368/816] Automatically close popup when prefix goes away It was necessary to hit C-g twice to close the popup before this change. --- which-key.el | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/which-key.el b/which-key.el index 34483c46ab7..016536fefb3 100644 --- a/which-key.el +++ b/which-key.el @@ -388,6 +388,7 @@ showing.") "Internal: Last location of side-window when two locations used.") (defvar which-key--multiple-locations nil) +(defvar which-key--using-top-level nil) (defvar which-key-key-based-description-replacement-alist '() "New version of @@ -780,6 +781,7 @@ total height." "This function is called to hide the which-key buffer." (unless (eq real-this-command 'which-key-show-next-page) (setq which-key--current-page-n nil + which-key--using-top-level nil which-key--on-last-page nil) (cl-case which-key-popup-type ;; Not necessary to hide minibuffer @@ -1597,6 +1599,7 @@ Will force an update if called before `which-key--update'." (defun which-key-show-top-level () "Show top-level bindings." (interactive) + (setq which-key--using-top-level t) (which-key--create-buffer-and-show nil)) (defun which-key-undo () @@ -1657,20 +1660,22 @@ Finally, show the buffer." ;; (message "key: %s" (key-description prefix-keys))) ;; (when (> (length prefix-keys) 0) ;; (message "key binding: %s" (key-binding prefix-keys))) - (when (and (> (length prefix-keys) 0) - (or (keymapp (key-binding prefix-keys)) - ;; Some keymaps are stored here like iso-transl-ctl-x-8-map - (keymapp (which-key--safe-lookup-key - key-translation-map prefix-keys)) - ;; just in case someone uses one of these - (keymapp (which-key--safe-lookup-key - function-key-map prefix-keys))) - (not which-key-inhibit) - ;; Do not display the popup if a command is currently being - ;; executed - (or (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator)) - (null this-command))) - (which-key--create-buffer-and-show prefix-keys)))) + (cond ((and (> (length prefix-keys) 0) + (or (keymapp (key-binding prefix-keys)) + ;; Some keymaps are stored here like iso-transl-ctl-x-8-map + (keymapp (which-key--safe-lookup-key + key-translation-map prefix-keys)) + ;; just in case someone uses one of these + (keymapp (which-key--safe-lookup-key + function-key-map prefix-keys))) + (not which-key-inhibit) + ;; Do not display the popup if a command is currently being + ;; executed + (or (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator)) + (null this-command))) + (which-key--create-buffer-and-show prefix-keys)) + ((and which-key--current-page-n (not which-key--using-top-level)) + (which-key--hide-popup))))) ;; Timers From 9dd0ceaaabe6b4ac5f3268747b6103fb04d65e5f Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 21:44:11 -0500 Subject: [PATCH 369/816] Revert change in default of side-window-bottom Not happy with the look of it yet, even though it's probably better to avoid the echo area --- README.org | 11 ----------- which-key.el | 4 ++-- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/README.org b/README.org index bf56704cdfc..f785d2024e1 100644 --- a/README.org +++ b/README.org @@ -1,17 +1,6 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] ** What's New -- Implemented =bottom= as an option for =which-key-show-prefix=, which will show - the key, page number, and next page key information on the last line of the - which-key buffer. -- This is the new default for =which-key-setup-side-window-bottom=. The old - default, which is still available, used the echo area for this information. - The echo area is not a good default, because it's not possible to completely - control what shows there without doing something ugly, so occasionally the - which-key information will be overwritten. To restore the old default simply - #+BEGIN_SRC emacs-lisp - (setq which-key-show-prefix 'echo) - #+END_SRC - The function =which-key-show-top-level= was implemented by @iqbalansari (thanks!) to show top-level key bindings (those not behind a prefix). You can use =M-x which-key-show-top-level= to try it and bind it to a key if you like. diff --git a/which-key.el b/which-key.el index 016536fefb3..5e68f5c4cda 100644 --- a/which-key.el +++ b/which-key.el @@ -164,7 +164,7 @@ and nil. Nil turns the feature off." :group 'which-key :type 'integer) -(defcustom which-key-side-window-location 'bottom +(defcustom which-key-side-window-location 'echo "Location of which-key popup when `which-key-popup-type' is side-window. Should be one of top, bottom, left or right. You can also specify a list of two locations, like (right bottom). In this case, the @@ -565,7 +565,7 @@ bottom." (interactive) (setq which-key-popup-type 'side-window which-key-side-window-location 'bottom - which-key-show-prefix 'bottom)) + which-key-show-prefix 'echo)) ;;;###autoload (defun which-key-setup-minibuffer () From 6b5ca75b648e256bf2da5d5b0341abb27a198484 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 21:48:27 -0500 Subject: [PATCH 370/816] Forgot line in last commit --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index 5e68f5c4cda..490ed7db277 100644 --- a/which-key.el +++ b/which-key.el @@ -563,6 +563,7 @@ if there is space and the bottom otherwise." "Apply suggested settings for side-window that opens on bottom." (interactive) + (which-key--setup-echo-keystrokes) (setq which-key-popup-type 'side-window which-key-side-window-location 'bottom which-key-show-prefix 'echo)) From c6abc78b5825b13febeee662433dbd7bb53d98e1 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 22:00:14 -0500 Subject: [PATCH 371/816] Provide alternate prefix-title for echo area --- which-key.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 490ed7db277..aaef402b459 100644 --- a/which-key.el +++ b/which-key.el @@ -1123,14 +1123,17 @@ An empty stiring is returned if no title exists." (let* ((alist which-key-prefix-title-alist) (res (assoc key-lst alist)) (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist (assoc key-lst mode-alist)))) + (mode-res (when mode-alist (assoc key-lst mode-alist))) + (alternate (when (symbolp (key-binding (apply #'vector key-lst))) + (symbol-name (key-binding (apply #'vector key-lst)))))) (cond (mode-res (cdr mode-res)) (res (cdr res)) + ((and (eq which-key-show-prefix 'echo) alternate) + alternate) ((and (member which-key-show-prefix '(bottom top)) (eq which-key-side-window-location 'bottom) echo-keystrokes) - (if (symbolp (key-binding (apply #'vector key-lst))) - (symbol-name (key-binding (apply #'vector key-lst))) + (if alternate alternate (concat "Following " (key-description key-lst)))) (t ""))) "Top-level bindings")) From cd6b3c5e99d371c08185aca6d333d0f0f278c666 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 18 Nov 2015 22:04:29 -0500 Subject: [PATCH 372/816] Check for nil as a binding in previous commit --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index aaef402b459..7347fad3723 100644 --- a/which-key.el +++ b/which-key.el @@ -1124,8 +1124,9 @@ An empty stiring is returned if no title exists." (res (assoc key-lst alist)) (mode-alist (assq major-mode alist)) (mode-res (when mode-alist (assoc key-lst mode-alist))) - (alternate (when (symbolp (key-binding (apply #'vector key-lst))) - (symbol-name (key-binding (apply #'vector key-lst)))))) + (binding (key-binding (apply #'vector key-lst))) + (alternate (when (and binding (symbolp binding)) + (symbol-name binding)))) (cond (mode-res (cdr mode-res)) (res (cdr res)) ((and (eq which-key-show-prefix 'echo) alternate) From 62344270c58abc1ca65fba65f5c1f4a1d81b493e Mon Sep 17 00:00:00 2001 From: Junpeng Qiu Date: Thu, 19 Nov 2015 22:52:43 -0500 Subject: [PATCH 373/816] Fix the value of `which-key-side-window-location' --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 7347fad3723..18b277ecda1 100644 --- a/which-key.el +++ b/which-key.el @@ -164,7 +164,7 @@ and nil. Nil turns the feature off." :group 'which-key :type 'integer) -(defcustom which-key-side-window-location 'echo +(defcustom 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. You can also specify a list of two locations, like (right bottom). In this case, the From 3fceb99ee4300ad5bf711f7113872a1dabe22301 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 20 Nov 2015 06:34:01 -0500 Subject: [PATCH 374/816] Fix mistake in reverting defaults Ref 9dd0ceaaabe6b4ac5f3268747b6103fb04d65e5f Accidentally changed the side window location instead of the show-prefix one. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 18b277ecda1..0c7860e1513 100644 --- a/which-key.el +++ b/which-key.el @@ -139,7 +139,7 @@ and have `which-key-special-key-face' applied to them." :group 'which-key :type 'string) -(defcustom which-key-show-prefix 'bottom +(defcustom which-key-show-prefix 'echo "Whether to and where to display the current prefix sequence. Possible choices are echo for echo area (the default), left, top and nil. Nil turns the feature off." From 55384945c7623536f6577d86b36357fff653d4dd Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 20 Nov 2015 15:23:40 -0500 Subject: [PATCH 375/816] Show docstring on hover in echo area for commands --- which-key.el | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index 0c7860e1513..f5e5c79dd54 100644 --- a/which-key.el +++ b/which-key.el @@ -39,6 +39,7 @@ ;;; Code: (require 'cl-lib) +(require 'button) (eval-when-compile (defvar golden-ratio-mode)) @@ -1196,21 +1197,40 @@ which-key-highlighted-command-list is not a string or a cons cell" el))))) face)) -(defun which-key--propertize-description (description group local hl-face) +(defun which-key--propertize-description + (description group local hl-face &optional original-description) "Add face to DESCRIPTION where the face chosen depends on whether the description represents a group or a command. Also make some minor adjustments to the description string, like -removing a \"group:\" prefix." +removing a \"group:\" prefix. + +ORIGINAL-DESCRIPTION is the description given by +`describe-buffer-bindings'." (let* ((desc description) (desc (if (string-match-p "^group:" desc) (substring desc 6) desc)) (desc (if group (concat "+" desc) desc)) (desc (which-key--truncate-description desc))) - (propertize desc 'face - (cond (hl-face hl-face) - (group 'which-key-group-description-face) - (local 'which-key-local-map-description-face) - (t 'which-key-command-description-face))))) + (eval + `(make-text-button + ,desc nil + 'face ',(cond (hl-face hl-face) + (group 'which-key-group-description-face) + (local 'which-key-local-map-description-face) + (t 'which-key-command-description-face)) + 'help-echo ,(cond + ((and (fboundp (intern original-description)) + (documentation (intern original-description)) + tooltip-mode) + (documentation (intern original-description))) + ((and (fboundp (intern original-description)) + (documentation (intern original-description)) + (let* ((doc (documentation (intern original-description))) + (str (replace-regexp-in-string "\n" " " doc)) + (max (floor (* (frame-width) 0.8)))) + (if (> (length str) max) + (concat (substring str 0 max) "...") + str))))))))) (defun which-key--format-and-replace (unformatted) "Take a list of (key . desc) cons cells in UNFORMATTED, add @@ -1222,23 +1242,24 @@ alists. Returns a list (key separator description)." (mapcar (lambda (key-desc-cons) (let* ((key (car key-desc-cons)) - (desc (cdr key-desc-cons)) - (group (which-key--group-p desc)) + (orig-desc (cdr key-desc-cons)) + (group (which-key--group-p orig-desc)) (keys (which-key--current-key-string key)) (key-lst (which-key--current-key-list key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) - (intern desc))) - (hl-face (which-key--highlight-face desc)) + (intern orig-desc))) + (hl-face (which-key--highlight-face orig-desc)) (key (which-key--maybe-replace key which-key-key-replacement-alist)) (desc (which-key--maybe-replace - desc which-key-description-replacement-alist)) + orig-desc which-key-description-replacement-alist)) (desc (which-key--maybe-replace-key-based desc key-lst)) (desc (if group (which-key--maybe-replace-prefix-name key-lst desc) desc)) (key-w-face (which-key--propertize-key key)) - (desc-w-face (which-key--propertize-description desc group local hl-face))) + (desc-w-face (which-key--propertize-description + desc group local hl-face orig-desc))) (list key-w-face sep-w-face desc-w-face))) unformatted))) From 2d0b1463adabedf679efa8257ff1cb3555808cf1 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 20 Nov 2015 15:40:16 -0500 Subject: [PATCH 376/816] Add README note about last commit --- README.org | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.org b/README.org index f785d2024e1..c0e7e93e3a5 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,9 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] ** What's New +- Use your mouse to hover over commands and the docstring will be displayed in + the echo area or a tooltip, depending on whether or not you're using + =tooltip-mode=. - The function =which-key-show-top-level= was implemented by @iqbalansari (thanks!) to show top-level key bindings (those not behind a prefix). You can use =M-x which-key-show-top-level= to try it and bind it to a key if you like. From ead6b70fd0910ead6db01ac8762918f48b6a5e5c Mon Sep 17 00:00:00 2001 From: Chris Perkins Date: Sat, 28 Nov 2015 11:15:21 -0700 Subject: [PATCH 377/816] Display prefix names in terminal-mode When running emacs in a terminal (or at least, in iTerm), keys are not passed through to emacs the same way that they are in graphical mode. For example, M-m (important in spacemacs) is the key-sequence `[134217837]` in graphical emacs, but `[27 109]` ("ESC m") in terminal. The variable `which-key-prefix-name-alst` only has a mapping for the former (the 134217837), and so the names of submenus all show up as "+prefix", limiting discoverability. This commit converts the key sequence into a canonical form (eg: converts `[27 109]` into `[134217837]`) in `which-key--maybe-replace-prefix-name`, so that the prefixes are found. I think some work is probably needed for `which-key-prefix-title-alist` too, but I'm not entirely sure what that's used for, so I didn't mess with it. --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index f5e5c79dd54..fc82da92e90 100644 --- a/which-key.el +++ b/which-key.el @@ -1109,9 +1109,10 @@ and DESC is the description that is possibly replaced using the `which-key-prefix-name-alist'. Whether or not a replacement occurs return the new STRING." (let* ((alist which-key-prefix-name-alist) - (res (assoc key-lst alist)) + (canonical-key-lst (listify-key-sequence (kbd (key-description key-lst)))) + (res (assoc canonical-key-lst alist)) (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist (assoc key-lst mode-alist)))) + (mode-res (when mode-alist (assoc canonical-key-lst mode-alist)))) (cond (mode-res (cdr mode-res)) (res (cdr res)) (t desc)))) From 2f4c5d8609cc31bb7212126dcaf45dd55d21880a Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 30 Nov 2015 11:23:50 -0500 Subject: [PATCH 378/816] Use key-description for canonical keys This takes the idea in the previous commit and translates the representations of keys in the alists to be the output of key-description. The issue is that `M-x` for example has two representations with listify-key-sequence, but only one (it seems) from key-description. --- which-key.el | 138 +++++++++++++++++++++++++-------------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/which-key.el b/which-key.el index fc82da92e90..b72de6f545c 100644 --- a/which-key.el +++ b/which-key.el @@ -400,15 +400,15 @@ variable.") (defvar which-key-prefix-name-alist '() "An alist with elements of the form (key-sequence . prefix-name). -key-sequence is a sequence of the sort produced by applying `kbd' -then `listify-key-sequence' to create a canonical version of the -key sequence. prefix-name is a string.") +key-sequence is a sequence of the sort produced by applying +`key-description' to create a canonical version of the key +sequence. prefix-name is a string.") (defvar which-key-prefix-title-alist '() "An alist with elements of the form (key-sequence . prefix-title). -key-sequence is a sequence of the sort produced by applying `kbd' -then `listify-key-sequence' to create a canonical version of the -key sequence. prefix-title is a string. The title is displayed +key-sequence is a sequence of the sort produced by applying +`key-description' to create a canonical version of the key +sequence. prefix-title is a string. The title is displayed alongside the actual current key sequence when `which-key-show-prefix' is set to either top or echo.") @@ -470,7 +470,7 @@ set too high) and setup which-key buffer." (when (or (eq which-key-show-prefix 'echo) (eq which-key-popup-type 'minibuffer)) (which-key--setup-echo-keystrokes)) - (which-key--check-key-based-alist) + ;; (which-key--check-key-based-alist) ;; (which-key--setup-undo-key) (which-key--init-buffer) (setq which-key--is-setup t)) @@ -509,35 +509,35 @@ starter kit for example." ;; (which-key-define-key-recursively ;; map (kbd which-key-undo-key) 'which-key-undo)))) -(defun which-key--check-key-based-alist () - "Check (and fix if necessary) `which-key-key-based-description-replacement-alist'" - (let ((alist which-key-key-based-description-replacement-alist) - old-style res) - (dolist (cns alist) - (cond ((listp (car cns)) - (push cns res)) - ((stringp (car cns)) - (setq old-style t) - (push (cons (listify-key-sequence (kbd (car cns))) (cdr cns)) res)) - ((symbolp (car cns)) - (let (new-mode-alist) - (dolist (cns2 (cdr cns)) - (cond ((listp (car cns2)) - (push cns2 new-mode-alist)) - ((stringp (car cns2)) - (setq old-style t) - (push (cons (listify-key-sequence (kbd (car cns2))) (cdr cns2)) - new-mode-alist)))) - (push (cons (car cns) new-mode-alist) res))) - (t (message "which-key: there's a problem with the \ -entry %s in which-key-key-based-replacement-alist" cns)))) - (setq which-key-key-based-description-replacement-alist res) - (when old-style - (message "which-key: \ - `which-key-key-based-description-replacement-alist' has changed format and you\ - seem to be using the old format. Please use the functions \ -`which-key-add-key-based-replacements' and \ -`which-key-add-major-mode-key-based-replacements' instead.")))) +;; (defun which-key--check-key-based-alist () +;; "Check (and fix if necessary) `which-key-key-based-description-replacement-alist'" +;; (let ((alist which-key-key-based-description-replacement-alist) +;; old-style res) +;; (dolist (cns alist) +;; (cond ((listp (car cns)) +;; (push cns res)) +;; ((stringp (car cns)) +;; (setq old-style t) +;; (push (cons (listify-key-sequence (kbd (car cns))) (cdr cns)) res)) +;; ((symbolp (car cns)) +;; (let (new-mode-alist) +;; (dolist (cns2 (cdr cns)) +;; (cond ((listp (car cns2)) +;; (push cns2 new-mode-alist)) +;; ((stringp (car cns2)) +;; (setq old-style t) +;; (push (cons (listify-key-sequence (kbd (car cns2))) (cdr cns2)) +;; new-mode-alist)))) +;; (push (cons (car cns) new-mode-alist) res))) +;; (t (message "which-key: there's a problem with the \ +;; entry %s in which-key-key-based-replacement-alist" cns)))) +;; (setq which-key-key-based-description-replacement-alist res) +;; (when old-style +;; (message "which-key: \ +;; `which-key-key-based-description-replacement-alist' has changed format and you\ +;; seem to be using the old format. Please use the functions \ +;; `which-key-add-key-based-replacements' and \ +;; `which-key-add-major-mode-key-based-replacements' instead.")))) ;; Default configuration functions for use by users. Should be the "best" ;; configurations @@ -584,15 +584,15 @@ bottom." (when (or (not (stringp key)) (not (stringp value))) (error "which-key: Error %s (key) and %s (value) should be strings" key value)) - (let ((key-lst (listify-key-sequence (kbd key)))) - (cond ((null alist) (list (cons key-lst value))) - ((assoc key-lst alist) - (when (not (string-equal (cdr (assoc key-lst alist)) value)) + (let ((keys (key-description (kbd key)))) + (cond ((null alist) (list (cons keys value))) + ((assoc-string keys alist) + (when (not (string-equal (cdr (assoc-string keys alist)) value)) (message "which-key: changing %s name from %s to %s in the %s alist" - key (cdr (assoc key-lst alist)) value alist-name) - (setcdr (assoc key-lst alist) value)) + key (cdr (assoc-string keys alist)) value alist-name) + (setcdr (assoc-string keys alist) value)) alist) - (t (cons (cons key-lst value) alist))))) + (t (cons (cons keys value) alist))))) ;;;###autoload (defun which-key-add-key-based-replacements (key-sequence replacement &rest more) @@ -641,11 +641,11 @@ Add title for KEY-SEQ-STR given by TITLE. FORCE, if non-nil, will add the new title even if one already exists. KEY-SEQ-STR should be a key sequence string suitable for `kbd' and TITLE should be a string." - (let ((key-seq-lst (listify-key-sequence (kbd key-seq-str)))) + (let ((keys (key-description (kbd key-seq-str)))) (if (and (null force) - (assoc key-seq-lst which-key-prefix-title-alist)) + (assoc-string keys which-key-prefix-title-alist)) (message "which-key: Prefix title not added. A title exists for this prefix.") - (push (cons key-seq-lst title) which-key-prefix-title-alist)))) + (push (cons keys title) which-key-prefix-title-alist)))) ;;;###autoload (defun which-key-declare-prefixes (key-sequence name &rest more) @@ -1103,30 +1103,31 @@ replacement occurs return the new STRING." (when key-str (listify-key-sequence (kbd key-str)))))) -(defun which-key--maybe-replace-prefix-name (key-lst desc) - "KEY-LST is a list of keys produced by `listify-key-sequences' -and DESC is the description that is possibly replaced using the -`which-key-prefix-name-alist'. Whether or not a replacement -occurs return the new STRING." +(defun which-key--maybe-replace-prefix-name (keys desc) + "KEYS is a list of keys produced by `listify-key-sequences' and +`key-description'. DESC is the description that is possibly +replaced using the `which-key-prefix-name-alist'. Whether or not +a replacement occurs return the new STRING." (let* ((alist which-key-prefix-name-alist) - (canonical-key-lst (listify-key-sequence (kbd (key-description key-lst)))) - (res (assoc canonical-key-lst alist)) + (res (assoc-string keys alist)) (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist (assoc canonical-key-lst mode-alist)))) + (mode-res (when mode-alist + (assoc-string keys mode-alist)))) (cond (mode-res (cdr mode-res)) (res (cdr res)) (t desc)))) -(defun which-key--maybe-get-prefix-title (key-lst) - "KEY-LST is a list of keys produced by `listify-key-sequences'. +(defun which-key--maybe-get-prefix-title (keys) + "KEYS is a string produced by `key-description'. A title is possibly returned using `which-key-prefix-title-alist'. An empty stiring is returned if no title exists." - (if key-lst + (if keys (let* ((alist which-key-prefix-title-alist) - (res (assoc key-lst alist)) + (res (assoc-string keys alist)) (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist (assoc key-lst mode-alist))) - (binding (key-binding (apply #'vector key-lst))) + (mode-res (when mode-alist + (assoc-string keys mode-alist))) + (binding (key-binding keys)) (alternate (when (and binding (symbolp binding)) (symbol-name binding)))) (cond (mode-res (cdr mode-res)) @@ -1137,19 +1138,19 @@ An empty stiring is returned if no title exists." (eq which-key-side-window-location 'bottom) echo-keystrokes) (if alternate alternate - (concat "Following " (key-description key-lst)))) + (concat "Following " keys))) (t ""))) "Top-level bindings")) -(defun which-key--maybe-replace-key-based (string key-lst) - "KEY-LST is a list of keys produced by `listify-key-sequences' +(defun which-key--maybe-replace-key-based (string keys) + "KEYS is a string produced by `key-description' and STRING is the description that is possibly replaced using the `which-key-key-based-description-replacement-alist'. Whether or not a replacement occurs return the new STRING." (let* ((alist which-key-key-based-description-replacement-alist) - (str-res (assoc key-lst alist)) + (str-res (assoc-string keys alist)) (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist (assoc key-lst 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)))) @@ -1246,7 +1247,6 @@ alists. Returns a list (key separator description)." (orig-desc (cdr key-desc-cons)) (group (which-key--group-p orig-desc)) (keys (which-key--current-key-string key)) - (key-lst (which-key--current-key-list key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern orig-desc))) (hl-face (which-key--highlight-face orig-desc)) @@ -1254,9 +1254,9 @@ alists. Returns a list (key separator description)." key which-key-key-replacement-alist)) (desc (which-key--maybe-replace orig-desc which-key-description-replacement-alist)) - (desc (which-key--maybe-replace-key-based desc key-lst)) + (desc (which-key--maybe-replace-key-based desc keys)) (desc (if group - (which-key--maybe-replace-prefix-name key-lst desc) + (which-key--maybe-replace-prefix-name keys desc) desc)) (key-w-face (which-key--propertize-key key)) (desc-w-face (which-key--propertize-description @@ -1520,7 +1520,7 @@ enough space based on your settings and frame size." prefix-keys) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) (status-top (propertize (which-key--maybe-get-prefix-title - (which-key--current-key-list)) + (which-key--current-key-string)) 'face 'which-key-note-face)) (status-top (concat status-top (when (< 1 n-pages) From 70a471687987e832137961069be7dd2cbb9ab1c9 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 30 Nov 2015 13:26:19 -0500 Subject: [PATCH 379/816] Use safe version of string-width --- which-key.el | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index f5e5c79dd54..ab9be1f22db 100644 --- a/which-key.el +++ b/which-key.el @@ -1073,6 +1073,10 @@ coming before a prefix. Within these categories order using ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for retrieving and formatting keys +(defsubst which-key--string-width (maybe-string) + "If MAYBE-STRING is a string use `which-key--string-width' o/w return 0." + (if (stringp maybe-string) (string-width maybe-string) 0)) + (defsubst which-key--safe-lookup-key (keymap key) "Version of `lookup-key' that allows KEYMAP to be nil. KEY is not checked." (when (keymapp keymap) (lookup-key keymap key))) @@ -1170,7 +1174,8 @@ If KEY contains any \"special keys\" defined in (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 (string-width key-w-face)))) + (substring key-w-face end + (which-key--string-width key-w-face)))) key-w-face)))) (defsubst which-key--truncate-description (desc) @@ -1352,7 +1357,8 @@ BUFFER that follow the key sequence KEY-SEQ." "Internal function for finding the max length of the INDEX element in each list element of KEYS." (cl-reduce - (lambda (x y) (max x (string-width (nth index y)))) keys :initial-value 0)) + (lambda (x y) (max x (which-key--string-width (nth index y)))) + keys :initial-value 0)) (defun which-key--pad-column (col-keys) "Take a column of (key separator description) COL-KEYS, @@ -1422,7 +1428,7 @@ is the width of the live window." (prefix-keys-desc (key-description which-key--current-prefix)) (prefix-w-face (which-key--propertize-key prefix-keys-desc)) (prefix-left (when (eq which-key-show-prefix 'left) - (+ 2 (string-width prefix-w-face)))) + (+ 2 (which-key--string-width prefix-w-face)))) (prefix-top-bottom (member which-key-show-prefix '(bottom top))) (avl-lines (if prefix-top-bottom (- max-lines 1) max-lines)) (min-lines (min avl-lines which-key-min-display-lines)) @@ -1526,8 +1532,8 @@ enough space based on your settings and frame size." prefix-keys) (propertize (format " (%s of %s)" (1+ page-n) n-pages) 'face 'which-key-note-face)))) - (first-col-width (+ 2 (max (string-width prefix-w-face) - (string-width status-left)))) + (first-col-width (+ 2 (max (which-key--string-width prefix-w-face) + (which-key--string-width status-left)))) (prefix-left (format (concat "%-" (int-to-string first-col-width) "s") prefix-w-face)) (status-left (format (concat "%-" (int-to-string first-col-width) "s") From 7a30f4d4431ca155a14d1920cfae2fd04da52676 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 30 Nov 2015 18:43:09 -0500 Subject: [PATCH 380/816] Fix return value problem for make-text-button Apparently in versions before 24.5 the return value was not always the button itself when a string was used as the argument --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 758fd00f554..04bc4ef9a46 100644 --- a/which-key.el +++ b/which-key.el @@ -1237,7 +1237,8 @@ ORIGINAL-DESCRIPTION is the description given by (max (floor (* (frame-width) 0.8)))) (if (> (length str) max) (concat (substring str 0 max) "...") - str))))))))) + str))))))) + desc)) (defun which-key--format-and-replace (unformatted) "Take a list of (key . desc) cons cells in UNFORMATTED, add From db97a29be52d2a9d6ac096fd12783976cca45b2b Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 30 Nov 2015 20:58:48 -0500 Subject: [PATCH 381/816] Cleanup make-text-button call --- which-key.el | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/which-key.el b/which-key.el index 04bc4ef9a46..57f475368cd 100644 --- a/which-key.el +++ b/which-key.el @@ -1218,26 +1218,24 @@ ORIGINAL-DESCRIPTION is the description given by (substring desc 6) desc)) (desc (if group (concat "+" desc) desc)) (desc (which-key--truncate-description desc))) - (eval - `(make-text-button - ,desc nil - 'face ',(cond (hl-face hl-face) - (group 'which-key-group-description-face) - (local 'which-key-local-map-description-face) - (t 'which-key-command-description-face)) - 'help-echo ,(cond - ((and (fboundp (intern original-description)) - (documentation (intern original-description)) - tooltip-mode) - (documentation (intern original-description))) - ((and (fboundp (intern original-description)) - (documentation (intern original-description)) - (let* ((doc (documentation (intern original-description))) - (str (replace-regexp-in-string "\n" " " doc)) - (max (floor (* (frame-width) 0.8)))) - (if (> (length str) max) - (concat (substring str 0 max) "...") - str))))))) + (make-text-button desc nil + 'face (cond (hl-face hl-face) + (group 'which-key-group-description-face) + (local 'which-key-local-map-description-face) + (t 'which-key-command-description-face)) + 'help-echo (cond + ((and (fboundp (intern original-description)) + (documentation (intern original-description)) + tooltip-mode) + (documentation (intern original-description))) + ((and (fboundp (intern original-description)) + (documentation (intern original-description)) + (let* ((doc (documentation (intern original-description))) + (str (replace-regexp-in-string "\n" " " doc)) + (max (floor (* (frame-width) 0.8)))) + (if (> (length str) max) + (concat (substring str 0 max) "...") + str)))))) desc)) (defun which-key--format-and-replace (unformatted) From 3327e9cdf2f9ee8e94501137401a5200db6bdbf3 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 1 Dec 2015 11:53:02 -0500 Subject: [PATCH 382/816] Remove dependencies from README --- README.org | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.org b/README.org index c0e7e93e3a5..c87080e6c52 100644 --- a/README.org +++ b/README.org @@ -39,7 +39,6 @@ Many of these have been implemented and are described below. - [[#install][Install]] - [[#melpa][MELPA]] - [[#manually][Manually]] - - [[#dependencies][Dependencies]] - [[#initial-setup][Initial Setup]] - [[#side-window-bottom-option][Side Window Bottom Option]] - [[#side-window-right-option][Side Window Right Option]] @@ -81,11 +80,6 @@ Add which-key.el to your =load-path= and require. Something like (which-key-mode) #+END_SRC -**** Dependencies - -Which-key requires recent versions of the packages [[https://github.com/magnars/dash.el][dash]] and [[https://github.com/magnars/s.el][s]]. These are -installed automatically if installed via MELPA. - ** Initial Setup No further setup is required if you are happy with the default setup. To try other options, there are 3 choices of default configs that are preconfigured From b5ec6f8f8d95104fd1ffb397f15aa0b818b1c272 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 2 Dec 2015 22:27:08 -0500 Subject: [PATCH 383/816] Introduce C-h command dispatch function Replace role of show-next-page with C-h-dispatch which immediately reads a key and calls a command from C-h-map, which may be one of several paging commands, a command to undo the last keypress, or a command to directly access describe-prefix-bindings. This commit does not include documenting these changes in the readme. Note that several options become deprecated here as they no longer have the same (if any effect). --- which-key.el | 193 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 141 insertions(+), 52 deletions(-) diff --git a/which-key.el b/which-key.el index 57f475368cd..3a81d1f89bf 100644 --- a/which-key.el +++ b/which-key.el @@ -247,12 +247,40 @@ prefixes in `which-key-paging-prefixes'" ;; :group 'which-key ;; :type '(repeat symbol)) -(defcustom which-key-use-C-h-for-paging t +(defcustom which-key-use-C-h-commands t "Use C-h for paging if non-nil. Normally C-h after a prefix calls `describe-prefix-bindings'. This changes that command to a which-key paging command when which-key-mode is active." :group 'which-key :type 'boolean) +(defvaralias 'which-key-use-C-h-for-paging + 'which-key-use-C-h-commands) +(make-obsolete-variable 'which-key-use-C-h-for-paging + 'which-key-use-C-h-commands + "2015-12-2") + +(defvar which-key-C-h-map + (let ((map (make-sparse-keymap))) + (dolist (bind '(("\C-h" . which-key-show-standard-help) + ("h" . which-key-show-standard-help) + ("\C-n" . which-key-show-next-page-cycle) + ("n" . which-key-show-next-page-cycle) + ("\C-p" . which-key-show-previous-page-cycle) + ("p" . which-key-show-previous-page-cycle) + ("\C-u" . which-key-undo-key) + ("u" . which-key-undo-key))) + (define-key map (car bind) (cdr bind))) + map) + "Keymap for C-h commands.") + +(defvar which-key--paging-functions '(which-key-C-h-dispatch + which-key-turn-page + which-key-show-next-page + which-key-show-next-page-cycle + which-key-show-next-page-no-cycle + which-key-show-previous-page-cycle + which-key-show-previous-page-no-cycle)) + (defcustom which-key-prevent-C-h-from-cycling t "When using C-h for paging, which-key overrides the default @@ -262,6 +290,9 @@ prefixes in `which-key-paging-prefixes'" want which-key to cycle, set this to nil." :group 'which-key :type 'boolean) +(make-obsolete-variable 'which-key-prevent-C-h-from-cycling + "No longer applies. See `which-key-C-h-dispatch'" + "2015-12-2") (defcustom which-key-allow-evil-operators (boundp 'evil-this-operator) "Allow popup to show for evil operators. The popup is normally @@ -422,17 +453,17 @@ alongside the actual current key sequence when (lambda (prefix) (define-key map (kbd (concat prefix " " which-key-paging-key)) - #'which-key-show-next-page)) + #'which-key-C-h-dispatch)) which-key-paging-prefixes) map) (if which-key-mode (progn (setq which-key--echo-keystrokes-backup echo-keystrokes) (unless which-key--is-setup (which-key--setup)) - (unless (eq prefix-help-command 'which-key-show-next-page) + (unless (member prefix-help-command which-key--paging-functions) (setq which-key--prefix-help-cmd-backup prefix-help-command)) - (when which-key-use-C-h-for-paging - (setq prefix-help-command #'which-key-show-next-page)) + (when which-key-use-C-h-commands + (setq prefix-help-command #'which-key-C-h-dispatch)) (when which-key-show-remaining-keys (add-hook 'pre-command-hook #'which-key--lighter-restore)) (add-hook 'pre-command-hook #'which-key--hide-popup) @@ -502,13 +533,6 @@ starter kit for example." (setq which-key-key-replacement-alist (delete '("right" . "→") which-key-key-replacement-alist))) -;; (defun which-key--setup-undo-key () -;; "Bind `which-key-undo-key' in `which-key-undo-keymaps'." -;; (when (and which-key-undo-key which-key-undo-keymaps) -;; (dolist (map which-key-undo-keymaps) -;; (which-key-define-key-recursively -;; map (kbd which-key-undo-key) 'which-key-undo)))) - ;; (defun which-key--check-key-based-alist () ;; "Check (and fix if necessary) `which-key-key-based-description-replacement-alist'" ;; (let ((alist which-key-key-based-description-replacement-alist) @@ -781,7 +805,7 @@ total height." (defun which-key--hide-popup () "This function is called to hide the which-key buffer." - (unless (eq real-this-command 'which-key-show-next-page) + (unless (member real-this-command which-key--paging-functions) (setq which-key--current-page-n nil which-key--using-top-level nil which-key--on-last-page nil) @@ -1472,31 +1496,26 @@ area." delay nil (lambda () (let (message-log-max) (message "%s" text)))))) -(defun which-key--next-page-hint (prefix-keys page-n n-pages) +(defun which-key--next-page-hint (prefix-keys n-pages) "Return string for next page hint." (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) - (paging-key-bound (eq 'which-key-show-next-page + (paging-key-bound (eq 'which-key-C-h-dispatch (key-binding (kbd paging-key)))) - (key (if paging-key-bound which-key-paging-key "C-h")) - (next-page-n (format "pg %s" (1+ (mod (1+ page-n) n-pages)))) - (use-descbind (and which-key--on-last-page which-key-use-C-h-for-paging - which-key-prevent-C-h-from-cycling))) - (when (and (or (and (< 1 n-pages) which-key-use-C-h-for-paging) - (and (< 1 n-pages) paging-key-bound) - use-descbind) + (key (if paging-key-bound which-key-paging-key "C-h"))) + (when (and (or (and (< 1 n-pages) which-key-use-C-h-commands) + (and (< 1 n-pages) paging-key-bound)) (not (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator)))) - (propertize (format "[%s %s]" key - (if use-descbind "help" next-page-n)) + (propertize (format "[%s which-key cmds]" key) 'face 'which-key-note-face)))) (defun which-key--get-popup-map () (unless which-key--current-prefix (let ((map (make-sparse-keymap))) - (define-key map (kbd which-key-paging-key) #'which-key-show-next-page) - (when which-key-use-C-h-for-paging + (define-key map (kbd which-key-paging-key) #'which-key-C-h-dispatch) + (when which-key-use-C-h-commands ;; Show next page even when C-h is pressed - (define-key map (kbd "C-h") #'which-key-show-next-page)) + (define-key map (kbd "C-h") #'which-key-C-h-dispatch)) map))) (defun which-key--show-page (n) @@ -1538,7 +1557,7 @@ enough space based on your settings and frame size." prefix-keys) prefix-w-face)) (status-left (format (concat "%-" (int-to-string first-col-width) "s") status-left)) - (nxt-pg-hint (which-key--next-page-hint prefix-keys page-n n-pages)) + (nxt-pg-hint (which-key--next-page-hint prefix-keys n-pages)) new-end lines first) (cond ((and (< 1 n-pages) (eq which-key-show-prefix 'left)) @@ -1588,37 +1607,28 @@ enough space based on your settings and frame size." prefix-keys) (with-no-warnings (set-temporary-overlay-map (which-key--get-popup-map)))))) -(defun which-key-show-next-page () +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; paging functions + +(defun which-key-turn-page (&optional backward) "Show the next page of keys. Will force an update if called before `which-key--update'." - (interactive) (cond - ;; on last page and want default C-h behavior - ((and which-key--current-page-n - which-key--on-last-page - which-key-use-C-h-for-paging - which-key-prevent-C-h-from-cycling) - (which-key--hide-popup-ignore-command) - (which-key--stop-timer) - (funcall which-key--prefix-help-cmd-backup) - (which-key--start-timer)) ;; No which-key buffer showing ((null which-key--current-page-n) (let* ((keysbl (vconcat (butlast (append (this-single-command-keys) nil)))) (next-event (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence keysbl)))) - (which-key--stop-timer) (setq unread-command-events next-event) - (which-key--create-buffer-and-show keysbl) - (which-key--start-timer))) + (which-key--create-buffer-and-show keysbl))) ;; which-key buffer showing. turn page (t (let ((next-event (mapcar (lambda (ev) (cons t ev)) (which-key--current-key-list))) (next-page - (if which-key--current-page-n (1+ which-key--current-page-n) 0))) - (which-key--stop-timer) + (if which-key--current-page-n + (+ which-key--current-page-n (if backward -1 1)) 0))) (setq unread-command-events next-event) (if which-key--last-try-2-loc (let ((which-key-side-window-location which-key--last-try-2-loc) @@ -1627,6 +1637,52 @@ Will force an update if called before `which-key--update'." (which-key--show-page next-page)) (which-key--start-paging-timer))))) +;;;###autoload +(defun which-key-show-standard-help () + "Call the command in `which-key--prefix-help-cmd-backup'. +Usually this is `describe-prefix-bindings'." + (interactive) + (which-key--hide-popup-ignore-command) + (funcall which-key--prefix-help-cmd-backup) + (which-key--start-timer)) + +;;;###autoload +(defun which-key-show-next-page-no-cycle () + "Show next page of keys unless on the last page, in which case +call `which-key-show-standard-help'." + (interactive) + (if (and which-key--current-page-n + which-key--on-last-page) + (which-key-show-standard-help) + (which-key-turn-page))) +(defalias 'which-key-show-next-page 'which-key-show-next-page-no-cycle) +(make-obsolete 'which-key-show-next-page 'which-key-show-next-page-no-cycle + "2015-12-2") + +;;;###autoload +(defun which-key-show-previous-page-no-cycle () + "Show previous page of keys unless on the first page, in which +case do nothing." + (interactive) + (if (and which-key--current-page-n + (eq which-key--current-page-n 0)) + nil + (which-key-turn-page t))) + +;;;###autoload +(defun which-key-show-next-page-cycle () + "Show the next page of keys, cycling from end to beginning +after last page." + (interactive) + (which-key-turn-page)) + +;;;###autoload +(defun which-key-show-previous-page-cycle () + "Show the previous page of keys, cycling from beginning to end +after first page." + (interactive) + (which-key-turn-page t)) + ;;;###autoload (defun which-key-show-top-level () "Show top-level bindings." @@ -1634,16 +1690,49 @@ Will force an update if called before `which-key--update'." (setq which-key--using-top-level t) (which-key--create-buffer-and-show nil)) -(defun which-key-undo () +;;;###autoload +(defun which-key-undo-key () "Undo last keypress and force which-key update." (interactive) - (let* ((key-str (this-command-keys)) - (key-str (substring key-str 0 (- (length key-str) 2))) - (ev (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence key-str)))) + (let* ((key-lst (butlast (which-key--current-key-list) 1))) + (if key-lst + (progn + (setq unread-command-events + (mapcar (lambda (ev) (cons t ev)) key-lst)) + (which-key--create-buffer-and-show + (key-description key-lst))) + (which-key-show-top-level))) + (which-key--start-timer)) +(defalias 'which-key-undo 'which-key-undo-key) + +(defun which-key-nil () + "Abort key sequence." + (interactive) + (message "abort") + (which-key--start-timer)) + +;;;###autoload +(defun which-key-C-h-dispatch () + "Dispatch C-h commands by looking up key in +`which-key-C-h-map'. This command is always accessible (from any +prefix) if `which-key-use-C-h-commands' is non nil." + (interactive) + (let* ((prefix-keys (key-description which-key--current-prefix)) + (prefix-w-face (if (eq which-key-show-prefix 'echo) prefix-keys + (which-key--propertize-key prefix-keys))) + (dash-w-face (if which-key--current-prefix + (if (eq which-key-show-prefix 'echo) "-" + (propertize "-" 'face 'which-key-key-face)) + "")) + (k (string + (read-key + (concat prefix-w-face dash-w-face + (propertize " [n]ext-page, [p]revious-page, [u]ndo-key, [h]elp" + 'face 'which-key-note-face))))) + (cmd (lookup-key which-key-C-h-map k)) + which-key-inhibit) (which-key--stop-timer) - (setq unread-command-events ev) - (which-key--create-buffer-and-show key-str) - (which-key--start-timer))) + (if cmd (funcall cmd) (which-key-nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update @@ -1727,7 +1816,7 @@ Finally, show the buffer." (setq which-key--paging-timer (run-with-idle-timer 0.2 t (lambda () - (when (or (not (eq real-last-command 'which-key-show-next-page)) + (when (or (not (member real-last-command which-key--paging-functions)) (and (< 0 (length (this-single-command-keys))) (not (equal which-key--current-prefix (this-single-command-keys))))) From 9846929ddf094929e824f69cde222b7d7af0d851 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Dec 2015 08:10:50 -0500 Subject: [PATCH 384/816] Fix undo and timer usage --- which-key.el | 54 +++++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/which-key.el b/which-key.el index 3a81d1f89bf..3885826303f 100644 --- a/which-key.el +++ b/which-key.el @@ -279,8 +279,9 @@ prefixes in `which-key-paging-prefixes'" which-key-show-next-page-cycle which-key-show-next-page-no-cycle which-key-show-previous-page-cycle - which-key-show-previous-page-no-cycle)) - + which-key-show-previous-page-no-cycle + which-key-undo-key + which-key-undo)) (defcustom which-key-prevent-C-h-from-cycling t "When using C-h for paging, which-key overrides the default @@ -1126,10 +1127,7 @@ replacement occurs return the new STRING." (listify-key-sequence (kbd key-str))))) (defsubst which-key--current-key-string (&optional key-str) - (key-description - (append (listify-key-sequence which-key--current-prefix) - (when key-str - (listify-key-sequence (kbd key-str)))))) + (key-description (which-key--current-key-list key-str))) (defun which-key--maybe-replace-prefix-name (keys desc) "KEYS is a list of keys produced by `listify-key-sequences' and @@ -1642,19 +1640,20 @@ Will force an update if called before `which-key--update'." "Call the command in `which-key--prefix-help-cmd-backup'. Usually this is `describe-prefix-bindings'." (interactive) - (which-key--hide-popup-ignore-command) - (funcall which-key--prefix-help-cmd-backup) - (which-key--start-timer)) + (let (which-key-inhibit) + (which-key--hide-popup-ignore-command) + (funcall which-key--prefix-help-cmd-backup))) ;;;###autoload (defun which-key-show-next-page-no-cycle () "Show next page of keys unless on the last page, in which case call `which-key-show-standard-help'." (interactive) - (if (and which-key--current-page-n - which-key--on-last-page) - (which-key-show-standard-help) - (which-key-turn-page))) + (let (which-key-inhibit) + (if (and which-key--current-page-n + which-key--on-last-page) + (which-key-show-standard-help) + (which-key-turn-page)))) (defalias 'which-key-show-next-page 'which-key-show-next-page-no-cycle) (make-obsolete 'which-key-show-next-page 'which-key-show-next-page-no-cycle "2015-12-2") @@ -1664,24 +1663,27 @@ call `which-key-show-standard-help'." "Show previous page of keys unless on the first page, in which case do nothing." (interactive) - (if (and which-key--current-page-n - (eq which-key--current-page-n 0)) - nil - (which-key-turn-page t))) + (let (which-key-inhibit) + (if (and which-key--current-page-n + (eq which-key--current-page-n 0)) + nil + (which-key-turn-page t)))) ;;;###autoload (defun which-key-show-next-page-cycle () "Show the next page of keys, cycling from end to beginning after last page." (interactive) - (which-key-turn-page)) + (let (which-key-inhibit) + (which-key-turn-page))) ;;;###autoload (defun which-key-show-previous-page-cycle () "Show the previous page of keys, cycling from beginning to end after first page." (interactive) - (which-key-turn-page t)) + (let (which-key-inhibit) + (which-key-turn-page t))) ;;;###autoload (defun which-key-show-top-level () @@ -1694,22 +1696,22 @@ after first page." (defun which-key-undo-key () "Undo last keypress and force which-key update." (interactive) - (let* ((key-lst (butlast (which-key--current-key-list) 1))) + (let* ((key-lst (butlast (which-key--current-key-list))) + which-key-inhibit) (if key-lst (progn (setq unread-command-events (mapcar (lambda (ev) (cons t ev)) key-lst)) (which-key--create-buffer-and-show - (key-description key-lst))) - (which-key-show-top-level))) - (which-key--start-timer)) + (apply #'vector key-lst))) + (which-key-show-top-level)))) (defalias 'which-key-undo 'which-key-undo-key) (defun which-key-nil () "Abort key sequence." (interactive) - (message "abort") - (which-key--start-timer)) + (let (which-key-inhibit) + (message "abort"))) ;;;###autoload (defun which-key-C-h-dispatch () @@ -1731,7 +1733,6 @@ prefix) if `which-key-use-C-h-commands' is non nil." 'face 'which-key-note-face))))) (cmd (lookup-key which-key-C-h-map k)) which-key-inhibit) - (which-key--stop-timer) (if cmd (funcall cmd) (which-key-nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1813,6 +1814,7 @@ Finally, show the buffer." (defun which-key--start-paging-timer () "Activate timer to restart which-key after paging." (when which-key--paging-timer (cancel-timer which-key--paging-timer)) + (which-key--stop-timer) (setq which-key--paging-timer (run-with-idle-timer 0.2 t (lambda () From 5ebbe69cfb9067076f76f6085f3943b0d3d04b32 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Dec 2015 08:33:56 -0500 Subject: [PATCH 385/816] Fix note on right and add abort keys --- which-key.el | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 3885826303f..f84461fad61 100644 --- a/which-key.el +++ b/which-key.el @@ -261,7 +261,9 @@ prefixes in `which-key-paging-prefixes'" (defvar which-key-C-h-map (let ((map (make-sparse-keymap))) - (dolist (bind '(("\C-h" . which-key-show-standard-help) + (dolist (bind '(("\C-a" . which-key-abort) + ("a" . which-key-abort) + ("\C-h" . which-key-show-standard-help) ("h" . which-key-show-standard-help) ("\C-n" . which-key-show-next-page-cycle) ("n" . which-key-show-next-page-cycle) @@ -1500,11 +1502,10 @@ area." (paging-key-bound (eq 'which-key-C-h-dispatch (key-binding (kbd paging-key)))) (key (if paging-key-bound which-key-paging-key "C-h"))) - (when (and (or (and (< 1 n-pages) which-key-use-C-h-commands) - (and (< 1 n-pages) paging-key-bound)) + (when (and which-key-use-C-h-commands (not (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator)))) - (propertize (format "[%s which-key cmds]" key) + (propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) (defun which-key--get-popup-map () @@ -1707,11 +1708,12 @@ after first page." (which-key-show-top-level)))) (defalias 'which-key-undo 'which-key-undo-key) -(defun which-key-nil () +(defun which-key-abort () "Abort key sequence." (interactive) (let (which-key-inhibit) - (message "abort"))) + (which-key--hide-popup-ignore-command) + (message "Aborted key sequence"))) ;;;###autoload (defun which-key-C-h-dispatch () @@ -1729,11 +1731,11 @@ prefix) if `which-key-use-C-h-commands' is non nil." (k (string (read-key (concat prefix-w-face dash-w-face - (propertize " [n]ext-page, [p]revious-page, [u]ndo-key, [h]elp" + (propertize " [n]ext-page, [p]revious-page, [u]ndo-key, [h]elp, [a]bort" 'face 'which-key-note-face))))) (cmd (lookup-key which-key-C-h-map k)) which-key-inhibit) - (if cmd (funcall cmd) (which-key-nil)))) + (if cmd (funcall cmd) (which-key-abort)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update From 388c00736a6e93a7772d1ce9d27eaec96c159089 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Dec 2015 08:44:14 -0500 Subject: [PATCH 386/816] Add C-h commands to what's new in readme Still need to update the rest of the content --- README.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.org b/README.org index c87080e6c52..80312e8b805 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,14 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] ** What's New +- =C-h= commands! Now =C-h= will prompt you will several options instead of + going to the next page. You can (see =which-key-C-h-map=) + - Cycle through the pages forward with =n= (or =C-n=) + - Cycle backwards with =p= (or =C-p=) + - Undo the last entered key (!) with =u= (or =C-u=) + - Show the default command bound to =C-h= with =h= (or =C-h=) + This is a fairly substantial change and might introduce a bug or two, so + please report anything you see that is strange and I will try to fix it. - Use your mouse to hover over commands and the docstring will be displayed in the echo area or a tooltip, depending on whether or not you're using =tooltip-mode=. @@ -323,6 +331,8 @@ available options. #+END_SRC *** Paging Options +[Note: This section is out of date given the new =C-h= commands feature +described in the What's New section. I will update it soon.]. There are at least several prefixes that have many keys bound to them, like =C-x=. which-key displays as many keys as it can given your settings, but for these prefixes this may not be enough. The paging feature gives you the ability From 318f9de6a921dee457cd8ab113f0f5bd78c858bf Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Dec 2015 11:15:19 -0500 Subject: [PATCH 387/816] Fix top-level note and satisfy compiler --- which-key.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index f84461fad61..57214df430a 100644 --- a/which-key.el +++ b/which-key.el @@ -1149,7 +1149,7 @@ a replacement occurs return the new STRING." "KEYS is a string produced by `key-description'. A title is possibly returned using `which-key-prefix-title-alist'. An empty stiring is returned if no title exists." - (if keys + (if (not (string-equal keys "")) (let* ((alist which-key-prefix-title-alist) (res (assoc-string keys alist)) (mode-alist (assq major-mode alist)) @@ -1496,7 +1496,7 @@ area." delay nil (lambda () (let (message-log-max) (message "%s" text)))))) -(defun which-key--next-page-hint (prefix-keys n-pages) +(defun which-key--next-page-hint (prefix-keys) "Return string for next page hint." (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) (paging-key-bound (eq 'which-key-C-h-dispatch @@ -1556,7 +1556,7 @@ enough space based on your settings and frame size." prefix-keys) prefix-w-face)) (status-left (format (concat "%-" (int-to-string first-col-width) "s") status-left)) - (nxt-pg-hint (which-key--next-page-hint prefix-keys n-pages)) + (nxt-pg-hint (which-key--next-page-hint prefix-keys)) new-end lines first) (cond ((and (< 1 n-pages) (eq which-key-show-prefix 'left)) @@ -1730,7 +1730,9 @@ prefix) if `which-key-use-C-h-commands' is non nil." "")) (k (string (read-key - (concat prefix-w-face dash-w-face + (concat (when (string-equal prefix-keys "") + (propertize " Top-level bindings" 'face 'which-key-note-face)) + prefix-w-face dash-w-face (propertize " [n]ext-page, [p]revious-page, [u]ndo-key, [h]elp, [a]bort" 'face 'which-key-note-face))))) (cmd (lookup-key which-key-C-h-map k)) From baee0db96e8a0235ec17f8caea2c32a434b87c30 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 3 Dec 2015 12:10:47 -0500 Subject: [PATCH 388/816] Clarify C-h commands description in readme --- README.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index 80312e8b805..e6a94880ef2 100644 --- a/README.org +++ b/README.org @@ -2,11 +2,11 @@ [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] ** What's New - =C-h= commands! Now =C-h= will prompt you will several options instead of - going to the next page. You can (see =which-key-C-h-map=) + going directly to the next page. You can (see =which-key-C-h-map=) - Cycle through the pages forward with =n= (or =C-n=) - Cycle backwards with =p= (or =C-p=) - Undo the last entered key (!) with =u= (or =C-u=) - - Show the default command bound to =C-h= with =h= (or =C-h=) + - Call the default command bound to =C-h=, usually =describe-prefix-bindings=, with =h= (or =C-h=) This is a fairly substantial change and might introduce a bug or two, so please report anything you see that is strange and I will try to fix it. - Use your mouse to hover over commands and the docstring will be displayed in From 4fb75fa6eff6b6920f66a09170fae1744082d1e7 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Dec 2015 20:49:43 -0500 Subject: [PATCH 389/816] Don't abort key seq after unbound key in C-h-map Allows to recover from accidentally pressing C-h. This commit also fixes some echo area problems that become apprent after introducing the C-h-map stuff --- which-key.el | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/which-key.el b/which-key.el index 57214df430a..a875c23ce2f 100644 --- a/which-key.el +++ b/which-key.el @@ -1489,7 +1489,7 @@ is the width of the live window." Slight delay gets around evil functions that clear the echo area." (let* ((minibuffer (eq which-key-popup-type 'minibuffer)) - (delay (if minibuffer 0.2 0.01)) + (delay (if minibuffer 0.2 (+ echo-keystrokes 0.001))) message-log-max) (unless minibuffer (message "%s" text)) (run-with-idle-timer @@ -1609,7 +1609,7 @@ enough space based on your settings and frame size." prefix-keys) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; paging functions -(defun which-key-turn-page (&optional backward) +(defun which-key-turn-page (delta) "Show the next page of keys. Will force an update if called before `which-key--update'." (cond @@ -1627,7 +1627,7 @@ Will force an update if called before `which-key--update'." (mapcar (lambda (ev) (cons t ev)) (which-key--current-key-list))) (next-page (if which-key--current-page-n - (+ which-key--current-page-n (if backward -1 1)) 0))) + (+ which-key--current-page-n delta) 0))) (setq unread-command-events next-event) (if which-key--last-try-2-loc (let ((which-key-side-window-location which-key--last-try-2-loc) @@ -1641,7 +1641,7 @@ Will force an update if called before `which-key--update'." "Call the command in `which-key--prefix-help-cmd-backup'. Usually this is `describe-prefix-bindings'." (interactive) - (let (which-key-inhibit) + (let ((which-key-inhibit t)) (which-key--hide-popup-ignore-command) (funcall which-key--prefix-help-cmd-backup))) @@ -1650,11 +1650,11 @@ Usually this is `describe-prefix-bindings'." "Show next page of keys unless on the last page, in which case call `which-key-show-standard-help'." (interactive) - (let (which-key-inhibit) + (let ((which-key-inhibit t)) (if (and which-key--current-page-n which-key--on-last-page) (which-key-show-standard-help) - (which-key-turn-page)))) + (which-key-turn-page 1)))) (defalias 'which-key-show-next-page 'which-key-show-next-page-no-cycle) (make-obsolete 'which-key-show-next-page 'which-key-show-next-page-no-cycle "2015-12-2") @@ -1664,27 +1664,27 @@ call `which-key-show-standard-help'." "Show previous page of keys unless on the first page, in which case do nothing." (interactive) - (let (which-key-inhibit) + (let ((which-key-inhibit t)) (if (and which-key--current-page-n (eq which-key--current-page-n 0)) - nil - (which-key-turn-page t)))) + (which-key-turn-page 0) + (which-key-turn-page -1)))) ;;;###autoload (defun which-key-show-next-page-cycle () "Show the next page of keys, cycling from end to beginning after last page." (interactive) - (let (which-key-inhibit) - (which-key-turn-page))) + (let ((which-key-inhibit t)) + (which-key-turn-page 1))) ;;;###autoload (defun which-key-show-previous-page-cycle () "Show the previous page of keys, cycling from beginning to end after first page." (interactive) - (let (which-key-inhibit) - (which-key-turn-page t))) + (let ((which-key-inhibit t)) + (which-key-turn-page -1))) ;;;###autoload (defun which-key-show-top-level () @@ -1698,7 +1698,7 @@ after first page." "Undo last keypress and force which-key update." (interactive) (let* ((key-lst (butlast (which-key--current-key-list))) - which-key-inhibit) + (which-key-inhibit t)) (if key-lst (progn (setq unread-command-events @@ -1711,7 +1711,7 @@ after first page." (defun which-key-abort () "Abort key sequence." (interactive) - (let (which-key-inhibit) + (let ((which-key-inhibit t)) (which-key--hide-popup-ignore-command) (message "Aborted key sequence"))) @@ -1736,8 +1736,8 @@ prefix) if `which-key-use-C-h-commands' is non nil." (propertize " [n]ext-page, [p]revious-page, [u]ndo-key, [h]elp, [a]bort" 'face 'which-key-note-face))))) (cmd (lookup-key which-key-C-h-map k)) - which-key-inhibit) - (if cmd (funcall cmd) (which-key-abort)))) + (which-key-inhibit t)) + (if cmd (funcall cmd) (which-key-turn-page 0)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update From b3b41792e808e64428b42e8d7f05e977d02fc01f Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 4 Dec 2015 14:21:17 -0500 Subject: [PATCH 390/816] Make C-h command hint respect C-h-map commands --- which-key.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index a875c23ce2f..323584ba339 100644 --- a/which-key.el +++ b/which-key.el @@ -1733,7 +1733,15 @@ prefix) if `which-key-use-C-h-commands' is non nil." (concat (when (string-equal prefix-keys "") (propertize " Top-level bindings" 'face 'which-key-note-face)) prefix-w-face dash-w-face - (propertize " [n]ext-page, [p]revious-page, [u]ndo-key, [h]elp, [a]bort" + (propertize + (substitute-command-keys + (concat + " \\" + " \\[which-key-show-next-page-cycle]" which-key-separator "next-page," + " \\[which-key-show-previous-page-cycle]" which-key-separator "previous-page," + " \\[which-key-undo-key]" which-key-separator "undo-key," + " \\[which-key-show-standard-help]" which-key-separator "help," + " \\[which-key-abort]" which-key-separator "abort")) 'face 'which-key-note-face))))) (cmd (lookup-key which-key-C-h-map k)) (which-key-inhibit t)) From 0e87f61d72fd4b7a9cdb68ebc422307213dcd80e Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 4 Dec 2015 15:34:17 -0500 Subject: [PATCH 391/816] Work on handling prefix args better --- which-key.el | 65 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/which-key.el b/which-key.el index 323584ba339..f985a20b184 100644 --- a/which-key.el +++ b/which-key.el @@ -1450,9 +1450,9 @@ is the width of the live window." (max-lines (car max-dims)) (max-width (cdr max-dims)) (prefix-keys-desc (key-description which-key--current-prefix)) - (prefix-w-face (which-key--propertize-key prefix-keys-desc)) + (full-prefix (which-key--full-prefix prefix-keys-desc)) (prefix-left (when (eq which-key-show-prefix 'left) - (+ 2 (which-key--string-width prefix-w-face)))) + (+ 2 (which-key--string-width full-prefix)))) (prefix-top-bottom (member which-key-show-prefix '(bottom top))) (avl-lines (if prefix-top-bottom (- max-lines 1) max-lines)) (min-lines (min avl-lines which-key-min-display-lines)) @@ -1508,6 +1508,39 @@ area." (propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) +(if (fboundp 'universal-argument--description) + (defalias 'which-key--universal-argument--description + 'universal-argument--description) + (defun which-key--universal-argument--description () + ;; Backport of the definition of universal-argument--description in emacs25 + ;; on 2015-12-04 + (when prefix-arg + (concat "C-u" + (pcase prefix-arg + (`(-) " -") + (`(,(and (pred integerp) n)) + (let ((str "")) + (while (and (> n 4) (= (mod n 4) 0)) + (setq str (concat str " C-u")) + (setq n (/ n 4))) + (if (= n 4) str (format " %s" prefix-arg)))) + (_ (format " %s" prefix-arg))))))) + +(defun which-key--full-prefix (prefix-keys) + "Return a description of the full key sequence up to now, +including prefix arguments." + (let* ((left (eq which-key-show-prefix 'left)) + (str (concat + (which-key--universal-argument--description) + (when prefix-arg " ") + prefix-keys)) + (dash (if (and which-key--current-prefix + (null left)) "-" ""))) + (if (eq which-key-show-prefix 'echo) + (concat str dash) + (concat (which-key--propertize-key str) + (propertize dash 'face 'which-key-key-face))))) + (defun which-key--get-popup-map () (unless which-key--current-prefix (let ((map (make-sparse-keymap))) @@ -1534,12 +1567,7 @@ enough space based on your settings and frame size." prefix-keys) (width (nth page-n (plist-get which-key--pages-plist :page-widths))) (n-shown (nth page-n (plist-get which-key--pages-plist :keys/page))) (n-tot (plist-get which-key--pages-plist :tot-keys)) - (prefix-w-face (if (eq which-key-show-prefix 'echo) prefix-keys - (which-key--propertize-key prefix-keys))) - (dash-w-face (if which-key--current-prefix - (if (eq which-key-show-prefix 'echo) "-" - (propertize "-" 'face 'which-key-key-face)) - "")) + (full-prefix (which-key--full-prefix prefix-keys)) (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) 'face 'which-key-separator-face)) (status-top (propertize (which-key--maybe-get-prefix-title @@ -1550,10 +1578,10 @@ enough space based on your settings and frame size." prefix-keys) (propertize (format " (%s of %s)" (1+ page-n) n-pages) 'face 'which-key-note-face)))) - (first-col-width (+ 2 (max (which-key--string-width prefix-w-face) + (first-col-width (+ 2 (max (which-key--string-width full-prefix) (which-key--string-width status-left)))) (prefix-left (format (concat "%-" (int-to-string first-col-width) "s") - prefix-w-face)) + full-prefix)) (status-left (format (concat "%-" (int-to-string first-col-width) "s") status-left)) (nxt-pg-hint (which-key--next-page-hint prefix-keys)) @@ -1577,7 +1605,7 @@ enough space based on your settings and frame size." prefix-keys) (concat (when (or (null echo-keystrokes) (not (eq which-key-side-window-location 'bottom))) - (concat prefix-w-face dash-w-face " ")) + full-prefix) status-top " " nxt-pg-hint "\n" page))) ((eq which-key-show-prefix 'bottom) (setq page @@ -1585,10 +1613,10 @@ enough space based on your settings and frame size." prefix-keys) page "\n" (when (or (null echo-keystrokes) (not (eq which-key-side-window-location 'bottom))) - (concat prefix-w-face dash-w-face " ")) + full-prefix) status-top " " nxt-pg-hint))) ((eq which-key-show-prefix 'echo) - (which-key--echo (concat prefix-w-face dash-w-face + (which-key--echo (concat full-prefix (when prefix-keys " ") status-top (when status-top " ") nxt-pg-hint)))) @@ -1722,17 +1750,12 @@ after first page." prefix) if `which-key-use-C-h-commands' is non nil." (interactive) (let* ((prefix-keys (key-description which-key--current-prefix)) - (prefix-w-face (if (eq which-key-show-prefix 'echo) prefix-keys - (which-key--propertize-key prefix-keys))) - (dash-w-face (if which-key--current-prefix - (if (eq which-key-show-prefix 'echo) "-" - (propertize "-" 'face 'which-key-key-face)) - "")) + (full-prefix (which-key--full-prefix prefix-keys)) (k (string (read-key (concat (when (string-equal prefix-keys "") (propertize " Top-level bindings" 'face 'which-key-note-face)) - prefix-w-face dash-w-face + full-prefix (propertize (substitute-command-keys (concat @@ -1742,7 +1765,7 @@ prefix) if `which-key-use-C-h-commands' is non nil." " \\[which-key-undo-key]" which-key-separator "undo-key," " \\[which-key-show-standard-help]" which-key-separator "help," " \\[which-key-abort]" which-key-separator "abort")) - 'face 'which-key-note-face))))) + 'face 'which-key-note-face))))) (cmd (lookup-key which-key-C-h-map k)) (which-key-inhibit t)) (if cmd (funcall cmd) (which-key-turn-page 0)))) From 583416fda4c5d8b1196f5275d1113d915010a297 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 5 Dec 2015 12:37:29 -0500 Subject: [PATCH 392/816] Preserve prefx-arg when paging --- which-key.el | 56 +++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/which-key.el b/which-key.el index f985a20b184..a7e86c963af 100644 --- a/which-key.el +++ b/which-key.el @@ -1508,23 +1508,24 @@ area." (propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) -(if (fboundp 'universal-argument--description) - (defalias 'which-key--universal-argument--description - 'universal-argument--description) - (defun which-key--universal-argument--description () - ;; Backport of the definition of universal-argument--description in emacs25 - ;; on 2015-12-04 - (when prefix-arg - (concat "C-u" - (pcase prefix-arg - (`(-) " -") - (`(,(and (pred integerp) n)) - (let ((str "")) - (while (and (> n 4) (= (mod n 4) 0)) - (setq str (concat str " C-u")) - (setq n (/ n 4))) - (if (= n 4) str (format " %s" prefix-arg)))) - (_ (format " %s" prefix-arg))))))) +(eval-and-compile + (if (fboundp 'universal-argument--description) + (defalias 'which-key--universal-argument--description + 'universal-argument--description) + (defun which-key--universal-argument--description () + ;; Backport of the definition of universal-argument--description in emacs25 + ;; on 2015-12-04 + (when prefix-arg + (concat "C-u" + (pcase prefix-arg + (`(-) " -") + (`(,(and (pred integerp) n)) + (let ((str "")) + (while (and (> n 4) (= (mod n 4) 0)) + (setq str (concat str " C-u")) + (setq n (/ n 4))) + (if (= n 4) str (format " %s" prefix-arg)))) + (_ (format " %s" prefix-arg)))))))) (defun which-key--full-prefix (prefix-keys) "Return a description of the full key sequence up to now, @@ -1637,6 +1638,12 @@ enough space based on your settings and frame size." prefix-keys) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; paging functions +(defun which-key--reload-key-sequence (key-seq) + (let ((next-event (mapcar (lambda (ev) (cons t ev)) + (listify-key-sequence key-seq)))) + (setq prefix-arg current-prefix-arg + unread-command-events next-event))) + (defun which-key-turn-page (delta) "Show the next page of keys. Will force an update if called before `which-key--update'." @@ -1644,19 +1651,15 @@ Will force an update if called before `which-key--update'." ;; No which-key buffer showing ((null which-key--current-page-n) (let* ((keysbl - (vconcat (butlast (append (this-single-command-keys) nil)))) - (next-event - (mapcar (lambda (ev) (cons t ev)) (listify-key-sequence keysbl)))) - (setq unread-command-events next-event) + (vconcat (butlast (append (this-single-command-keys) nil))))) + (which-key--reload-key-sequence keysbl) (which-key--create-buffer-and-show keysbl))) ;; which-key buffer showing. turn page (t - (let ((next-event - (mapcar (lambda (ev) (cons t ev)) (which-key--current-key-list))) - (next-page + (let ((next-page (if which-key--current-page-n (+ which-key--current-page-n delta) 0))) - (setq unread-command-events next-event) + (which-key--reload-key-sequence (which-key--current-key-list)) (if which-key--last-try-2-loc (let ((which-key-side-window-location which-key--last-try-2-loc) (which-key--multiple-locations t)) @@ -1729,8 +1732,7 @@ after first page." (which-key-inhibit t)) (if key-lst (progn - (setq unread-command-events - (mapcar (lambda (ev) (cons t ev)) key-lst)) + (which-key--reload-key-sequence key-lst) (which-key--create-buffer-and-show (apply #'vector key-lst))) (which-key-show-top-level)))) From dd77323e9eed94d55bf998bf1f6ccac4797ab59b Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 6 Dec 2015 13:16:05 -0500 Subject: [PATCH 393/816] echo-keystrokes should never be nil The correct test is to test if it's 0. --- which-key.el | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/which-key.el b/which-key.el index a7e86c963af..3c9c117eaf5 100644 --- a/which-key.el +++ b/which-key.el @@ -1527,10 +1527,11 @@ area." (if (= n 4) str (format " %s" prefix-arg)))) (_ (format " %s" prefix-arg)))))))) -(defun which-key--full-prefix (prefix-keys) +(defun which-key--full-prefix (prefix-keys &optional -prefix-arg) "Return a description of the full key sequence up to now, including prefix arguments." (let* ((left (eq which-key-show-prefix 'left)) + (prefix-arg (if -prefix-arg -prefix-arg prefix-arg)) (str (concat (which-key--universal-argument--description) (when prefix-arg " ") @@ -1604,17 +1605,17 @@ enough space based on your settings and frame size." prefix-keys) ((eq which-key-show-prefix 'top) (setq page (concat - (when (or (null echo-keystrokes) + (when (or (= 0 echo-keystrokes) (not (eq which-key-side-window-location 'bottom))) - full-prefix) + (concat full-prefix " ")) status-top " " nxt-pg-hint "\n" page))) ((eq which-key-show-prefix 'bottom) (setq page (concat page "\n" - (when (or (null echo-keystrokes) + (when (or (= 0 echo-keystrokes) (not (eq which-key-side-window-location 'bottom))) - full-prefix) + (concat full-prefix " ")) status-top " " nxt-pg-hint))) ((eq which-key-show-prefix 'echo) (which-key--echo (concat full-prefix @@ -1752,23 +1753,22 @@ after first page." prefix) if `which-key-use-C-h-commands' is non nil." (interactive) (let* ((prefix-keys (key-description which-key--current-prefix)) - (full-prefix (which-key--full-prefix prefix-keys)) - (k (string - (read-key - (concat (when (string-equal prefix-keys "") - (propertize " Top-level bindings" 'face 'which-key-note-face)) - full-prefix - (propertize - (substitute-command-keys - (concat - " \\" - " \\[which-key-show-next-page-cycle]" which-key-separator "next-page," - " \\[which-key-show-previous-page-cycle]" which-key-separator "previous-page," - " \\[which-key-undo-key]" which-key-separator "undo-key," - " \\[which-key-show-standard-help]" which-key-separator "help," - " \\[which-key-abort]" which-key-separator "abort")) - 'face 'which-key-note-face))))) - (cmd (lookup-key which-key-C-h-map k)) + (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg)) + (prompt (concat (when (string-equal prefix-keys "") + (propertize " Top-level bindings" 'face 'which-key-note-face)) + full-prefix + (propertize + (substitute-command-keys + (concat + " \\" + " \\[which-key-show-next-page-cycle]" which-key-separator "next-page," + " \\[which-key-show-previous-page-cycle]" which-key-separator "previous-page," + " \\[which-key-undo-key]" which-key-separator "undo-key," + " \\[which-key-show-standard-help]" which-key-separator "help," + " \\[which-key-abort]" which-key-separator "abort")) + 'face 'which-key-note-face))) + (key (string (read-key prompt))) + (cmd (lookup-key which-key-C-h-map key)) (which-key-inhibit t)) (if cmd (funcall cmd) (which-key-turn-page 0)))) From 37f28136dd66d057faa9b5c3a1ce05585f118304 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 6 Dec 2015 13:29:25 -0500 Subject: [PATCH 394/816] Tweak display of key sequence in one case This is for the C-h commands when the which-key message is not shown in the echo area but the echo-keystrokes prefix is --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 3c9c117eaf5..059cceda9ae 100644 --- a/which-key.el +++ b/which-key.el @@ -1527,7 +1527,7 @@ area." (if (= n 4) str (format " %s" prefix-arg)))) (_ (format " %s" prefix-arg)))))))) -(defun which-key--full-prefix (prefix-keys &optional -prefix-arg) +(defun which-key--full-prefix (prefix-keys &optional -prefix-arg dont-prop-keys) "Return a description of the full key sequence up to now, including prefix arguments." (let* ((left (eq which-key-show-prefix 'left)) @@ -1538,7 +1538,7 @@ including prefix arguments." prefix-keys)) (dash (if (and which-key--current-prefix (null left)) "-" ""))) - (if (eq which-key-show-prefix 'echo) + (if (or (eq which-key-show-prefix 'echo) dont-prop-keys) (concat str dash) (concat (which-key--propertize-key str) (propertize dash 'face 'which-key-key-face))))) @@ -1753,7 +1753,7 @@ after first page." prefix) if `which-key-use-C-h-commands' is non nil." (interactive) (let* ((prefix-keys (key-description which-key--current-prefix)) - (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg)) + (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) (prompt (concat (when (string-equal prefix-keys "") (propertize " Top-level bindings" 'face 'which-key-note-face)) full-prefix From 30bc0c224bac091fcf2759c8e8853e7237196090 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 8 Dec 2015 20:24:23 -0500 Subject: [PATCH 395/816] Allow custom prefix-prefix Suggested in #90. Thanks @Amorymeltzer --- which-key.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 059cceda9ae..8254b60eb15 100644 --- a/which-key.el +++ b/which-key.el @@ -98,7 +98,15 @@ of the which-key popup." (defcustom which-key-separator (if which-key-dont-use-unicode " : " " → ") - "Separator to use between key and description." + "Separator to use between key and description. Default is \" → +\", unless `which-key-dont-use-unicode' is non nil, in which case +the default is \" : \"." + :group 'which-key + :type 'string) + +(defcustom which-key-prefix-prefix "+" + "String to insert in front of prefix commands (i.e., commands +that represent a sub-map). Default is \"+\"." :group 'which-key :type 'string) @@ -1240,7 +1248,7 @@ ORIGINAL-DESCRIPTION is the description given by (let* ((desc description) (desc (if (string-match-p "^group:" desc) (substring desc 6) desc)) - (desc (if group (concat "+" desc) desc)) + (desc (if group (concat which-key-prefix-prefix desc) desc)) (desc (which-key--truncate-description desc))) (make-text-button desc nil 'face (cond (hl-face hl-face) From 06c312b4d578f342b6d02d62831079bc1587e984 Mon Sep 17 00:00:00 2001 From: Amory Meltzer Date: Wed, 9 Dec 2015 13:19:23 -0800 Subject: [PATCH 396/816] Document which-key-prefix-prefix https://github.com/justbur/emacs-which-key/commit/30bc0c224bac091fcf2759c8e8853e7237196090 --- README.org | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.org b/README.org index e6a94880ef2..65cc49f6bf1 100644 --- a/README.org +++ b/README.org @@ -448,6 +448,10 @@ shown. (setq which-key-separator " → " ) (setq which-key-unicode-correction 3) + ;; Set the prefix string that will be inserted in front of prefix commands + ;; (i.e., commands that represent a sub-map). + (setq which-key-prefix-prefix "+" ) + ;; Set the special keys. These are automatically truncated to one character and ;; have which-key-special-key-face applied. Set this variable to nil to disable ;; the feature From 47ef300b855a8aaab89c665f7014963523a7d15c Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 10 Dec 2015 20:02:58 -0500 Subject: [PATCH 397/816] Add which-key-init-buffer-hook --- which-key.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 8254b60eb15..5986ae6af7c 100644 --- a/which-key.el +++ b/which-key.el @@ -321,6 +321,10 @@ See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" :group 'which-key :type 'boolean) +;; Hooks +(defvar which-key-init-buffer-hook '() + "Hook run when which-key buffer is initialized.") + ;; Faces (defgroup which-key-faces nil "Faces for which-key-mode" @@ -503,7 +507,8 @@ alongside the actual current key sequence when (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) (setq-local mode-line-format nil) - (setq-local word-wrap nil)))) + (setq-local word-wrap nil) + (run-hooks 'which-key-init-buffer-hook)))) (defun which-key--setup () "Initial setup for which-key. From 14a11c6d69fea066a56cec0ce2702580ef86a9f1 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 11 Dec 2015 15:29:59 -0500 Subject: [PATCH 398/816] Ignore evil-state bindings These are the fake keys that evil uses to store maps under --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 5986ae6af7c..09cc404b7a3 100644 --- a/which-key.el +++ b/which-key.el @@ -1310,7 +1310,7 @@ alists. Returns a list (key separator description)." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) (buffer (current-buffer)) (ignore-bindings '("self-insert-command" "ignore" "ignore-event" "company-ignore")) - (ignore-keys-regexp "mouse-\\|wheel-\\|remap\\|drag-\\|scroll-bar\\|select-window\\|switch-frame") + (ignore-keys-regexp "mouse-\\|wheel-\\|remap\\|drag-\\|scroll-bar\\|select-window\\|switch-frame\\|-state") (ignore-sections-regexp "\\(Key translations\\|Function key map translations\\|Input decoding map translations\\)")) (with-temp-buffer (let ((indent-tabs-mode t)) From ad60a6c7206752d9b9cf4ba17c2293dba365e9fb Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 17 Dec 2015 09:27:22 -0500 Subject: [PATCH 399/816] New stable version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 09cc404b7a3..b04af5cd446 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.7.1 +;; Version: 0.8 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 4a10ab21287a35c570ad95450fdca96fdcd65a69 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 20 Dec 2015 13:19:16 -0500 Subject: [PATCH 400/816] Add which-key-show-keymap Basic version of this command that only shows the top-level of a keymap. Waiting for feedback on how this should work. --- which-key.el | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index b04af5cd446..4a9d11c222a 100644 --- a/which-key.el +++ b/which-key.el @@ -1305,6 +1305,21 @@ alists. Returns a list (key separator description)." (list key-w-face sep-w-face desc-w-face))) unformatted))) +(defun which-key--get-keymap-bindings (keymap) + "Retrieve top-level bindings from KEYMAP." + (let (bindings) + (map-keymap + (lambda (ev def) + (cl-pushnew + (cons (key-description (list ev)) + (cond ((keymapp def) "Prefix Command") + ((symbolp def) (copy-sequence (symbol-name def))) + ((eq 'lambda (car-safe def)) "lambda") + (t (format "%s" def)))) + bindings :test (lambda (a b) (string= (car a) (car b))))) + keymap) + bindings)) + ;; adapted from helm-descbinds (defun which-key--get-current-bindings () (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) @@ -1361,10 +1376,10 @@ alists. Returns a list (key separator description)." (forward-line)) (nreverse bindings))))) -(defun which-key--get-formatted-key-bindings () +(defun which-key--get-formatted-key-bindings (&optional bindings) "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." - (let* ((unformatted (which-key--get-current-bindings))) + (let* ((unformatted (if bindings bindings (which-key--get-current-bindings)))) (when which-key-sort-order (setq unformatted (sort unformatted (lambda (a b) (funcall which-key-sort-order a b))))) @@ -1808,6 +1823,28 @@ prefix) if `which-key-use-C-h-commands' is non nil." (which-key--show-page page-n) loc2)))) +(defun which-key-show-keymap (keymap) + "Show the top-level bindings in KEYMAP using which-key." + (interactive (list (intern + (completing-read "Keymap: " obarray + (lambda (m) (and (boundp m) (keymapp (symbol-value m)))) + t nil 'variable-name-history)))) + (setq which-key--current-prefix nil + which-key--using-top-level t) + (when (and (boundp keymap) (keymapp (symbol-value keymap))) + (let ((formatted-keys (which-key--get-formatted-key-bindings + (which-key--get-keymap-bindings (symbol-value keymap)))) + (prefix-keys (key-description which-key--current-prefix))) + (cond ((= (length formatted-keys) 0) + (message "%s- which-key: There are no keys to show" prefix-keys)) + ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + formatted-keys 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages formatted-keys (window-width))) + (which-key--show-page 0)))))) + (defun which-key--create-buffer-and-show (&optional prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." From 6702c2ed98e5ce60571849ab53521c0246dae133 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 20 Dec 2015 15:31:57 -0500 Subject: [PATCH 401/816] Add which-key-show-minor-mode-keymap Version of which-key-show-keymap that only looks in minor-mode-map-alist --- which-key.el | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 4a9d11c222a..329e0a19089 100644 --- a/which-key.el +++ b/which-key.el @@ -1823,17 +1823,41 @@ prefix) if `which-key-use-C-h-commands' is non nil." (which-key--show-page page-n) loc2)))) -(defun which-key-show-keymap (keymap) - "Show the top-level bindings in KEYMAP using which-key." - (interactive (list (intern - (completing-read "Keymap: " obarray - (lambda (m) (and (boundp m) (keymapp (symbol-value m)))) - t nil 'variable-name-history)))) +(defun which-key-show-keymap () + "Show the top-level bindings in KEYMAP using which-key. KEYMAP +is selected interactively from all available keymaps." + (interactive) + (let ((map + (symbol-value + (intern + (completing-read "Keymap: " obarray + (lambda (m) (and (boundp m) (keymapp (symbol-value m)))) + t nil 'variable-name-history))))) + (if (equal map (make-sparse-keymap)) + (message "which-key: %s is empty" map) + (which-key--show-keymap map)))) + +(defun which-key-show-minor-mode-keymap () + "Show the top-level bindings in KEYMAP using which-key. KEYMAP +is selected interactively by mode in `minor-mode-map-alist'." + (interactive) + (let* ((mode (intern + (completing-read + "Minor Mode: " + (cl-remove-if-not (lambda (mode) (symbol-value mode)) + (mapcar 'car minor-mode-map-alist)) + nil t nil 'variable-name-history))) + (map (cdr (assq mode minor-mode-map-alist)))) + (if (equal map (make-sparse-keymap)) + (message "which-key: %s's keymap is empty" mode) + (which-key--show-keymap map)))) + +(defun which-key--show-keymap (keymap) (setq which-key--current-prefix nil which-key--using-top-level t) - (when (and (boundp keymap) (keymapp (symbol-value keymap))) + (when (keymapp keymap) (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings (symbol-value keymap)))) + (which-key--get-keymap-bindings keymap))) (prefix-keys (key-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys)) From aa06530d064d8b4354f93029e101fe380e65a84b Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 20 Dec 2015 15:38:38 -0500 Subject: [PATCH 402/816] Filter out empty keymaps in new functions --- which-key.el | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/which-key.el b/which-key.el index 329e0a19089..e5ca81dcc1f 100644 --- a/which-key.el +++ b/which-key.el @@ -1827,30 +1827,32 @@ prefix) if `which-key-use-C-h-commands' is non nil." "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively from all available keymaps." (interactive) - (let ((map - (symbol-value - (intern - (completing-read "Keymap: " obarray - (lambda (m) (and (boundp m) (keymapp (symbol-value m)))) - t nil 'variable-name-history))))) - (if (equal map (make-sparse-keymap)) - (message "which-key: %s is empty" map) - (which-key--show-keymap map)))) + (which-key--show-keymap + (symbol-value + (intern + (completing-read + "Keymap: " obarray + (lambda (m) + (and (boundp m) + (keymapp (symbol-value m)) + (not (equal (symbol-value m) (make-sparse-keymap))))) + t nil 'variable-name-history))))) (defun which-key-show-minor-mode-keymap () "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively by mode in `minor-mode-map-alist'." (interactive) - (let* ((mode (intern - (completing-read - "Minor Mode: " - (cl-remove-if-not (lambda (mode) (symbol-value mode)) - (mapcar 'car minor-mode-map-alist)) - nil t nil 'variable-name-history))) - (map (cdr (assq mode minor-mode-map-alist)))) - (if (equal map (make-sparse-keymap)) - (message "which-key: %s's keymap is empty" mode) - (which-key--show-keymap map)))) + (let ((mode (intern + (completing-read + "Minor Mode: " + (mapcar 'car + (cl-remove-if-not + (lambda (entry) + (and (symbol-value (car entry)) + (not (equal (cdr entry) (make-sparse-keymap))))) + minor-mode-map-alist)) + nil t nil 'variable-name-history)))) + (which-key--show-keymap (cdr (assq mode minor-mode-map-alist))))) (defun which-key--show-keymap (keymap) (setq which-key--current-prefix nil From 38811018fb3531aeb3ea4288704ac1519ac6de91 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 20 Dec 2015 15:54:53 -0500 Subject: [PATCH 403/816] Allow traversal of keymaps in new commands --- which-key.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e5ca81dcc1f..0fdf6fe6255 100644 --- a/which-key.el +++ b/which-key.el @@ -1869,7 +1869,13 @@ is selected interactively by mode in `minor-mode-map-alist'." formatted-keys 0 which-key-side-window-location))) (t (setq which-key--pages-plist (which-key--create-pages formatted-keys (window-width))) - (which-key--show-page 0)))))) + (which-key--show-page 0))))) + (let* ((key (string (read-key))) + (next-def (lookup-key keymap key))) + (if (keymapp next-def) + (progn (which-key--hide-popup-ignore-command) + (which-key--show-keymap next-def)) + (which-key--hide-popup)))) (defun which-key--create-buffer-and-show (&optional prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. From c1e82229ad1e0e6377272b553e71ecabd1f9aec6 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 20 Dec 2015 17:18:22 -0500 Subject: [PATCH 404/816] Distinguish using-show-keymap --- which-key.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 0fdf6fe6255..3f383cd8e9f 100644 --- a/which-key.el +++ b/which-key.el @@ -436,6 +436,7 @@ showing.") used.") (defvar which-key--multiple-locations nil) (defvar which-key--using-top-level nil) +(defvar which-key--using-show-keymap nil) (defvar which-key-key-based-description-replacement-alist '() "New version of @@ -824,6 +825,7 @@ total height." (unless (member real-this-command which-key--paging-functions) (setq which-key--current-page-n nil which-key--using-top-level nil + which-key--using-show-keymap nil which-key--on-last-page nil) (cl-case which-key-popup-type ;; Not necessary to hide minibuffer @@ -1856,7 +1858,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (defun which-key--show-keymap (keymap) (setq which-key--current-prefix nil - which-key--using-top-level t) + which-key--using-show-keymap t) (when (keymapp keymap) (let ((formatted-keys (which-key--get-formatted-key-bindings (which-key--get-keymap-bindings keymap))) @@ -1915,7 +1917,9 @@ Finally, show the buffer." (or (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator)) (null this-command))) (which-key--create-buffer-and-show prefix-keys)) - ((and which-key--current-page-n (not which-key--using-top-level)) + ((and which-key--current-page-n + (not which-key--using-top-level) + (not which-key--using-show-keymap)) (which-key--hide-popup))))) ;; Timers From 92dc5871f01d2297349ecbf075d2263a846f1146 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 20 Dec 2015 19:36:05 -0500 Subject: [PATCH 405/816] Fix undo for show-keymap --- which-key.el | 137 ++++++++++++++++++++++++++++----------------------- 1 file changed, 76 insertions(+), 61 deletions(-) diff --git a/which-key.el b/which-key.el index 3f383cd8e9f..f21fd23fcd6 100644 --- a/which-key.el +++ b/which-key.el @@ -436,7 +436,8 @@ showing.") used.") (defvar which-key--multiple-locations nil) (defvar which-key--using-top-level nil) -(defvar which-key--using-show-keymap nil) +(defvar which-key--current-show-keymap-name nil) +(defvar which-key--prior-show-keymap-args nil) (defvar which-key-key-based-description-replacement-alist '() "New version of @@ -825,7 +826,8 @@ total height." (unless (member real-this-command which-key--paging-functions) (setq which-key--current-page-n nil which-key--using-top-level nil - which-key--using-show-keymap nil + which-key--current-show-keymap-name nil + which-key--prior-show-keymap-args nil which-key--on-last-page nil) (cl-case which-key-popup-type ;; Not necessary to hide minibuffer @@ -1123,6 +1125,9 @@ coming before a prefix. Within these categories order using "Version of `lookup-key' that allows KEYMAP to be nil. KEY is not checked." (when (keymapp keymap) (lookup-key keymap key))) +(defsubst which-key--butlast-string (str) + (mapconcat #'identity (butlast (split-string str)) " ")) + (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 @@ -1164,26 +1169,29 @@ a replacement occurs return the new STRING." "KEYS is a string produced by `key-description'. A title is possibly returned using `which-key-prefix-title-alist'. An empty stiring is returned if no title exists." - (if (not (string-equal keys "")) - (let* ((alist which-key-prefix-title-alist) - (res (assoc-string keys alist)) - (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist - (assoc-string keys mode-alist))) - (binding (key-binding keys)) - (alternate (when (and binding (symbolp binding)) - (symbol-name binding)))) - (cond (mode-res (cdr mode-res)) - (res (cdr res)) - ((and (eq which-key-show-prefix 'echo) alternate) - alternate) - ((and (member which-key-show-prefix '(bottom top)) - (eq which-key-side-window-location 'bottom) - echo-keystrokes) - (if alternate alternate - (concat "Following " keys))) - (t ""))) - "Top-level bindings")) + (cond + ((not (string-equal keys "")) + (let* ((alist which-key-prefix-title-alist) + (res (assoc-string keys alist)) + (mode-alist (assq major-mode alist)) + (mode-res (when mode-alist + (assoc-string keys mode-alist))) + (binding (key-binding keys)) + (alternate (when (and binding (symbolp binding)) + (symbol-name binding)))) + (cond (mode-res (cdr mode-res)) + (res (cdr res)) + ((and (eq which-key-show-prefix 'echo) alternate) + alternate) + ((and (member which-key-show-prefix '(bottom top)) + (eq which-key-side-window-location 'bottom) + echo-keystrokes) + (if alternate alternate + (concat "Following " keys))) + (t "")))) + (which-key--using-top-level "Top-level bindings") + (which-key--current-show-keymap-name + which-key--current-show-keymap-name))) (defun which-key--maybe-replace-key-based (string keys) "KEYS is a string produced by `key-description' @@ -1761,12 +1769,15 @@ after first page." (interactive) (let* ((key-lst (butlast (which-key--current-key-list))) (which-key-inhibit t)) - (if key-lst - (progn - (which-key--reload-key-sequence key-lst) - (which-key--create-buffer-and-show - (apply #'vector key-lst))) - (which-key-show-top-level)))) + (cond ((stringp which-key--current-show-keymap-name) + (if (keymapp (cdr (car-safe which-key--prior-show-keymap-args))) + (let ((args (pop which-key--prior-show-keymap-args))) + (which-key--show-keymap (car args) (cdr args))) + (which-key--hide-popup))) + (key-lst + (which-key--reload-key-sequence key-lst) + (which-key--create-buffer-and-show (apply #'vector key-lst))) + (t (which-key-show-top-level))))) (defalias 'which-key-undo 'which-key-undo-key) (defun which-key-abort () @@ -1829,42 +1840,43 @@ prefix) if `which-key-use-C-h-commands' is non nil." "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively from all available keymaps." (interactive) - (which-key--show-keymap - (symbol-value - (intern - (completing-read - "Keymap: " obarray - (lambda (m) - (and (boundp m) - (keymapp (symbol-value m)) - (not (equal (symbol-value m) (make-sparse-keymap))))) - t nil 'variable-name-history))))) + (let ((keymap-sym (intern + (completing-read + "Keymap: " obarray + (lambda (m) + (and (boundp m) + (keymapp (symbol-value m)) + (not (equal (symbol-value m) (make-sparse-keymap))))) + t nil 'variable-name-history)))) + (which-key--show-keymap (symbol-name keymap-sym) (symbol-value keymap-sym)))) (defun which-key-show-minor-mode-keymap () "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively by mode in `minor-mode-map-alist'." (interactive) - (let ((mode (intern - (completing-read - "Minor Mode: " - (mapcar 'car - (cl-remove-if-not - (lambda (entry) - (and (symbol-value (car entry)) - (not (equal (cdr entry) (make-sparse-keymap))))) - minor-mode-map-alist)) - nil t nil 'variable-name-history)))) - (which-key--show-keymap (cdr (assq mode minor-mode-map-alist))))) + (let ((mode-sym + (intern + (completing-read + "Minor Mode: " + (mapcar 'car + (cl-remove-if-not + (lambda (entry) + (and (symbol-value (car entry)) + (not (equal (cdr entry) (make-sparse-keymap))))) + minor-mode-map-alist)) + nil t nil 'variable-name-history)))) + (which-key--show-keymap (symbol-name mode-sym) + (cdr (assq mode-sym minor-mode-map-alist))))) -(defun which-key--show-keymap (keymap) +(defun which-key--show-keymap (keymap-name keymap &optional prior-args) (setq which-key--current-prefix nil - which-key--using-show-keymap t) + which-key--current-show-keymap-name keymap-name) + (when prior-args (push prior-args which-key--prior-show-keymap-args)) (when (keymapp keymap) (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings keymap))) - (prefix-keys (key-description which-key--current-prefix))) + (which-key--get-keymap-bindings keymap)))) (cond ((= (length formatted-keys) 0) - (message "%s- which-key: There are no keys to show" prefix-keys)) + (message "which-key: Keymap empty")) ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows @@ -1872,12 +1884,15 @@ is selected interactively by mode in `minor-mode-map-alist'." (t (setq which-key--pages-plist (which-key--create-pages formatted-keys (window-width))) (which-key--show-page 0))))) - (let* ((key (string (read-key))) - (next-def (lookup-key keymap key))) - (if (keymapp next-def) - (progn (which-key--hide-popup-ignore-command) - (which-key--show-keymap next-def)) - (which-key--hide-popup)))) + (let* ((key (key-description (list (read-key)))) + (next-def (lookup-key keymap (kbd key)))) + (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (which-key-C-h-dispatch)) + ((keymapp next-def) + (which-key--hide-popup-ignore-command) + (which-key--show-keymap (concat keymap-name " " key) next-def + (cons keymap-name keymap))) + (t (which-key--hide-popup))))) (defun which-key--create-buffer-and-show (&optional prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. @@ -1919,7 +1934,7 @@ Finally, show the buffer." (which-key--create-buffer-and-show prefix-keys)) ((and which-key--current-page-n (not which-key--using-top-level) - (not which-key--using-show-keymap)) + (not which-key--current-show-keymap-name)) (which-key--hide-popup))))) ;; Timers From f4a1b4283bf09475e5255a889a34784501ad2fc0 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 21 Dec 2015 12:12:29 -0500 Subject: [PATCH 406/816] Fix C-h prompt for show-keymap commands --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f21fd23fcd6..a952a9831dc 100644 --- a/which-key.el +++ b/which-key.el @@ -1796,7 +1796,10 @@ prefix) if `which-key-use-C-h-commands' is non nil." (let* ((prefix-keys (key-description which-key--current-prefix)) (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) (prompt (concat (when (string-equal prefix-keys "") - (propertize " Top-level bindings" 'face 'which-key-note-face)) + (propertize (concat " " + (or which-key--current-show-keymap-name + "Top-level bindings")) + 'face 'which-key-note-face)) full-prefix (propertize (substitute-command-keys From 9bb70c8cdd43f0cd76871fddc4dd3ee1bccd3897 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 11 Jan 2016 09:56:49 -0500 Subject: [PATCH 407/816] Fix problem with side-window dimension calculation The fringes were not being included in version 24. This makes the calculation consistent with the left/right side-window calculation and fixes #97. --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index a952a9831dc..c5ce0ff506a 100644 --- a/which-key.el +++ b/which-key.el @@ -1019,7 +1019,8 @@ width) in lines and characters respectively." (- (if (member which-key-side-window-location '(left right)) (which-key--total-width-to-text (which-key--width-or-percentage-to-width which-key-side-window-max-width)) - (frame-width)) + (which-key--total-width-to-text (which-key--width-or-percentage-to-width + 1.0))) which-key-unicode-correction)))) (defun which-key--frame-max-dimensions () From f1d3d1b5e5351e5f878643496d8523fd54a96ca3 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 17 Jan 2016 20:55:04 -0500 Subject: [PATCH 408/816] Add which-key-idle-secondary-delay Allows the delay time to be different for popups that follow an initial popup within the same key sequence. --- which-key.el | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index c5ce0ff506a..dcd1deb00da 100644 --- a/which-key.el +++ b/which-key.el @@ -54,6 +54,15 @@ :group 'which-key :type 'float) +(defcustom which-key-idle-secondary-delay nil + "Once the which-key buffer shows once for a key sequence reduce +the idle time to this amount (in seconds). This makes it possible +to shorten the delay for subsequent popups in the same key +sequence. The default is for this value to be nil, which disables +this behavior." + :group 'which-key + :type 'float) + (defcustom which-key-echo-keystrokes 0 "Value to use for `echo-keystrokes'. This only applies if `which-key-popup-type' is minibuffer or @@ -829,6 +838,8 @@ total height." which-key--current-show-keymap-name nil which-key--prior-show-keymap-args nil which-key--on-last-page nil) + (when which-key-idle-secondary-delay + (which-key--start-timer)) (cl-case which-key-popup-type ;; Not necessary to hide minibuffer ;; (minibuffer (which-key--hide-buffer-minibuffer)) @@ -1933,9 +1944,12 @@ Finally, show the buffer." (not which-key-inhibit) ;; Do not display the popup if a command is currently being ;; executed - (or (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator)) + (or (and which-key-allow-evil-operators + (bound-and-true-p evil-this-operator)) (null this-command))) - (which-key--create-buffer-and-show prefix-keys)) + (which-key--create-buffer-and-show prefix-keys) + (when which-key-idle-secondary-delay + (which-key--start-timer which-key-idle-secondary-delay))) ((and which-key--current-page-n (not which-key--using-top-level) (not which-key--current-show-keymap-name)) @@ -1943,11 +1957,14 @@ Finally, show the buffer." ;; Timers -(defun which-key--start-timer () +(defun which-key--start-timer (&optional delay) "Activate idle timer to trigger `which-key--update'." (which-key--stop-timer) (setq which-key--timer - (run-with-idle-timer which-key-idle-delay t #'which-key--update))) + (run-with-idle-timer + (if delay + delay + which-key-idle-delay) t #'which-key--update))) (defun which-key--stop-timer () "Deactivate idle timer for `which-key--update'." From 5909fb2fc3cfa924cfecf597de0003c4cdfaccc6 Mon Sep 17 00:00:00 2001 From: Colin Yates Date: Tue, 26 Jan 2016 12:47:58 +0000 Subject: [PATCH 409/816] Trivial fix correcting SpacEmacs --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 65cc49f6bf1..52429939f49 100644 --- a/README.org +++ b/README.org @@ -109,7 +109,7 @@ 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]]. +This functionality is targeting [[https://github.com/syl20bnr/spacemacs][spacemacs]]. *** Side Window Bottom Option Popup side window on bottom. This is the current default. To restore this setup use From f3681e93c57a62daba92e3a2ff39ad3331924b3f Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 28 Jan 2016 15:03:27 -0500 Subject: [PATCH 410/816] Initial try at addressing #99 --- which-key.el | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index dcd1deb00da..09ab770bdc1 100644 --- a/which-key.el +++ b/which-key.el @@ -321,6 +321,14 @@ prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'boolean) +(defcustom which-key-show-operator-state-maps nil + "Experimental: Try to show the right keys following an evil +command that reads a motion, such as \"y\", \"d\" and \"c\" from +normal state. This is experimental, because there might be some +valid keys missing and it might be showing some invalid keys." + :group 'which-key + :type 'boolean) + (defcustom which-key-hide-alt-key-translations t "Hide key translations using Alt key if non nil. These translations are not relevant most of the times since a lot @@ -1203,7 +1211,8 @@ An empty stiring is returned if no title exists." (t "")))) (which-key--using-top-level "Top-level bindings") (which-key--current-show-keymap-name - which-key--current-show-keymap-name))) + which-key--current-show-keymap-name) + (t ""))) (defun which-key--maybe-replace-key-based (string keys) "KEYS is a string produced by `key-description' @@ -1909,6 +1918,27 @@ is selected interactively by mode in `minor-mode-map-alist'." (cons keymap-name keymap))) (t (which-key--hide-popup))))) +(defun which-key--show-keymap-no-intercept (keymap-name keymap) + (setq which-key--current-prefix nil + which-key--current-show-keymap-name keymap-name) + (when (keymapp keymap) + (let ((formatted-keys (which-key--get-formatted-key-bindings + (which-key--get-keymap-bindings keymap)))) + (cond ((= (length formatted-keys) 0) + (message "which-key: Keymap empty")) + ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + formatted-keys 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages formatted-keys (window-width))) + (which-key--show-page 0))))) + (let* ((key (key-description (list (read-key))))) + (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (which-key-C-h-dispatch)) + (t (setq unread-command-events (listify-key-sequence key)) + (which-key--hide-popup))))) + (defun which-key--create-buffer-and-show (&optional prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." @@ -1950,6 +1980,14 @@ Finally, show the buffer." (which-key--create-buffer-and-show prefix-keys) (when which-key-idle-secondary-delay (which-key--start-timer which-key-idle-secondary-delay))) + ((and which-key-show-operator-state-maps + (bound-and-true-p evil-state) + (eq evil-state 'operator)) + (which-key--show-keymap-no-intercept + "evil operator state keys + motion keys" + (make-composed-keymap (list evil-operator-shortcut-map + evil-operator-state-map + evil-motion-state-map)))) ((and which-key--current-page-n (not which-key--using-top-level) (not which-key--current-show-keymap-name)) From d9bb55cd0001b2dff34e766bee26db32dbe6e631 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 28 Jan 2016 15:39:47 -0500 Subject: [PATCH 411/816] Improve previous commit Filter out keys with :suppress-keymap property, which seem to be the primary ones ignored in operator state --- which-key.el | 73 ++++++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/which-key.el b/which-key.el index 09ab770bdc1..3b8927d05c2 100644 --- a/which-key.el +++ b/which-key.el @@ -1336,18 +1336,19 @@ alists. Returns a list (key separator description)." (list key-w-face sep-w-face desc-w-face))) unformatted))) -(defun which-key--get-keymap-bindings (keymap) +(defun which-key--get-keymap-bindings (keymap &optional filter) "Retrieve top-level bindings from KEYMAP." (let (bindings) (map-keymap (lambda (ev def) - (cl-pushnew - (cons (key-description (list ev)) - (cond ((keymapp def) "Prefix Command") - ((symbolp def) (copy-sequence (symbol-name def))) - ((eq 'lambda (car-safe def)) "lambda") - (t (format "%s" def)))) - bindings :test (lambda (a b) (string= (car a) (car b))))) + (unless (and (functionp filter) (funcall filter ev def)) + (cl-pushnew + (cons (key-description (list ev)) + (cond ((keymapp def) "Prefix Command") + ((symbolp def) (copy-sequence (symbol-name def))) + ((eq 'lambda (car-safe def)) "lambda") + (t (format "%s" def)))) + bindings :test (lambda (a b) (string= (car a) (car b)))))) keymap) bindings)) @@ -1918,26 +1919,36 @@ is selected interactively by mode in `minor-mode-map-alist'." (cons keymap-name keymap))) (t (which-key--hide-popup))))) -(defun which-key--show-keymap-no-intercept (keymap-name keymap) - (setq which-key--current-prefix nil - which-key--current-show-keymap-name keymap-name) - (when (keymapp keymap) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings keymap)))) - (cond ((= (length formatted-keys) 0) - (message "which-key: Keymap empty")) - ((listp which-key-side-window-location) - (setq which-key--last-try-2-loc - (apply #'which-key--try-2-side-windows - formatted-keys 0 which-key-side-window-location))) - (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys (window-width))) - (which-key--show-page 0))))) - (let* ((key (key-description (list (read-key))))) - (cond ((and which-key-use-C-h-commands (string= "C-h" key)) - (which-key-C-h-dispatch)) - (t (setq unread-command-events (listify-key-sequence key)) - (which-key--hide-popup))))) +(defun which-key--evil-operator-filter (_ev def) + (and (functionp def) + (evil-get-command-property def :suppress-operator))) + +(defun which-key--show-evil-operator-keymap () + (let ((keymap-name "evil operator state keys + motion keys") + (keymap + (make-composed-keymap (list evil-operator-shortcut-map + evil-operator-state-map + evil-motion-state-map)))) + (setq which-key--current-prefix nil + which-key--current-show-keymap-name keymap-name) + (when (keymapp keymap) + (let ((formatted-keys (which-key--get-formatted-key-bindings + (which-key--get-keymap-bindings + keymap 'which-key--evil-operator-filter)))) + (cond ((= (length formatted-keys) 0) + (message "which-key: Keymap empty")) + ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + formatted-keys 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages formatted-keys (window-width))) + (which-key--show-page 0))))) + (let* ((key (key-description (list (read-key))))) + (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (which-key-C-h-dispatch)) + (t (setq unread-command-events (listify-key-sequence key)) + (which-key--hide-popup)))))) (defun which-key--create-buffer-and-show (&optional prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. @@ -1983,11 +1994,7 @@ Finally, show the buffer." ((and which-key-show-operator-state-maps (bound-and-true-p evil-state) (eq evil-state 'operator)) - (which-key--show-keymap-no-intercept - "evil operator state keys + motion keys" - (make-composed-keymap (list evil-operator-shortcut-map - evil-operator-state-map - evil-motion-state-map)))) + (which-key--show-evil-operator-keymap)) ((and which-key--current-page-n (not which-key--using-top-level) (not which-key--current-show-keymap-name)) From 9c93581566ac66f00af870aeb11aef53dee4d39c Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 29 Jan 2016 20:41:15 -0500 Subject: [PATCH 412/816] Interpret ESC in operator popup See #99 --- which-key.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 3b8927d05c2..37370764f4a 100644 --- a/which-key.el +++ b/which-key.el @@ -1947,8 +1947,12 @@ is selected interactively by mode in `minor-mode-map-alist'." (let* ((key (key-description (list (read-key))))) (cond ((and which-key-use-C-h-commands (string= "C-h" key)) (which-key-C-h-dispatch)) - (t (setq unread-command-events (listify-key-sequence key)) - (which-key--hide-popup)))))) + ((string= key "ESC") + (which-key--hide-popup) + (keyboard-quit)) + (t + (which-key--hide-popup) + (setq unread-command-events (listify-key-sequence key))))))) (defun which-key--create-buffer-and-show (&optional prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. From 094136858f8d6461d80fc94319638b16bc194373 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 29 Jan 2016 21:08:12 -0500 Subject: [PATCH 413/816] Don't listify key sequence repeatedly This function is not idempotent it turns out. --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 37370764f4a..738275dc421 100644 --- a/which-key.el +++ b/which-key.el @@ -1701,7 +1701,9 @@ enough space based on your settings and frame size." prefix-keys) (defun which-key--reload-key-sequence (key-seq) (let ((next-event (mapcar (lambda (ev) (cons t ev)) - (listify-key-sequence key-seq)))) + (if (listp key-seq) + key-seq + (listify-key-sequence key-seq))))) (setq prefix-arg current-prefix-arg unread-command-events next-event))) From 6ddebba30c4073c917934d62d142cd2ff7b40e76 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 3 Feb 2016 08:22:53 -0500 Subject: [PATCH 414/816] Comment out window var and add new func The window var is not being used. --- which-key.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 738275dc421..ab564626140 100644 --- a/which-key.el +++ b/which-key.el @@ -422,8 +422,8 @@ to a non-nil value for the execution of a command. Like this ;; 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--window nil +;; "Internal: Holds reference to which-key window.") (defvar which-key--timer nil "Internal: Holds reference to open window timer.") (defvar which-key--paging-timer nil @@ -875,6 +875,9 @@ total height." (when (frame-live-p which-key--frame) (delete-frame which-key--frame))) +(defun which-key--popup-showing-p () + (window-live-p (get-buffer-window which-key--buffer))) + (defun which-key--show-popup (act-popup-dim) "Show the which-key buffer. ACT-POPUP-DIM includes the dimensions, (height . width) of the From f6f4aee3404272d871b0c2111a7a41d680a1c071 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 3 Feb 2016 08:23:55 -0500 Subject: [PATCH 415/816] Use keyboard-quit in abort key sequence Need to do this for the operator keymap function. Otherwise the operator state doesn't exit properly --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ab564626140..9a40bb21beb 100644 --- a/which-key.el +++ b/which-key.el @@ -1812,7 +1812,7 @@ after first page." (interactive) (let ((which-key-inhibit t)) (which-key--hide-popup-ignore-command) - (message "Aborted key sequence"))) + (keyboard-quit))) ;;;###autoload (defun which-key-C-h-dispatch () From dce72aa134b706c1846502dd58a1141f4e2b0f6b Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 3 Feb 2016 08:24:54 -0500 Subject: [PATCH 416/816] Simplify page turning function --- which-key.el | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/which-key.el b/which-key.el index 9a40bb21beb..e74c9ed7742 100644 --- a/which-key.el +++ b/which-key.el @@ -1703,35 +1703,21 @@ enough space based on your settings and frame size." prefix-keys) ;; paging functions (defun which-key--reload-key-sequence (key-seq) - (let ((next-event (mapcar (lambda (ev) (cons t ev)) - (if (listp key-seq) - key-seq - (listify-key-sequence key-seq))))) + (let ((next-event (mapcar (lambda (ev) (cons t ev)) key-seq))) (setq prefix-arg current-prefix-arg unread-command-events next-event))) (defun which-key-turn-page (delta) - "Show the next page of keys. -Will force an update if called before `which-key--update'." - (cond - ;; No which-key buffer showing - ((null which-key--current-page-n) - (let* ((keysbl - (vconcat (butlast (append (this-single-command-keys) nil))))) - (which-key--reload-key-sequence keysbl) - (which-key--create-buffer-and-show keysbl))) - ;; which-key buffer showing. turn page - (t - (let ((next-page - (if which-key--current-page-n - (+ which-key--current-page-n delta) 0))) - (which-key--reload-key-sequence (which-key--current-key-list)) - (if which-key--last-try-2-loc - (let ((which-key-side-window-location which-key--last-try-2-loc) - (which-key--multiple-locations t)) - (which-key--show-page next-page)) - (which-key--show-page next-page)) - (which-key--start-paging-timer))))) + "Show the next page of keys." + (let ((next-page (if which-key--current-page-n + (+ which-key--current-page-n delta) 0))) + (which-key--reload-key-sequence (which-key--current-key-list)) + (if which-key--last-try-2-loc + (let ((which-key-side-window-location which-key--last-try-2-loc) + (which-key--multiple-locations t)) + (which-key--show-page next-page)) + (which-key--show-page next-page)) + (which-key--start-paging-timer))) ;;;###autoload (defun which-key-show-standard-help () From e1f2e6be99633906865ec3aba0454a0d50d6dba3 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 3 Feb 2016 08:27:40 -0500 Subject: [PATCH 417/816] Fix problems with operator keymap function 1. Introduce using-show-keymap and using-show-operator-keymap vars to make it clear how we are entering which-key 2. Add inhibit-next-operator-keymap for keys in the operator maps that are bound to commands that read the next key "manually" 3. Fix problem where the next page hint was only being shown sometimes in the operator maps. Need to distinguish between show-operator-keymap and the possibility that an operator is active but the usual which-key popup is showing. --- which-key.el | 82 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/which-key.el b/which-key.el index e74c9ed7742..f6ad1ff3984 100644 --- a/which-key.el +++ b/which-key.el @@ -453,6 +453,9 @@ showing.") used.") (defvar which-key--multiple-locations nil) (defvar which-key--using-top-level nil) +(defvar which-key--using-show-keymap nil) +(defvar which-key--using-show-operator-keymap nil) +(defvar which-key--inhibit-next-operator-popup nil) (defvar which-key--current-show-keymap-name nil) (defvar which-key--prior-show-keymap-args nil) @@ -843,6 +846,8 @@ total height." (unless (member real-this-command which-key--paging-functions) (setq which-key--current-page-n nil which-key--using-top-level nil + which-key--using-show-keymap nil + which-key--using-show-operator-keymap nil which-key--current-show-keymap-name nil which-key--prior-show-keymap-args nil which-key--on-last-page nil) @@ -1566,8 +1571,9 @@ area." (key-binding (kbd paging-key)))) (key (if paging-key-bound which-key-paging-key "C-h"))) (when (and which-key-use-C-h-commands - (not (and which-key-allow-evil-operators - (bound-and-true-p evil-this-operator)))) + (or which-key--using-show-operator-keymap + (not (and which-key-allow-evil-operators + (bound-and-true-p evil-this-operator))))) (propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) @@ -1886,7 +1892,8 @@ is selected interactively by mode in `minor-mode-map-alist'." (defun which-key--show-keymap (keymap-name keymap &optional prior-args) (setq which-key--current-prefix nil - which-key--current-show-keymap-name keymap-name) + which-key--current-show-keymap-name keymap-name + which-key--using-show-keymap t) (when prior-args (push prior-args which-key--prior-show-keymap-args)) (when (keymapp keymap) (let ((formatted-keys (which-key--get-formatted-key-bindings @@ -1915,35 +1922,40 @@ is selected interactively by mode in `minor-mode-map-alist'." (evil-get-command-property def :suppress-operator))) (defun which-key--show-evil-operator-keymap () - (let ((keymap-name "evil operator state keys + motion keys") - (keymap - (make-composed-keymap (list evil-operator-shortcut-map - evil-operator-state-map - evil-motion-state-map)))) - (setq which-key--current-prefix nil - which-key--current-show-keymap-name keymap-name) - (when (keymapp keymap) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings - keymap 'which-key--evil-operator-filter)))) - (cond ((= (length formatted-keys) 0) - (message "which-key: Keymap empty")) - ((listp which-key-side-window-location) - (setq which-key--last-try-2-loc - (apply #'which-key--try-2-side-windows - formatted-keys 0 which-key-side-window-location))) - (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys (window-width))) - (which-key--show-page 0))))) - (let* ((key (key-description (list (read-key))))) - (cond ((and which-key-use-C-h-commands (string= "C-h" key)) - (which-key-C-h-dispatch)) - ((string= key "ESC") - (which-key--hide-popup) - (keyboard-quit)) - (t - (which-key--hide-popup) - (setq unread-command-events (listify-key-sequence key))))))) + (if which-key--inhibit-next-operator-popup + (setq which-key--inhibit-next-operator-popup nil) + (let ((keymap + (make-composed-keymap (list evil-operator-shortcut-map + evil-operator-state-map + evil-motion-state-map)))) + (setq which-key--current-prefix nil + which-key--current-show-keymap-name "evil operator/motion keys" + which-key--using-show-operator-keymap t) + (when (keymapp keymap) + (let ((formatted-keys (which-key--get-formatted-key-bindings + (which-key--get-keymap-bindings + keymap 'which-key--evil-operator-filter)))) + (cond ((= (length formatted-keys) 0) + (message "which-key: Keymap empty")) + ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + formatted-keys 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages formatted-keys (window-width))) + (which-key--show-page 0))))) + (let* ((key (key-description (list (read-key))))) + (when (string= key "`") + ;; evil-goto-mark reads the next char manually + (setq which-key--inhibit-next-operator-popup t)) + (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (which-key-C-h-dispatch)) + ((string= key "ESC") + (which-key--hide-popup) + (keyboard-quit)) + (t + (which-key--hide-popup) + (setq unread-command-events (listify-key-sequence key)))))))) (defun which-key--create-buffer-and-show (&optional prefix-keys) "Fill `which-key--buffer' with key descriptions and reformat. @@ -1988,11 +2000,13 @@ Finally, show the buffer." (which-key--start-timer which-key-idle-secondary-delay))) ((and which-key-show-operator-state-maps (bound-and-true-p evil-state) - (eq evil-state 'operator)) + (eq evil-state 'operator) + (not which-key--using-show-operator-keymap)) (which-key--show-evil-operator-keymap)) ((and which-key--current-page-n (not which-key--using-top-level) - (not which-key--current-show-keymap-name)) + (not which-key--using-show-operator-keymap) + (not which-key--using-show-keymap)) (which-key--hide-popup))))) ;; Timers From d24c12f563021047ce237bc7fe3276775b3882a6 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 3 Feb 2016 12:40:35 -0500 Subject: [PATCH 418/816] Don't pass window-width around --- which-key.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index f6ad1ff3984..e115c21d8ed 100644 --- a/which-key.el +++ b/which-key.el @@ -1007,7 +1007,7 @@ call signature in different emacs versions" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Max dimension of available window functions -(defun which-key--popup-max-dimensions (selected-window-width) +(defun which-key--popup-max-dimensions () "Dimesion functions should return the maximum possible (height . width) of the intended popup. SELECTED-WINDOW-WIDTH is the width of currently active window, not the which-key buffer @@ -1016,7 +1016,8 @@ window." (minibuffer (which-key--minibuffer-max-dimensions)) (side-window (which-key--side-window-max-dimensions)) (frame (which-key--frame-max-dimensions)) - (custom (funcall which-key-custom-popup-max-dimensions-function selected-window-width)))) + (custom (funcall which-key-custom-popup-max-dimensions-function + (window-width))))) (defun which-key--minibuffer-max-dimensions () "Return max-dimensions of minibuffer (height . width). @@ -1509,12 +1510,12 @@ Returns a plist that holds the page strings, as well as metadata." :keys/page (reverse keys/page) :n-pages n-pages :tot-keys (apply #'+ keys/page))))) -(defun which-key--create-pages (keys sel-win-width) +(defun which-key--create-pages (keys) "Create page strings using `which-key--partition-columns'. Will try to find the best number of rows and columns using the given dimensions and the length and wdiths of KEYS. SEL-WIN-WIDTH is the width of the live window." - (let* ((max-dims (which-key--popup-max-dimensions sel-win-width)) + (let* ((max-dims (which-key--popup-max-dimensions)) (max-lines (car max-dims)) (max-width (cdr max-dims)) (prefix-keys-desc (key-description which-key--current-prefix)) @@ -1843,7 +1844,7 @@ prefix) if `which-key-use-C-h-commands' is non nil." (let (pages1) (let ((which-key-side-window-location loc1) (which-key--multiple-locations t)) - (setq pages1 (which-key--create-pages keys (window-width)))) + (setq pages1 (which-key--create-pages keys))) (if (< 0 (plist-get pages1 :n-pages)) (progn (setq which-key--pages-plist pages1) @@ -1853,8 +1854,8 @@ prefix) if `which-key-use-C-h-commands' is non nil." loc1) (let ((which-key-side-window-location loc2) (which-key--multiple-locations t)) - (setq which-key--pages-plist (which-key--create-pages - keys (window-width))) + (setq which-key--pages-plist + (which-key--create-pages keys)) (which-key--show-page page-n) loc2)))) @@ -1905,7 +1906,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (apply #'which-key--try-2-side-windows formatted-keys 0 which-key-side-window-location))) (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys (window-width))) + (which-key--create-pages formatted-keys)) (which-key--show-page 0))))) (let* ((key (key-description (list (read-key)))) (next-def (lookup-key keymap (kbd key)))) @@ -1942,7 +1943,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (apply #'which-key--try-2-side-windows formatted-keys 0 which-key-side-window-location))) (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys (window-width))) + (which-key--create-pages formatted-keys)) (which-key--show-page 0))))) (let* ((key (key-description (list (read-key))))) (when (string= key "`") @@ -1971,7 +1972,7 @@ Finally, show the buffer." (apply #'which-key--try-2-side-windows formatted-keys 0 which-key-side-window-location))) (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys (window-width))) + (which-key--create-pages formatted-keys)) (which-key--show-page 0))))) (defun which-key--update () From a87e6212f84e97150b12d82bb3dc70df17e19e31 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 3 Feb 2016 15:13:24 -0500 Subject: [PATCH 419/816] Improve some function names --- which-key.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index e115c21d8ed..eae2565e3e8 100644 --- a/which-key.el +++ b/which-key.el @@ -1429,7 +1429,7 @@ BUFFER that follow the key sequence KEY-SEQ." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for laying out which-key buffer pages -(defun which-key--pad (columns) +(defun which-key--normalize-columns (columns) "Pad COLUMNS to the same length using empty strings." (let ((max-len (cl-reduce (lambda (a x) (max a (length x))) columns :initial-value 0))) @@ -1442,7 +1442,7 @@ BUFFER that follow the key sequence KEY-SEQ." (defsubst which-key--join-columns (columns) "Transpose columns into rows, concat rows into lines and rows into page." - (let* ((padded (which-key--pad (nreverse columns))) + (let* ((padded (which-key--normalize-columns (nreverse columns))) (rows (apply #'cl-mapcar #'list padded))) (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n"))) @@ -1477,9 +1477,10 @@ that width." list (nthcdr n list))) (nreverse res))) -(defun which-key--partition-columns (keys avl-lines avl-width) +(defun which-key--list-to-pages (keys avl-lines avl-width) "Convert list of KEYS to columns based on dimensions AVL-LINES and AVL-WIDTH. -Returns a plist that holds the page strings, as well as metadata." +Returns a plist that holds the page strings, as well as +metadata." (let ((cols-w-widths (mapcar #'which-key--pad-column (which-key--partition-list avl-lines keys))) (page-width 0) (n-pages 0) (n-keys 0) @@ -1511,7 +1512,7 @@ Returns a plist that holds the page strings, as well as metadata." :tot-keys (apply #'+ keys/page))))) (defun which-key--create-pages (keys) - "Create page strings using `which-key--partition-columns'. + "Create page strings using `which-key--list-to-pages'. Will try to find the best number of rows and columns using the given dimensions and the length and wdiths of KEYS. SEL-WIN-WIDTH is the width of the live window." From e7a9ebf15f30b2e8763152af4e939bfc87b9fc42 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 3 Feb 2016 15:14:26 -0500 Subject: [PATCH 420/816] Refactor create-pages and show-page --- which-key.el | 184 ++++++++++++++++++++++++++++----------------------- 1 file changed, 102 insertions(+), 82 deletions(-) diff --git a/which-key.el b/which-key.el index eae2565e3e8..7ddbfc98f42 100644 --- a/which-key.el +++ b/which-key.el @@ -1511,6 +1511,31 @@ metadata." :keys/page (reverse keys/page) :n-pages n-pages :tot-keys (apply #'+ keys/page))))) +(defun which-key--create-pages-1 + (keys available-lines available-width &optional min-lines vertical) + "Create page strings using `popalist-list-to-page'. +Will try to find the best number of rows and columns using the +given dimensions and the length and widths of ITEMS. Use VERTICAL +if the ITEMS are laid out vertically and the number of columns +should be minimized." + (let ((result (which-key--list-to-pages + keys available-lines available-width)) + (min-lines (or min-lines 0)) + found prev-result) + (if (or vertical + (> (plist-get result :n-pages) 1) + (= 1 available-lines)) + result + ;; simple search for a fitting page + (while (and (> available-lines min-lines) + (not found)) + (setq available-lines (- available-lines 1) + prev-result result + result (which-key--list-to-pages + keys available-lines available-width) + found (> (plist-get result :n-pages) 1))) + (if found prev-result result)))) + (defun which-key--create-pages (keys) "Create page strings using `which-key--list-to-pages'. Will try to find the best number of rows and columns using the @@ -1521,33 +1546,24 @@ is the width of the live window." (max-width (cdr max-dims)) (prefix-keys-desc (key-description which-key--current-prefix)) (full-prefix (which-key--full-prefix prefix-keys-desc)) - (prefix-left (when (eq which-key-show-prefix 'left) - (+ 2 (which-key--string-width full-prefix)))) + (prefix (when (eq which-key-show-prefix 'left) + (+ 2 (which-key--string-width full-prefix)))) (prefix-top-bottom (member which-key-show-prefix '(bottom top))) (avl-lines (if prefix-top-bottom (- max-lines 1) max-lines)) (min-lines (min avl-lines which-key-min-display-lines)) - (avl-width (if prefix-left (- max-width prefix-left) max-width)) + (avl-width (if prefix (- max-width prefix) max-width)) (vertical (and (eq which-key-popup-type 'side-window) - (member which-key-side-window-location '(left right)))) - (result (which-key--partition-columns keys avl-lines avl-width)) - found prev-result) - (cond ((or vertical (> (plist-get result :n-pages) 1) (= 1 avl-lines)) - result) - ;; do a simple search for the smallest number of lines - (t (while (and (> avl-lines min-lines) (not found)) - (setq avl-lines (- avl-lines 1) - prev-result result - result (which-key--partition-columns - keys avl-lines avl-width) - found (> (plist-get result :n-pages) 1))) - (if found prev-result result))))) + (member which-key-side-window-location '(left right))))) + (which-key--create-pages-1 keys avl-lines avl-width min-lines vertical))) -(defun which-key--lighter-status (n-shown n-tot) - "Possibly show N-SHOWN keys and N-TOT keys in the mode line." +(defun which-key--lighter-status (page-n) + "Possibly show number of keys and total in the mode line." (when which-key-show-remaining-keys - (setq which-key--lighter-backup (cadr (assq 'which-key-mode minor-mode-alist))) - (setcar (cdr (assq 'which-key-mode minor-mode-alist)) - (format " WK: %s/%s keys" n-shown n-tot)))) + (let ((n-shown (nth page-n (plist-get which-key--pages-plist :keys/page))) + (n-tot (plist-get which-key--pages-plist :tot-keys))) + (setq which-key--lighter-backup (cadr (assq 'which-key-mode minor-mode-alist))) + (setcar (cdr (assq 'which-key-mode minor-mode-alist)) + (format " WK: %s/%s keys" n-shown n-tot))))) (defun which-key--lighter-restore () "Restore the lighter for which-key." @@ -1623,6 +1639,64 @@ including prefix arguments." (define-key map (kbd "C-h") #'which-key-C-h-dispatch)) map))) +(defun which-key--process-page (page-n pages-plist) + (let* ((page (nth page-n (plist-get pages-plist :pages))) + (height (plist-get pages-plist :page-height)) + (n-pages (plist-get pages-plist :n-pages)) + (prefix-keys (key-description which-key--current-prefix)) + (full-prefix (which-key--full-prefix prefix-keys)) + (nxt-pg-hint (which-key--next-page-hint prefix-keys)) + ;; not used in left case + (status-line + (concat (propertize (which-key--maybe-get-prefix-title + (which-key--current-key-string)) + 'face 'which-key-note-face) + (when (< 1 n-pages) + (propertize (format " (%s of %s)" + (1+ page-n) n-pages) + 'face 'which-key-note-face))))) + (pcase which-key-show-prefix + (`left + (let* ((page-cnt (propertize (format "%s/%s" (1+ page-n) n-pages) + 'face 'which-key-separator-face)) + (first-col-width (+ 2 (max (which-key--string-width full-prefix) + (which-key--string-width page-cnt)))) + (prefix (format (concat "%-" (int-to-string first-col-width) "s") + full-prefix)) + (page-cnt (if (> n-pages 1) + (format (concat "%-" (int-to-string first-col-width) "s") + page-cnt) + (make-string first-col-width 32))) + lines first-line new-end) + (if (= 1 height) + (concat prefix page) + (setq lines (split-string page "\n") + first-line (concat prefix (car lines) "\n" page-cnt) + new-end (concat "\n" (make-string first-col-width 32))) + (cons + (concat first-line (mapconcat #'identity (cdr lines) new-end)) + nil)))) + (`top + (cons + (concat (when (or (= 0 echo-keystrokes) + (not (eq which-key-side-window-location 'bottom))) + (concat full-prefix " ")) + status-line " " nxt-pg-hint "\n" page) + nil)) + (`bottom + (cons + (concat page "\n" + (when (or (= 0 echo-keystrokes) + (not (eq which-key-side-window-location 'bottom))) + (concat full-prefix " ")) + status-line " " nxt-pg-hint) + nil)) + (`echo + (cons page + (concat full-prefix (when prefix-keys " ") + status-line (when status-line " ") + nxt-pg-hint)))))) + (defun which-key--show-page (n) "Show page N, starting from 0." (which-key--init-buffer) ;; in case it was killed @@ -1635,71 +1709,17 @@ enough space based on your settings and frame size." prefix-keys) (setq page-n (mod n n-pages) which-key--current-page-n page-n) (when (= n-pages (1+ n)) (setq which-key--on-last-page t)) - (let* ((page (nth page-n (plist-get which-key--pages-plist :pages))) - (height (plist-get which-key--pages-plist :page-height)) - (width (nth page-n (plist-get which-key--pages-plist :page-widths))) - (n-shown (nth page-n (plist-get which-key--pages-plist :keys/page))) - (n-tot (plist-get which-key--pages-plist :tot-keys)) - (full-prefix (which-key--full-prefix prefix-keys)) - (status-left (propertize (format "%s/%s" (1+ page-n) n-pages) - 'face 'which-key-separator-face)) - (status-top (propertize (which-key--maybe-get-prefix-title - (which-key--current-key-string)) - 'face 'which-key-note-face)) - (status-top (concat status-top - (when (< 1 n-pages) - (propertize (format " (%s of %s)" - (1+ page-n) n-pages) - 'face 'which-key-note-face)))) - (first-col-width (+ 2 (max (which-key--string-width full-prefix) - (which-key--string-width status-left)))) - (prefix-left (format (concat "%-" (int-to-string first-col-width) "s") - full-prefix)) - (status-left (format (concat "%-" (int-to-string first-col-width) "s") - status-left)) - (nxt-pg-hint (which-key--next-page-hint prefix-keys)) - new-end lines first) - (cond ((and (< 1 n-pages) - (eq which-key-show-prefix 'left)) - (setq lines (split-string page "\n") - first (concat prefix-left (car lines) "\n" status-left) - new-end (concat "\n" (make-string first-col-width 32)) - page (concat first (mapconcat #'identity (cdr lines) new-end)))) - ((eq which-key-show-prefix 'left) - (if (= 1 height) - (setq page (concat prefix-left page)) - (setq lines (split-string page "\n") - first (concat prefix-left (car lines) - "\n" (make-string first-col-width 32)) - new-end (concat "\n" (make-string first-col-width 32)) - page (concat first (mapconcat #'identity (cdr lines) new-end))))) - ((eq which-key-show-prefix 'top) - (setq page - (concat - (when (or (= 0 echo-keystrokes) - (not (eq which-key-side-window-location 'bottom))) - (concat full-prefix " ")) - status-top " " nxt-pg-hint "\n" page))) - ((eq which-key-show-prefix 'bottom) - (setq page - (concat - page "\n" - (when (or (= 0 echo-keystrokes) - (not (eq which-key-side-window-location 'bottom))) - (concat full-prefix " ")) - status-top " " nxt-pg-hint))) - ((eq which-key-show-prefix 'echo) - (which-key--echo (concat full-prefix - (when prefix-keys " ") - status-top (when status-top " ") - nxt-pg-hint)))) - (which-key--lighter-status n-shown n-tot) + (let ((page-echo (which-key--process-page page-n which-key--pages-plist)) + (height (plist-get which-key--pages-plist :page-height)) + (width (nth page-n (plist-get which-key--pages-plist :page-widths)))) + (which-key--lighter-status page-n) (if (eq which-key-popup-type 'minibuffer) - (which-key--echo page) + (which-key--echo (car page-echo)) (with-current-buffer which-key--buffer (erase-buffer) - (insert page) + (insert (car page-echo)) (goto-char (point-min))) + (when (cdr page-echo) (which-key--echo (cdr page-echo))) (which-key--show-popup (cons height width))))) ;; used for paging at top-level (if (fboundp 'set-transient-map) From 529e9ac9f539aadd609aba8dd96d9d7704f1423b Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 6 Feb 2016 20:16:07 -0500 Subject: [PATCH 421/816] Add which-key-is-verbose Allows one to silence messages which may not indicate an error. --- which-key.el | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 7ddbfc98f42..cf58bfc303b 100644 --- a/which-key.el +++ b/which-key.el @@ -276,6 +276,11 @@ prefixes in `which-key-paging-prefixes'" 'which-key-use-C-h-commands "2015-12-2") +(defcustom which-key-is-verbose nil + "Whether to warn about potential mistakes in configuration." + :group 'which-key + :type 'boolean) + (defvar which-key-C-h-map (let ((map (make-sparse-keymap))) (dolist (bind '(("\C-a" . which-key-abort) @@ -650,8 +655,9 @@ bottom." (cond ((null alist) (list (cons keys value))) ((assoc-string keys alist) (when (not (string-equal (cdr (assoc-string keys alist)) value)) - (message "which-key: changing %s name from %s to %s in the %s alist" - key (cdr (assoc-string keys alist)) value alist-name) + (when which-key-is-verbose + (message "which-key: changing %s name from %s to %s in the %s alist" + key (cdr (assoc-string keys alist)) value alist-name)) (setcdr (assoc-string keys alist) value)) alist) (t (cons (cons keys value) alist))))) @@ -706,7 +712,8 @@ string." (let ((keys (key-description (kbd key-seq-str)))) (if (and (null force) (assoc-string keys which-key-prefix-title-alist)) - (message "which-key: Prefix title not added. A title exists for this prefix.") + (when which-key-is-verbose + (message "which-key: Prefix title not added. A title exists for this prefix.")) (push (cons keys title) which-key-prefix-title-alist)))) ;;;###autoload From 0ca36cef48fc21b0a2c2a17ef310036c1fc051f9 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 9 Feb 2016 11:32:20 -0500 Subject: [PATCH 422/816] Add missing case for which-key-show-prefix nil is a valid value for this option. --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index cf58bfc303b..8934934c082 100644 --- a/which-key.el +++ b/which-key.el @@ -1702,7 +1702,8 @@ including prefix arguments." (cons page (concat full-prefix (when prefix-keys " ") status-line (when status-line " ") - nxt-pg-hint)))))) + nxt-pg-hint))) + (_ (cons page nil))))) (defun which-key--show-page (n) "Show page N, starting from 0." From 4ea4a940ffe5d344a96923e3c467adff4c681890 Mon Sep 17 00:00:00 2001 From: USAMI Kenta Date: Sat, 13 Feb 2016 23:21:05 +0900 Subject: [PATCH 423/816] Disable show-trailing-whitespace --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index 8934934c082..44d893f6a4d 100644 --- a/which-key.el +++ b/which-key.el @@ -535,6 +535,7 @@ alongside the actual current key sequence when (setq-local cursor-in-non-selected-windows nil) (setq-local mode-line-format nil) (setq-local word-wrap nil) + (setq-local show-trailing-whitespace nil) (run-hooks 'which-key-init-buffer-hook)))) (defun which-key--setup () From 44c406404d21c28e470e0a6521a73d32a16d2b0a Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 29 Feb 2016 08:07:55 -0500 Subject: [PATCH 424/816] Export reload-key-sequence function Fixes #103 --- which-key.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 44d893f6a4d..12e4d1b82c8 100644 --- a/which-key.el +++ b/which-key.el @@ -1739,7 +1739,12 @@ enough space based on your settings and frame size." prefix-keys) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; paging functions -(defun which-key--reload-key-sequence (key-seq) +;;;###autoload +(defun which-key-reload-key-sequence (key-seq) + "Simulate entering the key sequence KEY-SEQ. +KEY-SEQ should be a list of events as produced by +`listify-key-sequence'. Any prefix arguments that were used are +reapplied to the new key sequence." (let ((next-event (mapcar (lambda (ev) (cons t ev)) key-seq))) (setq prefix-arg current-prefix-arg unread-command-events next-event))) @@ -1748,7 +1753,7 @@ enough space based on your settings and frame size." prefix-keys) "Show the next page of keys." (let ((next-page (if which-key--current-page-n (+ which-key--current-page-n delta) 0))) - (which-key--reload-key-sequence (which-key--current-key-list)) + (which-key-reload-key-sequence (which-key--current-key-list)) (if which-key--last-try-2-loc (let ((which-key-side-window-location which-key--last-try-2-loc) (which-key--multiple-locations t)) @@ -1825,7 +1830,7 @@ after first page." (which-key--show-keymap (car args) (cdr args))) (which-key--hide-popup))) (key-lst - (which-key--reload-key-sequence key-lst) + (which-key-reload-key-sequence key-lst) (which-key--create-buffer-and-show (apply #'vector key-lst))) (t (which-key-show-top-level))))) (defalias 'which-key-undo 'which-key-undo-key) From 5e0b9b64fa6e71331f8c43c2c30587d5293be7e3 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Mar 2016 16:41:31 -0500 Subject: [PATCH 425/816] Fix bug when show-prefix is left and there is one line Fixes #104 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 12e4d1b82c8..ab0713daafd 100644 --- a/which-key.el +++ b/which-key.el @@ -1677,7 +1677,7 @@ including prefix arguments." (make-string first-col-width 32))) lines first-line new-end) (if (= 1 height) - (concat prefix page) + (cons (concat prefix page) nil) (setq lines (split-string page "\n") first-line (concat prefix (car lines) "\n" page-cnt) new-end (concat "\n" (make-string first-col-width 32))) From 4622d18850a5fe52af07ce18001e963fe4cfd80f Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 3 Mar 2016 16:43:31 -0500 Subject: [PATCH 426/816] Increment version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ab0713daafd..138d46b3d40 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.8 +;; Version: 0.9 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From e81b7898aca445b77808085c642d18721ba9d1f4 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 10 Mar 2016 09:03:35 -0500 Subject: [PATCH 427/816] Fix compiler warnings Fixes #106 --- which-key.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 138d46b3d40..1971dc9b84c 100644 --- a/which-key.el +++ b/which-key.el @@ -41,8 +41,12 @@ (require 'cl-lib) (require 'button) -(eval-when-compile - (defvar golden-ratio-mode)) +;; For compiler +(defvar evil-operator-shortcut-map) +(defvar evil-operator-state-map) +(defvar evil-motion-state-map) +(defvar golden-ratio-mode) +(declare-function evil-get-command-property "ext:evil-common.el") (defgroup which-key nil "Customization options for which-key-mode" From 2d8767caa4e926027bf106450e0df7286f5e0a2d Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 10 Mar 2016 19:51:58 -0500 Subject: [PATCH 428/816] Disable special-keys option by default It's probably too surprising to have enabled by default. --- README.org | 4 +++- which-key.el | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/README.org b/README.org index 52429939f49..b955fbe0b9e 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,8 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] -** What's New +** Semi-Recent Changes +- =which-key-special-keys= is now disabled by default. See the docstring for the + old setting. - =C-h= commands! Now =C-h= will prompt you will several options instead of going directly to the next page. You can (see =which-key-C-h-map=) - Cycle through the pages forward with =n= (or =C-n=) diff --git a/which-key.el b/which-key.el index 1971dc9b84c..d874e18d297 100644 --- a/which-key.el +++ b/which-key.el @@ -150,9 +150,12 @@ the element is a cons cell, it should take the form (regexp . face to apply)." :group 'which-key) -(defcustom which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL") +(defcustom which-key-special-keys '() "These keys will automatically be truncated to one character -and have `which-key-special-key-face' applied to them." +and have `which-key-special-key-face' applied to them. This is +disabled by default. Try this to see the effect. + +\(setq which-key-special-keys '(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)" :group 'which-key :type '(repeat string)) From 91ab13ee3946bb6609d47bb510f2be1e6d4b392e Mon Sep 17 00:00:00 2001 From: "Will S. Medrano" Date: Sun, 13 Mar 2016 18:07:58 -0700 Subject: [PATCH 429/816] made minor mode lighter customizable --- which-key.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d874e18d297..ff0716beb16 100644 --- a/which-key.el +++ b/which-key.el @@ -424,6 +424,11 @@ ignored." :group 'which-key :type 'function) +(defcustom which-key-custom-lighter " WK" + "minor mode lighter to use in the mode-line." + :group 'which-key + :type 'string) + (defvar which-key-inhibit nil "Prevent which-key from popping up momentarily by setting this to a non-nil value for the execution of a command. Like this @@ -496,7 +501,7 @@ alongside the actual current key sequence when (define-minor-mode which-key-mode "Toggle which-key-mode." :global t - :lighter " WK" + :lighter which-key-custom-lighter :keymap (let ((map (make-sparse-keymap))) (mapc (lambda (prefix) From 9df87e6e36e55c55fcc7395fee7809ebd30c0396 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 14 Mar 2016 07:25:54 -0400 Subject: [PATCH 430/816] Shorten lighter name --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index ff0716beb16..490ca24aca0 100644 --- a/which-key.el +++ b/which-key.el @@ -424,8 +424,8 @@ ignored." :group 'which-key :type 'function) -(defcustom which-key-custom-lighter " WK" - "minor mode lighter to use in the mode-line." +(defcustom which-key-lighter " WK" + "Minor mode lighter to use in the mode-line." :group 'which-key :type 'string) @@ -501,7 +501,7 @@ alongside the actual current key sequence when (define-minor-mode which-key-mode "Toggle which-key-mode." :global t - :lighter which-key-custom-lighter + :lighter which-key-lighter :keymap (let ((map (make-sparse-keymap))) (mapc (lambda (prefix) From 23a01c9fc0d1c489a355b2bec07f4e4a791c3db9 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 17 Mar 2016 13:04:33 -0400 Subject: [PATCH 431/816] Make show-standard-help narrow to prefix This is what describe-prefix-bindings does and it should be consistent. --- which-key.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 490ca24aca0..3aaf86c97e1 100644 --- a/which-key.el +++ b/which-key.el @@ -1780,7 +1780,13 @@ Usually this is `describe-prefix-bindings'." (interactive) (let ((which-key-inhibit t)) (which-key--hide-popup-ignore-command) - (funcall which-key--prefix-help-cmd-backup))) + (cond ((eq which-key--prefix-help-cmd-backup + 'describe-prefix-bindings) + ;; This is essentially what `describe-prefix-bindings' does + (describe-bindings + (kbd (which-key--current-key-string)))) + ((functionp which-key--prefix-help-cmd-backup) + (funcall which-key--prefix-help-cmd-backup))))) ;;;###autoload (defun which-key-show-next-page-no-cycle () From a571ba2338f570b2738f55f221385404e1d69645 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 21 Mar 2016 22:04:53 -0400 Subject: [PATCH 432/816] Cleanup for 1.0 release --- README.org | 75 +++++++++++++++------------------------------------- which-key.el | 16 +---------- 2 files changed, 22 insertions(+), 69 deletions(-) diff --git a/README.org b/README.org index b955fbe0b9e..75db6d84623 100644 --- a/README.org +++ b/README.org @@ -1,23 +1,5 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] -** Semi-Recent Changes -- =which-key-special-keys= is now disabled by default. See the docstring for the - old setting. -- =C-h= commands! Now =C-h= will prompt you will several options instead of - going directly to the next page. You can (see =which-key-C-h-map=) - - Cycle through the pages forward with =n= (or =C-n=) - - Cycle backwards with =p= (or =C-p=) - - Undo the last entered key (!) with =u= (or =C-u=) - - Call the default command bound to =C-h=, usually =describe-prefix-bindings=, with =h= (or =C-h=) - This is a fairly substantial change and might introduce a bug or two, so - please report anything you see that is strange and I will try to fix it. -- Use your mouse to hover over commands and the docstring will be displayed in - the echo area or a tooltip, depending on whether or not you're using - =tooltip-mode=. -- The function =which-key-show-top-level= was implemented by @iqbalansari - (thanks!) to show top-level key bindings (those not behind a prefix). You can - use =M-x which-key-show-top-level= to try it and bind it to a key if you like. - It should function just like any other which-key popup once it's called. ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following your currently @@ -29,19 +11,6 @@ the popup will look like are included below. =which-key= started as a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged to a certain extent. -With respect to =guide-key=, the intention is to provide the -following features: -1. A different polling mechanism to make it lighter on resources than guide-key -2. An improved display of keys with more keys being shown by default and a nicer - presentation -3. Customization options that allow for the rewriting of command names on the - fly through easily modifiable alists -4. Good default configurations that work well with most themes -5. A well configured back-end for displaying keys (removing the popwin - dependency) that can be easily customized by writing new display functions - -Many of these have been implemented and are described below. - ** Table of Contents :TOC@4: - [[#which-key-][which-key ]] - [[#whats-new][What's New]] @@ -335,17 +304,22 @@ available options. *** Paging Options [Note: This section is out of date given the new =C-h= commands feature described in the What's New section. I will update it soon.]. +- =C-h= commands! Now =C-h= will prompt you will several options instead of + going directly to the next page. You can (see =which-key-C-h-map=) + This is a fairly substantial change and might introduce a bug or two, so + please report anything you see that is strange and I will try to fix it. + There are at least several prefixes that have many keys bound to them, like =C-x=. which-key displays as many keys as it can given your settings, but for these prefixes this may not be enough. The paging feature gives you the ability -to bind a key to the function =which-key-show-next-page= which will cycle -through the pages without changing the key sequence you were in the middle of -typing. There are two slightly different ways of doing this. +to bind a key to the function =which-key-C-h-dispatch= which will allow you to +cycle through the pages without changing the key sequence you were in the middle +of typing. There are two slightly different ways of doing this. **** Method 1 (default): Using C-h (or =help-char=) This is the easiest way, and is turned on by default. Use #+BEGIN_SRC emacs-lisp -(setq which-key-use-C-h-for-paging nil) +(setq which-key-use-C-h-commands nil) #+END_SRC to disable the behavior (this will only take effect after toggling which-key-mode if it is already enabled). =C-h= can be used with any prefix to @@ -354,23 +328,15 @@ behavior of Emacs which is to show a list of key bindings that apply to a prefix For example, if you were to type =C-x C-h= you would get a list of commands that follow =C-x=. This uses which-key instead to show those keys, and unlike the Emacs default saves the incomplete prefix that you just entered so that the next -keystroke can complete the command. As a bonus you can type =C-x C-h= and the -which-key buffer will pop up immediately (i.e., before =which-key-idle-delay= -kicks in). +keystroke can complete the command. -The option =which-key-prevent-C-h-from-cycling=, which is =t= by default -allows one to take advantage of using =C-h= for paging as well as the default -Emacs behavior of using =C-h= to describe the bindings for the current key -sequence prefix. +The commands are: + - Cycle through the pages forward with =n= (or =C-n=) + - Cycle backwards with =p= (or =C-p=) + - Undo the last entered key (!) with =u= (or =C-u=) + - Call the default command bound to =C-h=, usually =describe-prefix-bindings=, + with =h= (or =C-h=) -The default configuration below will allow you to switch paging using =C-h= -until you reach the last page of keys in the which-key buffer. The next press of -=C-h= will close the which-key buffer and trigger the default Emacs behavior on -=C-h=. -#+BEGIN_SRC emacs-lisp -(setq which-key-use-C-h-for-paging t - which-key-prevent-C-h-from-cycling t) -#+END_SRC This is especially useful for those who like =helm-descbinds= but also want to use =C-h= as their which-key paging key. @@ -382,7 +348,7 @@ Essentially, all you need to do for a prefix like =C-x= is the following which will bind == to the relevant command. #+BEGIN_SRC emacs-lisp -(define-key which-key-mode-map (kbd "C-x ") 'which-key-show-next-page) +(define-key which-key-mode-map (kbd "C-x ") 'which-key-C-h-dispatch) #+END_SRC This is completely equivalent to @@ -455,9 +421,10 @@ shown. (setq which-key-prefix-prefix "+" ) ;; Set the special keys. These are automatically truncated to one character and - ;; have which-key-special-key-face applied. Set this variable to nil to disable - ;; the feature - (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) + ;; have which-key-special-key-face applied. Disabled by default. An example + ;; setting is + ;; (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) + (setq which-key-special-keys nil) ;; Show the key prefix on the left, top, or bottom (nil means hide the prefix). ;; The prefix consists of the keys you have typed so far. which-key also shows diff --git a/which-key.el b/which-key.el index 3aaf86c97e1..7fec216b9ee 100644 --- a/which-key.el +++ b/which-key.el @@ -1010,20 +1010,6 @@ call signature in different emacs versions" (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) -;; "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-side-window-location)) - -;; (defun which-key-hide-buffer-popwin () -;; "Hide popwin buffer." -;; (when (eq popwin:popup-buffer (get-buffer which-key--buffer)) -;; (popwin:close-popup-window))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Max dimension of available window functions @@ -1533,7 +1519,7 @@ metadata." (defun which-key--create-pages-1 (keys available-lines available-width &optional min-lines vertical) - "Create page strings using `popalist-list-to-page'. + "Create page strings using `which-key--list-to-pages'. Will try to find the best number of rows and columns using the given dimensions and the length and widths of ITEMS. Use VERTICAL if the ITEMS are laid out vertically and the number of columns From 3150e7d9a4f4f55be9ee02ddee6a901940f3db13 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 21 Mar 2016 22:05:26 -0400 Subject: [PATCH 433/816] Version 1.0 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 7fec216b9ee..a0f226bb393 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 0.9 +;; Version: 1.0 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From bf4c7d8559715e0fc6d620d4df99209c686c423b Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 31 Mar 2016 10:51:32 -0400 Subject: [PATCH 434/816] Support key-chord Fixes #108 --- which-key.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/which-key.el b/which-key.el index a0f226bb393..2706a99062b 100644 --- a/which-key.el +++ b/which-key.el @@ -2021,6 +2021,18 @@ Finally, show the buffer." ;; (message "key: %s" (key-description prefix-keys))) ;; (when (> (length prefix-keys) 0) ;; (message "key binding: %s" (key-binding prefix-keys))) + ;; Taken from guide-key + (when (and (equal prefix-keys [key-chord]) + (bound-and-true-p key-chord-mode)) + (setq prefix-keys + (condition-case nil + (let ((rkeys (recent-keys))) + (vector 'key-chord + (aref rkeys (- (length rkeys) 2)) + (aref rkeys (- (length rkeys) 1)))) + (error (progn + (message "which-key error in key-chord handling") + [key-chord]))))) (cond ((and (> (length prefix-keys) 0) (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map From fe56015cb1d8aad9c863d9a017f12ad7e374f132 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 31 Mar 2016 16:13:06 -0400 Subject: [PATCH 435/816] Fix key-chord problem See the note in which-key--update --- which-key.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 2706a99062b..8435d2eb2ec 100644 --- a/which-key.el +++ b/which-key.el @@ -2028,8 +2028,13 @@ Finally, show the buffer." (condition-case nil (let ((rkeys (recent-keys))) (vector 'key-chord - (aref rkeys (- (length rkeys) 2)) - (aref rkeys (- (length rkeys) 1)))) + ;; Take the two preceding the last one, because the + ;; read-event call in key-chord seems to add a + ;; spurious key press to this list. Note this is + ;; different from guide-key's method which didn't work + ;; for me. + (aref rkeys (- (length rkeys) 3)) + (aref rkeys (- (length rkeys) 2)))) (error (progn (message "which-key error in key-chord handling") [key-chord]))))) From 20032f52c7b5af3b4db27b7c11a2839026fa816a Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Apr 2016 09:36:43 -0400 Subject: [PATCH 436/816] Fix bug in declare-prefixes-for-mode Fixes #109 --- which-key.el | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index 8435d2eb2ec..e17bde7f281 100644 --- a/which-key.el +++ b/which-key.el @@ -747,14 +747,14 @@ MORE allows you to specifcy additional KEY-SEQUENCE NAME pairs. All names are added to `which-key-prefix-names-alist' and titles to `which-key-prefix-title-alist'." (while key-sequence - (let ((-name (if (consp name) (car name) name)) - (-title (if (consp name) (cdr name) name))) + (let ((name (if (consp name) (car name) name)) + (title (if (consp name) (cdr name) name))) (setq which-key-prefix-name-alist (which-key--add-key-val-to-alist - which-key-prefix-name-alist key-sequence -name "prefix-name") + which-key-prefix-name-alist key-sequence name "prefix-name") which-key-prefix-title-alist (which-key--add-key-val-to-alist - which-key-prefix-title-alist key-sequence -title "prefix-title"))) + which-key-prefix-title-alist key-sequence title "prefix-title"))) (setq key-sequence (pop more) name (pop more)))) (put 'which-key-declare-prefixes 'lisp-indent-function 'defun) @@ -767,16 +767,16 @@ addition KEY-SEQUENCE NAME pairs) to apply." (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) (let ((mode-name-alist (cdr (assq mode which-key-prefix-name-alist))) - (mode-title-alist (cdr (assq mode which-key-prefix-title-alist))) - (-name (if (consp name) (car name) name)) - (-title (if (consp name) (cdr name) name))) + (mode-title-alist (cdr (assq mode which-key-prefix-title-alist)))) (while key-sequence - (setq mode-name-alist (which-key--add-key-val-to-alist - mode-name-alist key-sequence -name - (format "prefix-name-%s" mode)) - mode-title-alist (which-key--add-key-val-to-alist - mode-title-alist key-sequence -title - (format "prefix-name-%s" mode))) + (let ((name (if (consp name) (car name) name)) + (title (if (consp name) (cdr name) name))) + (setq mode-name-alist (which-key--add-key-val-to-alist + mode-name-alist key-sequence name + (format "prefix-name-%s" mode)) + mode-title-alist (which-key--add-key-val-to-alist + mode-title-alist key-sequence title + (format "prefix-name-%s" mode)))) (setq key-sequence (pop more) name (pop more))) (if (assq mode which-key-prefix-name-alist) (setcdr (assq mode which-key-prefix-name-alist) mode-name-alist) From 4800f339465b4f3a1a2af1ac1a02ca4f92611533 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Apr 2016 09:39:20 -0400 Subject: [PATCH 437/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e17bde7f281..8c8b3dfb25f 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.0 +;; Version: 1.1.2 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From b98616102540365362c4b41edff14d45a6cb9633 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Apr 2016 10:04:54 -0400 Subject: [PATCH 438/816] Add tests --- which-key-tests.el | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 which-key-tests.el diff --git a/which-key-tests.el b/which-key-tests.el new file mode 100644 index 00000000000..e5c8c4a05f0 --- /dev/null +++ b/which-key-tests.el @@ -0,0 +1,57 @@ +;;; which-key-tests.el --- Tests for which-key.el -*- lexical-binding: t; -*- + +;; Copyright (C) 2015 Justin Burkett + +;; Author: Justin Burkett +;; URL: https://github.com/justbur/emacs-which-key + +;; 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 . + +;;; Commentary: + +;; Tests for which-key.el + +;;; Code: + +(require 'which-key) +(require 'ert) + +(ert-deftest which-key-test-prefix-declaration () + "Test `which-key-declare-prefixes' and +`which-key-declare-prefixes-for-mode'. See Bug #109." + (let* (test-mode which-key-prefix-name-alist which-key-prefix-title-alist) + (which-key-declare-prefixes + "SPC C-c" '("complete" . "complete title") + "SPC C-k" "cancel") + (which-key-declare-prefixes-for-mode 'test-mode + "C-c C-c" '("complete" . "complete title") + "C-c C-k" "cancel") + (should (equal + (assoc-string "SPC C-k" which-key-prefix-name-alist) + '("SPC C-k" . "cancel"))) + (should (equal + (assoc-string + "C-c C-c" (cdr (assq 'test-mode which-key-prefix-name-alist))) + '("C-c C-c" . "complete"))) + (pp which-key-prefix-title-alist) + (should (equal + (assoc-string "SPC C-k" which-key-prefix-title-alist) + '("SPC C-k" . "cancel"))) + (should (equal + (assoc-string + "C-c C-c" (cdr (assq 'test-mode which-key-prefix-title-alist))) + '("C-c C-c" . "complete title"))))) + +(provide 'which-key-tests) +;;; which-key-tests.el ends here From 001a458fc62664f9d67fb99b9955d36ed325d706 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Apr 2016 10:05:15 -0400 Subject: [PATCH 439/816] Fix docstring typo --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 8c8b3dfb25f..891deaaa824 100644 --- a/which-key.el +++ b/which-key.el @@ -760,7 +760,7 @@ to `which-key-prefix-title-alist'." ;;;###autoload (defun which-key-declare-prefixes-for-mode (mode key-sequence name &rest more) - "Functions like `which-key-declare-prefix-names'. + "Functions like `which-key-declare-prefixes'. The difference is that MODE specifies the `major-mode' that must be active for KEY-SEQUENCE and NAME (MORE contains addition KEY-SEQUENCE NAME pairs) to apply." From 07d649e07753f10752f5b33f72b4445d12b5a64d Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Apr 2016 10:05:38 -0400 Subject: [PATCH 440/816] Fix problem where prefix-title-alist was not updated --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 891deaaa824..898109f13b9 100644 --- a/which-key.el +++ b/which-key.el @@ -780,7 +780,10 @@ addition KEY-SEQUENCE NAME pairs) to apply." (setq key-sequence (pop more) name (pop more))) (if (assq mode which-key-prefix-name-alist) (setcdr (assq mode which-key-prefix-name-alist) mode-name-alist) - (push (cons mode mode-name-alist) which-key-prefix-name-alist)))) + (push (cons mode mode-name-alist) which-key-prefix-name-alist)) + (if (assq mode which-key-prefix-title-alist) + (setcdr (assq mode which-key-prefix-title-alist) mode-title-alist) + (push (cons mode mode-title-alist) which-key-prefix-title-alist)))) (put 'which-key-declare-prefixes-for-mode 'lisp-indent-function 'defun) (defun which-key-define-key-recursively (map key def &optional recursing) From 060c8fe0b1a0390bea018a1694fc59d00fb620f2 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Apr 2016 10:06:45 -0400 Subject: [PATCH 441/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 898109f13b9..d0052e38c85 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.2 +;; Version: 1.1.3 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 97c7ab1ba1d6f713a7b2e388db622c0cade5bce2 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Apr 2016 10:09:59 -0400 Subject: [PATCH 442/816] Set up travis --- .travis.yml | 26 ++++++++++++++++++++++++++ Cask | 7 +++++++ Makefile | 18 ++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 .travis.yml create mode 100644 Cask create mode 100644 Makefile diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000..cdea71fe995 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,26 @@ +language: generic +sudo: false + +branches: + only: + - master + +before_install: + - curl -fsSkL https://gist.github.com/rejeep/ebcd57c3af83b049833b/raw > x.sh && source ./x.sh + - evm install $EVM_EMACS --use --skip + - cask + +env: + - EVM_EMACS=emacs-24.4-travis + - EVM_EMACS=emacs-24.5-travis + - EVM_EMACS=emacs-git-snapshot-travis + +matrix: + fast_finish: true + allow_failures: + env: + - EVM_EMACS=emacs-git-snapshot-travis + +script: + - emacs --version + - make test diff --git a/Cask b/Cask new file mode 100644 index 00000000000..60fa07cbdf2 --- /dev/null +++ b/Cask @@ -0,0 +1,7 @@ +(source gnu) +(source melpa) + +(package-file "which-key.el") + +(development + (depends-on "ert")) diff --git a/Makefile b/Makefile new file mode 100644 index 00000000000..34574e36025 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +.PHONY : test + +EMACS ?= emacs +CASK ?= cask + +LOADPATH = -L . + +ELPA_DIR = \ + .cask/$(shell $(EMACS) -Q --batch --eval '(princ emacs-version)')/elpa + +test: elpa + $(CASK) exec $(EMACS) -Q -batch $(LOADPATH) \ + -l which-key-tests.el -f ert-run-tests-batch-and-exit + +elpa: $(ELPA_DIR) +$(ELPA_DIR): Cask + $(CASK) install + touch $@ From c77d75fe9d76aac82492bba447796b52b2266823 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Apr 2016 10:12:04 -0400 Subject: [PATCH 443/816] Trigger travis --- Cask | 1 + 1 file changed, 1 insertion(+) diff --git a/Cask b/Cask index 60fa07cbdf2..d8171e342fc 100644 --- a/Cask +++ b/Cask @@ -5,3 +5,4 @@ (development (depends-on "ert")) + From 2fef1f73c4f95ad1799dd925b732cc73455def80 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 6 Apr 2016 13:53:58 -0400 Subject: [PATCH 444/816] Add badge --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 75db6d84623..f3b29526986 100644 --- a/README.org +++ b/README.org @@ -1,5 +1,5 @@ * which-key -[[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] +[[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following your currently From d0075fbd74ed52a92f1f1dded45d2487174195bf Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 10 Apr 2016 15:05:02 -0400 Subject: [PATCH 445/816] Support key ranges below top level --- which-key.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/which-key.el b/which-key.el index d0052e38c85..ce4dd749dc7 100644 --- a/which-key.el +++ b/which-key.el @@ -1420,6 +1420,15 @@ alists. Returns a list (key separator description)." (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt) key)) (unless (assoc-string (match-string 1 key) bindings) (push (cons (match-string 1 key) binding) bindings))) + ((and which-key--current-prefix + (string-match + (format + "^%s[ \t]\\([^ \t]+\\) \\.\\. %s[ \t]\\([^ \t]+\\)[ \t]+$" + key-str-qt key-str-qt) key)) + (let ((stripped-key + (concat (match-string 1 key) " \.\. " (match-string 2 key)))) + (unless (assoc-string stripped-key bindings) + (push (cons stripped-key binding) bindings)))) ((string-match "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$" key) (unless (assoc-string (match-string 1 key) bindings) (push (cons (match-string 1 key) binding) bindings))))))))) From 6ac8c56b245ceea1923152de4d7bdbd46b3e5367 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 10 Apr 2016 15:07:15 -0400 Subject: [PATCH 446/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ce4dd749dc7..7b8038b0ad1 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.3 +;; Version: 1.1.4 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 48cbf48d68ed217c08f28f429d71d178017363b8 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 17 Apr 2016 16:34:45 -0400 Subject: [PATCH 447/816] Declare variable-name-history Fixes #110 --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index 7b8038b0ad1..32a251dfef6 100644 --- a/which-key.el +++ b/which-key.el @@ -46,6 +46,7 @@ (defvar evil-operator-state-map) (defvar evil-motion-state-map) (defvar golden-ratio-mode) +(defvar variable-name-history) (declare-function evil-get-command-property "ext:evil-common.el") (defgroup which-key nil From e7ce315c371b89ea746617d94c4130abc81ea011 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 17 Apr 2016 16:37:26 -0400 Subject: [PATCH 448/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 32a251dfef6..817a8ba9193 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.4 +;; Version: 1.1.5 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 77a559ed31b7245953f745d282f6af5c3971c001 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 17 Apr 2016 16:57:26 -0400 Subject: [PATCH 449/816] Explicitly initialize variable-name-history See #110 --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 817a8ba9193..0bafbf6f829 100644 --- a/which-key.el +++ b/which-key.el @@ -46,9 +46,10 @@ (defvar evil-operator-state-map) (defvar evil-motion-state-map) (defvar golden-ratio-mode) -(defvar variable-name-history) (declare-function evil-get-command-property "ext:evil-common.el") +(defvar variable-name-history nil) + (defgroup which-key nil "Customization options for which-key-mode" :group 'help From a45a4248ca6006c055165f6d2683710cefda6f39 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 17 Apr 2016 16:58:15 -0400 Subject: [PATCH 450/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 0bafbf6f829..54839807a0b 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.5 +;; Version: 1.1.6 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 38762c3f909ca39d9f89b76935bf2615a6cae35f Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 19 Apr 2016 08:14:34 -0400 Subject: [PATCH 451/816] Use new history var for keymap selection --- which-key.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 54839807a0b..6939132cfa9 100644 --- a/which-key.el +++ b/which-key.el @@ -48,8 +48,6 @@ (defvar golden-ratio-mode) (declare-function evil-get-command-property "ext:evil-common.el") -(defvar variable-name-history nil) - (defgroup which-key nil "Customization options for which-key-mode" :group 'help @@ -438,6 +436,10 @@ to a non-nil value for the execution of a command. Like this \(let \(\(which-key-inhibit t\)\) ...\)") +(defvar which-key-keymap-history nil + "History of keymap selections in functions like +`which-key-show-keymap'.") + ;; Internal Vars (defvar which-key--buffer nil "Internal: Holds reference to which-key buffer.") @@ -1923,7 +1925,7 @@ is selected interactively from all available keymaps." (and (boundp m) (keymapp (symbol-value m)) (not (equal (symbol-value m) (make-sparse-keymap))))) - t nil 'variable-name-history)))) + t nil 'which-key-keymap-history)))) (which-key--show-keymap (symbol-name keymap-sym) (symbol-value keymap-sym)))) (defun which-key-show-minor-mode-keymap () @@ -1940,7 +1942,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (and (symbol-value (car entry)) (not (equal (cdr entry) (make-sparse-keymap))))) minor-mode-map-alist)) - nil t nil 'variable-name-history)))) + nil t nil 'which-key-keymap-history)))) (which-key--show-keymap (symbol-name mode-sym) (cdr (assq mode-sym minor-mode-map-alist))))) From d572f37f21838eb336c1eaf79672a7acb9ff06c0 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 19 Apr 2016 08:15:23 -0400 Subject: [PATCH 452/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 6939132cfa9..ae58344153c 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.6 +;; Version: 1.1.7 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 5284e904cc7e9dc1e5dd57de94f0dd789db74d15 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 26 Apr 2016 09:07:12 -0400 Subject: [PATCH 453/816] Add support for god-mode Needs to be explicitly activated by calling (which-key-enable-god-mode-support) --- which-key.el | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/which-key.el b/which-key.el index ae58344153c..1504519d856 100644 --- a/which-key.el +++ b/which-key.el @@ -501,6 +501,30 @@ sequence. prefix-title is a string. The title is displayed alongside the actual current key sequence when `which-key-show-prefix' is set to either top or echo.") +;; God-mode +(defvar which-key--god-mode-support-enabled nil + "Support god-mode if non-nil. This is experimental, +so you need to explicitly opt-in for now. Please report any +problems at github.") + +(defvar which-key--god-mode-key-string nil + "Holds key string to use for god-mode support.") + +(defadvice god-mode-lookup-command (before which-key--god-mode-advice disable) + (setq which-key--god-mode-key-string (ad-get-arg 0))) + +(defun which-key-enable-god-mode-support (&optional disable) + "Enable support for god-mode if non-nil. This is experimental, +so you need to explicitly opt-in for now. Please report any +problems at github. If DISABLE is non-nil disable support." + (interactive "P") + (setq which-key--god-mode-support-enabled (null disable)) + (if disable + (ad-disable-advice 'god-mode-lookup-command + 'before 'which-key--god-mode-advice) + (ad-enable-advice 'god-mode-lookup-command + 'before 'which-key--god-mode-advice))) + ;;;###autoload (define-minor-mode which-key-mode "Toggle which-key-mode." @@ -2054,6 +2078,10 @@ Finally, show the buffer." (error (progn (message "which-key error in key-chord handling") [key-chord]))))) + (when (and which-key--god-mode-support-enabled + (bound-and-true-p god-local-mode) + (eq this-command 'god-mode-self-insert)) + (setq prefix-keys (kbd which-key--god-mode-key-string))) (cond ((and (> (length prefix-keys) 0) (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map @@ -2067,6 +2095,9 @@ Finally, show the buffer." ;; executed (or (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator)) + (and which-key--god-mode-support-enabled + (bound-and-true-p god-local-mode) + (eq this-command 'god-mode-self-insert)) (null this-command))) (which-key--create-buffer-and-show prefix-keys) (when which-key-idle-secondary-delay From bfc5c38b6d4de1bfc250b407dc8d99209f424953 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 26 Apr 2016 09:18:20 -0400 Subject: [PATCH 454/816] Add third-party support section to readme --- README.org | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index f3b29526986..74baeb27811 100644 --- a/README.org +++ b/README.org @@ -13,7 +13,6 @@ to a certain extent. ** Table of Contents :TOC@4: - [[#which-key-][which-key ]] - - [[#whats-new][What's New]] - [[#introduction][Introduction]] - [[#install][Install]] - [[#melpa][MELPA]] @@ -39,6 +38,10 @@ to a certain extent. - [[#method-2-bind-your-own-keys][Method 2: Bind your own keys]] - [[#face-customization-options][Face Customization Options]] - [[#other-options][Other Options]] + - [[#support-for-third-party-libraries][Support for Third-Party Libraries]] + - [[#key-chord][Key-chord]] + - [[#evil-operators][Evil operators]] + - [[#god-mode][God-mode]] - [[#more-examples][More Examples]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] - [[#status][Status]] @@ -52,7 +55,6 @@ minor mode of course. *** Manually Add which-key.el to your =load-path= and require. Something like - #+BEGIN_SRC emacs-lisp (add-to-list 'load-path "path/to/which-key.el") (require 'which-key) @@ -434,6 +436,24 @@ shown. ;; Set to t to show the count of keys shown vs. total keys in the mode line. (setq which-key-show-remaining-keys nil) #+END_SRC +** Support for Third-Party Libraries + Some support is provided for third-party libraries which don't use standard + methods of looking up commands. Some of these need to be enabled + explicitly. This code includes some hacks, so please report any problems. +*** Key-chord + Enabled by default. +*** Evil operators + Evil motions and text objects following an operator like =d= are not all + looked up in a standard way. Support is controlled through + =which-key-allow-evil-operators= which should be non-nil if evil is loaded + before which-key and through =which-key-show-operator-state-maps= which + needs to be enabled explicitly because it is more of a hack. The former + allows for the inner and outer text object maps to show, while the latter + shows motions as well. +*** God-mode + Call =(which-key-enable-god-mode-support)= after loading god-mode to enable + support for god-mode key sequences. This is new and experimental, so please + report any issues. ** More Examples *** Nice Display with Split Frame Unlike guide-key, which-key looks good even if the frame is split into several From 137ccbbac7beff6899c694a673cd913a1789ed5a Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 26 Apr 2016 09:18:48 -0400 Subject: [PATCH 455/816] Add third-party section to which-key.el --- which-key.el | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index 1504519d856..1153b072d05 100644 --- a/which-key.el +++ b/which-key.el @@ -326,21 +326,6 @@ prefixes in `which-key-paging-prefixes'" "No longer applies. See `which-key-C-h-dispatch'" "2015-12-2") -(defcustom which-key-allow-evil-operators (boundp 'evil-this-operator) - "Allow popup to show for evil operators. The popup is normally - inhibited in the middle of commands, but setting this to - non-nil will override this behavior for evil operators." - :group 'which-key - :type 'boolean) - -(defcustom which-key-show-operator-state-maps nil - "Experimental: Try to show the right keys following an evil -command that reads a motion, such as \"y\", \"d\" and \"c\" from -normal state. This is experimental, because there might be some -valid keys missing and it might be showing some invalid keys." - :group 'which-key - :type 'boolean) - (defcustom which-key-hide-alt-key-translations t "Hide key translations using Alt key if non nil. These translations are not relevant most of the times since a lot @@ -501,6 +486,25 @@ sequence. prefix-title is a string. The title is displayed alongside the actual current key sequence when `which-key-show-prefix' is set to either top or echo.") + +;; Third-party library support + +;; Evil +(defcustom which-key-allow-evil-operators (boundp 'evil-this-operator) + "Allow popup to show for evil operators. The popup is normally + inhibited in the middle of commands, but setting this to + non-nil will override this behavior for evil operators." + :group 'which-key + :type 'boolean) + +(defcustom which-key-show-operator-state-maps nil + "Experimental: Try to show the right keys following an evil +command that reads a motion, such as \"y\", \"d\" and \"c\" from +normal state. This is experimental, because there might be some +valid keys missing and it might be showing some invalid keys." + :group 'which-key + :type 'boolean) + ;; God-mode (defvar which-key--god-mode-support-enabled nil "Support god-mode if non-nil. This is experimental, From 88fd7608c5201b1a36b8eed2e9cc688677e96a77 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 26 Apr 2016 11:08:32 -0400 Subject: [PATCH 456/816] Better default for which-key-echo-keystrokes Fixes #114 --- which-key.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index ae58344153c..9ad5f522c96 100644 --- a/which-key.el +++ b/which-key.el @@ -67,7 +67,11 @@ this behavior." :group 'which-key :type 'float) -(defcustom which-key-echo-keystrokes 0 +(defcustom which-key-echo-keystrokes (if (and echo-keystrokes + (> echo-keystrokes + which-key-idle-delay)) + (/ (float which-key-idle-delay) 4) + echo-keystrokes) "Value to use for `echo-keystrokes'. This only applies if `which-key-popup-type' is minibuffer or `which-key-show-prefix' is echo. It needs to be less than @@ -556,7 +560,7 @@ alongside the actual current key sequence when (defun which-key--setup () "Initial setup for which-key. -Reduce `echo-keystrokes' if necessary (it will interfer if it's +Reduce `echo-keystrokes' if necessary (it will interfere if it's set too high) and setup which-key buffer." (when (or (eq which-key-show-prefix 'echo) (eq which-key-popup-type 'minibuffer)) @@ -567,7 +571,7 @@ set too high) and setup which-key buffer." (setq which-key--is-setup t)) (defun which-key--setup-echo-keystrokes () - "Reduce `echo-keystrokes' if necessary (it will interfer if + "Reduce `echo-keystrokes' if necessary (it will interfere if it's set too high)." (let (;(previous echo-keystrokes) ) From 9a5d4c5b15bf3efd9f3f9875cd2849f222046689 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 26 Apr 2016 14:16:08 -0400 Subject: [PATCH 457/816] Fix minor issues with god-mode support Make sure advice is activated for god-mode-lookup-command Check for null which-key--god-mode-key-string --- which-key.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 1153b072d05..23f71917451 100644 --- a/which-key.el +++ b/which-key.el @@ -523,11 +523,13 @@ so you need to explicitly opt-in for now. Please report any problems at github. If DISABLE is non-nil disable support." (interactive "P") (setq which-key--god-mode-support-enabled (null disable)) + (ad-deactivate 'god-mode-lookup-command) (if disable (ad-disable-advice 'god-mode-lookup-command 'before 'which-key--god-mode-advice) (ad-enable-advice 'god-mode-lookup-command - 'before 'which-key--god-mode-advice))) + 'before 'which-key--god-mode-advice)) + (ad-activate 'god-mode-lookup-command)) ;;;###autoload (define-minor-mode which-key-mode @@ -2085,7 +2087,8 @@ Finally, show the buffer." (when (and which-key--god-mode-support-enabled (bound-and-true-p god-local-mode) (eq this-command 'god-mode-self-insert)) - (setq prefix-keys (kbd which-key--god-mode-key-string))) + (setq prefix-keys (when which-key--god-mode-key-string + (kbd which-key--god-mode-key-string)))) (cond ((and (> (length prefix-keys) 0) (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map From cc2a561a16ff8d1206603525343f26854395206c Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 26 Apr 2016 14:26:25 -0400 Subject: [PATCH 458/816] Add advice for god-mode support to hide popup The standard way to hide the popup before the command is not working. --- which-key.el | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 23f71917451..a78d49562a6 100644 --- a/which-key.el +++ b/which-key.el @@ -514,22 +514,36 @@ problems at github.") (defvar which-key--god-mode-key-string nil "Holds key string to use for god-mode support.") -(defadvice god-mode-lookup-command (before which-key--god-mode-advice disable) +(defadvice god-mode-lookup-command + (before which-key--god-mode-lookup-command-advice disable) (setq which-key--god-mode-key-string (ad-get-arg 0))) +(defadvice god-mode-self-insert + (after which-key--god-mode-self-insert-advice disable) + (which-key--hide-popup)) + (defun which-key-enable-god-mode-support (&optional disable) "Enable support for god-mode if non-nil. This is experimental, so you need to explicitly opt-in for now. Please report any problems at github. If DISABLE is non-nil disable support." (interactive "P") (setq which-key--god-mode-support-enabled (null disable)) - (ad-deactivate 'god-mode-lookup-command) (if disable - (ad-disable-advice 'god-mode-lookup-command - 'before 'which-key--god-mode-advice) - (ad-enable-advice 'god-mode-lookup-command - 'before 'which-key--god-mode-advice)) - (ad-activate 'god-mode-lookup-command)) + (progn + (ad-disable-advice + 'god-mode-lookup-command + 'before 'which-key--god-mode-lookup-command-advice) + (ad-disable-advice + 'god-mode-self-insert + 'after 'which-key--god-mode-self-insert-advice)) + (ad-enable-advice + 'god-mode-lookup-command + 'before 'which-key--god-mode-lookup-command-advice) + (ad-enable-advice + 'god-mode-self-insert + 'after 'which-key--god-mode-self-insert-advice)) + (ad-activate 'god-mode-lookup-command) + (ad-activate 'god-mode-self-insert)) ;;;###autoload (define-minor-mode which-key-mode From d905bf6570797c4c0b711d3b4526c6b622993538 Mon Sep 17 00:00:00 2001 From: Junpeng Qiu Date: Wed, 27 Apr 2016 14:45:41 -0400 Subject: [PATCH 459/816] Fix god mode advice See https://github.com/justbur/emacs-which-key/pull/115 --- which-key.el | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/which-key.el b/which-key.el index fcb762809f5..6788d0168af 100644 --- a/which-key.el +++ b/which-key.el @@ -519,12 +519,12 @@ problems at github.") "Holds key string to use for god-mode support.") (defadvice god-mode-lookup-command - (before which-key--god-mode-lookup-command-advice disable) - (setq which-key--god-mode-key-string (ad-get-arg 0))) - -(defadvice god-mode-self-insert - (after which-key--god-mode-self-insert-advice disable) - (which-key--hide-popup)) + (around which-key--god-mode-lookup-command-advice disable) + (setq which-key--god-mode-key-string (ad-get-arg 0)) + (unwind-protect + ad-do-it + (when (bound-and-true-p which-key-mode) + (which-key--hide-popup)))) (defun which-key-enable-god-mode-support (&optional disable) "Enable support for god-mode if non-nil. This is experimental, @@ -533,21 +533,13 @@ problems at github. If DISABLE is non-nil disable support." (interactive "P") (setq which-key--god-mode-support-enabled (null disable)) (if disable - (progn - (ad-disable-advice - 'god-mode-lookup-command - 'before 'which-key--god-mode-lookup-command-advice) - (ad-disable-advice - 'god-mode-self-insert - 'after 'which-key--god-mode-self-insert-advice)) + (ad-disable-advice + 'god-mode-lookup-command + 'around 'which-key--god-mode-lookup-command-advice) (ad-enable-advice 'god-mode-lookup-command - 'before 'which-key--god-mode-lookup-command-advice) - (ad-enable-advice - 'god-mode-self-insert - 'after 'which-key--god-mode-self-insert-advice)) - (ad-activate 'god-mode-lookup-command) - (ad-activate 'god-mode-self-insert)) + 'around 'which-key--god-mode-lookup-command-advice)) + (ad-activate 'god-mode-lookup-command)) ;;;###autoload (define-minor-mode which-key-mode From e13a378a9d41f4c902633ba230d968d54433c2c7 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 5 May 2016 10:30:44 -0400 Subject: [PATCH 460/816] Backport two frame width functions for 24.3 support Fixes #119 --- which-key.el | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/which-key.el b/which-key.el index 6788d0168af..c0bf5eca2be 100644 --- a/which-key.el +++ b/which-key.el @@ -2161,5 +2161,24 @@ Finally, show the buffer." (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) +;; backport some functions for 24.3 + +;; found at https://github.com/Lindydancer/andersl-old-emacs-support/blob/master/andersl-old-emacs-support.el +(unless (fboundp 'frame-fringe-width) + (defun frame-fringe-width (&optional frame) + "Return fringe width of FRAME in pixels." + (let ((left-pair (assq 'left-fringe (frame-parameters frame))) + (right-pair (assq 'right-fringe (frame-parameters frame)))) + (+ (if left-pair (cdr left-pair) 0) + (if right-pair (cdr right-pair) 0))))) + +(unless (fboundp 'frame-scroll-bar-width) + (defun frame-scroll-bar-width (&optional frame) + "Return scroll bar width of FRAME in pixels." + (let ((pair (assq 'scroll-bar-width (frame-parameters frame)))) + (if pair + (cdr pair) + 0)))) + (provide 'which-key) ;;; which-key.el ends here From 9883acc8878d0b540090ea0199af128a6819b56b Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 5 May 2016 10:31:45 -0400 Subject: [PATCH 461/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index c0bf5eca2be..04bb693a880 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.7 +;; Version: 1.1.8 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From df41a62dc8f90cbe18ebaddd57e810a16ff0035a Mon Sep 17 00:00:00 2001 From: Chen Bin Date: Sat, 7 May 2016 14:19:23 +1000 Subject: [PATCH 462/816] tooltip-mode does in exist in emacs-nox #120 --- which-key.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 04bb693a880..e4c8f714c4a 100644 --- a/which-key.el +++ b/which-key.el @@ -1354,11 +1354,14 @@ ORIGINAL-DESCRIPTION is the description given by (local 'which-key-local-map-description-face) (t 'which-key-command-description-face)) 'help-echo (cond - ((and (fboundp (intern original-description)) + ((and original-description + (fboundp (intern original-description)) (documentation (intern original-description)) - tooltip-mode) + ;; tooltip-mode doesn't exist in emacs-nox + (boundp 'tooltip-mode) tooltip-mode) (documentation (intern original-description))) - ((and (fboundp (intern original-description)) + ((and original-description + (fboundp (intern original-description)) (documentation (intern original-description)) (let* ((doc (documentation (intern original-description))) (str (replace-regexp-in-string "\n" " " doc)) From e151eebebf74b81321d49ea9c120bee149820fa8 Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 7 May 2016 08:07:55 -0400 Subject: [PATCH 463/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e4c8f714c4a..e0ef45b851c 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.8 +;; Version: 1.1.9 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 796d0ccefbf8f4c07bf23dff621da56cbbf4ac89 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 12 May 2016 08:39:38 -0400 Subject: [PATCH 464/816] Account for echo-keystrokes = which-key-idle-delay Ref #123 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e0ef45b851c..26d3612c84e 100644 --- a/which-key.el +++ b/which-key.el @@ -68,7 +68,7 @@ this behavior." :type 'float) (defcustom which-key-echo-keystrokes (if (and echo-keystrokes - (> echo-keystrokes + (> (+ echo-keystrokes 0.01) which-key-idle-delay)) (/ (float which-key-idle-delay) 4) echo-keystrokes) From 484f4ff9a733838cda6105a3c02e0ae574ed8697 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 13 May 2016 09:05:03 -0400 Subject: [PATCH 465/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 26d3612c84e..b4458933596 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.9 +;; Version: 1.1.10 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From c18ff1c131a33e9d75674dc25b9e54ff88db380f Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 May 2016 15:35:33 -0400 Subject: [PATCH 466/816] Add which-key-local-then-key-order To use (setq which-key-sort-order 'which-key-local-then-key-order) See #125 --- which-key.el | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/which-key.el b/which-key.el index b4458933596..d221c6fdcd2 100644 --- a/which-key.el +++ b/which-key.el @@ -1196,6 +1196,21 @@ coming before a prefix. Within these categories order using (and (not apref?) bpref?) (which-key-key-order acons bcons)))) +(defun which-key--local-binding-p (keydesc) + (eq (which-key--safe-lookup-key + (current-local-map) (kbd (which-key--current-key-string (car keydesc)))) + (intern (cdr keydesc)))) + +(defun which-key-local-then-key-order (acons bcons) + "Order first by whether A and/or B is a local binding with +local bindings coming first. Within these categories order using +`which-key-key-order'." + (let ((aloc? (which-key--local-binding-p acons)) + (bloc? (which-key--local-binding-p bcons))) + (if (not (eq aloc? bloc?)) + (and aloc? (not bloc?)) + (which-key-key-order acons bcons)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Functions for retrieving and formatting keys From 0c32f52bfce89850cb5a4aeb97b1d11be038ff17 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 May 2016 21:06:23 -0400 Subject: [PATCH 467/816] Update docs for new sort function --- README.org | 2 ++ which-key.el | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index 74baeb27811..5db07c1b6fd 100644 --- a/README.org +++ b/README.org @@ -299,6 +299,8 @@ available options. ;; (setq which-key-sort-order 'which-key-key-order-alpha) ;; same as default, except all prefix keys are grouped together at the end ;; (setq which-key-sort-order 'which-key-prefix-then-key-order) +;; same as default, except all keys from local maps shown first +;; (setq which-key-sort-order 'which-key-prefix-then-key-order) ;; sort based on the key description ignoring case ;; (setq which-key-sort-order 'which-key-description-order) #+END_SRC diff --git a/which-key.el b/which-key.el index d221c6fdcd2..2cdf1cb94bb 100644 --- a/which-key.el +++ b/which-key.el @@ -245,8 +245,10 @@ a percentage out of the frame's height." are 1. `which-key-key-order': by key (default) -2. `which-key-description-order': by description -3. `which-key-prefix-then-key-order': prefix (no prefix first) then key +2. `which-key-key-order-alpha': by key using alphabetical order +3. `which-key-description-order': by description +4. `which-key-prefix-then-key-order': prefix (no prefix first) then key +5. `which-key-local-then-key-order': local binding then key See the README and the docstrings for those functions for more information." From 642373e356f982605e461157ebc232a6064a06ea Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 May 2016 21:08:18 -0400 Subject: [PATCH 468/816] Fix comment about special keys in README --- README.org | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/README.org b/README.org index 5db07c1b6fd..a570592495e 100644 --- a/README.org +++ b/README.org @@ -73,16 +73,8 @@ 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, most of which are described below. -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 (see [[#other-options][Other Options]]), 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 +There are many 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]]. *** Side Window Bottom Option Popup side window on bottom. This is the current default. To restore this setup use From 02ee845072bb9e93adb3f6c1c1f672fe8bbe6ba9 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 May 2016 21:15:28 -0400 Subject: [PATCH 469/816] README typo --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index a570592495e..d8f5e98546b 100644 --- a/README.org +++ b/README.org @@ -292,7 +292,7 @@ available options. ;; same as default, except all prefix keys are grouped together at the end ;; (setq which-key-sort-order 'which-key-prefix-then-key-order) ;; same as default, except all keys from local maps shown first -;; (setq which-key-sort-order 'which-key-prefix-then-key-order) +;; (setq which-key-sort-order 'which-key-local-then-key-order) ;; sort based on the key description ignoring case ;; (setq which-key-sort-order 'which-key-description-order) #+END_SRC From 1b611e9947140f9c384a31cebbd5f24d106fe059 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 May 2016 21:18:59 -0400 Subject: [PATCH 470/816] More cleanup of README --- README.org | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/README.org b/README.org index d8f5e98546b..fc5ad99e99b 100644 --- a/README.org +++ b/README.org @@ -44,7 +44,6 @@ to a certain extent. - [[#god-mode][God-mode]] - [[#more-examples][More Examples]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] - - [[#status][Status]] - [[#thanks][Thanks]] ** Install @@ -298,12 +297,6 @@ available options. #+END_SRC *** Paging Options -[Note: This section is out of date given the new =C-h= commands feature -described in the What's New section. I will update it soon.]. -- =C-h= commands! Now =C-h= will prompt you will several options instead of - going directly to the next page. You can (see =which-key-C-h-map=) - This is a fairly substantial change and might introduce a bug or two, so - please report anything you see that is strange and I will try to fix it. There are at least several prefixes that have many keys bound to them, like =C-x=. which-key displays as many keys as it can given your settings, but for @@ -458,10 +451,6 @@ windows. #+CAPTION: which-key in a frame with 2 vertical splits [[./img/which-key-bottom-split.png]] -** Status -It requires testing on different platforms with different configurations, which -is beyond my capabilities. The default configuration has been reasonably stable -for me. ** Thanks Special thanks to - @bmag for helping with the initial development and finding many From c6ad06c03d5adaa148472d53da47a2ea7749b182 Mon Sep 17 00:00:00 2001 From: justbur Date: Mon, 16 May 2016 21:25:05 -0400 Subject: [PATCH 471/816] New screenshots --- img/which-key-bottom.png | Bin 54157 -> 32305 bytes img/which-key-minibuffer.png | Bin 53881 -> 27502 bytes img/which-key-right.png | Bin 66506 -> 39174 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/img/which-key-bottom.png b/img/which-key-bottom.png index d7e725b3a22ef8d7534f4812e52787fa56d5d4ce..19f1f521f3b72fbbec8c75314a6be513619d0f05 100644 GIT binary patch literal 32305 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 literal 54157 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 HH01vQE%RiG diff --git a/img/which-key-minibuffer.png b/img/which-key-minibuffer.png index bb5d00bf26b70532a67c5033608dff6f734e754d..702e175941e2338e13e14e11a5b4600ce7660b48 100644 GIT binary patch literal 27502 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 StWem+x78nMKg?IQeDfa(njY)` literal 53881 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 M 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

|NC&}CDCnK}ju~u*Om#MX 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¶?8TwY|A;K4(c`;1b#@!!A-b$( zqf=VE;Pu^ZcE7xsWfZoTkox8c!xPGgMLqKs1mt{R=HFJV(m0A<_Fzj{k@&GK%_8jhQq0;WrRf_Czq)r zX#m*Z47V6R113+o$YNdlhXRRjG0TkJT~9dv;g zfP1dz`z`i{39^`?-dipF-lXH_-+lx5F#Hmojc)JZHC?e;*SrFhuF|3-$D@w*>+VNj zd!R+t_`~HJdDO~hUlmC!g6~(ybeV!#O3KN?IBQe5lq`FOZX&0+?I?fz%x+A#;U9(g zsx+9T2!ZK;?w4#y$6w z&M;THe`?Fc+{I4~)iXZx?&%WipgKJ6Tp(wlb>k@a)5YuN^v2`odQDsD^=-|C?6dZ1 zhi=d&o^Nw7O+V0E-au840qk{3zSwZDe8O9=Ev^R>QHle2gvAjtPt&x!TnKTz(wvYK zRuuc~qInkQ%p?5W_&`Ld2&bvh%1GrjajM~D76}2{yVSZ$t59Qw&|#Z8@O3@WpD#o`{_)U98C)brCPX-{rGR6L+zNjx@9)hk#zz z1=D@xaXOh`4SrdkA6`@3l5@r;{(*T|tK8D+EGID&9fQ&j^F9lRlGwB0ZhF*1M1}3U z)+Wd5a!Mc$CwXC7&~D}ia-I5lkI-R|A+$k-fdVE|^Qy)9IFlH^L_Z+t(E*D^gS1Tu z=uW!x_B%;WYewgWadrnlu(aD>oQF8uSV3LX2c&Cn49co&kQy&1L@E0Eik7fcNAh*_@YbuFVe#*h;7|5AStvhyZKYbjDzb)L*lV?TolgbkY z?J5#jVi(KfFnkWH>^;kGV=tv4GKUUKQWEGsum!>N_@{!6t)t(1>I9jlx0CH-Pak@$ zCr>Li@u5(5j4iTfaU2*s7el@+t2yKynjLTzIScrMQ(qQ)PEhe|oW#pKM{u5ijJ#d+ z8%=%l>3$oe?vouUeOP?CdWz)+{UlRj9>()Zq*+THg&eSE>dlpE{_^mi1a^cXbe9N8xx89G3S z$;|Kid8`x@!y1mEULmmea`5ogG*(QdAmp_d%Z?~`9n^6W;*X9Ol<>nQNffTP|- zDL_Gx9GV_HF7&vS9Vtu?OE%Lo{#aAEsOBCqj2seSp|iX+1q8Na@jSgKmJ%d-7|Ye) ztK!FUumA#U%UDvFFxcB!73h$W)W~rp&}xFw9>_kT-Bh}iz;BXj@Z6B8P^|*w=cN)T zl$%;hT{QoBgSpPtIJSHRFH7A_uARHFVM)Q%_N>RAjg!ufc33#dI-Hk*dtt(9RVLaf zsKpDd@ic%hqV`KcJlP;ZAGa}FCp94Q4&Nny*uIr3m^#(muvL&+FgEC7+{5xme{rg$>H-!Z;vUS-8aBZTeBx__3#uHEoMlbe#VM{ zNy83179KyEdpj9UL0%%2lcgYtkJiblhKeeJF&5M#blQV}>|td=-V7|cGeS`l%j=nN zr)2YuVq#xY)R8_g4N5H6EW4rg^~R^7w1jj>ivp6;AR!<~*HF?jfOJVWNJ+PJooCSZ+k0PU z$9Mjnf1?*LYpt25?gX(A(^k|&6!I#<_Q!;Hhl(ziiO&++2}Ek2Mv9g|#aNk%)nQ?# zFEl)=ZhG{Kd_DZ30H~xzEC?&FiI`qsOkr=AN@HwIl-2lnN_mOochEM1%ezQsU<4<*4$^KDl${G2qVS^fmc5R~NdLmiE z$r_xmm<$;V@J=&%F+Bmw(fU*$(X%}(E{(~QgSuzTU5e}_D>VHs^qKqL8TaE#<6}UQ zu_-sJ=8HZX*+k~jNxWU=5R#J(%+iD+3sqy{@mIwRqtjlI9%v-1bf>429A;6_i>9xA zunWjh#931G+1dCwkwb-)-s-gma|`XZ6{*#4tgI}R2fvtaP7p>$GAEC*QfLT_G=)4V zV((RI3>MrCR)%EH*nOn3(LK%Od&iwIM>XMM}5IulFxAis~#aM@Y8 zHBaTEYyt-blQf<~BhBMZ!Hln7`_Qxejv2E(ui<;t@DX3h4~l5(AJ_G8wPgT3^<}*4 zfMOVf_ny9YSp(O}`(Jr^tVgwO=f&L`aYRrC59rkjSC*9&MOqO{&lLa2spZ7nbP3tl zyno{Pm9Y$#TJ2G~pW-;6yt!3s`@^#IGb(lg*8g1s2YRZiOTu%D#;Hb~O5NCM^hdJA z7Dg!cue1A2J9i%-+Pk`w8Zsj8(yAukUd-hFk>{&}zovRQypeC!eT_wzZ;myW(T9`K{2k^DqwUlVR%v^(Zd ziXPDYQ2myc!*%IRQp9c&erxQ#`n6;o zBj5Rvq;aFk&9@}_18`k#D>keOG%^1cBh@@_1{Z_cHDR)5JESq$f3o9Z^WD~~sUVPQ zXEc@Xu!q}O$Z7M2eIu`AN})bcWXt1&mn5S(E?OK;pXh_~LfH65E6uzUhHr8}`hkdM z7QU>%CFh}VT9)(+26Ht^?nuRezTi|XZuQ8|m9i~sEzs>g(aiL>shqW7D)e02*i-qX zGodImK%<8g2#o^z?U^Om7ENrG7nzWQmNi;hXtdCPRDp z3B6LO-&*;EP#NP`%#cg}d&~E9ty^4dCj)r5y+2c*zv9UkaL*8>Ul@Q6+EM?GEGv(f zySES~d}8*6CFn|8p*mbGw~CR!Cc!;q@k}u{hs-LU6&iHYa?^Ra@d=>dR5iu?j_^~G zuU@-}C9gfK-XiAmjolz3pT$`yS2;Z;ZON&}eXg9K?$lE(JtGX*r9r}U^!toAG6Dzl zRLn@**p=D_YD%aD6cWgd=Yowbj_Cw1aC(R~!%7+kXwVM|LNi2t)gFvfxUjxb*7@!@-)SZPK=UX=Gnl`9nL z^%MxcGLfGZW5>gUdgB70L zqIHd`T;=RAQjgN(b~s%0Z}S?@4Q|5Af>EHy(SKK9gw zDow^r`qW8!y(C12?vb>E@?EIqWEn}WHv{uMTkBfsSkM~!+r&F~<3@eLSLt=-_DpBJ zG)i89)&#&B^%aj+{4af|RwkYA&?GbVo~ta$dL$%pv(afKqHEMD%tT>9^k40Xv*cdi zmjvutE6n#`zK1cPBy|ozwc^3$Sdh}k*pLvgqijt4h)l=BTPl_t9upTS`uOq7ObwxQ zq)5=<_45Ag#}YgSEbnIhN}Ln$`=ShVbKKfaVi^kkE0ha+h5Z+PJrOK<-EL7^m+VLCOAbDpXpxB+BA!veZ8?d{d!CfzZp7Ah>RUzB?y3)oj4C$B&X7&$91G| z5a+Zybr{|pik(oT1+n>>40P-9Hy^_q?sv{pp-ckd=5_9?&I8*=Uw<|Wp!{TM|MmvO zn)e!B`?r;|$Sls=4GCxO&xgu)TCrSi`d2B80QjjS{N>n(8yFM&&WFK-Of){7DD<#jy(VH8TyS}<#it(-Gv6M zv8F0`Fu-%lU)%OK7(U`QYFTIb%Ps+*6%s(B1ppfTXeP$)kKvcT^cr~(8-gwou5eO3 z{ePsZJ-Ur~rsezz{=^0O|KwLSAS_ihzXOKlvYtAYfvWy=jE=#$duf~Et=nIW5NTof zz^*-{?tcTd%jN_9)-CcdQ?@#&l=j-M`sHL!GW(33e=Y@h(@`G(MZdtWm;D7G|E-s$ zk*HSHVjqxooahA^2reP6my>)eCbscL8Cuxc#rcNXnrQVOq2In&->13~jxG%9*h78KuYSrx2$)bBt; z-f?&zxUs*R2otC{!iku!m)y6W3#$!bwE4UafE);+4!fzU=8H}6LGs4^jntS$)30MD zltp5uC7>>(G81z9c2LV~xB{=ac@*i-9jn_HA2vNHx91a*+z-{J_Vw!Y+Dx2m*>JXl zKRBOgKaN+eRkk1}Q^3%VHPzr;H?cTu4YsWR!ux`GQ2Y@0F7!)6%;ejGqU0hY6=#QX z9rDeO49=#Y6fRpl>?!D9Lbz~WH^jeoo23LD&pjvHZh1;w>llu{#IwXNrQYzXe`Cr1 z%DXS@^VIN|to-d`v)HJnhyyd`7rBvD-%(rQC0vq1N?-W$;?iTZx+gFL3PbDgN6f4~ zLB{W>0mX`LyR`}Qk@6f=R-Pzpqfaqp7i{7h+BPShs8ZkqLIC|g2B_3=Di$K>(g|={7y2++tNhf0jlLK8cA$#Ul9S2TQ7lR*qbdwPz0jp%Ttif>zf&8 zAy)Jj!4)EXBCb+f^2DRP-X-LR0_V32^V^Tb-Vo=HO$QlagWd)dSna)UZx4`8)(N0FvjGRZnCDgrjzLM~4y4Y*0#6R3e!@Sh*#Na=iB!)0(xr4USVL3T@rD(a^ zHz&F8-`(FMj~XOd8t4_-UF47a)T3*ZVD#d&=JE8Po|$hyH16GUk;DXx1AR=r8WtoS zGH6Jb*ggXk(jm`nyDP4p1}A^Qs9CA3v%^Jvr1;|$A1v)%jG4o8Z^r|3#{}LF=&2q2rf1YwuGY8pYWLJ5~Rb6glPB9xJQLh+Mfvx8+_B1VmPyEXmI<+>h2?@mUtn%LeY5kf=BF?(dvMMX>0fg`Xej< zKTTgi-v@f7%;O8UJs#|qnxD${Pp{onz2)-RKh(a3-V0Nag$p_kyc|fl>Q}P^me) zTO89}+oG z_k|K?bZwKsz&i9o4GA;iT>aH1elxN?aCIG(HNQnWE~ovAQ;i?7BL6Tnl952dRNtz= zv`=>rqQZa)Dfv}N^!LgC%S4ge;$1pvN;W^|_?ab?0VafVwpF=Z)WRd za=)c!BKtkUc`R1$I5=9sG}rt8U|B}UNpOP-65dE=U@Q<4o6bW9 zbc1SWaLLxRlXUQ3Pl%yid%6&wliLIFrXRR;{;r+K)A`?Z?tgxnAOjP*+BBFE>jg<% zm;C!{DH{92wdEY?HAum8=ZgGE$2+QXR?@)5VxOD0i?4R3*Uu6_<`jZ1^e%LDLxgse zXn}H6=gjQUJH+V*->lbB5^EL9uWi)M>E^h(-Lr=C$+P7I760!qiV>wN%*wr)I|Jw> zH^RV7%gw0-%Pczz?Y^^c%dWn{_Et17Ru(s$HLv$^Ez~?g&F?<}xsvkgu!PHVwg7$< z6vf`DN(^9$$lxWfSH;Wn;KpeOh?Cc0(spUmI~NMAhVZ^;MLeR&%z2_OWcz;ve1)`*i?jGDV@4`EqqF9UVE_1hI6!|VK_9l%_eg6v z8M?CfLp|so+zwhw#NW~u#?}Iy)N?05ktjXLOidA4O5Tqz4giWHF3A7W#EX)X@ z9@(iryZNDstwwV+Z`JZt_TXa-NtV9FIFSJizOm9edDAAjRcOMRWpCBj9#DrSM@Dr- zK8{7Ou#i8gMXbT#AYKeVU+Y!@a)rhzn8ec1>j6?atX%YOnczVG;|{bCJe9mYm>jkN zamh!gePhRQS+Ns^7Ol4k2kCvr45YKOA7wzt&vw8$cfxq}UTjP?Vy_atBPFYi8%%$X zZtr6w$#YP|ZKCKD&Ic}y9j@k~EmT}CaPi$`J!p+E5Fjm`%ij+|I%yFcFj3Dfc8bjM zxOa~xx+}~Vj`+5h07?!c(3X<8gJ0bsP)$V|_nMW+SXm?K@o(^6r*^BX@(&PA1_Y=m z2;qNi{XXgYI$uk@FbLozhCI~tgp3MWT7Ep_T@3r;@{Y_|w+FEcZjaG7^eyER6;YuxV;iLj&qh7?Wq zLqcKit9YL-gM*Cg@wDE{?`z5{W9=CY(n;E?p7uxleqK5|jN)X6g18}|;>5O$W z%mV4&*A&x3n8_E4Qj0S;q0~rBI8;qbMX4rZ-*{|3<>GyUGkvG(m38GAlrMRAQ z9Et6O$L@SHm#fye4L(S(k8-fhPu`a;#av(wA`Zn+bsmpttzFjQ@4A^2^DIG}@M-jl z&PUlyLbQ=bMP}&vLn5m@X0-It3&t$I>S~WsS<6bZ$*Hu@FVN{6vk3|)KWJ`3jt}@q zHwRpMh`9eDoS*#bER7nvh8DJ#5zYa#fQ<$Vp`mtEixFvYnO$AjpHV_QEwMxYJ0u-H zwbsf)>aqQuR^MtR>+{QB^`3Snq!sn)(p#cJ)l^gt%Ck~jWE2Um}PQGBZ zone@1vlcYQp&SFE6dll>bo9M!$4^9IoN9!HkU$Iae94=TbI)d9bz~9MD#{Cfj9Ogk z*|C!wOnfQ35a_M~~PE zu4+6<=6jN@2!Kp2nlt=*E!Ic^6C+Cb-*(gg`HaOCj;M)x#@{m=V&+3GNOh)cfaB%m zzL)h0B_;AU${Tf94x-aVA~_6x|J`1jz9z*nLKTc!hOw;ALCdkbm1yC!S4*>dniu>G zccEyHf&M~QC?9Ao=*nVH_#}SbbmXi?u<(-WG0MV*lT$&RW~wR*N|np6>n#{PFZnP! z36vHfcomvU$6+GpSw(fLT9zfXjoJ$mV(>)_>^8%bm^-YQVD(`hn$rU$a|nL?QyBWf z64HXY%*@fu_v2+LOqnmMnFjgZ9M|?Rhs#l9RVBwjlhFpkJ+z&c2YR8eh- zLev?T8)ZAY8M0zlElFmG!OAn*3H2p5yCjir*r>*Ei=*2yx5Mr;0X?1s7%Y5rdGpxWQ96Fe1%_Rth0SY|p`n9IJ*#G*V#y&F zA8ZYXxujttKa&VMO!VPE!9m*42{=lUCp5AhY(qL|ak!o_B{ijXcKb%qpEn2Xd03&D zTLcTu_n5~ik*df01B#$q)tR}0D_NE)-d{bwrXbdv@p?3kc7klAtfTo4lB8utF!YRA zEnY7gcnZFr7Rn%J2_jGQ9X*@pNeg|$Ny$Cd#~;r>{)D)sNoJf(4*8-g6zAOEWiwhb zF^z^&{yGcb^{uldD_4t0Tn{e0`cR)+tS2YaPeXu%3RQvqrCSt2=AQAL-{FmRKkxQU zzVv^?3Q||qMH!1$9=w%#V?g9}JcWy%-xvgzpU@(s|GfNcRuSh?H3<0JwIOIdd&e;& zEW$^)wpA8=woC2mlL422%^`=|&qS?xYS+6M`gNGukN=<$!~~b$31e_P`L;!t!>L=x zG1?v2rrf^YgpRiV8D+0Mt>Kpll0Y9xd~$;*UxT#~2Q>tGcq8K(3G_Kwo#0s4 zyo?O8$`~cTCjeNASpJ?JkSo;x`tmwL--hEs1Mz&Y!@^SPhxXoU*+=@Do(G$S z9{%^cZ~WCM4PlL>krL?B(v=bUI-e_%>cjBv{;HZx3J|BDTC^LQp`%A2ertCiGFoVrtx2bqDU*!;GDrEQN{5QDlsh`` zFg_vvi;pq+9t;9=9n7Wqba(UJ#fDlZa9PjZ-P*hSSy>4}>=r+iHPkwvGePX#XvLDZ zR7WuA8IO)n(c>!cb1;Vf?&iUE8|CreEBv45!~gyVz%1#0IoVL>lT2ajb$;5~yj)%K z^H;M^!*0`$h-32OlkA4Gi|kZ0={6w7xms~;xYRNvbu#U%I$BB%?{i%6q^!GaHu!ed z<9l{|d|`08$t6qC?a~BcmVFl6kXNY-ESF=s70bpxeK|qQN8ywf*3E=Ozi;hO2p^d15g7B?| z%Pst3v98d#fCqJMI~NcxPw`t!bYa89P;&5fcoSx7<6GfTwKDzEslpeOVC15Ym^YlT z*9x>Jc1-ViPr`s^=s8@X+dlx)>2Z%BLZzWVMlXO_-Eokip(5jOXcW6?_g zc}386LK*#2O#gQ>Z9ZRao*p061J%r7o0u5QH%}A7LFWBPSzCfc9<~J4o+4T_l6W7N z6Guly`YNtZOXpTv%(GbqBno>+m3^z^2;ZY(&p5Z#|t`MFdEZ_8UD?PuK5bYtl}TpRx|0 zQ11>-Y>^zhBnb+Zrd1oQ zp-N#&JihlXC#p?YesQHhPh6Fyz*h9)V0U|}@!mRFhHY|MNtD8(gT<5#7(?sHKCgyU z%@2t<;7nRoo3i7^acPJxuX~}=i0be3bnv&qG`lfHJS;~*=z+YU=e|+{YtcGjp(V4B zqUuXsvLJFdkda+P?aHCYQ>RSP-N*>1=I{JrR<`(=TZW^IgfFv%!;%yjoZnRx7gf4c zq?aeGxBf<5zi>2^19^DKs}Np6FUueYemUDRKWtd>bN;wBmOfe1u^46A*~Xrb zJTkGX#3cgEj4p%JgqvkXUlb^1Xy9KSVdadw`F657akAe?&CI)E%EM4FNT~`mjZJnO z$nKM~`6=piW!us67Hlc3@4iEiQ&D4F{$<+d>|604%hEj>^2D*ln^XJ0X$>EkkupmN zxUE2*cd0Fy8CeHT2yktdQX!zO6~Cz z*h$Qm@mm#zBld>N--9x3p0JS;GXkif(}*w^2T9EUU;tS)Af~y<>FA9yIBs#-pyx-> zCNoIp(*-9$4stA2{`HQVs0#T^2y^BwQmI1XyVwQu_aJLlVt7>z*5)0);)mf2rd`EG z{i`HC6=-Uay4K~ftrKB8;T5FJ>QL(Y2Bm4$M@yq^O10(Kkc^0VwkCrkbLAlOg%=tz zBEq3k!xzHAZ2GmQ2lhEi=6;C0iw=N%6!7g|pS-?A_TH{igJI68N*C$hP-81&wMjJb zQmK98r;YQ24`0&RbkkC*gjy}e(N+ZTK$+CZb05kSp5HdY*&W_HeBUR5AD2OAWfe`)@SEl@P+4IFJoe$&>;TY_VGrebfqes1GTaU8Z%Z%Q$ zjX;YOz4d44;fEgva3s*<#wojmuTn&{!G_$buN&2Bc_m#+kN6lRzLUVsC*o~xJOg_d zKL|aEsj}z|2tG~!8gLB>+Ndk$*B7h+^nNNXVp_1e2+StG`9%n~UiLTC8|Pq>)35%R zx^pa=HRJ+TM?o?MxJClgM+6qCE)R`${-e4KaVZ5p;i`z5x#8>^y;RXuVLwL=qd+Zbt49_>5Xu?Tu zo8rihP>|dP(p24fvm8Hy>a2NpE6r-Nco$M-Gt$nRL{Y5(0y*eHM`8LSs@7P`K6oNa z{H)Yd>ItmHN0SELJ;Xuu=2ZTM1yLJO^>i2`)xIBniDS`__`v4xH+KynA71-6PZ*an z?O6w6xfHT5*Xh^lXU#|9CVY-aNy{-8!wT`?JyT>4GV+oq?%ayX4C)F#hwbp)WetwN zDwk)Xe6He@cB*BSRh7nWnwdZ@4zoX*=^Ilu-#u;pHJ^%GVRZ0W_GLX$aveW^2-qrq zdj3rp1;yVN)#_?B1fTKRrN2v&ekCG+RB?XPTpA0vmvC%&moql6TUXI)&AG<+U0&ZM z>fZjd$#*N5x96vMKHu>usHL-gc)E~;-_Y>%dE(95{o3O7x%H~M^^g&5cO9b1nTyNV z*!e^>5-Ds7XOi3Oei8Ix{`OG%j8d zXIe@C+CaU#utMjMZmHow=4Z4LXY}EXZNruVYPko5X{OiUyo21IeTO`%3^}bFnp zfX#EvVgF4Y{Pvz6^Hv4#R>oSC9WABfa7^f65?7cu7gc62cS;1O27!T44u5K9j90~g zZZv{L&iJzo-ZOh$%#P|5rg_%XgWyi7r&s--tDm-*IhVAsGX_RXeKAvuw~Q?PLS5@* z>>keoZZ%FfH>V1X$C`@}_r3I!s-*T$dhtU!N{*H;8r+wstqR@dxt5;|s?X_6`_o@% z>#zlYC)H7O_L2de9cFhoA)13Zq5iS+${SrylFoFgwy-uuM|G>XVEQBddSJ_ zTY@toxU)MZOnLP&WVv>O5tf@MZy3PFlzFW?`st}eQD=^2K&T;sEL~1#o%Xs;&)MP&BB}x#cUeWpWbOrBnTbK+<9u3pXbk3!<_mCC3GJ&f zWU(Efe_C=!B4#=@^W{*9^_^0ar>sIyZ}8JaLmp5_6QG{pRdH$B8`nQL~|Bz8X;&nPoN zY$UyAG1SbWPzM%UQO4O>l|&^}lF6^keAjs;SlbN*=n+UuC7=(7w9K%}e1L)OhPEra zhO){ugmDys9L_?-!r&yLd9G92$Vn|dk>hEA37#!`G32SB+hS8)X2EnsfLlu@wc)p@ zPiQh`IN8ZwsPQ%K`n1LVOrY@f>8G@aZh8zLEphh0sr%N^yQDG=@7|C7J&4dx`41xJ z=wW?MkDOv!)!rLr#uw~5QKziufv?_*xtXt&K_7{;dV1bHH=mt{44_30%?hF;euqh| z>e)SF!bb9(7=Ar=FQ5ICK@*UikIG&=Z3(ejoG7e!0;}Jyr%2?<*P4Pj1Zsw?8Y&d` zSk#P#{RT>Y%M;%UdiaV~JbgOxZB(n9ZxGt_Q%%cN21O`u@^Ah-0OEhKT4>xpGVnQi zKbmSP9ox2jwP)*N=$*86A1v@Nsc~yx)5GUKT=vj3(b3}koCnU9=ZtF+rO#cE%NZ1( zR|l3LQdD{&-WZGOOHb`jM@)=7yqbuZhK#aRCc35*S5Go*@c^#9NTsImQ| z(>=Ey@%R?Cn2m(qDkJ~GxQuDVbrCym^Qa-*!uJttc8=)v**R2 zs^QZvT9OiZU*a;Vx=V?gDZp_26uid{pRc|4x{>M#?0(9Q1n|2*$YjRhg{jkMT0I`> z-76``2~EP3uTopQzhdZ&7Dsu*-r7P!zP*?lm6gi#LJciWXOLx;5E^qI$!lr6H$|3^ zf+{StDXch>YV8a|{v^zTj|1G2Fs)6@z(Qq2$fr(|O7Koem)ps^>O_pzFEWFD&S-a_j^EbTpVNG{92sMINTOI3 zW^w&c2vu54Ti8(T3xBk8JhyHlF^s1OIC3b5z6m#&eGQzZtq&??%5*YM zD11ak=)ZOlg|uu~P*heCcV&;)q6@mdW?V8vYr7N^Io-bcP31?3b=&7?7~km$l`@sj z>A26;+|_XdMz+dI%!%xmN(`+wI_BXGLFC@7l~pi{P&c7>o+rAe#Y*jd%dei$Y2nShw+Y!miJwxR7#~~*IP1Rtf?9^p&6C9s(BKuOZ|+0#7MV$eI?i)rlcVc z^AA_OsbxW5nUNW@D+=3F{W5{2VN;pG%`Ed?GJKf+YIUfSJnEt6&Z@b=1)uBAtX3PD z*8*BttgZ#M_&Qy_WYJjf2D3g)rPOXRva}8I)K}!P80?t@w^c}bLWQqMP9-qe!3l7P zpndGk6b?{}11t!Vdh5cFZOoT|xdo5CCoWL`2?n|njqChRI4hJh;l5muaCmc$I&9o1 zv(BoO{V?Lr2_voi<)B4PX-l9KgT(*)AnJ2R{rQQUd`aMvX|zH7K-b26*{tVnU+`Qc z0pv}n4mNA^qI({gR;X6nzxO%3V^zRTCR381`{^T0=u?lUutF+U7I@0-gA8oQGbw@| z)UNX$(EVdNG_c?!c+r=7Ij#Ah517hJ#}K&_Ld^nbCpn%5@|50r4Lk6?LS;2Q#v+jc zi7?NQH}x$*vRRfr*u6v@3lhy`R(E1gsUC*fO+!~Q>=XhAF2r1f z(FGkX><+Z|B?-nUx(0z@qk5St>bfBmLL9Chiy8uZW%6Q=KO~3(jfCobCKq|>yU~)j z;`5Ac(+)!@zEXCWhYZs`7aO}iYqiZEY5GcUiW^sRow&KhBPN98*KhhrVW5mbZ;37T z)^rLldS7N4qW?J5t$XD82y3HCzJp0cli! zz&s2f%=?S${r4~1&9EV5h3~%F_7AIA2j-QadiSFL1x(A(M;vF+)&;LnBV%54k?4+Y zEqnewK>lGAA}PZ3sl&Kl@{hs(_)j&sps;DA1gZ?4dIpN*+}`>jwbeuU4jW2aM@`;a z`Y0-;4vsF~R6#uCczA>%RR^uL^+L6;S@mR@H!P*{6igFtB#EAVG|{|xtVa-nOCQs- zQQ*b%52i=}Jx@tCudWZ7ye? zG9!w==H?;(QE@!VuPgJl>NYqpSu^sr9~10jCjs%OrlR?e=oI;k zQ>S4WH6%!C*de){SUs^`LuF01P?49UmxCT|efT_bw=7>O|DS|SI6|9;i#eJpcKvP3 z`1cUG{IPC^zi2oz41ru3I@&?yF#B+%JmK%d0)};1?Ee>i#(5h$u8wa@L#wrH9n1NF zSi@<)&*fzI%JBxN&w-f!#bQ|#`$}iZZWs9H+_vKa-OvTyk@ud0|l`*P>Btox#VxVgnT1DFc= zQOY@pVEOiXU(THb1%9ua4H<|{%ST>MQ{$}Ml_*Pl2f7Ooc@Tr-89z;F(zB>>E*Y=l zs*_RU47uyVa+d-&R@iDX8nOUY89U?ACKOthXZt4{#5to>S^K&8?$73iAHI>;K4;NB z6?|Xy&nup7Y&$Mh&U9<5M5%UNgS=P84H(xD@3s#O>(Zppuo0{GEg$fVCBhLbmc^gr zwYv1xh)TmPvNE2+M1VcqZeA=U8Svq6dQ9MmbOT+RSGA_po=7ptSza=PgwyKfc81QGF=mTBu;wfOEwwvhzKEeY}@z z4Z~#eEBkh$GjMzBr-1;1BIqZL$a<`aKxd{sm6jel!OoEwr)4g;M=&W=)zj`Uf}ZJ- z;EuF>gd9!ScV(C6IAfEr?v&LB^)9#--5)ljq&U8KYz_S|JH&=mTDG`iGMjb?_peC|!X^3mH%$hP`9YOM+=l`cvp(^UXRQQ3v3pT zp0PMQ)e36?P|D^h=ROvRYY_{4fE5^BVOmoU16##ma`6EGmL>E)2}wQQpS|RnT`a}c zF2jJ_7qogHWsbg3O1Gq-TM|Q0G~*9ptUefFg#Vtv9^$GkHTP=i!IW3|Jq9)@J{M$T(0?1TO|D>x5>hY<=!tRPFGM!sF@GhbXKW)0jls z4PEVEkDxVp?ndLY=XAX`VEUpa0T(B%#5gO<{$8e1EW7k{_`-RJwJt|O>9BbHQBbNl zLPaX~M^JWmo8_i}Wy1aO{owQ&8qK9#>K<^INnoFTv3W~=L3Dswco7f8Z6A}&xh3OH zjC|Dr=)tbS8YWM2uKf#)$UD8qP)tMZN10q+adb9jm(Y+0hPg%Cwh!vU>GK<7KJ_&h zk%zpZRuw2fHjD2SV^sUB))3yFPqcUSIBQ=1Oa&szKN=c>nuCD&ensmOa1w7|0p7V> znf4Om^}USf;{1x^{QM6=&&9=`%l>jvSHq;9am9wbRe&E=>z^;i`zT9=5kg09d@j*V zC!v1?sc6 zR@D@eDY1R&35`#%0AuwL6ku*FdV99lA4$*k=m^P>vaRK%k@v<_-An%*1lNyI6NeHg z<|1;8)2-(x1~q}oVASqE*GSIx^fwl4pEdH@(Ou6lqcQ0 zk1H}8D`E@=QJIvD?uQ!{LPM9y_0cy_uz+5%DFEX&!^K+F17BiP#s*bHZou2lUk4d=krkacz*$pjG!)#9q6t(?N*U}D46Eoi+YE+AqVF}|eB;QIt>i@mANz^>m zsX@+-Kv+T`W4%ijHHr-5AfbHx`LKyr_n~};TG}wp+?(L^n-x-)ecVzU>VlFI7!dZ^ zvwJ#%o?~{KGBFQxKVjk1a#OZxLt5_+e;hM5=XG{)=x5U-ReJi0K*fw|$fZINcd|Q+ z8Vga11CIRYJ2n)q60`XZNZr1$(&~=%vdR&iM;5pDq_Xqu{>#T>B4X+p73QcRmBbYt z-#uQZ-;{8nL>CyPgEQfbxw+UsM14XT=(mzfpKDCy z*Kw1xJOs9pO^x?IHVK_^J3m>^1jn>*mCRZzVG~Oj((*qzt*czb%*2=5_m=F(Q}a|@ zb4#MxT4eFQC9KuB=Z>Uvd3a0?#}MauPPX!MqdX!-mNYEJr%SWIaayoQtQZ(wp(xdw zQ-Md5-$xffjVN%E%0q*Z zkT@|-yt>i%McO$vlz{S?yZ z^P?9^xgQ>W&1asLK`Dw%03n<*i<)E4d-dY1bD3F^bYUeq^7@t5y?dw8KU8^rEz7^4 z=0jN=c^ueJnPTseH3wrsNSTMF=w6ZL!9LiLw z21-BHueM{06-juJ-dUpg!=|l?3SpnD+hrU!o0wm+4U|<@f)GhjRJ*W(K`afH*g8ZM z4RbK}bbAb{LT51%V;TG{Pl`Gbl;}a-!?av2#kN`@nw{tF_s+jR%(_Fbyi4b3Hf>{C*FX*mZlhGwmttglH7`rqBJO3jZ*G(e@$@2ZI9v1!?C{6 zm5m7ODIpPl$BE1`u@|??^(`AH=dIOnPM6>o(m9D;QEc$`sQiC@4IZ^;}{GOL=Q zvtMdr9@17LpPVepdc0%jKZ82j%I|vsPEy^__l))YH`V&lHSAqE3KSwAm3GQ?KsmK@ z?l4!sE@VZ5(r4&!$&PCIMmqpYjAss6SNofrn=iK|yqoU*XU>{o%+%drvu+RanzzawvO$gQS=WH)RoqpR z?Q#{hs>*b-c(Sp~n;2v9yYR?-?n%EwPdu$i7hYA=L6_m?{mgq+jD2+qa&xVFi#tjK z!}30P(mk2fs0wjEmqJ|Th<=l(2N)SoTA7N&e67s<5H)Uq1;ajy@R(I42|v$D(0D%_ zt|fs*&NQPOn%-8(oyn}8(YV5E5n8chL`>|lKeN9$LTy9z!Q2^b#B&EXS2%C@xx`Pi zr_^_-3w^1Z%^cGr(k@z`f25^H(d-1p!}4%KLe%z|y%%9~v{mA~+OSCNd8(e9J`y-O zEKu&WqSJeP*1TvK5V%x9J%X!p=UnyfoL`J3nr0s_QZfukR0_a{{*$HmzpXnwG5@H* zGZui@;c{=L>`_0IPYB?Jz zyXjas@>v~ze62SzxZIoU^|D3E7hv>I86Z{KB3H-jfM68dcmk7?g&pLj-oTOra61x< z{FA0r=Hda01X}@&RyJHPWvF5E0`%MbG&ySeR(^o{s)JA;@6Lylup7k}trfUJ1M&xV zKQ#Ns8vNd^>=QfdarHT=Y`C*cmGr&tcMDa}Z<5bigHiuLX0!F*Y(M0pA-iv{3JYRv zU$~Hf_k9D>qEqzrz4=u>SRoyBUd5e}QS_8PzmF#;+s-Oy#%dk5ZH~(THiE3u3AgE* z^!GgaK@Y&Uc_5)GH5cIglzEjYGPIZ7;C9j;OB=>1G{^uS+OXU#Rry|7sXPD7&>v01 zb2*Y&okpvfHNg^GW6GY~5Awea|+*))flIm%+pw@vUAa&cx-t z`?KT~LkS`+*bsS=y7UcBh3Bxo+1thgNIMLV88`+CeIn0iK&nI*kRmL^lRf%i7WsR< zog188yF$gu1y%M~-BFpp$7lWbGCh`LV&z>j4~Hs$51H9{p|ZYjiMRvx-q&LOnoK`_ zJlmjF#{i!XVcU<7KH594goMkI)nE3w{z4RxtrE6HVnCQfQ7v8c(;Tq%LKP5zF+71n zp{IM_r6Bo>$V-_5D4#_?J-)*z| zRwTZe66QU$`$nHx^{DSw8MUYaj^quy#%uI^Em*ZKjY0|{19aTPYLy(?VRP($c?MH2 z&99JQW3n2jL~bcOe8hKm_Er5U`_ba+#^a}GoU}XZ*n}|(xJ-o#B4!%Qp6;Jt*v<-V z4zR<)qE(6EGngtupAx35rE<9Qh(z60>{`6hbN2i`cweOe>;kHknWY6}aQm}p#F~aC znjA?sTX!C)kZid(TUYyOhK~qeY}03PV~t$3?h`2sAxkj&a|XD3>~s2B?X${yhgbDl z_kEWjH;@rwfYVBX2y1{a>YmqqRy-uHOgmlvD>mmcb2cmNGvoT6Q!0g6$hxG}!E|qb z50r+w#@s?dc>?TCT6zbxyN8Ws*&ILu2UKpAHAYR-<$T39uNyfPVdKtebYcC_uVcl> zZf?d9`rga11(|v8bTJCs9WRgd-C9W%OxyZ5tUt9yQatJ7*`5UmsqEF^|PQiAm|zNf4P+0Tppc-M*wNG8DSiFO-c*c^+d z*8>ia{JaLS`%+uphoDClH9tLbYazB9*w5u{SpAv&1|8imO2SJEx~QuGj#YFL02 zz`CpS1292Z8M4ag?p36#vzQM_AIskvhI+ne-J5lvf}^>2!#>_cLn^$PVbw51Df(fL z&F>fRc;<%si&7ofxZdam?|S-J0nJ;z3h97tOe_V5kVg|2S^LCde1Wk9&;SSYb+;+z z80T05LC6=+(jEOK6XpKp3y#+Qk%&YMI8;v{_d8){Uin$^?E6r;)4T|vMLbRv2Q!Ff zFM_z>BAa8X79-nZoI42TppgGC%zF>Ao+R$u5sx_mVb3JxGbyL{gJ@U)AXj&H#asG) z7vJ1-HWip@#bmmg7+)};yU07)ns(TmlJGBbB^9b6EvQg^C2W9SJ=;I`@;uJ8Vs$!Yxmo|Hqin#d(NH&O=Wh`;Uv>QE6Ik$z_3qaxr&c()qG)Mqm9(@%Cwju$ z0t@pHQOZ`il^FgQA<_Zy6_2UaiS@x_E%F1Dn$OGLh9mv5Vwa5RksI<-2bRGo4m$*i{B2n|*L*Tz1GoWm~rp~JN z;mS-bN4s+#sgMexg$6(=2~Q+}-BaDsGCcvvr^M_leE-z9+F#gvrZsQlyO#sSI-&PkOVSd*n9X|JS#zQpisySc2iA_AZ{}q|s zF=?k%SMyQHBJ{1>P5DBa1if#p=s17VgSlR!BU|KmC>*xFReR3iP0YxSoe7FJt;m|)BqhdbD|y$%J2O?58aHKOp6%YZ_J3I# zAf-pS^?%aD|EC6fzfhFrdjrR-e-Fl2=R_#SS~=^RqwAsmKec^#R8wEqCJKo3CQX{s zLjp)IO7DcC)X)QjE>Z=QCS9pg5{e)qO?m+7H6kta4k{o`0Vx8~+jrydeP`CU=36u0 znl)v2bMHR8oPD1CY@me*jsU`e3I^aRnsp-+Xflih37n#w52YeA%i6JL_ zLZr=jfG(u>6aW;z^1+=S9|Nam4Qx0x;(vlx-v~uM&XphsfMCfC(u1FpvG~_rL2_qZ z))&8oE@ea|M53WUyN#x_)Y>)*dOQ#Ee>~K(#BFX=oP`O^u>vKKcN-4gxAgVCw@rNZ zI|z_uUD;?0HK-OgR_-9+3pJgeTS((f==xE!6p44Y5}n5UWj^ruf;S<{c2-D(cnkY)D=?mAR(6w`@KT_*=IQTKN+3)Zg3PYg+r3nK zRoC1OO(}y%#-9()M)LrTZ>vR?;Q|qXKa%@ats?q5)AV-LFD~$IZAv#>Zt2OjcoAJ; z^*cV>6%kA6^7cOvj6drw;nqlLzj{SHnLTR&?2ZwOb)1frreU`4@ZIwXSdaKhXTP4W z;J@k8dOe#ptlv!!0+hr|l~`jfSfbgmT(+m&tg-QUrNxi_2A&0FrwMvzJ47Hi4Q#P(z~2wNgt^wB>*thh&z;P)Y$}~mO@o3iV8;ks<${95L!hN zWu-svKnD2iH)h{lXq)w@<;a4(Nq)vBjd4}K0$c$~`^ftp)ND)I7=FUu09e2>h}{$F zdEn%-AmqloPxI?Pt?q1^LIN+#?e_DmCFo=PXOfxgT2bfO35prP@u%e&$a$0CYV{Vl4YaA2`XHMA(KJ zJqTC5-V60I7Vsq-g(q*EElWAY2&c|-Jh-RYB{GQXGExot<}2o$Z}xt3L*SD{sC{Zr zw6zD`Hz|>{O$As3XNAA{#uy$P&x_X^bJkdJ}%&l+i zbEAp?xrnNr^v|o)9BZyQ#^)fpd^$ctyvZ&DfOy2K5@@{)e{Qd z>u)c5FH=+0TeJCMgaE){Q_TIvVLy0&=pb*}Jd-;2RABXd;qpL8)9WNg|Kb+Z1J@HN ztL#tBWI@FjsQ+b`1UX)rR3`!b!V%?yQ*dv!JL^9O^OJm>Ce)Ihx3A@_Ht-miV>iE- zWLUtTZiW+9u>C!cH>;W&!pAet79NIQ8yNs9nMVA)h)iBKl1`m`7$K>_eK`fB74Cum z?^4!px|ZI#3w>AIWU&mqT=6JE*WX(sq$UA3luP@X5y4$?i3l%Q9JBmNY;0FWP(jB! ztD`WHaOm-e(T32kP0E80q`wTt^()N<*Y(DeE5M7aEg~Qm~rn%OvEdKsXrWyc=sg#0o56QbGSwa zY;R5?OW!$vuEu89yyMrfX<$ao#+Pfu`w}yZ4Qh&Bnn6ZWzP;Bkw!8(du5aW@Hf^$~ zzF2qXp-6jW^K%#BZcD>HbqsK%<&Y1k$d`LTF7jZ z(qt}&jpnA|b$j7Td+tEhn4EG!YWuAO)B>=RLfU=kh%tCCLYa!Qiq2UjyPk(7EW4L9 z-R<~A{zR`_T26kSF%y_lY&vZ3(aC)02hysl*iJzU0SYhV9ZEi*?5G1~kZqHE)H2uJ z!8`*Pi2AV&5C~Ex%n7<>XR-7=dHM0dSTR$?RN-6PR%xabJ z(T}f(rHv3iACgGR@IV45QIbNrpP0SGINLXLTC&mmgYIzS3V@@mA+l84_xC>R$)K86 z*5e5m8g>Vq7=qoE%UoEsAPjO^Xnb2nJG- zKGHYi36X!Jknv}+C#8wfoh3s9;VFS9RmZ&1w0sCj{5bp)j zv-Wn@4CPLZE;5BDZH`35l4M^*#TI-Dl77AwQ3{3FKPwxd-WDe=i^);85V=(gC`l?c z(1XH~?iRJ8qA5mef^KoD;G24G0l?FghNOY1EoHGaG)KoVW^#$|(LpZqOn0jr^X2kr ze4CKuj@k$kxv)QmUUUk2u)PZMo z@z-8%H0kvwN?u1SgW=-!v)J<{~} z06>klYz=(-6D;V66_@#GYRv;6zi~B~TycR|L}o0vluiC{I8F@1dv1{ZMp!wNRne3YyAe0OO#fVU!hPS1>&&- zkM>);S+sa?HC&AK-zW+BTa$ol-;O&qpS52v3A(KFJ21Rz$dWhZaey$KF|y6^-N*WP%| zE**G~thFCPlsf|x;?kK%#1mBrN##U{UBlu>SG`wrU zZ;{12Zun4SJXKj;M7&13@^&TOr6PwzmudSR{9e#?Xv=rZ(gFPsmJuBL&Fo_-yL5L4 zI>M=Q3-@8lhZ?uP3Zmse)|aB!rnyB>i0>N4hd;_0D=7+y|HR%p8?m}Cd%bjTs_anO z5n#;JY#p=+?U0!fJ*znr7Z4d!*$ElzGZo_cb(PHu{SBIoQL?@3N#FPD+<&p$j?!l_ zIfuOQeIDB4=U#~#ln2f4_LC+{R<~J)Rf)+hIvT$ujADknTp1hV0y4h|6p_p<1pe9W z)SNk<*$QBj)E|EGKZ^Hw?h7vbqT$CNnT~uJko@k`uRON&K#EoYjnplf$;puijUE=@ z8ihFlGru-thf!a3#=ESB-HziASA-baH?S+ROGbQeU;+lLPbX8m(qi?aDvhKP?7rH% zn8d%54PM@4ramA1yiPzh$^G2Qr?8+DipiQFG(M*>&3_McngD82RIeyEFU;L9|43Rh z&9|KPG6F@fTU$MqzGb_mev%eg_4KD>xLCt3VH?B(xp4MfX6!MLnjXV^$uF~OSug=~| zPUJH>_a$zp%N#v)FbIFi>2eCbU;m_;+@RXndE!nj{^XTf>1&MDS*9fWx7KBe0YABM zS!rIXK8>Qhv7Ja46Ge&&S#jBE#Nn-l*)B8A*=R_vWL&VM8I5+?qm9wlOpU7Cz=hHh z{Mq*|px7{RT~qr9;YKBaRobs0SRmt^m;VUrak?v=70Fbl^X`ZYb+=W{`|=`XC*?1gdP>b#rdaLcegmh=)R~sZF_E z$hyJgz;m?5zV3WQp)C!f_9YS743;CE^^Nvu*o-H))pK;*nYw@f^#1I2z81N@+{ns; z6ZfIXl}g+bx#OwF>32hH(}$bNVd~erHaDn7{j|~)jc&3 zW%P|^|BB1^2+W+1SrR4rTAR9@*F*eGz2M=AmTZbhce<6LG z!I*qdqJQXxeg6?-`#2eH`q)IyQ(7yGFD+qI^DKIAAD=Ff?P<1K znD~?E4(tu#S-*wZfFmq(y-(+WU3^J?(kebupNE)7IA|pPjh=jvL5R%nsO%Ab=49UW zI$Ks^Z3n%iRv@qk^*9#$#OBU8Nqo=<_IaA>lQg7CZy<3KrME7Z0J>?MyH_Am`cp22 zcHvDnVgG`KE9sO}{A(kB;ba5!9oU-=wE;MJjgDem^{WDnC=uG^bfd6Uj(*_GwaE0z zB^kY)Hv!lx@eSLL)#nER1rfzvLb3V70g~&QS7+JT=3trewQdax!w08QWBM{pud@Tr zx5L4ena8H&@5fD&{ry6AP&M7Q;f54qyOL({GN0$(d?BAZUR$@6JpXAIVu|)~|EO{d ze|nf|v-4dcSym)na^ZH9M)u`14@s7aI0rv_Eu-xEKIa5ZSCHjuSIYTS8lI z0BjAZ3Er;htr+fxR;9sDS~~~DzZu)|zuM=1=9<*SoGS>UX`kXW?dvo9_{9=I;V@#2 zey^CX4Wl2JK3400#*HZvqE6rdgQ5wwY6a8q=xyx?eqouL?~et1nVmq!QhQA{rM7hx z<7WuMXw@zA57C*Ke#A7OVh-oew=56& zs$`6Bo9a4$QM7AoJ&_;X*Y6T>B|AtgtggmRV_EhJf67It%)MzPDE07Gt)FD>tFb@H zHi~6gxG75jmWiQBtnI82pCF&IErhH383zL=t5CnOid37R-^1;vD`#+x_RGD1W+z5X zJw-Huc#)Vr_nFkHd8NfwYcDDmk?Y|}&rr4>R#CXx>Ot!@Oorcy;Cg(gDWTCtU%hFR zPE`9X8;G};zg;5(?`uB^Mn*JQyzQhcgO%Ryi~!o!|HGQwF%+Jy=R>X2<`Y$v$20Q) z!*9Zdxeg;GAZ@Cy{maHO`M3m*A-sl5?79(P!Yc0IC|ct0z((i@fW%@QHEv`^*yNvf za|ZjtqKQsdPTj^YDBZ*vXqCWKXyC@9Uu&(z;tmgrWiQ&Io_?4%C~;&LpxkkCdZrzm z`OqPWkkaQg>r1?c%T@Wx1O_s9^*mii#oRoA#4WZ!sP>BlK&msL^$cJ4#<%KXP1=?`b9h+mWE zk#4K%EULRB(ky?TI@bMh_z|;|+O=uVff?Jo01p)a2cof>A(9W%u1dO$H<&iOf3DBb zg^9~NkN3)`-OR&}+|(%og{;vF@XfIvy8ZYuw>pY6$oKV&dlIp?YT5r*3m?+2I5vB5 zn)wDPExh8i8Z`g96gEuEWoOZe^0rubtE8 z7AF4Bd%|^}ROqr?i6tR%!{Nlt7~s5wU{!${hj*d((0>?`M7jBsCJeAgJVj=-j>9cQ zfq!VaM0l$cDgHdNkgYEb&fJT(@}yIpe)ilCR%<4(FssVEz&b9ew3}(|>0N8JUv7^w zz;=5q-4EcY_J5}}j(LXv&okx8fdlvVorFwdeOl86uzn-ubFIlopENVf3O*(#X!7r1 zK~tiA$fN{t?Piy#*-tTWUgRCn#i(1D3znxs)<~8{xas7(d5uk>J`Xo1LmKQlq-(Q; z)3>hsJI$Jvw9h#$oFD9ob@J`W%qm6HYO7le=MQBxC~?0y23PNuYd{5%sSJXTXA-tL=kkQ4l+U;Jond& z+&2=J=FqfemIS47o8pP@q0(|t{opvTMCNh^mmsg{b8~LkYF;8AN*XEa3htx%1AbDK zQN(1>e4nfB5xOMJZ`5$?@6`BV@xXhPAT=)k*Sus%QEFTg zG)qnrKMDNvr-FH6c{doLQLOyoE;%%U(%4at>5!t0=1nxqb~(nxNB<{g&ZEIO`MKJ4 zULq|O-Y*3ciEj-c-W&nGcif(tkQckOxK26q7;Y!1Vfd}*QKRt>TYmifX5ls+7?81= zsz2nBnw@n^U`Qjs-*endt+ciwQ>k>UL4a7XO7l1_iy`5*wS6SxOg7$6{Q>^f348h5N`HTkY z@2+uT?Tu?3iEd93?L0UZ%c#us&Xg`_&ND(sY|JHnyE)n4oY|@}E-qg*;H3q^s&4OW zZfmprPo?F9;W0;6*i99s3X++7W#aYYo{MIJ0f(W>yc&-uC!P8t3Ss~ZNO zO*$mP{{95V{Xzv<`%{5!tAi(=d_|G_g&jdnfxBC_U zqkd;nV|-x9VvjZz1n&cGwbRo=DhDgVNeW_T_Zn#{@ z_%l?>BZRe>RMl)B@q25hPTOj|ZV70%FVa*SnjnqIFxF+$7cS;OjG+4vLU%h2Sv`WnME2 zEg>R1x>BTRE*FfG)mf!tA4l=ll+ROdm=PAhetOgfZAyky`}NsFio(eZR|K zgVoWv8yTT*_d_HtiwDGjwDXKp%B%sR(wPVsdK%BuG3(gV^(9sea+9+m*EwQADgVno zZhSJ|S-aWP-0lZvenE=wE0$IHa^Q8S#BGbpmW>#Jo5o_gP(q8o-KN}x@p%U=dt)k$ zRw6R-LbM+uVOgcE_vLN1--qF$p^Z&Y=R78K13BGTnr;5fz|qOq>hp(k+V(`i|> z1PhwX&&(w)&N{MJr((-QxFilz6FdFcXSH233JOb+&WyE1C^+TE_L^qVM+Mh+t;!Wv zUhpmn320X|B;imtM!d^y@SC&--^{&jRv} zUlwmN5vjMcu&yKlG1W~V9wEfUoUE+*7mRB&CG(B$?k(QlV0QB3u_tz}m$B4LwB<-&4>vOV#h>crj(je3_XpE5hLM26cH+K0Y6mygmLL z_clVC;Y`Z6Q8#xghu(^8vc9cO-dwbSNPnwUtn=C4xO^nV0s#GRhFn4&ZK2(<#eWm^ zF2Oz}vZo}@WH!#EwY2yna79`&%^ViL@kgQr&=HzVuldo7@Ngq=9B6lbjof?#V3i5N zvC8by768H_!x`@T80-jBp+^1~QMs;GwTl1f=+l8(b22=*`Cr*_!rI3i^EVAsY=W9; z>Xgy*b$V_4IYig+9B}JOLIc1N;^~qD#`V8&G$g>9#QS;^xQilMpMtGf@=k+fVAR$l zY)ZA?F@sed1)j$bV8tTK=^)6WQS-d_eucbAq*p|;ETnkf2XOZC4L7VNMDX`Yszu4U zvY0EeaaTdbZVG@9awPrN+~-&1&Z%;hty?ObqZn*6{A#UhcO2#a?6@V)?^npj*>N&M z1fJzR-+S((EY>Ja4|&DJ?Jbn2pY=#p80G&dP7{LnqJ|Jq(Z_LcrfyLfQRf?_$?y%eL)Z!jZtJ`1od`o8)14GY1n zipGk|5Y<@HsW0sn;~X%e#EV2huoc=Tax~Vk`nZ=2P-6$2y%z&BlJ>HZ45LbDS|vHM%NXoQo;{FU_AJ7Z+Vag@=G&Mysh`c zx1OWKz-qC1)yrk%5oOe|12#;&?BW@>eowXVV&lQ zPKv-<$;3?NAx`vETwojz67K~O{!4;`^pK;qri{tv&tI$41Fw~@p5Jy{uZ zr4i%}gAMd|#fW}BJor9Ft##MJA2;L~hGe?p^_B~-Ai)r6#Sw>CMA^Cv3;R`a68DFs zRhnu7@oEbt)H~V=%bVmFX+zltpNQvZ6IMVJrut|l>x?9B^FGsZvfz`=G)L=|B>R7J@dfMVnw&0cF~I?^;VpHc1nXeGuR&&VVijcctA$p4O(Z&Rjzca_n;FrEydVIakNI@mEW);$OwP2w=Xn zpARlrpN&&i{@lg>vhJ^FZ$CV6G!6W0c$j*a>bf^;UtCjQNp86_Nxv<76vD9Dm1n?4 zvvc8pehwJv8wOPg%1TpCs`)zA=^dX1G26A}w{4a3<3Y&mTXb8P;%^pnEbG|sc zn z<;QZ_R~BCXyy4qDpOe6*fu~vorG+{fkDk(&-H>>QCfi{hqAfGsry6t3`6z11F+o`B z>Xgxz?8z}t5qIS9xw(5?@Ac>tJp{{~c!+>j z!uAAOB>2BM)YyM?PHk1;f*p=T z+GVsJQU!m37=BGlNpY+npo3rztjKdmGUm^ASNGYiu??4d&FT)ppSWM^jziTRyjbUR zT@L401)2PrAjFVZht*zJX1C-s=!sKLv}*Y5ts>xB!J+@dznL+k>T$P!GwM-WNBaFP z=1HQEb5q{ZZ|d3dPtu!78YIk^{s@V%)j&hq*4!P7t>|hhT6ei0$-cJW7j)=-QYkC% zIKGY0%>&^5=G6JQO1~oA@)Q>#-?%MXIK@Qdez~MHq2IzYjLjxhc9}Hq>ZHKDTJPd) zJ{4qIF`qQd*F+P&dAo-y$L90u-cA-xD_h6}xuzZc^b(=sFBvO?J@xAOuOV~J2HXKk zRFD*He)v*6o2jq}vGyUKSJQx(Z$UjgQa=9INP*~Nutg8omSZ-4(D~Z4Z;j1w4Qq&M z8jteU)3}#M>H$32YCDKS(^ z?s3noD^tjR7cE^G<>m3Fqo~nic{9xO52U;C<0kaeYT(Y#3%W{sKgUPJs>GJRlv+9D z;oE~Qo^nJ+y9Voe+%}>VoQt9Qr4gu)dCw*CG_^(3tpb1@D<+fch_UMO!785Xg9okn z@^7s?SN_M%4gLz3>CBf+m7Cuu3+a^ZSzLAhoD$qnR`+Lo^(gE} zBU2?PRRz728fxpy%#=HC#~Jcm0Q4F0s!Cnb$jEt|L|fb1sG5|Qs_ZcGt(T*V8tW13 zL`do#<+LmBuX3_%T<;$;Hhuhh@J#tI|Mvq#r)KT|!pYg1(Z!Vg){4jSmMub!UWmO% zc(+G^#ogOZ5rq z!d%h1#GQLr{&l5Q$5uRvJ7s@4W%rTpOhv;x@;sheff3)?N?w=%#(4N+9YP%qSB9yf zBO21my0pDXuAZSq?8O5o?kaA%jm>O69-*uZ+7FkSTCFsyX(1B;!#u+jTr4XF%;-~& ze+~PD@z1-~g7#~csP*o^l$P(!LSSQx(G?HK@aZtsn1m2oVlHhmujNG*C4C3E+qH3G z@xI)>p`X-R+$5{F(jmcFW!!ecIs$n?Ya5HAjh-qcZy)$1J~*Z8v>_MHw^khQ%2Qtd z-9uNNQ5VW{UA(>(4-daWQ$^7b|E=fN$-SllAY5;I&82M-fJCp2n~>f_A%{@?^QjNS zMt!7m;RUVNpb_Z1k6**P))_iwsh8@(z zXbdX=xk)=1jmj$8*VAt1j$2k-e}oWkF4qontBU#6$)j8YS8XjyD62S1-R$Ihx^thF zNocKXqm1`PBLcUamn*;zO2&M8Go3OA{Hqgf0tQsD-Eqr^6sF2pOWAi;a#nO zEo<%*_6NmnhZO_5tZ6Quo`vvn<_bEUt|V+6!)-Qg!?+_ZtByUn?_MMadR!=9sYN+) zk5*Wd!75{dpzK5CGN}EM`)5OjQOIT<%ot6}5+C>ia#z>6p0>w}Obemqy)Jt~hSKk2 zGpaQ!psApILnfo97DBiM>krR5YbsmA@9n$yeJLlzZ)d*8eeQB&Ue=Q5cT$R7`g#NY zk+9N9yj3c47z}vG`kWx?nE5p|9^iXNB^+7Ulv<)MdoOAeay`E1ql zlZ9M7R$wJY(Xqa1kTI;c4lqcYJyuX2sPd00M+vpaO2wBDrBw(-q&z=a1G~%X4@+Q@ zw-%Wr8_ZfYEl1wiPYTe~Cfi6gHR_qLDk<^VNX4$-F}eMZV+PjqM+C9U@0#$|dtu^! z@$Nxp?1j>mcbVeNl+I4!cgQ4!O*1)6>7l4X4OCZhfi$7uX_x4INRyoZX|5`I=uR&( z3JCV->C0$o{VLI9PlA7Okp{+oZ>oxAav(LHlDZe~Djr7s*XDj5c>%|us;R@e{!B(j zJbOu{doQSV)nhlpW2mT->kbTEkW~fGHD-7#zz%v;`gCS5_UC!&q#99U2Tp8{F)__R zl=EUAD#39b()$>L-NOfh9)%mYz#R{L4;O^}jo*Mjc%W>!AvF zsBRK`!hT-?kr-h(fX}#pWkK%1{(hjkNlHWz`*+NBo5dG!>VLk6uu%Q$rxB6(VXC-G mTn|Nic>MdL0t~XbeJOuqv%l_Hd+-z7>@`(&RVtL=VgCUa`Ch94 From e8a66637c7c1d0a86499e537977e345f3188f4cb Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 24 May 2016 12:44:50 -0400 Subject: [PATCH 472/816] Change name of arg in define-key-recursively Also clarify docstring --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 2cdf1cb94bb..b47b05825cd 100644 --- a/which-key.el +++ b/which-key.el @@ -832,10 +832,10 @@ addition KEY-SEQUENCE NAME pairs) to apply." (push (cons mode mode-title-alist) which-key-prefix-title-alist)))) (put 'which-key-declare-prefixes-for-mode 'lisp-indent-function 'defun) -(defun which-key-define-key-recursively (map key def &optional recursing) +(defun which-key-define-key-recursively (map key def &optional at-root) "Recursively bind KEY in MAP to DEF on every level of MAP except the first. -RECURSING is for internal use." - (when recursing (define-key map key def)) +If AT-ROOT is non-nil the binding is also placed at the root of MAP." + (when at-root (define-key map key def)) (map-keymap (lambda (_ev df) (when (keymapp df) From 3018a537f5cd7f0c726e7fb6125e6442de9a0efc Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 24 May 2016 21:37:52 -0400 Subject: [PATCH 473/816] Remove some unused code in comments --- which-key.el | 50 ++++++-------------------------------------------- 1 file changed, 6 insertions(+), 44 deletions(-) diff --git a/which-key.el b/which-key.el index b47b05825cd..477df09a9bf 100644 --- a/which-key.el +++ b/which-key.el @@ -434,8 +434,6 @@ to a non-nil value for the execution of a command. Like this ;; 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 open window timer.") (defvar which-key--paging-timer nil @@ -603,7 +601,6 @@ set too high) and setup which-key buffer." (when (or (eq which-key-show-prefix 'echo) (eq which-key-popup-type 'minibuffer)) (which-key--setup-echo-keystrokes)) - ;; (which-key--check-key-based-alist) ;; (which-key--setup-undo-key) (which-key--init-buffer) (setq which-key--is-setup t)) @@ -611,17 +608,12 @@ set too high) and setup which-key buffer." (defun which-key--setup-echo-keystrokes () "Reduce `echo-keystrokes' if necessary (it will interfere if it's set too high)." - (let (;(previous echo-keystrokes) - ) - (when (and echo-keystrokes - (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001)) - (if (> which-key-idle-delay which-key-echo-keystrokes) - (setq echo-keystrokes which-key-echo-keystrokes) - (setq which-key-echo-keystrokes (/ (float which-key-idle-delay) 4) - echo-keystrokes which-key-echo-keystrokes)) - ;; (message "which-key: echo-keystrokes changed from %s to %s" - ;; previous echo-keystrokes) - ))) + (when (and echo-keystrokes + (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001)) + (if (> which-key-idle-delay which-key-echo-keystrokes) + (setq echo-keystrokes which-key-echo-keystrokes) + (setq which-key-echo-keystrokes (/ (float which-key-idle-delay) 4) + echo-keystrokes which-key-echo-keystrokes)))) (defun which-key-remove-default-unicode-chars () "Use of `which-key-dont-use-unicode' is preferred to this @@ -635,36 +627,6 @@ starter kit for example." (setq which-key-key-replacement-alist (delete '("right" . "→") which-key-key-replacement-alist))) -;; (defun which-key--check-key-based-alist () -;; "Check (and fix if necessary) `which-key-key-based-description-replacement-alist'" -;; (let ((alist which-key-key-based-description-replacement-alist) -;; old-style res) -;; (dolist (cns alist) -;; (cond ((listp (car cns)) -;; (push cns res)) -;; ((stringp (car cns)) -;; (setq old-style t) -;; (push (cons (listify-key-sequence (kbd (car cns))) (cdr cns)) res)) -;; ((symbolp (car cns)) -;; (let (new-mode-alist) -;; (dolist (cns2 (cdr cns)) -;; (cond ((listp (car cns2)) -;; (push cns2 new-mode-alist)) -;; ((stringp (car cns2)) -;; (setq old-style t) -;; (push (cons (listify-key-sequence (kbd (car cns2))) (cdr cns2)) -;; new-mode-alist)))) -;; (push (cons (car cns) new-mode-alist) res))) -;; (t (message "which-key: there's a problem with the \ -;; entry %s in which-key-key-based-replacement-alist" cns)))) -;; (setq which-key-key-based-description-replacement-alist res) -;; (when old-style -;; (message "which-key: \ -;; `which-key-key-based-description-replacement-alist' has changed format and you\ -;; seem to be using the old format. Please use the functions \ -;; `which-key-add-key-based-replacements' and \ -;; `which-key-add-major-mode-key-based-replacements' instead.")))) - ;; Default configuration functions for use by users. Should be the "best" ;; configurations From 8fee7c168eb3635287557b8810edaf7b4113bd7d Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 26 May 2016 11:16:43 -0400 Subject: [PATCH 474/816] Fix --echo when echo-keystrokes nil --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 477df09a9bf..92789e40fba 100644 --- a/which-key.el +++ b/which-key.el @@ -1619,7 +1619,9 @@ is the width of the live window." Slight delay gets around evil functions that clear the echo area." (let* ((minibuffer (eq which-key-popup-type 'minibuffer)) - (delay (if minibuffer 0.2 (+ echo-keystrokes 0.001))) + (delay (if minibuffer + 0.2 + (+ (or echo-keystrokes 0) 0.001))) message-log-max) (unless minibuffer (message "%s" text)) (run-with-idle-timer From 169c1ad72506fcfe3ced439c3f2e42a87ea67556 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 26 May 2016 11:19:02 -0400 Subject: [PATCH 475/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 92789e40fba..464c9e82345 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.10 +;; Version: 1.1.11 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From d031bad7b6042006c9706fb8bd467edacf3fb435 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 27 May 2016 09:31:35 -0400 Subject: [PATCH 476/816] Fix performance issue with secondary timer The secondary timer option was restarting the timer every time through the update function, which caused the cpu to max out. Adds a flag so that the timer is only restarted when necessary. Fixes #126 --- which-key.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 464c9e82345..45a4d632e18 100644 --- a/which-key.el +++ b/which-key.el @@ -436,6 +436,8 @@ to a non-nil value for the execution of a command. Like this "Internal: Holds reference to which-key buffer.") (defvar which-key--timer nil "Internal: Holds reference to open window timer.") +(defvar which-key--secondary-timer-active nil + "Internal: Non-nil if the secondary timer is active.") (defvar which-key--paging-timer nil "Internal: Holds reference to timer for paging.") (defvar which-key--is-setup nil @@ -882,7 +884,8 @@ total height." which-key--current-show-keymap-name nil which-key--prior-show-keymap-args nil which-key--on-last-page nil) - (when which-key-idle-secondary-delay + (when (and which-key-idle-secondary-delay + which-key--secondary-timer-active) (which-key--start-timer)) (cl-case which-key-popup-type ;; Not necessary to hide minibuffer @@ -2101,8 +2104,9 @@ Finally, show the buffer." (eq this-command 'god-mode-self-insert)) (null this-command))) (which-key--create-buffer-and-show prefix-keys) - (when which-key-idle-secondary-delay - (which-key--start-timer which-key-idle-secondary-delay))) + (when (and which-key-idle-secondary-delay + (not which-key--secondary-timer-active)) + (which-key--start-timer which-key-idle-secondary-delay t))) ((and which-key-show-operator-state-maps (bound-and-true-p evil-state) (eq evil-state 'operator) @@ -2116,9 +2120,10 @@ Finally, show the buffer." ;; Timers -(defun which-key--start-timer (&optional delay) +(defun which-key--start-timer (&optional delay secondary) "Activate idle timer to trigger `which-key--update'." (which-key--stop-timer) + (setq which-key--secondary-timer-active secondary) (setq which-key--timer (run-with-idle-timer (if delay From 13316578c8483740ecfe97f9f069fc364e4f97d9 Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 27 May 2016 09:35:27 -0400 Subject: [PATCH 477/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 45a4d632e18..abc9e36e679 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.11 +;; Version: 1.1.12 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 322cda0e7865f90493ed0337182c2d9fe51a66b4 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jun 2016 22:37:11 -0400 Subject: [PATCH 478/816] Introduce delayed prefixes One version of idea in #128. This design is subject to change. --- which-key.el | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index abc9e36e679..0175d3367e1 100644 --- a/which-key.el +++ b/which-key.el @@ -341,6 +341,20 @@ See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" :group 'which-key :type 'boolean) +(defcustom which-key-delayed-prefixes nil + "A list of key sequences (in the form of vectors of events) +that should not pop up the which-key buffer after +`which-key-idle-delay' but after `which-key-idle-delay' + +`which-key-delayed-prefixes-delay'." + :group 'which-key + :type '(repeat (vector integer))) + +(defcustom which-key-delayed-prefixes-delay 1 + "When `which-key-delayed-prefixes' is non-nil delay which-key +popup by this many seconds after `which-key-idle-delay'." + :group 'which-key + :type 'integer) + ;; Hooks (defvar which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized.") @@ -470,6 +484,7 @@ used.") (defvar which-key--inhibit-next-operator-popup nil) (defvar which-key--current-show-keymap-name nil) (defvar which-key--prior-show-keymap-args nil) +(defvar which-key--delayed-timer nil) (defvar which-key-key-based-description-replacement-alist '() "New version of @@ -884,6 +899,7 @@ total height." which-key--current-show-keymap-name nil which-key--prior-show-keymap-args nil which-key--on-last-page nil) + (cancel-timer which-key--delayed-timer) (when (and which-key-idle-secondary-delay which-key--secondary-timer-active) (which-key--start-timer)) @@ -2057,9 +2073,10 @@ Finally, show the buffer." (which-key--create-pages formatted-keys)) (which-key--show-page 0))))) -(defun which-key--update () +(defun which-key--update (&optional delayed) "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." - (let ((prefix-keys (this-single-command-keys))) + (let ((prefix-keys (this-single-command-keys)) + skip) ;; (when (> (length prefix-keys) 0) ;; (message "key: %s" (key-description prefix-keys))) ;; (when (> (length prefix-keys) 0) @@ -2086,6 +2103,15 @@ Finally, show the buffer." (eq this-command 'god-mode-self-insert)) (setq prefix-keys (when which-key--god-mode-key-string (kbd which-key--god-mode-key-string)))) + (when (and which-key-delayed-prefixes + which-key-delayed-prefixes-delay + (> (length prefix-keys) 0) + (not delayed) + (member prefix-keys which-key-delayed-prefixes)) + (setq which-key--delayed-timer + (run-with-idle-timer which-key-delayed-prefixes-delay nil + #'which-key--update t)) + (setq skip t)) (cond ((and (> (length prefix-keys) 0) (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map @@ -2095,6 +2121,7 @@ Finally, show the buffer." (keymapp (which-key--safe-lookup-key function-key-map prefix-keys))) (not which-key-inhibit) + (not skip) ;; Do not display the popup if a command is currently being ;; executed (or (and which-key-allow-evil-operators From 12d2266d9d7ba24a1f0f9cad54b0153f061bef06 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 9 Jun 2016 22:39:47 -0400 Subject: [PATCH 479/816] Fix bug in previous commit --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 0175d3367e1..79f7a2bdf03 100644 --- a/which-key.el +++ b/which-key.el @@ -899,7 +899,8 @@ total height." which-key--current-show-keymap-name nil which-key--prior-show-keymap-args nil which-key--on-last-page nil) - (cancel-timer which-key--delayed-timer) + (when (timerp which-key--delayed-timer) + (cancel-timer which-key--delayed-timer)) (when (and which-key-idle-secondary-delay which-key--secondary-timer-active) (which-key--start-timer)) From e4d61490e8c9bb271855ef0fdd1887433d1ad525 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jun 2016 21:42:34 -0400 Subject: [PATCH 480/816] Redesign delayed keys implementation Everything is controlled through which-key-delay-functions now. Ref #128 --- which-key.el | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/which-key.el b/which-key.el index 79f7a2bdf03..79858459e80 100644 --- a/which-key.el +++ b/which-key.el @@ -341,20 +341,21 @@ See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" :group 'which-key :type 'boolean) -(defcustom which-key-delayed-prefixes nil - "A list of key sequences (in the form of vectors of events) -that should not pop up the which-key buffer after -`which-key-idle-delay' but after `which-key-idle-delay' + -`which-key-delayed-prefixes-delay'." +(defcustom which-key-delay-functions nil + "A list of functions that may decide whether to delay the +which-key popup based on the current incomplete key +sequence. Each function in the list is run with a single argument +which is the current key sequence as produced by +`key-description'. If the popup should be delayed based on that +key sequence, the function should return the delay time in +seconds. Returning nil means no delay. The first function in this +list to return a value is the value that is used. + +The delay time is effectively added to the normal +`which-key-idle-delay'." :group 'which-key :type '(repeat (vector integer))) -(defcustom which-key-delayed-prefixes-delay 1 - "When `which-key-delayed-prefixes' is non-nil delay which-key -popup by this many seconds after `which-key-idle-delay'." - :group 'which-key - :type 'integer) - ;; Hooks (defvar which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized.") @@ -2104,15 +2105,13 @@ Finally, show the buffer." (eq this-command 'god-mode-self-insert)) (setq prefix-keys (when which-key--god-mode-key-string (kbd which-key--god-mode-key-string)))) - (when (and which-key-delayed-prefixes - which-key-delayed-prefixes-delay + (when (and which-key-delay-functions (> (length prefix-keys) 0) (not delayed) - (member prefix-keys which-key-delayed-prefixes)) + (setq skip (run-hook-with-args-until-success + 'which-key-delay-functions prefix-keys))) (setq which-key--delayed-timer - (run-with-idle-timer which-key-delayed-prefixes-delay nil - #'which-key--update t)) - (setq skip t)) + (run-with-idle-timer skip nil #'which-key--update t))) (cond ((and (> (length prefix-keys) 0) (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map @@ -2138,12 +2137,14 @@ Finally, show the buffer." ((and which-key-show-operator-state-maps (bound-and-true-p evil-state) (eq evil-state 'operator) - (not which-key--using-show-operator-keymap)) + (not which-key--using-show-operator-keymap) + (not skip)) (which-key--show-evil-operator-keymap)) ((and which-key--current-page-n (not which-key--using-top-level) (not which-key--using-show-operator-keymap) - (not which-key--using-show-keymap)) + (not which-key--using-show-keymap) + (not skip)) (which-key--hide-popup))))) ;; Timers From c2fb61f2f8bb8b51900e0dd55f70c5e7efa949b8 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 14 Jun 2016 21:45:10 -0400 Subject: [PATCH 481/816] Fix arg to which-key-delay-functions --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 79858459e80..1e2437cb5d3 100644 --- a/which-key.el +++ b/which-key.el @@ -2109,7 +2109,8 @@ Finally, show the buffer." (> (length prefix-keys) 0) (not delayed) (setq skip (run-hook-with-args-until-success - 'which-key-delay-functions prefix-keys))) + 'which-key-delay-functions + (key-description prefix-keys)))) (setq which-key--delayed-timer (run-with-idle-timer skip nil #'which-key--update t))) (cond ((and (> (length prefix-keys) 0) From 6adadec740b64bb33153a197222708ece353ad1f Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jun 2016 10:03:51 -0400 Subject: [PATCH 482/816] Use sit-for instead of timer for delay functions --- which-key.el | 50 +++++++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/which-key.el b/which-key.el index 1e2437cb5d3..55721a8129f 100644 --- a/which-key.el +++ b/which-key.el @@ -344,17 +344,17 @@ See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" (defcustom which-key-delay-functions nil "A list of functions that may decide whether to delay the which-key popup based on the current incomplete key -sequence. Each function in the list is run with a single argument -which is the current key sequence as produced by -`key-description'. If the popup should be delayed based on that -key sequence, the function should return the delay time in -seconds. Returning nil means no delay. The first function in this -list to return a value is the value that is used. +sequence. Each function in the list is run with two arguments, +the current key sequence as produced by `key-description' and the +length of the key sequence. If the popup should be delayed based +on that key sequence, the function should return the delay time +in seconds. Returning nil means no delay. The first function in +this list to return a value is the value that is used. The delay time is effectively added to the normal `which-key-idle-delay'." :group 'which-key - :type '(repeat (vector integer))) + :type '(repeat function)) ;; Hooks (defvar which-key-init-buffer-hook '() @@ -485,7 +485,6 @@ used.") (defvar which-key--inhibit-next-operator-popup nil) (defvar which-key--current-show-keymap-name nil) (defvar which-key--prior-show-keymap-args nil) -(defvar which-key--delayed-timer nil) (defvar which-key-key-based-description-replacement-alist '() "New version of @@ -900,8 +899,6 @@ total height." which-key--current-show-keymap-name nil which-key--prior-show-keymap-args nil which-key--on-last-page nil) - (when (timerp which-key--delayed-timer) - (cancel-timer which-key--delayed-timer)) (when (and which-key-idle-secondary-delay which-key--secondary-timer-active) (which-key--start-timer)) @@ -2075,10 +2072,10 @@ Finally, show the buffer." (which-key--create-pages formatted-keys)) (which-key--show-page 0))))) -(defun which-key--update (&optional delayed) +(defun which-key--update () "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." (let ((prefix-keys (this-single-command-keys)) - skip) + delay-time) ;; (when (> (length prefix-keys) 0) ;; (message "key: %s" (key-description prefix-keys))) ;; (when (> (length prefix-keys) 0) @@ -2105,14 +2102,6 @@ Finally, show the buffer." (eq this-command 'god-mode-self-insert)) (setq prefix-keys (when which-key--god-mode-key-string (kbd which-key--god-mode-key-string)))) - (when (and which-key-delay-functions - (> (length prefix-keys) 0) - (not delayed) - (setq skip (run-hook-with-args-until-success - 'which-key-delay-functions - (key-description prefix-keys)))) - (setq which-key--delayed-timer - (run-with-idle-timer skip nil #'which-key--update t))) (cond ((and (> (length prefix-keys) 0) (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map @@ -2122,7 +2111,6 @@ Finally, show the buffer." (keymapp (which-key--safe-lookup-key function-key-map prefix-keys))) (not which-key-inhibit) - (not skip) ;; Do not display the popup if a command is currently being ;; executed (or (and which-key-allow-evil-operators @@ -2131,21 +2119,25 @@ Finally, show the buffer." (bound-and-true-p god-local-mode) (eq this-command 'god-mode-self-insert)) (null this-command))) - (which-key--create-buffer-and-show prefix-keys) - (when (and which-key-idle-secondary-delay - (not which-key--secondary-timer-active)) - (which-key--start-timer which-key-idle-secondary-delay t))) + (when (or (null which-key-delay-functions) + (null (setq delay-time (run-hook-with-args-until-success + 'which-key-delay-functions + (key-description prefix-keys) + (length prefix-keys)))) + (sit-for delay-time t)) + (which-key--create-buffer-and-show prefix-keys) + (when (and which-key-idle-secondary-delay + (not which-key--secondary-timer-active)) + (which-key--start-timer which-key-idle-secondary-delay t)))) ((and which-key-show-operator-state-maps (bound-and-true-p evil-state) (eq evil-state 'operator) - (not which-key--using-show-operator-keymap) - (not skip)) + (not which-key--using-show-operator-keymap)) (which-key--show-evil-operator-keymap)) ((and which-key--current-page-n (not which-key--using-top-level) (not which-key--using-show-operator-keymap) - (not which-key--using-show-keymap) - (not skip)) + (not which-key--using-show-keymap)) (which-key--hide-popup))))) ;; Timers From ff66d8abc702a061065ffd540d2db9aee592ba56 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 16 Jun 2016 11:01:53 -0400 Subject: [PATCH 483/816] Make current-prefix nil when not showing popup --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index 55721a8129f..6f2792ee90c 100644 --- a/which-key.el +++ b/which-key.el @@ -893,6 +893,7 @@ total height." "This function is called to hide the which-key buffer." (unless (member real-this-command which-key--paging-functions) (setq which-key--current-page-n nil + which-key--current-prefix nil which-key--using-top-level nil which-key--using-show-keymap nil which-key--using-show-operator-keymap nil From 9184b1bcbf316e8d619d72ae140efa48c5e6595d Mon Sep 17 00:00:00 2001 From: justbur Date: Fri, 17 Jun 2016 08:42:18 -0400 Subject: [PATCH 484/816] Remove setup code It's no longer necessary and makes changing echo-keystrokes annoying. --- which-key.el | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index 6f2792ee90c..12c798727b4 100644 --- a/which-key.el +++ b/which-key.el @@ -455,8 +455,6 @@ to a non-nil value for the execution of a command. Like this "Internal: Non-nil if the secondary timer is active.") (defvar which-key--paging-timer nil "Internal: Holds reference to timer for paging.") -(defvar which-key--is-setup 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 frame.") @@ -574,7 +572,9 @@ problems at github. If DISABLE is non-nil disable support." (if which-key-mode (progn (setq which-key--echo-keystrokes-backup echo-keystrokes) - (unless which-key--is-setup (which-key--setup)) + (when (or (eq which-key-show-prefix 'echo) + (eq which-key-popup-type 'minibuffer)) + (which-key--setup-echo-keystrokes)) (unless (member prefix-help-command which-key--paging-functions) (setq which-key--prefix-help-cmd-backup prefix-help-command)) (when which-key-use-C-h-commands @@ -611,17 +611,6 @@ problems at github. If DISABLE is non-nil disable support." (setq-local show-trailing-whitespace nil) (run-hooks 'which-key-init-buffer-hook)))) -(defun which-key--setup () - "Initial setup for which-key. -Reduce `echo-keystrokes' if necessary (it will interfere if it's -set too high) and setup which-key buffer." - (when (or (eq which-key-show-prefix 'echo) - (eq which-key-popup-type 'minibuffer)) - (which-key--setup-echo-keystrokes)) - ;; (which-key--setup-undo-key) - (which-key--init-buffer) - (setq which-key--is-setup t)) - (defun which-key--setup-echo-keystrokes () "Reduce `echo-keystrokes' if necessary (it will interfere if it's set too high)." @@ -2125,7 +2114,7 @@ Finally, show the buffer." 'which-key-delay-functions (key-description prefix-keys) (length prefix-keys)))) - (sit-for delay-time t)) + (sit-for delay-time)) (which-key--create-buffer-and-show prefix-keys) (when (and which-key-idle-secondary-delay (not which-key--secondary-timer-active)) From adfcd0e73b6950bccf52d3c2f5b57e4a498fbfc3 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Jul 2016 08:58:40 -0400 Subject: [PATCH 485/816] Add whitelist and blacklist options which-key-allow-regexps is a list of regexps that allow the popup when one is matched which-key-inhibit-regexps inhibits the popup when one regexp matches The string matched against is the current key sequence as produced by key-description. Fixes #129 --- which-key.el | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/which-key.el b/which-key.el index 12c798727b4..324778841a7 100644 --- a/which-key.el +++ b/which-key.el @@ -356,6 +356,23 @@ The delay time is effectively added to the normal :group 'which-key :type '(repeat function)) +(defcustom which-key-allow-regexps nil + "A list of regexp strings to use to filter key sequences. When +non-nil, for a key sequence to trigger the which-key popup it +must match one of the regexps in this list. The format of the key +sequences is what is produced by `key-description'." + :group 'which-key + :type '(repeat regexp)) + +(defcustom which-key-inhibit-regexps nil + "Similar to `which-key-allow-regexps', a list of regexp strings +to use to filter key sequences. When non-nil, for a key sequence +to trigger the which-key popup it cannot match one of the regexps +in this list. The format of the key sequences is what is produced +by `key-description'." + :group 'which-key + :type '(repeat regexp)) + ;; Hooks (defvar which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized.") @@ -1926,6 +1943,14 @@ prefix) if `which-key-use-C-h-commands' is non nil." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Update +(defun which-key--any-match-p (regexps string) + "Non-nil if any of REGEXPS match STRING." + (let (match) + (dolist (regexp regexps) + (when (string-match-p regexp string) + (setq match t))) + match)) + (defun which-key--try-2-side-windows (keys page-n loc1 loc2 &rest _ignore) "Try to show KEYS (PAGE-N) in LOC1 first. Only if no keys fit fallback to LOC2." (let (pages1) @@ -2101,6 +2126,13 @@ Finally, show the buffer." (keymapp (which-key--safe-lookup-key function-key-map prefix-keys))) (not which-key-inhibit) + (or (null which-key-allow-regexps) + (which-key--any-match-p + which-key-allow-regexps (key-description prefix-keys))) + (or (null which-key-inhibit-regexps) + (not + (which-key--any-match-p + which-key-allow-regexps (key-description prefix-keys)))) ;; Do not display the popup if a command is currently being ;; executed (or (and which-key-allow-evil-operators From 71b0b83a27b9622a39cda4a238815036f83b94e6 Mon Sep 17 00:00:00 2001 From: justbur Date: Tue, 5 Jul 2016 09:05:47 -0400 Subject: [PATCH 486/816] Fix previous commit --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 324778841a7..c9cd9e3b3fc 100644 --- a/which-key.el +++ b/which-key.el @@ -2132,7 +2132,7 @@ Finally, show the buffer." (or (null which-key-inhibit-regexps) (not (which-key--any-match-p - which-key-allow-regexps (key-description prefix-keys)))) + which-key-inhibit-regexps (key-description prefix-keys)))) ;; Do not display the popup if a command is currently being ;; executed (or (and which-key-allow-evil-operators From 9ec4b6a258c99bff307cfbde6b183634210d6363 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 6 Jul 2016 15:16:40 -0400 Subject: [PATCH 487/816] Explicitly set tab-width when collecting bindings For some reason indent-tabs-mode doesn't use tabs with strange tab-widths. See https://github.com/syl20bnr/spacemacs/issues/6497 --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index c9cd9e3b3fc..280212bba3c 100644 --- a/which-key.el +++ b/which-key.el @@ -1429,8 +1429,9 @@ alists. Returns a list (key separator description)." (ignore-keys-regexp "mouse-\\|wheel-\\|remap\\|drag-\\|scroll-bar\\|select-window\\|switch-frame\\|-state") (ignore-sections-regexp "\\(Key translations\\|Function key map translations\\|Input decoding map translations\\)")) (with-temp-buffer - (let ((indent-tabs-mode t)) - (describe-buffer-bindings buffer which-key--current-prefix)) + (setq-local indent-tabs-mode t) + (setq-local tab-width 8) + (describe-buffer-bindings buffer which-key--current-prefix) (goto-char (point-min)) (let ((header-p (not (= (char-after) ?\f))) bindings header) From eb4a6f6e251cf0e34f2d7f988591dea194b4012f Mon Sep 17 00:00:00 2001 From: justbur Date: Sat, 9 Jul 2016 15:25:50 -0400 Subject: [PATCH 488/816] Add allow-imprecise-window-fit option Possible fix for #130 When enabled this option avoids the use of fit-window-to-buffer to resize the popup. My profiling suggested that emacs was spending a lot of time in this function (and hanging sometimes) with different fonts. I noticed this with Roboto Mono on MSWindows, which should explain #130. --- which-key.el | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 280212bba3c..f77d7256cf2 100644 --- a/which-key.el +++ b/which-key.el @@ -233,6 +233,15 @@ a percentage out of the frame's height." :group 'which-key :type 'integer) +(defcustom which-key-allow-imprecise-window-fit nil + "If non-nil allow which-key to use a less intensive method of +fitting the popup window to the buffer. If you are noticing lag +when the which-key popup displays turning this on may help. + +See https://github.com/justbur/emacs-which-key/issues/130" + :group 'which-key + :type 'boolean) + (defcustom which-key-show-remaining-keys nil "Show remaining keys in last slot, when keys are hidden." :group 'which-key @@ -959,11 +968,17 @@ call signature in different emacs versions" (let ((fit-window-to-buffer-horizontally t)) (apply #'fit-window-to-buffer window params))) -(defun which-key--show-buffer-side-window (_act-popup-dim) +(defun which-key--show-buffer-side-window (act-popup-dim) "Show which-key buffer when popup type is side-window." - (let* ((side which-key-side-window-location) - (alist '((window-width . which-key--fit-buffer-to-window-horizontally) - (window-height . (lambda (w) (fit-window-to-buffer w nil 1)))))) + (let* ((height (car act-popup-dim)) + (width (cdr act-popup-dim)) + (side which-key-side-window-location) + (alist + (if which-key-allow-imprecise-window-fit + `((window-width . ,(which-key--text-width-to-total width)) + (window-height . ,height)) + '((window-width . which-key--fit-buffer-to-window-horizontally) + (window-height . (lambda (w) (fit-window-to-buffer w nil 1))))))) ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' ;; were added in Emacs 24.3 From b7e1906dd6fb8b1dc03685229f956a21a5ded269 Mon Sep 17 00:00:00 2001 From: justbur Date: Wed, 27 Jul 2016 09:22:38 -0400 Subject: [PATCH 489/816] Fix Makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 34574e36025..facb1f80b4b 100644 --- a/Makefile +++ b/Makefile @@ -15,4 +15,5 @@ test: elpa elpa: $(ELPA_DIR) $(ELPA_DIR): Cask $(CASK) install + mkdir -p $(ELPA_DIR) touch $@ From c03f179e253cfce18c21c5eb1a0cde2e2bdbaf43 Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 28 Jul 2016 09:17:19 -0400 Subject: [PATCH 490/816] Disable hack for echo area Seems to cause more problems (like completion commands sometimes being overwritten) than it solves. --- which-key.el | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index f77d7256cf2..d7cee3ff4ea 100644 --- a/which-key.el +++ b/which-key.el @@ -1656,18 +1656,21 @@ is the width of the live window." (setcar (cdr (assq 'which-key-mode minor-mode-alist)) which-key--lighter-backup))) (defun which-key--echo (text) - "Echo TEXT to minibuffer without logging. -Slight delay gets around evil functions that clear the echo -area." + "Echo TEXT to minibuffer without logging." (let* ((minibuffer (eq which-key-popup-type 'minibuffer)) - (delay (if minibuffer - 0.2 - (+ (or echo-keystrokes 0) 0.001))) + ;; (delay (if minibuffer + ;; 0.2 + ;; (+ (or echo-keystrokes 0) 0.001))) message-log-max) (unless minibuffer (message "%s" text)) - (run-with-idle-timer - delay nil (lambda () (let (message-log-max) - (message "%s" text)))))) + + ;; Caused some completion commands in the minibuffer to be overwritten, so + ;; disable the hack for now + + ;; (run-with-idle-timer + ;; delay nil (lambda () (let (message-log-max) + ;; (message "%s" text)))) + )) (defun which-key--next-page-hint (prefix-keys) "Return string for next page hint." From 979b98429047bec063a22fbd9f6cdf3e2b44aaed Mon Sep 17 00:00:00 2001 From: justbur Date: Thu, 28 Jul 2016 09:20:20 -0400 Subject: [PATCH 491/816] Version 1.1.14 Tagged wrong commit --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d7cee3ff4ea..5d08278db82 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.12 +;; Version: 1.1.14 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 06444f300ecb767b42ad09f0e2d35e098dd1402d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 17 Aug 2016 11:11:56 -0400 Subject: [PATCH 492/816] Fix minibuffer echo not displaying See #133 --- which-key.el | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index 5d08278db82..ccac5ce50f8 100644 --- a/which-key.el +++ b/which-key.el @@ -1657,20 +1657,21 @@ is the width of the live window." (defun which-key--echo (text) "Echo TEXT to minibuffer without logging." - (let* ((minibuffer (eq which-key-popup-type 'minibuffer)) - ;; (delay (if minibuffer - ;; 0.2 - ;; (+ (or echo-keystrokes 0) 0.001))) - message-log-max) - (unless minibuffer (message "%s" text)) + (let (message-log-max) + (message "%s" text))) - ;; Caused some completion commands in the minibuffer to be overwritten, so - ;; disable the hack for now - - ;; (run-with-idle-timer - ;; delay nil (lambda () (let (message-log-max) - ;; (message "%s" text)))) - )) +;; Caused some completion commands in the minibuffer to be overwritten, so +;; disable the hack for now +;; (defun which-key--echo (text) +;; "Echo TEXT to minibuffer without logging." +;; (let* ((minibuffer (eq which-key-popup-type 'minibuffer)) +;; (delay (if minibuffer +;; 0.2 +;; (+ (or echo-keystrokes 0) 0.001))) +;; message-log-max) +;; (run-with-idle-timer +;; delay nil (lambda () (let (message-log-max) +;; (message "%s" text)))))) (defun which-key--next-page-hint (prefix-keys) "Return string for next page hint." From b7cce2d0a7eaa3092c96bd211c743af6891e3feb Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 17 Aug 2016 11:17:16 -0400 Subject: [PATCH 493/816] Add note about setting delay to zero --- README.org | 3 ++- which-key.el | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index fc5ad99e99b..31a3186bd27 100644 --- a/README.org +++ b/README.org @@ -386,7 +386,8 @@ The options below are also available through customize. Their defaults are shown. #+BEGIN_SRC emacs-lisp - ;; Set the time delay (in seconds) for the which-key popup to appear. + ;; Set the time delay (in seconds) for the which-key popup to appear. A value of + ;; zero might cause issues so a non-zero value is recommended. (setq which-key-idle-delay 1.0) ;; Set the maximum length (in characters) for key descriptions (commands or diff --git a/which-key.el b/which-key.el index ccac5ce50f8..114b04dae3a 100644 --- a/which-key.el +++ b/which-key.el @@ -54,7 +54,9 @@ :prefix "which-key-") (defcustom which-key-idle-delay 1.0 - "Delay (in seconds) for which-key buffer to popup." + "Delay (in seconds) for which-key buffer to popup. A value of zero +might lead to issues, so a non-zero value is recommended +(see https://github.com/justbur/emacs-which-key/issues/134)." :group 'which-key :type 'float) From 1eace34a1f5b780a30797976d0cfec5936048b7b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 17 Aug 2016 11:17:45 -0400 Subject: [PATCH 494/816] Version 1.1.15 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 114b04dae3a..0c98a9ab2cc 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.14 +;; Version: 1.1.15 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From fe21ce6f0b58e0ba5c729fdd0afc3093fe8ff6b0 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Wed, 31 Aug 2016 14:41:41 +0200 Subject: [PATCH 495/816] Move definition of which-key--local-binding-p It has to be defined after the inline functions which it uses. --- which-key.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 0c98a9ab2cc..90aea83f7b4 100644 --- a/which-key.el +++ b/which-key.el @@ -1202,11 +1202,6 @@ coming before a prefix. Within these categories order using (and (not apref?) bpref?) (which-key-key-order acons bcons)))) -(defun which-key--local-binding-p (keydesc) - (eq (which-key--safe-lookup-key - (current-local-map) (kbd (which-key--current-key-string (car keydesc)))) - (intern (cdr keydesc)))) - (defun which-key-local-then-key-order (acons bcons) "Order first by whether A and/or B is a local binding with local bindings coming first. Within these categories order using @@ -1254,6 +1249,11 @@ replacement occurs return the new STRING." (defsubst which-key--current-key-string (&optional key-str) (key-description (which-key--current-key-list key-str))) +(defun which-key--local-binding-p (keydesc) + (eq (which-key--safe-lookup-key + (current-local-map) (kbd (which-key--current-key-string (car keydesc)))) + (intern (cdr keydesc)))) + (defun which-key--maybe-replace-prefix-name (keys desc) "KEYS is a list of keys produced by `listify-key-sequences' and `key-description'. DESC is the description that is possibly From 1c4bea2d094bcd2e37c0729b61ecedfe7e9ad884 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 1 Sep 2016 01:26:10 +0200 Subject: [PATCH 496/816] Follow conventions for section headers Doing so allows the use of `outline-minor-mode' makes it possible to navigate sections similarly to how that is done in `org-mode'. --- which-key.el | 66 +++++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/which-key.el b/which-key.el index 0c98a9ab2cc..c5ffc35f43e 100644 --- a/which-key.el +++ b/which-key.el @@ -48,6 +48,8 @@ (defvar golden-ratio-mode) (declare-function evil-get-command-property "ext:evil-common.el") +;;; Options + (defgroup which-key nil "Customization options for which-key-mode" :group 'help @@ -388,7 +390,8 @@ by `key-description'." (defvar which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized.") -;; Faces +;;;; Faces + (defgroup which-key-faces nil "Faces for which-key-mode" :group 'which-key @@ -435,7 +438,8 @@ and it matches a string in `which-key-highlighted-command-list'." "Face for special keys (SPC, TAB, RET)" :group 'which-key-faces) -;; Custom popup +;;;; Custom popup + (defcustom which-key-custom-popup-max-dimensions-function nil "Variable to hold a custom max-dimensions function. Will be passed the width of the active window and is expected to @@ -474,7 +478,8 @@ to a non-nil value for the execution of a command. Like this "History of keymap selections in functions like `which-key-show-keymap'.") -;; Internal Vars +;;; Internal Vars + (defvar which-key--buffer nil "Internal: Holds reference to which-key buffer.") (defvar which-key--timer nil @@ -534,9 +539,9 @@ alongside the actual current key sequence when `which-key-show-prefix' is set to either top or echo.") -;; Third-party library support +;;; Third-party library support +;;;; Evil -;; Evil (defcustom which-key-allow-evil-operators (boundp 'evil-this-operator) "Allow popup to show for evil operators. The popup is normally inhibited in the middle of commands, but setting this to @@ -552,7 +557,8 @@ valid keys missing and it might be showing some invalid keys." :group 'which-key :type 'boolean) -;; God-mode +;;;;; God-mode + (defvar which-key--god-mode-support-enabled nil "Support god-mode if non-nil. This is experimental, so you need to explicitly opt-in for now. Please report any @@ -584,6 +590,8 @@ problems at github. If DISABLE is non-nil disable support." 'around 'which-key--god-mode-lookup-command-advice)) (ad-activate 'god-mode-lookup-command)) +;;; Mode + ;;;###autoload (define-minor-mode which-key-mode "Toggle which-key-mode." @@ -661,8 +669,7 @@ starter kit for example." (setq which-key-key-replacement-alist (delete '("right" . "→") which-key-key-replacement-alist))) -;; Default configuration functions for use by users. Should be the "best" -;; configurations +;;; Default configuration functions for use by users. ;;;###autoload (defun which-key-setup-side-window-right () @@ -699,7 +706,7 @@ bottom." (setq which-key-popup-type 'minibuffer which-key-show-prefix 'left)) -;; Helper functions to modify replacement lists. +;;; Helper functions to modify replacement lists. (defun which-key--add-key-val-to-alist (alist key value &optional alist-name) "Internal function to add (KEY . VALUE) to ALIST." @@ -838,8 +845,7 @@ If AT-ROOT is non-nil the binding is also placed at the root of MAP." (which-key-define-key-recursively df key def t))) map)) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Functions for computing window sizes +;;; Functions for computing window sizes (defun which-key--text-width-to-total (text-width) "Convert window text-width to window total-width. @@ -903,8 +909,7 @@ total height." height-or-percentage (round (* height-or-percentage (window-total-height (frame-root-window)))))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Show/hide which-key buffer +;;; Show/hide which-key buffer (defun which-key--hide-popup () "This function is called to hide the which-key buffer." @@ -1063,8 +1068,7 @@ call signature in different emacs versions" (set-frame-size (window-frame window) frame-width frame-height) window))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Max dimension of available window functions +;;; Max dimension of available window functions (defun which-key--popup-max-dimensions () "Dimesion functions should return the maximum possible (height @@ -1104,10 +1108,12 @@ width) in lines and characters respectively." ;; width (max 0 (- (if (member which-key-side-window-location '(left right)) - (which-key--total-width-to-text (which-key--width-or-percentage-to-width - which-key-side-window-max-width)) - (which-key--total-width-to-text (which-key--width-or-percentage-to-width - 1.0))) + (which-key--total-width-to-text + (which-key--width-or-percentage-to-width + which-key-side-window-max-width)) + (which-key--total-width-to-text + (which-key--width-or-percentage-to-width + 1.0))) which-key-unicode-correction)))) (defun which-key--frame-max-dimensions () @@ -1115,8 +1121,7 @@ width) in lines and characters respectively." width) in lines and characters respectively." (cons which-key-frame-max-height which-key-frame-max-width)) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Sorting functions +;;; Sorting functions (defun which-key--string< (a b &optional alpha) (if alpha @@ -1217,8 +1222,7 @@ local bindings coming first. Within these categories order using (and aloc? (not bloc?)) (which-key-key-order acons bcons)))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Functions for retrieving and formatting keys +;;; Functions for retrieving and formatting keys (defsubst which-key--string-width (maybe-string) "If MAYBE-STRING is a string use `which-key--string-width' o/w return 0." @@ -1486,7 +1490,8 @@ alists. Returns a list (key separator description)." ((member binding ignore-bindings)) ((string-match-p ignore-keys-regexp key)) ((and which-key--current-prefix - (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt) key)) + (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" + key-str-qt) key)) (unless (assoc-string (match-string 1 key) bindings) (push (cons (match-string 1 key) binding) bindings))) ((and which-key--current-prefix @@ -1513,8 +1518,7 @@ BUFFER that follow the key sequence KEY-SEQ." (sort unformatted (lambda (a b) (funcall which-key-sort-order a b))))) (which-key--format-and-replace unformatted))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Functions for laying out which-key buffer pages +;;; Functions for laying out which-key buffer pages (defun which-key--normalize-columns (columns) "Pad COLUMNS to the same length using empty strings." @@ -1821,8 +1825,7 @@ enough space based on your settings and frame size." prefix-keys) (with-no-warnings (set-temporary-overlay-map (which-key--get-popup-map)))))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; paging functions +;;; Paging functions ;;;###autoload (defun which-key-reload-key-sequence (key-seq) @@ -1962,8 +1965,7 @@ prefix) if `which-key-use-C-h-commands' is non nil." (which-key-inhibit t)) (if cmd (funcall cmd) (which-key-turn-page 0)))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Update +;;; Update (defun which-key--any-match-p (regexps string) "Non-nil if any of REGEXPS match STRING." @@ -2184,7 +2186,7 @@ Finally, show the buffer." (not which-key--using-show-keymap)) (which-key--hide-popup))))) -;; Timers +;;; Timers (defun which-key--start-timer (&optional delay secondary) "Activate idle timer to trigger `which-key--update'." @@ -2216,7 +2218,7 @@ Finally, show the buffer." (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) -;; backport some functions for 24.3 +;;; backport some functions for 24.3 ;; found at https://github.com/Lindydancer/andersl-old-emacs-support/blob/master/andersl-old-emacs-support.el (unless (fboundp 'frame-fringe-width) From c493e0b4bb53c524d99c6ad071ba0a22259f8f38 Mon Sep 17 00:00:00 2001 From: justbur Date: Sun, 11 Sep 2016 15:58:53 -0400 Subject: [PATCH 497/816] Resize popup when frame resized Fixes #139 --- which-key.el | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 4ef640887a6..6e92281fd31 100644 --- a/which-key.el +++ b/which-key.el @@ -516,6 +516,7 @@ used.") (defvar which-key--inhibit-next-operator-popup nil) (defvar which-key--current-show-keymap-name nil) (defvar which-key--prior-show-keymap-args nil) +(defvar which-key--previous-frame-size nil) (defvar which-key-key-based-description-replacement-alist '() "New version of @@ -620,6 +621,8 @@ problems at github. If DISABLE is non-nil disable support." (add-hook 'pre-command-hook #'which-key--hide-popup) (add-hook 'focus-out-hook #'which-key--stop-timer) (add-hook 'focus-in-hook #'which-key--start-timer) + (add-hook 'window-configuration-change-hook + 'which-key--hide-popup-on-frame-size-change) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) (when which-key--prefix-help-cmd-backup @@ -629,6 +632,8 @@ problems at github. If DISABLE is non-nil disable support." (remove-hook 'pre-command-hook #'which-key--hide-popup) (remove-hook 'focus-out-hook #'which-key--stop-timer) (remove-hook 'focus-in-hook #'which-key--start-timer) + (remove-hook 'window-configuration-change-hook + 'which-key--hide-popup-on-frame-size-change) (which-key--stop-timer))) (defun which-key--init-buffer () @@ -909,6 +914,15 @@ total height." height-or-percentage (round (* height-or-percentage (window-total-height (frame-root-window)))))) +(defun which-key--frame-size-changed-p () + "Non-nil if a change in frame size is detected." + (let ((new-size (cons (frame-width) (frame-height)))) + (cond ((null which-key--previous-frame-size) + (setq which-key--previous-frame-size new-size) + nil) + ((not (equal which-key--previous-frame-size new-size)) + (setq which-key--previous-frame-size new-size))))) + ;;; Show/hide which-key buffer (defun which-key--hide-popup () @@ -940,6 +954,12 @@ total height." (frame (which-key--hide-buffer-frame)) (custom (funcall which-key-custom-hide-popup-function)))) +(defun which-key--hide-popup-on-frame-size-change () + "Hide which-key popup if the frame is resized (to trigger a new +popup)." + (when (which-key--frame-size-changed-p) + (which-key--hide-popup))) + (defun which-key--hide-buffer-side-window () "Hide which-key buffer when side-window popup is used." (when (buffer-live-p which-key--buffer) @@ -1109,11 +1129,11 @@ width) in lines and characters respectively." (max 0 (- (if (member which-key-side-window-location '(left right)) (which-key--total-width-to-text - (which-key--width-or-percentage-to-width - which-key-side-window-max-width)) + (which-key--width-or-percentage-to-width + which-key-side-window-max-width)) (which-key--total-width-to-text - (which-key--width-or-percentage-to-width - 1.0))) + (which-key--width-or-percentage-to-width + 1.0))) which-key-unicode-correction)))) (defun which-key--frame-max-dimensions () @@ -1491,7 +1511,7 @@ alists. Returns a list (key separator description)." ((string-match-p ignore-keys-regexp key)) ((and which-key--current-prefix (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" - key-str-qt) key)) + key-str-qt) key)) (unless (assoc-string (match-string 1 key) bindings) (push (cons (match-string 1 key) binding) bindings))) ((and which-key--current-prefix From d939e06fdac9b158e06a8633186ffa41e396e659 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 4 Oct 2016 16:48:40 -0400 Subject: [PATCH 498/816] Fix -maybe-get-prefix-title use of key-binding key-binding doesn't work with all forms of key strings. See #143 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 6e92281fd31..61ef9014a8a 100644 --- a/which-key.el +++ b/which-key.el @@ -1303,7 +1303,7 @@ An empty stiring is returned if no title exists." (mode-alist (assq major-mode alist)) (mode-res (when mode-alist (assoc-string keys mode-alist))) - (binding (key-binding keys)) + (binding (key-binding (kbd keys))) (alternate (when (and binding (symbolp binding)) (symbol-name binding)))) (cond (mode-res (cdr mode-res)) From 458c8d97fb03e926422516ea79198ee18a75dd18 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 5 Oct 2016 14:24:11 -0400 Subject: [PATCH 499/816] Consolidate prefix names and key-based replacements Make obsolete several redundant functions, the most important of which is which-key-declare-prefixes. This is just an alias for which-key-add-key-based-replacements now. The additional functionality that declare-prefixes had (for declaring prefix titles) is now rolled into the add-key-based-replacements function. See that functions doc string. --- which-key.el | 165 ++++++++++++++------------------------------------- 1 file changed, 46 insertions(+), 119 deletions(-) diff --git a/which-key.el b/which-key.el index 61ef9014a8a..681a2eb0fc7 100644 --- a/which-key.el +++ b/which-key.el @@ -525,20 +525,8 @@ used.") `which-key-add-major-mode-key-based-replacements' to set this variable.") -(defvar which-key-prefix-name-alist '() - "An alist with elements of the form (key-sequence . prefix-name). -key-sequence is a sequence of the sort produced by applying -`key-description' to create a canonical version of the key -sequence. prefix-name is a string.") - -(defvar which-key-prefix-title-alist '() - "An alist with elements of the form (key-sequence . prefix-title). -key-sequence is a sequence of the sort produced by applying -`key-description' to create a canonical version of the key -sequence. prefix-title is a string. The title is displayed -alongside the actual current key sequence when -`which-key-show-prefix' is set to either top or echo.") - +(make-obsolete-variable 'which-key-prefix-name-alist nil "2016-10-05") +(make-obsolete-variable 'which-key-prefix-title-alist nil "2016-10-05") ;;; Third-party library support ;;;; Evil @@ -715,13 +703,14 @@ bottom." (defun which-key--add-key-val-to-alist (alist key value &optional alist-name) "Internal function to add (KEY . VALUE) to ALIST." - (when (or (not (stringp key)) (not (stringp value))) - (error "which-key: Error %s (key) and %s (value) should be strings" + (when (or (not (stringp key)) (not (or (stringp value) (listp value)))) + (error "which-key: Error %s (key) should be a string and %s (value) should\ + be a string or list of strings." key value)) (let ((keys (key-description (kbd key)))) (cond ((null alist) (list (cons keys value))) ((assoc-string keys alist) - (when (not (string-equal (cdr (assoc-string keys alist)) value)) + (when (not (equal (cdr (assoc-string keys alist)) value)) (when which-key-is-verbose (message "which-key: changing %s name from %s to %s in the %s alist" key (cdr (assoc-string keys alist)) value alist-name)) @@ -732,11 +721,19 @@ bottom." ;;;###autoload (defun which-key-add-key-based-replacements (key-sequence replacement &rest more) "Replace the description of KEY-SEQUENCE with REPLACEMENT. -Both KEY-SEQUENCE and REPLACEMENT should be strings. For Example, +KEY-SEQUENCE is a string suitable for use in `kbd'. REPLACEMENT +may either be a string, as in \(which-key-add-key-based-replacements \"C-x 1\" \"maximize\"\) -MORE allows you to specifcy additional KEY REPL pairs. All +or a list of two strings as in + +\(which-key-add-key-based-replacements \"C-x 8\" '(\"unicode\" \"Unicode keys\")\) + +In the second case, the second string is used to provide a longer +name for the keys under a prefix. + +MORE allows you to specifcy additional KEY REPLACEMENT pairs. All replacements are added to `which-key-key-based-description-replacement-alist'." ;; TODO: Make interactive @@ -768,77 +765,21 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) (put 'which-key-add-major-mode-key-based-replacements 'lisp-indent-function 'defun) -;;;###autoload -(defun which-key-add-prefix-title (key-seq-str title &optional force) - "Deprecated in favor of `which-key-declare-prefixes'. +(defalias 'which-key-add-prefix-title 'which-key-add-key-based-replacements) +(make-obsolete 'which-key-add-prefix-title + 'which-key-add-key-based-replacements + "2016-10-05") -Add title for KEY-SEQ-STR given by TITLE. FORCE, if non-nil, will -add the new title even if one already exists. KEY-SEQ-STR should -be a key sequence string suitable for `kbd' and TITLE should be a -string." - (let ((keys (key-description (kbd key-seq-str)))) - (if (and (null force) - (assoc-string keys which-key-prefix-title-alist)) - (when which-key-is-verbose - (message "which-key: Prefix title not added. A title exists for this prefix.")) - (push (cons keys title) which-key-prefix-title-alist)))) +(defalias 'which-key-declare-prefixes 'which-key-add-key-based-replacements) +(make-obsolete 'which-key-declare-prefixes + 'which-key-add-key-based-replacements + "2016-10-05") -;;;###autoload -(defun which-key-declare-prefixes (key-sequence name &rest more) - "Name the KEY-SEQUENCE prefix NAME. -KEY-SEQUENCE should be a string, acceptable to `kbd'. NAME can be -a string or a cons cell of two strings. In the first case, the -string is used as both the name and the title (the title is -displayed in the echo area only). For Example, - -\(which-key-declare-prefixes \"C-x 8\" \"unicode\"\) - -or - -\(which-key-declare-prefixes \"C-x 8\" (\"unicode\" . \"Unicode Chararcters\")\) - -MORE allows you to specifcy additional KEY-SEQUENCE NAME pairs. -All names are added to `which-key-prefix-names-alist' and titles -to `which-key-prefix-title-alist'." - (while key-sequence - (let ((name (if (consp name) (car name) name)) - (title (if (consp name) (cdr name) name))) - (setq which-key-prefix-name-alist - (which-key--add-key-val-to-alist - which-key-prefix-name-alist key-sequence name "prefix-name") - which-key-prefix-title-alist - (which-key--add-key-val-to-alist - which-key-prefix-title-alist key-sequence title "prefix-title"))) - (setq key-sequence (pop more) name (pop more)))) -(put 'which-key-declare-prefixes 'lisp-indent-function 'defun) - -;;;###autoload -(defun which-key-declare-prefixes-for-mode (mode key-sequence name &rest more) - "Functions like `which-key-declare-prefixes'. -The difference is that MODE specifies the `major-mode' that must -be active for KEY-SEQUENCE and NAME (MORE contains -addition KEY-SEQUENCE NAME pairs) to apply." - (when (not (symbolp mode)) - (error "MODE should be a symbol corresponding to a value of major-mode")) - (let ((mode-name-alist (cdr (assq mode which-key-prefix-name-alist))) - (mode-title-alist (cdr (assq mode which-key-prefix-title-alist)))) - (while key-sequence - (let ((name (if (consp name) (car name) name)) - (title (if (consp name) (cdr name) name))) - (setq mode-name-alist (which-key--add-key-val-to-alist - mode-name-alist key-sequence name - (format "prefix-name-%s" mode)) - mode-title-alist (which-key--add-key-val-to-alist - mode-title-alist key-sequence title - (format "prefix-name-%s" mode)))) - (setq key-sequence (pop more) name (pop more))) - (if (assq mode which-key-prefix-name-alist) - (setcdr (assq mode which-key-prefix-name-alist) mode-name-alist) - (push (cons mode mode-name-alist) which-key-prefix-name-alist)) - (if (assq mode which-key-prefix-title-alist) - (setcdr (assq mode which-key-prefix-title-alist) mode-title-alist) - (push (cons mode mode-title-alist) which-key-prefix-title-alist)))) -(put 'which-key-declare-prefixes-for-mode 'lisp-indent-function 'defun) +(defalias 'which-key-declare-prefixes-for-mode + 'which-key-add-major-mode-key-based-replacements) +(make-obsolete 'which-key-declare-prefixes-for-mode + 'which-key-add-major-mode-key-based-replacements + "2016-10-05") (defun which-key-define-key-recursively (map key def &optional at-root) "Recursively bind KEY in MAP to DEF on every level of MAP except the first. @@ -1278,36 +1219,18 @@ replacement occurs return the new STRING." (current-local-map) (kbd (which-key--current-key-string (car keydesc)))) (intern (cdr keydesc)))) -(defun which-key--maybe-replace-prefix-name (keys desc) - "KEYS is a list of keys produced by `listify-key-sequences' and -`key-description'. DESC is the description that is possibly -replaced using the `which-key-prefix-name-alist'. Whether or not -a replacement occurs return the new STRING." - (let* ((alist which-key-prefix-name-alist) - (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)) - (res (cdr res)) - (t desc)))) - (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. -A title is possibly returned using `which-key-prefix-title-alist'. -An empty stiring is returned if no title exists." +A title is possibly returned using +`which-key-key-based-description-replacement-alist'. An empty +stiring is returned if no title exists." (cond ((not (string-equal keys "")) - (let* ((alist which-key-prefix-title-alist) - (res (assoc-string keys alist)) - (mode-alist (assq major-mode alist)) - (mode-res (when mode-alist - (assoc-string keys mode-alist))) + (let* ((repl-res (which-key--maybe-replace-key-based "" keys t)) (binding (key-binding (kbd keys))) (alternate (when (and binding (symbolp binding)) (symbol-name binding)))) - (cond (mode-res (cdr mode-res)) - (res (cdr res)) + (cond (repl-res repl-res) ((and (eq which-key-show-prefix 'echo) alternate) alternate) ((and (member which-key-show-prefix '(bottom top)) @@ -1321,7 +1244,7 @@ An empty stiring is returned if no title exists." which-key--current-show-keymap-name) (t ""))) -(defun which-key--maybe-replace-key-based (string keys) +(defun which-key--maybe-replace-key-based (string keys &optional title) "KEYS is a string produced by `key-description' and STRING is the description that is possibly replaced using the `which-key-key-based-description-replacement-alist'. Whether or @@ -1329,10 +1252,17 @@ not a replacement occurs return the new STRING." (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)))) + (mode-res (when mode-alist (assoc-string keys mode-alist))) + tmp-res) + (setq tmp-res + (cond (mode-res (cdr mode-res)) + (str-res (cdr str-res)) + (t string))) + (cond ((and (listp tmp-res) title) + (nth 1 tmp-res)) + ((listp tmp-res) + (car tmp-res)) + (t tmp-res)))) (defun which-key--propertize-key (key) "Add a face to KEY. @@ -1437,9 +1367,6 @@ alists. Returns a list (key separator description)." (desc (which-key--maybe-replace orig-desc which-key-description-replacement-alist)) (desc (which-key--maybe-replace-key-based desc keys)) - (desc (if group - (which-key--maybe-replace-prefix-name keys desc) - desc)) (key-w-face (which-key--propertize-key key)) (desc-w-face (which-key--propertize-description desc group local hl-face orig-desc))) From 94b2c7b884b7841aebf1db6aaecc8f20be34dc49 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 5 Oct 2016 14:42:10 -0400 Subject: [PATCH 500/816] Move a function for the compiler --- which-key.el | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/which-key.el b/which-key.el index 681a2eb0fc7..ff9e46b5841 100644 --- a/which-key.el +++ b/which-key.el @@ -1219,6 +1219,26 @@ replacement occurs return the new STRING." (current-local-map) (kbd (which-key--current-key-string (car keydesc)))) (intern (cdr keydesc)))) +(defun which-key--maybe-replace-key-based (string keys &optional title) + "KEYS is a string produced by `key-description' +and STRING is the description that is possibly replaced using the +`which-key-key-based-description-replacement-alist'. Whether or +not a replacement occurs return the new STRING." + (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))) + tmp-res) + (setq tmp-res + (cond (mode-res (cdr mode-res)) + (str-res (cdr str-res)) + (t string))) + (cond ((and (listp tmp-res) title) + (nth 1 tmp-res)) + ((listp tmp-res) + (car tmp-res)) + (t tmp-res)))) + (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. A title is possibly returned using @@ -1244,26 +1264,6 @@ stiring is returned if no title exists." which-key--current-show-keymap-name) (t ""))) -(defun which-key--maybe-replace-key-based (string keys &optional title) - "KEYS is a string produced by `key-description' -and STRING is the description that is possibly replaced using the -`which-key-key-based-description-replacement-alist'. Whether or -not a replacement occurs return the new STRING." - (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))) - tmp-res) - (setq tmp-res - (cond (mode-res (cdr mode-res)) - (str-res (cdr str-res)) - (t string))) - (cond ((and (listp tmp-res) title) - (nth 1 tmp-res)) - ((listp tmp-res) - (car tmp-res)) - (t tmp-res)))) - (defun which-key--propertize-key (key) "Add a face to KEY. If KEY contains any \"special keys\" defined in From fe73d0849c68b72f96b71f63e6b6e745ac18e50f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 5 Oct 2016 14:54:49 -0400 Subject: [PATCH 501/816] Make 458c8d9 backwards compatible The prefix titles need to be in cons cells to stay consistent with how they were used before. --- which-key.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index ff9e46b5841..b85d8158428 100644 --- a/which-key.el +++ b/which-key.el @@ -703,9 +703,9 @@ bottom." (defun which-key--add-key-val-to-alist (alist key value &optional alist-name) "Internal function to add (KEY . VALUE) to ALIST." - (when (or (not (stringp key)) (not (or (stringp value) (listp value)))) + (when (or (not (stringp key)) (not (or (stringp value) (consp value)))) (error "which-key: Error %s (key) should be a string and %s (value) should\ - be a string or list of strings." + be a string or cons of two strings." key value)) (let ((keys (key-description (kbd key)))) (cond ((null alist) (list (cons keys value))) @@ -726,9 +726,9 @@ may either be a string, as in \(which-key-add-key-based-replacements \"C-x 1\" \"maximize\"\) -or a list of two strings as in +or a cons of two strings as in -\(which-key-add-key-based-replacements \"C-x 8\" '(\"unicode\" \"Unicode keys\")\) +\(which-key-add-key-based-replacements \"C-x 8\" '(\"unicode\" . \"Unicode keys\")\) In the second case, the second string is used to provide a longer name for the keys under a prefix. @@ -1233,9 +1233,9 @@ not a replacement occurs return the new STRING." (cond (mode-res (cdr mode-res)) (str-res (cdr str-res)) (t string))) - (cond ((and (listp tmp-res) title) - (nth 1 tmp-res)) - ((listp tmp-res) + (cond ((and (consp tmp-res) title) + (cdr tmp-res)) + ((consp tmp-res) (car tmp-res)) (t tmp-res)))) From 5b3614643e3e8a5815505e24fb34ee57a360442b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 5 Oct 2016 16:32:29 -0400 Subject: [PATCH 502/816] Fix test for recent prefix-name change --- which-key-tests.el | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index e5c8c4a05f0..e620c3ae3e1 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -30,7 +30,7 @@ (ert-deftest which-key-test-prefix-declaration () "Test `which-key-declare-prefixes' and `which-key-declare-prefixes-for-mode'. See Bug #109." - (let* (test-mode which-key-prefix-name-alist which-key-prefix-title-alist) + (let* (test-mode which-key-key-based-description-replacement-alist) (which-key-declare-prefixes "SPC C-c" '("complete" . "complete title") "SPC C-k" "cancel") @@ -38,20 +38,12 @@ "C-c C-c" '("complete" . "complete title") "C-c C-k" "cancel") (should (equal - (assoc-string "SPC C-k" which-key-prefix-name-alist) + (assoc-string "SPC C-k" which-key-key-based-description-replacement-alist) '("SPC C-k" . "cancel"))) (should (equal (assoc-string - "C-c C-c" (cdr (assq 'test-mode which-key-prefix-name-alist))) - '("C-c C-c" . "complete"))) - (pp which-key-prefix-title-alist) - (should (equal - (assoc-string "SPC C-k" which-key-prefix-title-alist) - '("SPC C-k" . "cancel"))) - (should (equal - (assoc-string - "C-c C-c" (cdr (assq 'test-mode which-key-prefix-title-alist))) - '("C-c C-c" . "complete title"))))) + "C-c C-c" (cdr (assq 'test-mode which-key-key-based-description-replacement-alist))) + '("C-c C-c" . ("complete" . "complete title")))))) (provide 'which-key-tests) ;;; which-key-tests.el ends here From 431f29aee44b983bbe7beb9e4e0542dabd7bf57b Mon Sep 17 00:00:00 2001 From: Hariharan R Date: Sun, 16 Oct 2016 02:18:23 -0400 Subject: [PATCH 503/816] fix link --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 31a3186bd27..059fe296ca8 100644 --- a/README.org +++ b/README.org @@ -12,7 +12,7 @@ the popup will look like are included below. =which-key= started as a rewrite of to a certain extent. ** Table of Contents :TOC@4: - - [[#which-key-][which-key ]] + - [[#which-key][which-key]] - [[#introduction][Introduction]] - [[#install][Install]] - [[#melpa][MELPA]] From c678b9370682c55e73b1157929e97edce44fe398 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 29 Oct 2016 08:33:55 -0400 Subject: [PATCH 504/816] Add global option for how to sort case which-key-sort-uppercase-first (default t) See #145 --- which-key.el | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index b85d8158428..c17a1c7a3eb 100644 --- a/which-key.el +++ b/which-key.el @@ -268,6 +268,13 @@ information." :group 'which-key :type 'function) +(defcustom which-key-sort-uppercase-first t + "If non-nil, uppercase comes before lowercase in sorting +function chosen in `which-key-sort-order'. Otherwise, the order +is reversed." + :group 'which-key + :type 'boolean) + (defcustom which-key-paging-prefixes '() "Enable paging for these prefixes." :group 'which-key @@ -1085,13 +1092,14 @@ width) in lines and characters respectively." ;;; Sorting functions (defun which-key--string< (a b &optional alpha) - (if alpha - (let ((da (downcase a)) - (db (downcase b))) - (if (string-equal da db) - (not (string-lessp a b)) - (string-lessp da db))) - (string-lessp a b))) + (let* ((da (downcase a)) + (db (downcase b))) + (cond ((string-equal da db) + (if which-key-sort-uppercase-first + (string-lessp a b) + (not (string-lessp a b)))) + (alpha (string-lessp da db)) + (t (string-lessp a b))))) (defun which-key--key-description< (a b &optional alpha) "Sorting function used for `which-key-key-order' and @@ -1116,7 +1124,7 @@ width) in lines and characters respectively." ((and asp? bsp?) (if (string-equal (substring a 0 3) (substring b 0 3)) (which-key--key-description< (substring a 3) (substring b 3) alpha) - (string-lessp a b))) + (which-key--string< a b alpha))) ((or asp? bsp?) asp?) ((and a1? b1?) (which-key--string< a b alpha)) ((or a1? b1?) a1?) @@ -1127,9 +1135,9 @@ width) in lines and characters respectively." ((and apr? bpr?) (if (string-equal (substring a 0 2) (substring b 0 2)) (which-key--key-description< (substring a 2) (substring b 2) alpha) - (string-lessp a b))) + (which-key--string< a b alpha))) ((or apr? bpr?) apr?) - (t (string-lessp a b)))))) + (t (which-key--string< a b alpha)))))) (defsubst which-key-key-order-alpha (acons bcons) "Order key descriptions A and B. @@ -1462,7 +1470,7 @@ BUFFER that follow the key sequence KEY-SEQ." (let* ((unformatted (if bindings bindings (which-key--get-current-bindings)))) (when which-key-sort-order (setq unformatted - (sort unformatted (lambda (a b) (funcall which-key-sort-order a b))))) + (sort unformatted which-key-sort-order))) (which-key--format-and-replace unformatted))) ;;; Functions for laying out which-key buffer pages From 5abc8cfd33f7ad03ceb3fe7b35fbcdc732c0193a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 29 Oct 2016 08:34:42 -0400 Subject: [PATCH 505/816] Add sort option -prefix-then-key-order-reverse Fixes #145 --- which-key.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/which-key.el b/which-key.el index c17a1c7a3eb..70372675ce9 100644 --- a/which-key.el +++ b/which-key.el @@ -1176,6 +1176,16 @@ coming before a prefix. Within these categories order using (and (not apref?) bpref?) (which-key-key-order acons bcons)))) +(defun which-key-prefix-then-key-order-reverse (acons bcons) + "Order first by whether A and/or B is a prefix with prefix +coming before a prefix. Within these categories order using +`which-key-key-order'." + (let ((apref? (which-key--group-p (cdr acons))) + (bpref? (which-key--group-p (cdr bcons)))) + (if (not (eq apref? bpref?)) + (and apref? (not bpref?)) + (which-key-key-order acons bcons)))) + (defun which-key-local-then-key-order (acons bcons) "Order first by whether A and/or B is a local binding with local bindings coming first. Within these categories order using From ee121d08bf3b505f0dc2e5a6a8a425f1c3943fad Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 29 Oct 2016 09:15:03 -0400 Subject: [PATCH 506/816] Add which-key-binding-filter-function Can be used to arbitrarily manipulate key bindings, including deleting them, before they are processed by which-key. See docstring for usage. Fixes #152 https://github.com/syl20bnr/spacemacs/issues/7582 --- which-key.el | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/which-key.el b/which-key.el index 70372675ce9..d97e885cc7e 100644 --- a/which-key.el +++ b/which-key.el @@ -149,6 +149,25 @@ This is a list of lists for replacing descriptions." :group 'which-key :type '(alist :key-type regexp :value-type string)) +(defcustom which-key-binding-filter-function nil + "Optional function to use to filter key bindings before they +are processed by which-key. The function should accept a cons +cell of the form (\"KEY\" . \"BINDING\") and the current prefix +sequence as a string. If it returns nil, the key binding is +ignored by which-key. Otherwise it should a cons cell of the same +form. To leave the key binding unchanged simply return the +original cons cell. Here's an example + +\(defun my-filter \(cell prefix\) + \(if \(and \(string-equal prefix \"SPC\"\) + \(string-equal \(car cell\) \"?\"\)\) + \(cons \"?\" \"NEW DESCRIPTION\") + cell\)\) + +\(setq which-key-binding-filter-function 'my-filter\)" + :group 'which-key + :type 'function) + (defcustom which-key-highlighted-command-list '() "A list of strings and/or cons cells used to highlight certain commands. If the element is a string, assume it is a regexp @@ -1481,6 +1500,13 @@ BUFFER that follow the key sequence KEY-SEQ." (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) + (when which-key-binding-filter-function + (setq unformatted + (delq nil (mapcar + (lambda (cell) + (funcall which-key-binding-filter-function + cell (which-key--current-key-string))) + unformatted)))) (which-key--format-and-replace unformatted))) ;;; Functions for laying out which-key buffer pages From fc7482e4a2063697738a405686ebc62d87697ab8 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 31 Oct 2016 13:48:14 -0400 Subject: [PATCH 507/816] Remove use of display-buffer-in-major-side-window According to emacs bug #24828, this is an internal function and should not be used. Following the advice from that report, switch to display-buffer-in-side-window and add an option for the user to specify the slot value for that function. Fixes #146 --- which-key.el | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index d97e885cc7e..c6bf5b5de9f 100644 --- a/which-key.el +++ b/which-key.el @@ -230,6 +230,20 @@ location is tried." (const (right bottom)) (const (bottom right)))) +(defcustom which-key-side-window-slot 0 + "The `slot' to use for `display-buffer-in-side-window' when +`which-key-popup-type' is 'side-window. Quoting from the +docstring of `display-buffer-in-side-window', + +‘slot’ if non-nil, specifies the window slot where to display + BUFFER. A value of zero or nil means use the middle slot on + the specified side. A negative value means use a slot + preceding (that is, above or on the left of) the middle slot. + A positive value means use a slot following (that is, below or + on the right of) the middle slot. The default is zero." + :group 'which-key + :type 'integer) + (defcustom which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window and location is left or right. @@ -966,13 +980,16 @@ call signature in different emacs versions" "Show which-key buffer when popup type is side-window." (let* ((height (car act-popup-dim)) (width (cdr act-popup-dim)) - (side which-key-side-window-location) (alist (if which-key-allow-imprecise-window-fit `((window-width . ,(which-key--text-width-to-total width)) - (window-height . ,height)) - '((window-width . which-key--fit-buffer-to-window-horizontally) - (window-height . (lambda (w) (fit-window-to-buffer w nil 1))))))) + (window-height . ,height) + (side . ,which-key-side-window-location) + (slot . ,which-key-side-window-slot)) + `((window-width . which-key--fit-buffer-to-window-horizontally) + (window-height . (lambda (w) (fit-window-to-buffer w nil 1))) + (side . ,which-key-side-window-location) + (slot . ,which-key-side-window-slot))))) ;; Note: `display-buffer-in-side-window' and `display-buffer-in-major-side-window' ;; were added in Emacs 24.3 @@ -992,11 +1009,11 @@ call signature in different emacs versions" ((eq which-key--multiple-locations t) ;; possibly want to switch sides in this case so we can't reuse the window (delete-windows-on which-key--buffer) - (display-buffer-in-major-side-window which-key--buffer side 0 alist)) + (display-buffer-in-side-window which-key--buffer alist)) ((get-buffer-window which-key--buffer) (display-buffer-reuse-window which-key--buffer alist)) (t - (display-buffer-in-major-side-window which-key--buffer side 0 alist))))) + (display-buffer-in-side-window which-key--buffer alist))))) (defun which-key--show-buffer-frame (act-popup-dim) "Show which-key buffer when popup type is frame." From 4b01b44c6718168be9553043124c3efd766abbc1 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 31 Oct 2016 13:56:57 -0400 Subject: [PATCH 508/816] Update comment in --show-buffer-side-window for prior change --- which-key.el | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index c6bf5b5de9f..2a37da3c89b 100644 --- a/which-key.el +++ b/which-key.el @@ -990,21 +990,9 @@ call signature in different emacs versions" (window-height . (lambda (w) (fit-window-to-buffer w nil 1))) (side . ,which-key-side-window-location) (slot . ,which-key-side-window-slot))))) - ;; 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 + ;; Previously used `display-buffer-in-major-side-window' here, but + ;; apparently that is meant to be an internal function. See emacs bug #24828 + ;; and advice given there. (cond ((eq which-key--multiple-locations t) ;; possibly want to switch sides in this case so we can't reuse the window From 17f4b0069273f9c9877dc079e5cf49ed9cb4d278 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 6 Nov 2016 12:50:55 -0500 Subject: [PATCH 509/816] Move sort after filter op in --get-formatted-key-bindings --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 2a37da3c89b..4f77379f451 100644 --- a/which-key.el +++ b/which-key.el @@ -1502,9 +1502,6 @@ alists. Returns a list (key separator description)." "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let* ((unformatted (if bindings bindings (which-key--get-current-bindings)))) - (when which-key-sort-order - (setq unformatted - (sort unformatted which-key-sort-order))) (when which-key-binding-filter-function (setq unformatted (delq nil (mapcar @@ -1512,6 +1509,9 @@ BUFFER that follow the key sequence KEY-SEQ." (funcall which-key-binding-filter-function cell (which-key--current-key-string))) unformatted)))) + (when which-key-sort-order + (setq unformatted + (sort unformatted which-key-sort-order))) (which-key--format-and-replace unformatted))) ;;; Functions for laying out which-key buffer pages From 19186917eb2958c11a297b03b7963e02053959ec Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Nov 2016 23:03:12 -0500 Subject: [PATCH 510/816] Consolidate replacements into one alist New list is which-key-replacement-alist. See docstring. The following lists are deprecated. Some basic backwards compatibility is attempted, but more complicated configs will likely break. which-key-key-replacement-alist which-key-key-based-description-replacement-alist which-key-description-replacement-alist which-key-binding-filter-function was removed, since it's functionality is mostly replaced by which-key-replacement-alist Updated README --- README.org | 53 ++++++----- which-key.el | 259 +++++++++++++++++++++++++++++---------------------- 2 files changed, 177 insertions(+), 135 deletions(-) diff --git a/README.org b/README.org index 059fe296ca8..d61585376b3 100644 --- a/README.org +++ b/README.org @@ -1,15 +1,22 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] +** Recent Changes +*** [2016-11-21] Replacement list changes +The alists controlling the replacement of key binding descriptions was +simplified to use one centralized alist, =which-key-replacement-alist=. This +change also allows for some new features compared to the old method. The other +alists are deprecated. See [[Custom%20String%20Replacement%20Options][Custom String Replacement Options]]. + ** Introduction -=which-key= is a minor mode for Emacs that displays the key bindings following your currently -entered incomplete command (a prefix) in a popup. For example, after enabling the minor mode -if you enter =C-x= and wait for the default of 1 second the minibuffer will expand with all of -the available key bindings that follow =C-x= (or as many as space allows given your settings). -This includes prefixes like =C-x 8= which are shown in a different face. Screenshots of what +=which-key= is a minor mode for Emacs that displays the key bindings following +your currently entered incomplete command (a prefix) in a popup. For example, +after enabling the minor mode if you enter =C-x= and wait for the default of 1 +second the minibuffer will expand with all of the available key bindings that +follow =C-x= (or as many as space allows given your settings). This includes +prefixes like =C-x 8= which are shown in a different face. Screenshots of what the popup will look like are included below. =which-key= started as a rewrite of -[[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged -to a certain extent. +[[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged to a certain extent. ** Table of Contents :TOC@4: - [[#which-key][which-key]] @@ -214,13 +221,8 @@ of behind each alist is that you specify a selection string in the =car= of each cons cell and the replacement string in the =cdr=. **** "Key-Based" replacement -[Note on 2015-9-3 the format of -=which-key-key-based-description-replacement-alist= changed. It will be easier -to use the functions below in your configuration, instead of modifying this -variable directly.] - Using this method, the description of a key is replaced using a string that you -provide. Here's an example +provide. Here's an example #+BEGIN_SRC emacs-lisp (which-key-add-key-based-replacements @@ -245,20 +247,23 @@ itself, the major-mode version takes precedence. **** Key and Description replacement The second and third methods target the text used for the keys and the -descriptions directly. The relevant variables are -=which-key-key-replacement-alist= and =which-key-description-replacement-alist=. +descriptions directly. The relevant variable is =which-key-replacement-alist=. Here's an example of one of the default key replacements #+BEGIN_SRC emacs-lisp -("<\\([[:alnum:]-]+\\)>" . "\\1") +(push '(("<\\([[:alnum:]-]+\\)>" . nil) . ("\\1" . nil)) + which-key-replacement-alist) #+END_SRC -The =car= takes a string which may use Emacs regexp and the =cdr= takes a string -with the replacement text. As shown, you can specify a sub-expression of the -match. The replacements do not need to use regexp and can be as simple as +Each element of the outer cons cell is a cons cell of the form =(KEY +. BINDING)=. The =car= of the outer cons determines how to match key bindings +while the =cdr= determines how those matches are replaced. See the docstring of +=which-key-replacement-alist= for more information. + +The next example shows how to replace the description. #+BEGIN_SRC emacs-lisp -("left" . "lft") +(push '((nil . "left") . (nil . "lft")) which-key-replacement-alist) #+END_SRC Here is an example of using key replacement to include Unicode characters in the @@ -267,10 +272,10 @@ which-key buffer, because Unicode characters can have different widths even in a monospace font and alignment is based on character width. #+BEGIN_SRC emacs-lisp -(add-to-list 'which-key-key-replacement-alist '("TAB" . "↹")) -(add-to-list 'which-key-key-replacement-alist '("RET" . "⏎")) -(add-to-list 'which-key-key-replacement-alist '("DEL" . "⇤")) -(add-to-list 'which-key-key-replacement-alist '("SPC" . "␣")) +(add-to-list 'which-key-replacement-alist '(("TAB" . nil) . ("↹" . nil)) +(add-to-list 'which-key-replacement-alist '(("RET" . nil) . ("⏎" . nil)) +(add-to-list 'which-key-replacement-alist '(("DEL" . nil) . ("⇤" . nil)) +(add-to-list 'which-key-replacement-alist '(("SPC" . nil) . ("␣" . nil)) #+END_SRC *** Sorting Options diff --git a/which-key.el b/which-key.el index 4f77379f451..50537810a74 100644 --- a/which-key.el +++ b/which-key.el @@ -131,42 +131,69 @@ that represent a sub-map). Default is \"+\"." :group 'which-key :type 'string) -(defcustom which-key-key-replacement-alist - (if which-key-dont-use-unicode - '(("<\\([[:alnum:]-]+\\)>" . "\\1")) - '(("<\\([[:alnum:]-]+\\)>" . "\\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-key-replacement-alist nil) +(make-obsolete-variable 'which-key-key-replacement-alist + 'which-key-replacement-alist "2016-11-21") +(defvar which-key-description-replacement-alist nil) +(make-obsolete-variable 'which-key-description-replacement-alist + 'which-key-replacement-alist "2016-11-21") +(defvar which-key-key-based-description-replacement-alist nil) +(make-obsolete-variable 'which-key-key-based-description-replacement-alist + 'which-key-replacement-alist "2016-11-21") + +(defcustom which-key-replacement-alist + (delq nil + `(((nil . "Prefix Command") . (nil . "prefix")) + ((nil . "\\`\\?\\?\\'") . (nil . "lambda")) + ((nil . "which-key-show-next-page") . (nil . "wk next pg")) + (("<\\([[:alnum:]-]+\\)>") . ("\\1")) + ,@(unless which-key-dont-use-unicode + '((("left") . ("←")) + (("right") . ("→")))))) + "Association list to determine how to manipulate descriptions +of key bindings in the which-key popup. Each element of the list +is a nested cons cell with the format + +\(MATCH CONS . REPLACEMENT\). + +The MATCH CONS determines when a replacement should occur and +REPLACEMENT determines how the replacement should occur. Each may +have the format \(KEY REGEXP . BINDING REGEXP\). For the +replacement to apply the key binding must match both the KEY +REGEXP and the BINDING REGEXP. A value of nil in either position +can be used to match every possibility. The replacement is +performed by using `replace-regexp-in-string' on the KEY REGEXP +from the MATCH CONS and REPLACEMENT when it is a cons cell, and +then similarly for the BINDING REGEXP. A nil value in the BINDING +REGEXP position cancels the replacement. For example, the entry + +\(\(nil . \"Prefix Command\"\) . \(nil . \"prefix\"\)\) + +matches any binding with the descriptions \"Prefix Command\" and +replaces the description with \"prefix\", ignoring the +corresponding key. + +REPLACEMENT may also be a function taking a cons cell +\(KEY . BINDING\) and producing a new corresponding cons cell. + +If REPLACEMENT is anything other than a cons cell \(and non nil\) +the key binding is ignored by which-key." :group 'which-key - :type '(alist :key-type regexp :value-type string)) + :type '(alist :key-type (alist :key-type regexp :value-type regexp) + :value-type (alist :key-type regexp :value-type regexp))) -(defcustom which-key-description-replacement-alist - '(("Prefix Command" . "prefix") ("which-key-show-next-page" . "wk next pg") - ("\\`\\?\\?\\'" . "lambda")) - "See `which-key-key-replacement-alist'. -This is a list of lists for replacing descriptions." - :group 'which-key - :type '(alist :key-type regexp :value-type string)) - -(defcustom which-key-binding-filter-function nil - "Optional function to use to filter key bindings before they -are processed by which-key. The function should accept a cons -cell of the form (\"KEY\" . \"BINDING\") and the current prefix -sequence as a string. If it returns nil, the key binding is -ignored by which-key. Otherwise it should a cons cell of the same -form. To leave the key binding unchanged simply return the -original cons cell. Here's an example - -\(defun my-filter \(cell prefix\) - \(if \(and \(string-equal prefix \"SPC\"\) - \(string-equal \(car cell\) \"?\"\)\) - \(cons \"?\" \"NEW DESCRIPTION\") - cell\)\) - -\(setq which-key-binding-filter-function 'my-filter\)" - :group 'which-key - :type 'function) +(when (bound-and-true-p which-key-key-replacement-alist) + (mapc + (lambda (repl) + (push (cons (cons (car repl) nil) (cons (cdr repl) nil)) + which-key-replacement-alist)) + which-key-key-replacement-alist)) +(when (bound-and-true-p which-key-description-replacement-alist) + (mapc + (lambda (repl) + (push (cons (cons nil (car repl)) (cons nil (cdr repl))) + which-key-replacement-alist)) + which-key-description-replacement-alist)) (defcustom which-key-highlighted-command-list '() "A list of strings and/or cons cells used to highlight certain @@ -557,13 +584,8 @@ used.") (defvar which-key--current-show-keymap-name nil) (defvar which-key--prior-show-keymap-args nil) (defvar which-key--previous-frame-size nil) - -(defvar which-key-key-based-description-replacement-alist '() - "New version of -`which-key-key-based-description-replacement-alist'. Use -`which-key-add-key-based-replacements' or -`which-key-add-major-mode-key-based-replacements' to set this -variable.") +(defvar which-key--last-replace-key nil) +(defvar which-key--prefix-title-alist nil) (make-obsolete-variable 'which-key-prefix-name-alist nil "2016-10-05") (make-obsolete-variable 'which-key-prefix-title-alist nil "2016-10-05") @@ -758,6 +780,14 @@ bottom." alist) (t (cons (cons keys value) alist))))) +(defun which-key-replace-key-binding (match-cons replace-cons) + (lambda (key-binding) + (cons + (replace-regexp-in-string + (car match-cons) (car replace-cons) (car key-binding)) + (replace-regexp-in-string + (cdr match-cons) (cdr replace-cons) (cdr key-binding))))) + ;;;###autoload (defun which-key-add-key-based-replacements (key-sequence replacement &rest more) "Replace the description of KEY-SEQUENCE with REPLACEMENT. @@ -778,15 +808,18 @@ replacements are added to `which-key-key-based-description-replacement-alist'." ;; TODO: Make interactive (while key-sequence - (setq which-key-key-based-description-replacement-alist - (which-key--add-key-val-to-alist - which-key-key-based-description-replacement-alist - key-sequence replacement "key-based")) + (push (cons (cons (format "\\`%s\\'" key-sequence) nil) + (cons nil (or (car-safe replacement) replacement))) + which-key-replacement-alist) + (when (consp replacement) + (push (cons key-sequence (cdr-safe replacement)) + which-key--prefix-title-alist)) (setq key-sequence (pop more) replacement (pop more)))) (put 'which-key-add-key-based-replacements 'lisp-indent-function 'defun) ;;;###autoload -(defun which-key-add-major-mode-key-based-replacements (mode key-sequence replacement &rest more) +(defun which-key-add-major-mode-key-based-replacements + (mode key-sequence replacement &rest more) "Functions like `which-key-add-key-based-replacements'. The difference is that MODE specifies the `major-mode' that must be active for KEY-SEQUENCE and REPLACEMENT (MORE contains @@ -794,16 +827,26 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." ;; TODO: Make interactive (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) - (let ((mode-alist (cdr (assq mode which-key-key-based-description-replacement-alist)))) + (let ((mode-alist + (or (cdr-safe (assq mode which-key-replacement-alist)) (list))) + (title-mode-alist + (or (cdr-safe (assq mode which-key--prefix-title-alist)) (list)))) (while key-sequence - (setq mode-alist (which-key--add-key-val-to-alist - mode-alist key-sequence replacement - (format "key-based-%s" mode))) + (push (cons (cons (format "\\`%s\\'" key-sequence) nil) + (cons nil (or (car-safe replacement) replacement))) + mode-alist) + (when (consp replacement) + (push (cons key-sequence (cdr-safe replacement)) + title-mode-alist)) (setq key-sequence (pop more) replacement (pop more))) - (if (assq mode which-key-key-based-description-replacement-alist) - (setcdr (assq mode which-key-key-based-description-replacement-alist) mode-alist) - (push (cons mode mode-alist) which-key-key-based-description-replacement-alist)))) -(put 'which-key-add-major-mode-key-based-replacements 'lisp-indent-function 'defun) + (if (assq mode which-key-replacement-alist) + (setcdr (assq mode which-key-replacement-alist) mode-alist) + (push (cons mode mode-alist) which-key-replacement-alist)) + (if (assq mode which-key--prefix-title-alist) + (setcdr (assq mode which-key--prefix-title-alist) title-mode-alist) + (push (cons mode title-mode-alist) which-key--prefix-title-alist)))) +(put 'which-key-add-major-mode-key-based-replacements + 'lisp-indent-function 'defun) (defalias 'which-key-add-prefix-title 'which-key-add-key-based-replacements) (make-obsolete 'which-key-add-prefix-title @@ -1233,20 +1276,40 @@ local bindings coming first. Within these categories order using (defsubst which-key--butlast-string (str) (mapconcat #'identity (butlast (split-string str)) " ")) -(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. Whether or not a -replacement occurs return the new STRING." - (save-match-data - (let ((new-string string) - case-fold-search) - (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--replacement-test (alist-key key) + (when (and (consp alist-key) + (or (null (car alist-key)) + (string-match-p (car alist-key) (car key))) + (or (null (cdr alist-key)) + (string-match-p (cdr alist-key) (cdr key)))) + (setq which-key--last-replace-key alist-key))) + +(defun which-key--maybe-replace (key-binding) + (setq which-key--last-replace-key nil) + (let* ((mode-alist (assq major-mode which-key-replacement-alist)) + (mode-res (when mode-alist + (assoc-default + key-binding mode-alist 'which-key--replacement-test))) + (res (or mode-res + (assoc-default + key-binding which-key-replacement-alist + 'which-key--replacement-test)))) + (cond ((null res) key-binding) + ((consp res) + (cons + (cond ((and (car res) (car which-key--last-replace-key)) + (replace-regexp-in-string + (car which-key--last-replace-key) + (car res) (car key-binding) t)) + ((car res) (car res)) + (t (car key-binding))) + (cond ((and (cdr res) (cdr which-key--last-replace-key)) + (replace-regexp-in-string + (cdr which-key--last-replace-key) + (cdr res) (cdr key-binding) t)) + ((cdr res) (cdr res)) + (t (cdr key-binding))))) + ((functionp res) (funcall res key-binding))))) (defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence which-key--current-prefix) @@ -1261,38 +1324,22 @@ replacement occurs return the new STRING." (current-local-map) (kbd (which-key--current-key-string (car keydesc)))) (intern (cdr keydesc)))) -(defun which-key--maybe-replace-key-based (string keys &optional title) - "KEYS is a string produced by `key-description' -and STRING is the description that is possibly replaced using the -`which-key-key-based-description-replacement-alist'. Whether or -not a replacement occurs return the new STRING." - (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))) - tmp-res) - (setq tmp-res - (cond (mode-res (cdr mode-res)) - (str-res (cdr str-res)) - (t string))) - (cond ((and (consp tmp-res) title) - (cdr tmp-res)) - ((consp tmp-res) - (car tmp-res)) - (t tmp-res)))) - (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. A title is possibly returned using -`which-key-key-based-description-replacement-alist'. An empty -stiring is returned if no title exists." +`which-key--prefix-title-alist'. An empty stiring is returned if +no title exists." (cond ((not (string-equal keys "")) - (let* ((repl-res (which-key--maybe-replace-key-based "" keys t)) + (let* ((title-res + (cdr-safe (assoc-string keys which-key--prefix-title-alist))) + (repl-res + (cdr-safe (which-key--maybe-replace (cons keys "")))) (binding (key-binding (kbd keys))) (alternate (when (and binding (symbolp binding)) (symbol-name binding)))) - (cond (repl-res repl-res) + (cond (title-res title-res) + ((not (string-equal repl-res "")) repl-res) ((and (eq which-key-show-prefix 'echo) alternate) alternate) ((and (member which-key-show-prefix '(bottom top)) @@ -1396,23 +1443,20 @@ alists. Returns a list (key separator description)." (propertize which-key-separator 'face 'which-key-separator-face)) (local-map (current-local-map))) (mapcar - (lambda (key-desc-cons) - (let* ((key (car key-desc-cons)) - (orig-desc (cdr key-desc-cons)) + (lambda (key-binding) + (let* ((key (car key-binding)) + (orig-desc (cdr key-binding)) (group (which-key--group-p orig-desc)) (keys (which-key--current-key-string key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern orig-desc))) (hl-face (which-key--highlight-face orig-desc)) - (key (which-key--maybe-replace - key which-key-key-replacement-alist)) - (desc (which-key--maybe-replace - orig-desc which-key-description-replacement-alist)) - (desc (which-key--maybe-replace-key-based desc keys)) - (key-w-face (which-key--propertize-key key)) - (desc-w-face (which-key--propertize-description - desc group local hl-face orig-desc))) - (list key-w-face sep-w-face desc-w-face))) + (key-binding (which-key--maybe-replace (cons keys orig-desc)))) + (list (which-key--propertize-key + (car (last (split-string (car key-binding) " ")))) + sep-w-face + (which-key--propertize-description + (cdr key-binding) group local hl-face orig-desc)))) unformatted))) (defun which-key--get-keymap-bindings (keymap &optional filter) @@ -1502,13 +1546,6 @@ alists. Returns a list (key separator description)." "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let* ((unformatted (if bindings bindings (which-key--get-current-bindings)))) - (when which-key-binding-filter-function - (setq unformatted - (delq nil (mapcar - (lambda (cell) - (funcall which-key-binding-filter-function - cell (which-key--current-key-string))) - unformatted)))) (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) From b5a9d7d1ce028ce904cb8479a10440ad6c839221 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 22 Nov 2016 07:01:09 -0500 Subject: [PATCH 511/816] Update test --- which-key-tests.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index e620c3ae3e1..cd055015a19 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -30,20 +30,20 @@ (ert-deftest which-key-test-prefix-declaration () "Test `which-key-declare-prefixes' and `which-key-declare-prefixes-for-mode'. See Bug #109." - (let* (test-mode which-key-key-based-description-replacement-alist) - (which-key-declare-prefixes + (let* ((major-mode 'test-mode) + which-key-replacement-alist) + (which-key-add-key-based-replacements "SPC C-c" '("complete" . "complete title") "SPC C-k" "cancel") - (which-key-declare-prefixes-for-mode 'test-mode + (which-key-add-major-mode-key-based-replacements 'test-mode "C-c C-c" '("complete" . "complete title") "C-c C-k" "cancel") (should (equal - (assoc-string "SPC C-k" which-key-key-based-description-replacement-alist) + (which-key--maybe-replace '("SPC C-k" . "")) '("SPC C-k" . "cancel"))) (should (equal - (assoc-string - "C-c C-c" (cdr (assq 'test-mode which-key-key-based-description-replacement-alist))) - '("C-c C-c" . ("complete" . "complete title")))))) + (which-key--maybe-replace '("C-c C-c" . "")) + '("C-c C-c" . "complete"))))) (provide 'which-key-tests) ;;; which-key-tests.el ends here From 3c4ca65395b7df3eb98088d694525ccf1507ae35 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 25 Nov 2016 07:56:06 -0500 Subject: [PATCH 512/816] Don't use case-fold-search in --maybe-replace See https://github.com/syl20bnr/spacemacs/issues/7837#issuecomment-262938480 --- which-key.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 50537810a74..b5b671c3833 100644 --- a/which-key.el +++ b/which-key.el @@ -1277,14 +1277,18 @@ local bindings coming first. Within these categories order using (mapconcat #'identity (butlast (split-string str)) " ")) (defun which-key--replacement-test (alist-key key) - (when (and (consp alist-key) - (or (null (car alist-key)) - (string-match-p (car alist-key) (car key))) - (or (null (cdr alist-key)) - (string-match-p (cdr alist-key) (cdr key)))) - (setq which-key--last-replace-key alist-key))) + (let (case-fold-search) + (when (and (consp alist-key) + (or (null (car alist-key)) + (string-match-p (car alist-key) (car key))) + (or (null (cdr alist-key)) + (string-match-p (cdr alist-key) (cdr key)))) + (setq which-key--last-replace-key alist-key)))) (defun which-key--maybe-replace (key-binding) + "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. +KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of +which are strings. KEY is of the form produced by `key-binding'." (setq which-key--last-replace-key nil) (let* ((mode-alist (assq major-mode which-key-replacement-alist)) (mode-res (when mode-alist From 0ac09351c4dc346d0c1d70d180c15732a4b2a3d7 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 25 Nov 2016 09:00:25 -0500 Subject: [PATCH 513/816] Fix use of function in -replacement-alist Wasn't actually deleting nil results --- which-key.el | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/which-key.el b/which-key.el index b5b671c3833..6828f42fe2d 100644 --- a/which-key.el +++ b/which-key.el @@ -1299,6 +1299,7 @@ which are strings. KEY is of the form produced by `key-binding'." key-binding which-key-replacement-alist 'which-key--replacement-test)))) (cond ((null res) key-binding) + ((functionp res) (funcall res key-binding)) ((consp res) (cons (cond ((and (car res) (car which-key--last-replace-key)) @@ -1312,8 +1313,7 @@ which are strings. KEY is of the form produced by `key-binding'." (cdr which-key--last-replace-key) (cdr res) (cdr key-binding) t)) ((cdr res) (cdr res)) - (t (cdr key-binding))))) - ((functionp res) (funcall res key-binding))))) + (t (cdr key-binding)))))))) (defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence which-key--current-prefix) @@ -1446,22 +1446,25 @@ alists. Returns a list (key separator description)." (let ((sep-w-face (propertize which-key-separator 'face 'which-key-separator-face)) (local-map (current-local-map))) - (mapcar - (lambda (key-binding) - (let* ((key (car key-binding)) - (orig-desc (cdr key-binding)) - (group (which-key--group-p orig-desc)) - (keys (which-key--current-key-string key)) - (local (eq (which-key--safe-lookup-key local-map (kbd keys)) - (intern orig-desc))) - (hl-face (which-key--highlight-face orig-desc)) - (key-binding (which-key--maybe-replace (cons keys orig-desc)))) - (list (which-key--propertize-key - (car (last (split-string (car key-binding) " ")))) - sep-w-face - (which-key--propertize-description - (cdr key-binding) group local hl-face orig-desc)))) - unformatted))) + (delq + nil + (mapcar + (lambda (key-binding) + (let* ((key (car key-binding)) + (orig-desc (cdr key-binding)) + (group (which-key--group-p orig-desc)) + (keys (which-key--current-key-string key)) + (local (eq (which-key--safe-lookup-key local-map (kbd keys)) + (intern orig-desc))) + (hl-face (which-key--highlight-face orig-desc)) + (key-binding (which-key--maybe-replace (cons keys orig-desc)))) + (when (consp key-binding) + (list (which-key--propertize-key + (car (last (split-string (car key-binding) " ")))) + sep-w-face + (which-key--propertize-description + (cdr key-binding) group local hl-face orig-desc))))) + unformatted)))) (defun which-key--get-keymap-bindings (keymap &optional filter) "Retrieve top-level bindings from KEYMAP." From a32ec0c45a73e1d03e3e79203aa808803b00ba5c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 28 Nov 2016 10:10:18 -0500 Subject: [PATCH 514/816] Simplify --format-and-replace --- which-key.el | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/which-key.el b/which-key.el index 6828f42fe2d..9acb29bb2d4 100644 --- a/which-key.el +++ b/which-key.el @@ -1445,26 +1445,26 @@ faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." (let ((sep-w-face (propertize which-key-separator 'face 'which-key-separator-face)) - (local-map (current-local-map))) - (delq - nil - (mapcar - (lambda (key-binding) - (let* ((key (car key-binding)) - (orig-desc (cdr key-binding)) - (group (which-key--group-p orig-desc)) - (keys (which-key--current-key-string key)) - (local (eq (which-key--safe-lookup-key local-map (kbd keys)) - (intern orig-desc))) - (hl-face (which-key--highlight-face orig-desc)) - (key-binding (which-key--maybe-replace (cons keys orig-desc)))) - (when (consp key-binding) - (list (which-key--propertize-key - (car (last (split-string (car key-binding) " ")))) - sep-w-face - (which-key--propertize-description - (cdr key-binding) group local hl-face orig-desc))))) - unformatted)))) + (local-map (current-local-map)) + new-list) + (dolist (key-binding unformatted) + (let* ((key (car key-binding)) + (orig-desc (cdr key-binding)) + (group (which-key--group-p orig-desc)) + (keys (which-key--current-key-string key)) + (local (eq (which-key--safe-lookup-key local-map (kbd keys)) + (intern orig-desc))) + (hl-face (which-key--highlight-face orig-desc)) + (key-binding (which-key--maybe-replace (cons keys orig-desc)))) + (when (consp key-binding) + (push + (list (which-key--propertize-key + (car (last (split-string (car key-binding) " ")))) + sep-w-face + (which-key--propertize-description + (cdr key-binding) group local hl-face orig-desc)) + new-list)))) + (nreverse new-list))) (defun which-key--get-keymap-bindings (keymap &optional filter) "Retrieve top-level bindings from KEYMAP." From 2b78bdd26d3d5385b473f18bb217915488e0d3ff Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 29 Nov 2016 08:38:21 -0500 Subject: [PATCH 515/816] Normalize key sequences from -add-key-based-replacements --- which-key.el | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/which-key.el b/which-key.el index 9acb29bb2d4..496d2cbebd7 100644 --- a/which-key.el +++ b/which-key.el @@ -808,12 +808,14 @@ replacements are added to `which-key-key-based-description-replacement-alist'." ;; TODO: Make interactive (while key-sequence - (push (cons (cons (format "\\`%s\\'" key-sequence) nil) - (cons nil (or (car-safe replacement) replacement))) - which-key-replacement-alist) - (when (consp replacement) - (push (cons key-sequence (cdr-safe replacement)) - which-key--prefix-title-alist)) + ;; normalize key sequences before adding + (let ((key-seq (key-description (kbd key-sequence)))) + (push (cons (cons (format "\\`%s\\'" key-seq) nil) + (cons nil (or (car-safe replacement) replacement))) + which-key-replacement-alist) + (when (consp replacement) + (push (cons key-seq (cdr-safe replacement)) + which-key--prefix-title-alist))) (setq key-sequence (pop more) replacement (pop more)))) (put 'which-key-add-key-based-replacements 'lisp-indent-function 'defun) @@ -832,12 +834,14 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (title-mode-alist (or (cdr-safe (assq mode which-key--prefix-title-alist)) (list)))) (while key-sequence - (push (cons (cons (format "\\`%s\\'" key-sequence) nil) - (cons nil (or (car-safe replacement) replacement))) - mode-alist) - (when (consp replacement) - (push (cons key-sequence (cdr-safe replacement)) - title-mode-alist)) + ;; normalize key sequences before adding + (let ((key-seq (key-description (kbd key-sequence)))) + (push (cons (cons (format "\\`%s\\'" key-seq) nil) + (cons nil (or (car-safe replacement) replacement))) + mode-alist) + (when (consp replacement) + (push (cons key-seq (cdr-safe replacement)) + title-mode-alist))) (setq key-sequence (pop more) replacement (pop more))) (if (assq mode which-key-replacement-alist) (setcdr (assq mode which-key-replacement-alist) mode-alist) From 9110eebc366d767adc14f16ecfc3eac418666beb Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 29 Nov 2016 13:20:00 -0500 Subject: [PATCH 516/816] Fix a README link --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index d61585376b3..a33cfd20bc0 100644 --- a/README.org +++ b/README.org @@ -6,7 +6,7 @@ The alists controlling the replacement of key binding descriptions was simplified to use one centralized alist, =which-key-replacement-alist=. This change also allows for some new features compared to the old method. The other -alists are deprecated. See [[Custom%20String%20Replacement%20Options][Custom String Replacement Options]]. +alists are deprecated. See [[#custom-string-replacement-options][Custom String Replacement Options]]. ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following From a2b3383f49530fd4a99e924e8b7973f468795a9d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 29 Nov 2016 21:29:32 -0500 Subject: [PATCH 517/816] Quote regexp in -add-key-based-replacements Should fix #154 --- which-key-tests.el | 29 +++++++++++++++++++++++++++++ which-key.el | 4 ++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index cd055015a19..244992df16a 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -45,5 +45,34 @@ (which-key--maybe-replace '("C-c C-c" . "")) '("C-c C-c" . "complete"))))) +(ert-deftest which-key-test--maybe-replace () + "Test `which-key--maybe-replace'. See #154" + (let ((which-key-replacement-alist + '((("C-c [a-d]" . nil) . ("C-c a" . "c-c a")) + (("C-c .+" . nil) . ("C-c *" . "c-c *"))))) + (which-key-add-key-based-replacements + "C-c ." "test ." + "C-c \\" "regexp quoting" + "C-c [" "bad regexp") + (should (equal + (which-key--maybe-replace '("C-c g" . "test")) + '("C-c *" . "c-c *"))) + (should (equal + (which-key--maybe-replace '("C-c b" . "test")) + '("C-c a" . "c-c a"))) + (should (equal + (which-key--maybe-replace '("C-c ." "not test .")) + '("C-c ." . "test ."))) + (should (not + (equal + (which-key--maybe-replace '("C-c +" "not test .")) + '("C-c ." . "test .")))) + (should (equal + (which-key--maybe-replace '("C-c [" "orig bad regexp")) + '("C-c [" . "bad regexp"))) + (should (equal + (which-key--maybe-replace '("C-c \\" "pre quoting")) + '("C-c \\" . "regexp quoting"))))) + (provide 'which-key-tests) ;;; which-key-tests.el ends here diff --git a/which-key.el b/which-key.el index 496d2cbebd7..7d99fa597a3 100644 --- a/which-key.el +++ b/which-key.el @@ -810,7 +810,7 @@ replacements are added to (while key-sequence ;; normalize key sequences before adding (let ((key-seq (key-description (kbd key-sequence)))) - (push (cons (cons (format "\\`%s\\'" key-seq) nil) + (push (cons (cons (regexp-quote key-seq) nil) (cons nil (or (car-safe replacement) replacement))) which-key-replacement-alist) (when (consp replacement) @@ -836,7 +836,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (while key-sequence ;; normalize key sequences before adding (let ((key-seq (key-description (kbd key-sequence)))) - (push (cons (cons (format "\\`%s\\'" key-seq) nil) + (push (cons (cons (regexp-quote key-seq) nil) (cons nil (or (car-safe replacement) replacement))) mode-alist) (when (consp replacement) From 880a38ef92a5cc5d898047590766f3404699a100 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 Nov 2016 07:03:52 -0500 Subject: [PATCH 518/816] Fix bug in last commit The regexp-quote docstring is misleading since (regexp-quote "SPC x") will match "SPC x c". Added back the beginning and end markers in the regexp. --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 7d99fa597a3..d383866b7d6 100644 --- a/which-key.el +++ b/which-key.el @@ -810,7 +810,7 @@ replacements are added to (while key-sequence ;; normalize key sequences before adding (let ((key-seq (key-description (kbd key-sequence)))) - (push (cons (cons (regexp-quote key-seq) nil) + (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil) (cons nil (or (car-safe replacement) replacement))) which-key-replacement-alist) (when (consp replacement) @@ -836,7 +836,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (while key-sequence ;; normalize key sequences before adding (let ((key-seq (key-description (kbd key-sequence)))) - (push (cons (cons (regexp-quote key-seq) nil) + (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil) (cons nil (or (car-safe replacement) replacement))) mode-alist) (when (consp replacement) From b57b3cb3424179264071773d581fed1e320dc0c3 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 Nov 2016 08:39:52 -0500 Subject: [PATCH 519/816] Add test for #155 --- which-key-tests.el | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 244992df16a..4fcbf395385 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -52,6 +52,7 @@ (("C-c .+" . nil) . ("C-c *" . "c-c *"))))) (which-key-add-key-based-replacements "C-c ." "test ." + "SPC ." "SPC ." "C-c \\" "regexp quoting" "C-c [" "bad regexp") (should (equal @@ -61,18 +62,22 @@ (which-key--maybe-replace '("C-c b" . "test")) '("C-c a" . "c-c a"))) (should (equal - (which-key--maybe-replace '("C-c ." "not test .")) + (which-key--maybe-replace '("C-c ." . "not test .")) '("C-c ." . "test ."))) (should (not (equal - (which-key--maybe-replace '("C-c +" "not test .")) + (which-key--maybe-replace '("C-c +" . "not test .")) '("C-c ." . "test .")))) (should (equal - (which-key--maybe-replace '("C-c [" "orig bad regexp")) + (which-key--maybe-replace '("C-c [" . "orig bad regexp")) '("C-c [" . "bad regexp"))) (should (equal - (which-key--maybe-replace '("C-c \\" "pre quoting")) - '("C-c \\" . "regexp quoting"))))) + (which-key--maybe-replace '("C-c \\" . "pre quoting")) + '("C-c \\" . "regexp quoting"))) + ;; see #155 + (should (equal + (which-key--maybe-replace '("SPC . ." . "don't replace")) + '("SPC . ." . "don't replace"))))) (provide 'which-key-tests) ;;; which-key-tests.el ends here From b3f686dd6c672150c11c55103eca6e9cf635ecae Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 Nov 2016 08:56:05 -0500 Subject: [PATCH 520/816] Add @pdcawley's example to README --- README.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.org b/README.org index a33cfd20bc0..f90dd4fe895 100644 --- a/README.org +++ b/README.org @@ -278,6 +278,22 @@ monospace font and alignment is based on character width. (add-to-list 'which-key-replacement-alist '(("SPC" . nil) . ("␣" . nil)) #+END_SRC +The =cdr= may also be a function that receives a =cons= of the form =(KEY +. BINDING)= and produces a =cons= of the same form. This allows for interesting +ideas like this one suggested by @pdcawley in [[https://github.com/justbur/emacs-which-key/pull/147][PR #147]]. + +#+BEGIN_SRC emacs-lisp +(push (cons '(nil . "paredit-mode") + (lambda (kb) + (cons (car kb) + (if paredit-mode + "[x] paredit-mode" + "[ ] paredit-mode")))) + which-key-replacement-alist) +#+END_SRC + +The box will be checked if =paredit-mode= is currently active. + *** Sorting Options By default the output is sorted by the key in a custom order. The default order is to sort lexicographically within each "class" of key, where the classes and From 0498eeab1fef008214c1ebfe1b01b92029e304bf Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 Nov 2016 08:58:53 -0500 Subject: [PATCH 521/816] Fix links to users in README --- README.org | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.org b/README.org index f90dd4fe895..3972295d421 100644 --- a/README.org +++ b/README.org @@ -280,7 +280,7 @@ monospace font and alignment is based on character width. The =cdr= may also be a function that receives a =cons= of the form =(KEY . BINDING)= and produces a =cons= of the same form. This allows for interesting -ideas like this one suggested by @pdcawley in [[https://github.com/justbur/emacs-which-key/pull/147][PR #147]]. +ideas like this one suggested by [[https://github.com/pdcawley][@pdcawley]] in [[https://github.com/justbur/emacs-which-key/pull/147][PR #147]]. #+BEGIN_SRC emacs-lisp (push (cons '(nil . "paredit-mode") @@ -475,7 +475,6 @@ windows. ** Thanks Special thanks to -- @bmag for helping with the initial development and finding many - bugs. -- @iqbalansari who among other things adapted the code to make +- [[https://github.com/bmag][@bmag]] for helping with the initial development and finding many bugs. +- [[https://github/iqbalansari][@iqbalansari]] who among other things adapted the code to make =which-key-show-top-level= possible. From 8f4a21855f38650e3e3f2c5afa0aa95a3252e45c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 Nov 2016 18:52:52 -0500 Subject: [PATCH 522/816] Support functions in -add-key-based-replacements --- which-key-tests.el | 24 +++++++++++++++++++++--- which-key.el | 19 ++++++++++++++----- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 4fcbf395385..93e1dfa969f 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -49,12 +49,24 @@ "Test `which-key--maybe-replace'. See #154" (let ((which-key-replacement-alist '((("C-c [a-d]" . nil) . ("C-c a" . "c-c a")) - (("C-c .+" . nil) . ("C-c *" . "c-c *"))))) + (("C-c .+" . nil) . ("C-c *" . "c-c *")))) + (test-mode-1 t) + (test-mode-2 nil)) (which-key-add-key-based-replacements "C-c ." "test ." "SPC ." "SPC ." "C-c \\" "regexp quoting" - "C-c [" "bad regexp") + "C-c [" "bad regexp" + "SPC t1" (lambda (kb) + (cons (car kb) + (if test-mode-1 + "[x] test mode" + "[ ] test mode"))) + "SPC t2" (lambda (kb) + (cons (car kb) + (if test-mode-2 + "[x] test mode" + "[ ] test mode")))) (should (equal (which-key--maybe-replace '("C-c g" . "test")) '("C-c *" . "c-c *"))) @@ -77,7 +89,13 @@ ;; see #155 (should (equal (which-key--maybe-replace '("SPC . ." . "don't replace")) - '("SPC . ." . "don't replace"))))) + '("SPC . ." . "don't replace"))) + (should (equal + (which-key--maybe-replace '("SPC t 1" . "test mode")) + '("SPC t 1" . "[x] test mode"))) + (should (equal + (which-key--maybe-replace '("SPC t 2" . "test mode")) + '("SPC t 2" . "[ ] test mode"))))) (provide 'which-key-tests) ;;; which-key-tests.el ends here diff --git a/which-key.el b/which-key.el index d383866b7d6..63327cb9ba2 100644 --- a/which-key.el +++ b/which-key.el @@ -796,10 +796,13 @@ may either be a string, as in \(which-key-add-key-based-replacements \"C-x 1\" \"maximize\"\) -or a cons of two strings as in +a cons of two strings as in \(which-key-add-key-based-replacements \"C-x 8\" '(\"unicode\" . \"Unicode keys\")\) +or a function that takes a \(KEY . BINDING\) cons and returns a +replacement. + In the second case, the second string is used to provide a longer name for the keys under a prefix. @@ -809,9 +812,12 @@ replacements are added to ;; TODO: Make interactive (while key-sequence ;; normalize key sequences before adding - (let ((key-seq (key-description (kbd key-sequence)))) + (let ((key-seq (key-description (kbd key-sequence))) + (replace (or (and (functionp replacement) replacement) + (cdr-safe replacement) + replacement))) (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil) - (cons nil (or (car-safe replacement) replacement))) + (if (functionp replace) replace (cons nil replace))) which-key-replacement-alist) (when (consp replacement) (push (cons key-seq (cdr-safe replacement)) @@ -835,9 +841,12 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (or (cdr-safe (assq mode which-key--prefix-title-alist)) (list)))) (while key-sequence ;; normalize key sequences before adding - (let ((key-seq (key-description (kbd key-sequence)))) + (let ((key-seq (key-description (kbd key-sequence))) + (replace (or (and (functionp replacement) replacement) + (cdr-safe replacement) + replacement))) (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil) - (cons nil (or (car-safe replacement) replacement))) + (if (functionp replace) replace (cons nil replace))) mode-alist) (when (consp replacement) (push (cons key-seq (cdr-safe replacement)) From 1b8c1e5490296e1d44b7f1ffad1e27a3c4a34a4b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 Nov 2016 19:03:56 -0500 Subject: [PATCH 523/816] Fixup last commit --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 63327cb9ba2..c4cf96b5f97 100644 --- a/which-key.el +++ b/which-key.el @@ -819,7 +819,7 @@ replacements are added to (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil) (if (functionp replace) replace (cons nil replace))) which-key-replacement-alist) - (when (consp replacement) + (when (and (not (functionp replacement)) (consp replacement)) (push (cons key-seq (cdr-safe replacement)) which-key--prefix-title-alist))) (setq key-sequence (pop more) replacement (pop more)))) @@ -848,7 +848,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil) (if (functionp replace) replace (cons nil replace))) mode-alist) - (when (consp replacement) + (when (and (not (functionp replacement)) (consp replacement)) (push (cons key-seq (cdr-safe replacement)) title-mode-alist))) (setq key-sequence (pop more) replacement (pop more))) From 73dd5ad8827553c06de325f23c02e66fcbd669b2 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 Nov 2016 19:09:20 -0500 Subject: [PATCH 524/816] Fixup last commit part 2 --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index c4cf96b5f97..81060112029 100644 --- a/which-key.el +++ b/which-key.el @@ -814,7 +814,7 @@ replacements are added to ;; normalize key sequences before adding (let ((key-seq (key-description (kbd key-sequence))) (replace (or (and (functionp replacement) replacement) - (cdr-safe replacement) + (car-safe replacement) replacement))) (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil) (if (functionp replace) replace (cons nil replace))) @@ -843,7 +843,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." ;; normalize key sequences before adding (let ((key-seq (key-description (kbd key-sequence))) (replace (or (and (functionp replacement) replacement) - (cdr-safe replacement) + (car-safe replacement) replacement))) (push (cons (cons (concat "\\`" (regexp-quote key-seq) "\\'") nil) (if (functionp replace) replace (cons nil replace))) From 0724e62ce520ba6176a61686980f8e1a90f382db Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 1 Dec 2016 07:39:03 -0500 Subject: [PATCH 525/816] Remove some unused functions --- which-key.el | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/which-key.el b/which-key.el index 81060112029..990c9aae36e 100644 --- a/which-key.el +++ b/which-key.el @@ -763,31 +763,6 @@ bottom." ;;; Helper functions to modify replacement lists. -(defun which-key--add-key-val-to-alist (alist key value &optional alist-name) - "Internal function to add (KEY . VALUE) to ALIST." - (when (or (not (stringp key)) (not (or (stringp value) (consp value)))) - (error "which-key: Error %s (key) should be a string and %s (value) should\ - be a string or cons of two strings." - key value)) - (let ((keys (key-description (kbd key)))) - (cond ((null alist) (list (cons keys value))) - ((assoc-string keys alist) - (when (not (equal (cdr (assoc-string keys alist)) value)) - (when which-key-is-verbose - (message "which-key: changing %s name from %s to %s in the %s alist" - key (cdr (assoc-string keys alist)) value alist-name)) - (setcdr (assoc-string keys alist) value)) - alist) - (t (cons (cons keys value) alist))))) - -(defun which-key-replace-key-binding (match-cons replace-cons) - (lambda (key-binding) - (cons - (replace-regexp-in-string - (car match-cons) (car replace-cons) (car key-binding)) - (replace-regexp-in-string - (cdr match-cons) (cdr replace-cons) (cdr key-binding))))) - ;;;###autoload (defun which-key-add-key-based-replacements (key-sequence replacement &rest more) "Replace the description of KEY-SEQUENCE with REPLACEMENT. @@ -1719,19 +1694,6 @@ is the width of the live window." (let (message-log-max) (message "%s" text))) -;; Caused some completion commands in the minibuffer to be overwritten, so -;; disable the hack for now -;; (defun which-key--echo (text) -;; "Echo TEXT to minibuffer without logging." -;; (let* ((minibuffer (eq which-key-popup-type 'minibuffer)) -;; (delay (if minibuffer -;; 0.2 -;; (+ (or echo-keystrokes 0) 0.001))) -;; message-log-max) -;; (run-with-idle-timer -;; delay nil (lambda () (let (message-log-max) -;; (message "%s" text)))))) - (defun which-key--next-page-hint (prefix-keys) "Return string for next page hint." (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) From 474d5bfaa66080096dfb02c3b0c9abaa4ffdc8f4 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 1 Dec 2016 07:39:19 -0500 Subject: [PATCH 526/816] Add some docstrings --- which-key.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/which-key.el b/which-key.el index 990c9aae36e..46bcfd10106 100644 --- a/which-key.el +++ b/which-key.el @@ -1265,6 +1265,8 @@ local bindings coming first. Within these categories order using (mapconcat #'identity (butlast (split-string str)) " ")) (defun which-key--replacement-test (alist-key key) + "`assoc-default' test to find bindings in `which-key-replacement-alist'. +Used in `which-key--maybe-replace'." (let (case-fold-search) (when (and (consp alist-key) (or (null (car alist-key)) @@ -1472,6 +1474,7 @@ alists. Returns a list (key separator description)." ;; adapted from helm-descbinds (defun which-key--get-current-bindings () + "Generate a list of current active bindings." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) (buffer (current-buffer)) (ignore-bindings '("self-insert-command" "ignore" "ignore-event" "company-ignore")) @@ -1743,6 +1746,7 @@ including prefix arguments." (propertize dash 'face 'which-key-key-face))))) (defun which-key--get-popup-map () + "Generate transient-map for use in the top level binding display." (unless which-key--current-prefix (let ((map (make-sparse-keymap))) (define-key map (kbd which-key-paging-key) #'which-key-C-h-dispatch) @@ -1752,6 +1756,9 @@ including prefix arguments." map))) (defun which-key--process-page (page-n pages-plist) + "Add information to the basic list of key bindings, including +if applicable the current prefix, the name of the current prefix, +and a page count." (let* ((page (nth page-n (plist-get pages-plist :pages))) (height (plist-get pages-plist :page-height)) (n-pages (plist-get pages-plist :n-pages)) From 22928eeffa89a465ec50f4c4eb6c9617ae0e94a5 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 1 Dec 2016 07:42:32 -0500 Subject: [PATCH 527/816] Remove old obsolete variables/functions --- which-key.el | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/which-key.el b/which-key.el index 46bcfd10106..d171b587ad0 100644 --- a/which-key.el +++ b/which-key.el @@ -145,7 +145,7 @@ that represent a sub-map). Default is \"+\"." (delq nil `(((nil . "Prefix Command") . (nil . "prefix")) ((nil . "\\`\\?\\?\\'") . (nil . "lambda")) - ((nil . "which-key-show-next-page") . (nil . "wk next pg")) + ((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg")) (("<\\([[:alnum:]-]+\\)>") . ("\\1")) ,@(unless which-key-dont-use-unicode '((("left") . ("←")) @@ -363,11 +363,6 @@ prefixes in `which-key-paging-prefixes'" a which-key paging command when which-key-mode is active." :group 'which-key :type 'boolean) -(defvaralias 'which-key-use-C-h-for-paging - 'which-key-use-C-h-commands) -(make-obsolete-variable 'which-key-use-C-h-for-paging - 'which-key-use-C-h-commands - "2015-12-2") (defcustom which-key-is-verbose nil "Whether to warn about potential mistakes in configuration." @@ -392,7 +387,6 @@ prefixes in `which-key-paging-prefixes'" (defvar which-key--paging-functions '(which-key-C-h-dispatch which-key-turn-page - which-key-show-next-page which-key-show-next-page-cycle which-key-show-next-page-no-cycle which-key-show-previous-page-cycle @@ -400,18 +394,6 @@ prefixes in `which-key-paging-prefixes'" which-key-undo-key which-key-undo)) -(defcustom which-key-prevent-C-h-from-cycling t - "When using C-h for paging, which-key overrides the default - behavior of calling `describe-prefix-bindings'. Setting this - variable to t makes it so that when on the last page, pressing - C-h calls the default function instead of cycling pages. If you - want which-key to cycle, set this to nil." - :group 'which-key - :type 'boolean) -(make-obsolete-variable 'which-key-prevent-C-h-from-cycling - "No longer applies. See `which-key-C-h-dispatch'" - "2015-12-2") - (defcustom which-key-hide-alt-key-translations t "Hide key translations using Alt key if non nil. These translations are not relevant most of the times since a lot @@ -1896,9 +1878,6 @@ call `which-key-show-standard-help'." which-key--on-last-page) (which-key-show-standard-help) (which-key-turn-page 1)))) -(defalias 'which-key-show-next-page 'which-key-show-next-page-no-cycle) -(make-obsolete 'which-key-show-next-page 'which-key-show-next-page-no-cycle - "2015-12-2") ;;;###autoload (defun which-key-show-previous-page-no-cycle () From cf698ea25e8787c0440eabf7bdfd141329b6debf Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 5 Dec 2016 13:55:25 -0500 Subject: [PATCH 528/816] Add basic timing facility for debugging. --- which-key.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index d171b587ad0..84beedace6b 100644 --- a/which-key.el +++ b/which-key.el @@ -568,6 +568,7 @@ used.") (defvar which-key--previous-frame-size nil) (defvar which-key--last-replace-key nil) (defvar which-key--prefix-title-alist nil) +(defvar which-key--debug nil) (make-obsolete-variable 'which-key-prefix-name-alist nil "2016-10-05") (make-obsolete-variable 'which-key-prefix-title-alist nil "2016-10-05") @@ -2100,7 +2101,8 @@ is selected interactively by mode in `minor-mode-map-alist'." Finally, show the buffer." (setq which-key--current-prefix prefix-keys which-key--last-try-2-loc nil) - (let ((formatted-keys (which-key--get-formatted-key-bindings)) + (let ((start-time (when which-key--debug (current-time))) + (formatted-keys (which-key--get-formatted-key-bindings)) (prefix-keys (key-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys)) @@ -2110,7 +2112,10 @@ Finally, show the buffer." formatted-keys 0 which-key-side-window-location))) (t (setq which-key--pages-plist (which-key--create-pages formatted-keys)) - (which-key--show-page 0))))) + (which-key--show-page 0))) + (when which-key--debug + (message "On prefix \"%s\" which-key took %.0f ms." prefix-keys + (* 1000 (float-time (time-since start-time))))))) (defun which-key--update () "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." From 786d800f61e25a1892c44f68a3e21c0507d03a1d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 5 Dec 2016 14:09:36 -0500 Subject: [PATCH 529/816] Prevent display from occurring twice in a row Found some cases where this could happen with a secondary idle delay. --- which-key.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 84beedace6b..c8a08295c5f 100644 --- a/which-key.el +++ b/which-key.el @@ -2171,12 +2171,13 @@ Finally, show the buffer." (bound-and-true-p god-local-mode) (eq this-command 'god-mode-self-insert)) (null this-command))) - (when (or (null which-key-delay-functions) - (null (setq delay-time (run-hook-with-args-until-success - 'which-key-delay-functions - (key-description prefix-keys) - (length prefix-keys)))) - (sit-for delay-time)) + (when (and (not (equal prefix-keys which-key--current-prefix)) + (or (null which-key-delay-functions) + (null (setq delay-time (run-hook-with-args-until-success + 'which-key-delay-functions + (key-description prefix-keys) + (length prefix-keys)))) + (sit-for delay-time))) (which-key--create-buffer-and-show prefix-keys) (when (and which-key-idle-secondary-delay (not which-key--secondary-timer-active)) From c34cfd69a93ceb64ee6eb75468c32be06371eb8d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 7 Dec 2016 10:14:08 -0500 Subject: [PATCH 530/816] Add a missing type declaration --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index c8a08295c5f..c5746a3f445 100644 --- a/which-key.el +++ b/which-key.el @@ -202,7 +202,8 @@ pattern for matching command names and use `which-key-highlighted-command-face' for any matching names. If the element is a cons cell, it should take the form (regexp . face to apply)." - :group 'which-key) + :group 'which-key + :type '(repeat (choice string (cons regexp face)))) (defcustom which-key-special-keys '() "These keys will automatically be truncated to one character From f0eb183af6ce87344af40813a20fbe81bf98c80a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 12 Dec 2016 09:04:44 -0500 Subject: [PATCH 531/816] Tweak TOC in README and fix a link --- README.org | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/README.org b/README.org index 3972295d421..764fcd46c76 100644 --- a/README.org +++ b/README.org @@ -2,7 +2,7 @@ [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] ** Recent Changes -*** [2016-11-21] Replacement list changes +*** 2016-11-21: Replacement list changes The alists controlling the replacement of key binding descriptions was simplified to use one centralized alist, =which-key-replacement-alist=. This change also allows for some new features compared to the old method. The other @@ -18,8 +18,10 @@ prefixes like =C-x 8= which are shown in a different face. Screenshots of what the popup will look like are included below. =which-key= started as a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged to a certain extent. -** Table of Contents :TOC@4: +** Table of Contents :TOC_3: - [[#which-key][which-key]] + - [[#recent-changes][Recent Changes]] + - [[#2016-11-21-replacement-list-changes][2016-11-21: Replacement list changes]] - [[#introduction][Introduction]] - [[#install][Install]] - [[#melpa][MELPA]] @@ -32,17 +34,9 @@ the popup will look like are included below. =which-key= started as a rewrite of - [[#additional-commands][Additional Commands]] - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - [[#popup-type-options][Popup Type Options]] - - [[#minibuffer][minibuffer]] - - [[#side-window][side window]] - - [[#frame][frame]] - - [[#custom][custom]] - [[#custom-string-replacement-options][Custom String Replacement Options]] - - [[#key-based-replacement]["Key-Based" replacement]] - - [[#key-and-description-replacement][Key and Description replacement]] - [[#sorting-options][Sorting Options]] - [[#paging-options][Paging Options]] - - [[#method-1-default-using-c-h-or-help-char][Method 1 (default): Using C-h (or =help-char=)]] - - [[#method-2-bind-your-own-keys][Method 2: Bind your own keys]] - [[#face-customization-options][Face Customization Options]] - [[#other-options][Other Options]] - [[#support-for-third-party-libraries][Support for Third-Party Libraries]] @@ -215,6 +209,7 @@ current implementation of side-window bottom). #+END_SRC *** Custom String Replacement Options + #+NAME: #custom-string-replacement-options You can customize the way the keys show in the buffer using three different replacement methods, each of which corresponds replacement alist. The basic idea of behind each alist is that you specify a selection string in the =car= of each From 3cd9457f96f694fac3279416ccd366517d69cadd Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 15 Dec 2016 09:42:08 -0500 Subject: [PATCH 532/816] Fix #156 by allowing multiple replacements Add which-key-allow-multiple-replacements which can be set to allow multiple replacements from which-key-replacement-alist to apply to a key binding. Switch from using assoc-default to find replacements to which-key--get-replacements. Adjusts tests and add a new one for multiple replacements. --- which-key-tests.el | 19 +++++++++- which-key.el | 92 ++++++++++++++++++++++++++++------------------ 2 files changed, 74 insertions(+), 37 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 93e1dfa969f..aa50ec01ae7 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -51,7 +51,8 @@ '((("C-c [a-d]" . nil) . ("C-c a" . "c-c a")) (("C-c .+" . nil) . ("C-c *" . "c-c *")))) (test-mode-1 t) - (test-mode-2 nil)) + (test-mode-2 nil) + which-key-allow-multiple-replacements) (which-key-add-key-based-replacements "C-c ." "test ." "SPC ." "SPC ." @@ -97,5 +98,21 @@ (which-key--maybe-replace '("SPC t 2" . "test mode")) '("SPC t 2" . "[ ] test mode"))))) +(ert-deftest which-key-test--maybe-replace-multiple () + "Test `which-key-allow-multiple-replacements'. See #156" + (let ((which-key-replacement-alist + '(((nil . "helm") . (nil . "HLM")) + ((nil . "projectile") . (nil . "PRJTL")))) + (which-key-allow-multiple-replacements t)) + (should (equal + (which-key--maybe-replace '("C-c C-c" . "helm-x")) + '("C-c C-c" . "HLM-x"))) + (should (equal + (which-key--maybe-replace '("C-c C-c" . "projectile-x")) + '("C-c C-c" . "PRJTL-x"))) + (should (equal + (which-key--maybe-replace '("C-c C-c" . "helm-projectile-x")) + '("C-c C-c" . "HLM-PRJTL-x"))))) + (provide 'which-key-tests) ;;; which-key-tests.el ends here diff --git a/which-key.el b/which-key.el index c5746a3f445..56dad94e3c2 100644 --- a/which-key.el +++ b/which-key.el @@ -177,7 +177,11 @@ REPLACEMENT may also be a function taking a cons cell \(KEY . BINDING\) and producing a new corresponding cons cell. If REPLACEMENT is anything other than a cons cell \(and non nil\) -the key binding is ignored by which-key." +the key binding is ignored by which-key. + +Finally, you can multiple replacements to occur for a given key +binding by setting `which-key-allow-multiple-replacements' to a +non-nil value." :group 'which-key :type '(alist :key-type (alist :key-type regexp :value-type regexp) :value-type (alist :key-type regexp :value-type regexp))) @@ -195,6 +199,14 @@ the key binding is ignored by which-key." which-key-replacement-alist)) which-key-description-replacement-alist)) +(defcustom which-key-allow-multiple-replacements nil + "Allow a key binding to match and be modified by multiple +elements in `which-key-replacement-alist' if non-nil. When nil, +only the first match is used to perform replacements from +`which-key-replacement-alist'." + :group 'which-key + :type 'boolean) + (defcustom which-key-highlighted-command-list '() "A list of strings and/or cons cells used to highlight certain commands. If the element is a string, assume it is a regexp @@ -1248,46 +1260,54 @@ local bindings coming first. Within these categories order using (defsubst which-key--butlast-string (str) (mapconcat #'identity (butlast (split-string str)) " ")) -(defun which-key--replacement-test (alist-key key) - "`assoc-default' test to find bindings in `which-key-replacement-alist'. -Used in `which-key--maybe-replace'." - (let (case-fold-search) - (when (and (consp alist-key) - (or (null (car alist-key)) - (string-match-p (car alist-key) (car key))) - (or (null (cdr alist-key)) - (string-match-p (cdr alist-key) (cdr key)))) - (setq which-key--last-replace-key alist-key)))) +(defun which-key--get-replacements (key-binding &optional use-major-mode) + (let ((alist (or (and use-major-mode + (cdr-safe (assq major-mode which-key-replacement-alist))) + which-key-replacement-alist)) + res case-fold-search) + (catch 'res + (dolist (replacement alist) + ;; these are mode specific ones to ignore. The mode specific case is + ;; handled in the selection of alist + (unless (symbolp (car replacement)) + (let ((key-regexp (caar replacement)) + (binding-regexp (cdar replacement))) + (when (and (or (null key-regexp) + (string-match-p key-regexp + (car key-binding))) + (or (null binding-regexp) + (string-match-p binding-regexp + (cdr key-binding)))) + (push replacement res) + (when (not which-key-allow-multiple-replacements) + (throw 'res res))))))) + (nreverse res))) (defun which-key--maybe-replace (key-binding) "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." - (setq which-key--last-replace-key nil) - (let* ((mode-alist (assq major-mode which-key-replacement-alist)) - (mode-res (when mode-alist - (assoc-default - key-binding mode-alist 'which-key--replacement-test))) - (res (or mode-res - (assoc-default - key-binding which-key-replacement-alist - 'which-key--replacement-test)))) - (cond ((null res) key-binding) - ((functionp res) (funcall res key-binding)) - ((consp res) - (cons - (cond ((and (car res) (car which-key--last-replace-key)) - (replace-regexp-in-string - (car which-key--last-replace-key) - (car res) (car key-binding) t)) - ((car res) (car res)) - (t (car key-binding))) - (cond ((and (cdr res) (cdr which-key--last-replace-key)) - (replace-regexp-in-string - (cdr which-key--last-replace-key) - (cdr res) (cdr key-binding) t)) - ((cdr res) (cdr res)) - (t (cdr key-binding)))))))) + (let* ((mode-res (which-key--get-replacements key-binding t)) + (all-repls (or mode-res + (which-key--get-replacements key-binding)))) + (dolist (repl all-repls key-binding) + (setq key-binding + (cond ((or (not (consp repl)) (null (cdr repl))) + key-binding) + ((functionp (cdr repl)) + (funcall (cdr repl) key-binding)) + ((consp (cdr repl)) + (cons + (cond ((and (caar repl) (cadr repl)) + (replace-regexp-in-string + (caar repl) (cadr repl) (car key-binding) t)) + ((cadr repl) (cadr repl)) + (t (car key-binding))) + (cond ((and (cdar repl) (cddr repl)) + (replace-regexp-in-string + (cdar repl) (cddr repl) (cdr key-binding) t)) + ((cddr repl) (cddr repl)) + (t (cdr key-binding)))))))))) (defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence which-key--current-prefix) From 07ff661a0b712dc70675ed84529ffe314f2db9ee Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 15 Dec 2016 09:58:32 -0500 Subject: [PATCH 533/816] Remove unused variable --- which-key.el | 1 - 1 file changed, 1 deletion(-) diff --git a/which-key.el b/which-key.el index 56dad94e3c2..6545026c7f2 100644 --- a/which-key.el +++ b/which-key.el @@ -579,7 +579,6 @@ used.") (defvar which-key--current-show-keymap-name nil) (defvar which-key--prior-show-keymap-args nil) (defvar which-key--previous-frame-size nil) -(defvar which-key--last-replace-key nil) (defvar which-key--prefix-title-alist nil) (defvar which-key--debug nil) From 47c6f914c3985c5719edf710848d372fc2640b26 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 20 Dec 2016 15:56:35 -0500 Subject: [PATCH 534/816] Add which-key-max-display-columns See #157 --- which-key.el | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 6545026c7f2..9a44be9b458 100644 --- a/which-key.el +++ b/which-key.el @@ -256,6 +256,12 @@ and nil. Nil turns the feature off." :group 'which-key :type 'integer) +(defcustom which-key-max-display-columns nil + "The maximum number of columns to display in the which-key +buffer. nil means don't impose a maximum." + :group 'which-key + :type 'integer) + (defcustom 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. You can also specify @@ -1608,7 +1614,7 @@ Returns a plist that holds the page strings, as well as metadata." (let ((cols-w-widths (mapcar #'which-key--pad-column (which-key--partition-list avl-lines keys))) - (page-width 0) (n-pages 0) (n-keys 0) + (page-width 0) (n-pages 0) (n-keys 0) (n-columns 0) page-cols pages page-widths keys/page col) (if (> (apply #'max (mapcar #'car cols-w-widths)) avl-width) ;; give up if no columns fit @@ -1617,17 +1623,21 @@ metadata." (while cols-w-widths ;; start new page (cl-incf n-pages) - (setq col (pop cols-w-widths) - page-cols (list (cdr col)) - page-width (car col) - n-keys (length (cdr col))) + (setq col (pop cols-w-widths)) + (setq page-cols (list (cdr col))) + (setq page-width (car col)) + (setq n-keys (length (cdr col))) + (setq n-columns 1) ;; add additional columns as long as they fit (while (and cols-w-widths + (or (null which-key-max-display-columns) + (< n-columns which-key-max-display-columns)) (<= (+ (caar cols-w-widths) page-width) avl-width)) (setq col (pop cols-w-widths)) (push (cdr col) page-cols) (cl-incf page-width (car col)) - (cl-incf n-keys (length (cdr col)))) + (cl-incf n-keys (length (cdr col))) + (cl-incf n-columns)) (push (which-key--join-columns page-cols) pages) (push n-keys keys/page) (push page-width page-widths)) From a3a989e804bc1bc0b823cbd5facd326a82674074 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 20 Dec 2016 16:03:21 -0500 Subject: [PATCH 535/816] Update README --- README.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.org b/README.org index 764fcd46c76..ac8b97ffdb8 100644 --- a/README.org +++ b/README.org @@ -2,6 +2,8 @@ [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] ** Recent Changes +*** 2016-12-20: Added =which-key-max-display-columns= +Allows control over the number of columns in the popup. See [[#other-options][Other Options]]. *** 2016-11-21: Replacement list changes The alists controlling the replacement of key binding descriptions was simplified to use one centralized alist, =which-key-replacement-alist=. This @@ -21,6 +23,7 @@ the popup will look like are included below. =which-key= started as a rewrite of ** Table of Contents :TOC_3: - [[#which-key][which-key]] - [[#recent-changes][Recent Changes]] + - [[#2016-12-20-added-which-key-max-display-columns][2016-12-20: Added =which-key-max-display-columns=]] - [[#2016-11-21-replacement-list-changes][2016-11-21: Replacement list changes]] - [[#introduction][Introduction]] - [[#install][Install]] @@ -398,6 +401,7 @@ You can also use =M-x customize-face= to customize any of the above faces to your liking. *** Other Options + #+NAME: #other-options The options below are also available through customize. Their defaults are shown. @@ -414,6 +418,10 @@ shown. ;; number of spaces to add to the left of each column. (setq which-key-add-column-padding 0) + ;; The maximum number of columns to display in the which-key buffer. nil means + ;; don't impose a maximum. + (setq which-key-max-display-columns nil) + ;; Set the separator used between keys and descriptions. Change this setting to ;; an ASCII character if your font does not show the default arrow. The second ;; setting here allows for extra padding for Unicode characters. which-key uses From 49ab7afd93ef36e5f0261eff7151360edeeea4e6 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 22 Dec 2016 15:21:37 -0500 Subject: [PATCH 536/816] Add which-key-show-prefix 'mode-line option See #157 --- which-key.el | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 9a44be9b458..1585c87f84b 100644 --- a/which-key.el +++ b/which-key.el @@ -240,6 +240,7 @@ and nil. Nil turns the feature off." (const :tag "In the first line" top) (const :tag "In the last line" bottom) (const :tag "In the echo area" echo) + (const :tag "In the mode-line" mode-line) (const :tag "Hide" nil))) (defcustom which-key-popup-type 'side-window @@ -1825,9 +1826,17 @@ and a page count." nil)) (`echo (cons page - (concat full-prefix (when prefix-keys " ") - status-line (when status-line " ") - nxt-pg-hint))) + (lambda () + (which-key--echo + (concat full-prefix (when prefix-keys " ") + status-line (when status-line " ") + nxt-pg-hint))))) + (`mode-line + (cons page + (lambda () + (with-current-buffer which-key--buffer + (setq-local mode-line-format + (concat " " full-prefix " " status-line " " nxt-pg-hint)))))) (_ (cons page nil))))) (defun which-key--show-page (n) @@ -1839,8 +1848,8 @@ and a page count." (if (= 0 n-pages) (message "%s- which-key can't show keys: There is not \ enough space based on your settings and frame size." prefix-keys) - (setq page-n (mod n n-pages) - which-key--current-page-n page-n) + (setq page-n (mod n n-pages)) + (setq which-key--current-page-n page-n) (when (= n-pages (1+ n)) (setq which-key--on-last-page t)) (let ((page-echo (which-key--process-page page-n which-key--pages-plist)) (height (plist-get which-key--pages-plist :page-height)) @@ -1852,7 +1861,7 @@ enough space based on your settings and frame size." prefix-keys) (erase-buffer) (insert (car page-echo)) (goto-char (point-min))) - (when (cdr page-echo) (which-key--echo (cdr page-echo))) + (when (cdr page-echo) (funcall (cdr page-echo))) (which-key--show-popup (cons height width))))) ;; used for paging at top-level (if (fboundp 'set-transient-map) From ea6f1dc5aacff2f3d909e410db05af01966555aa Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 7 Feb 2017 10:55:14 -0500 Subject: [PATCH 537/816] Version 2.0 Increased major version for replacement list changes --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 1585c87f84b..4a386a1fd73 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 1.1.15 +;; Version: 2.0 ;; Keywords: ;; Package-Requires: ((emacs "24.3")) From 0d56e4369b53af2c5960af4827b56b06d9162d62 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 9 Feb 2017 10:27:41 -0500 Subject: [PATCH 538/816] Fix handling of key ranges ("a .. d") When the last key in the key sequence is a range, extract the whole range instead of just the final key. Fixes #161 --- which-key-tests.el | 10 +++++++++- which-key.el | 12 ++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index aa50ec01ae7..1312f832c8d 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -99,7 +99,7 @@ '("SPC t 2" . "[ ] test mode"))))) (ert-deftest which-key-test--maybe-replace-multiple () - "Test `which-key-allow-multiple-replacements'. See #156" + "Test `which-key-allow-multiple-replacements'. See #156." (let ((which-key-replacement-alist '(((nil . "helm") . (nil . "HLM")) ((nil . "projectile") . (nil . "PRJTL")))) @@ -114,5 +114,13 @@ (which-key--maybe-replace '("C-c C-c" . "helm-projectile-x")) '("C-c C-c" . "HLM-PRJTL-x"))))) +(ert-deftest which-key-test--key-extraction () + "Test `which-key--extract-key'. See #161." + (should (equal (which-key--extract-key "SPC a") "a")) + (should (equal (which-key--extract-key "C-x a") "a")) + (should (equal (which-key--extract-key " b a") "a")) + (should (equal (which-key--extract-key " a .. c") "a .. c")) + (should (equal (which-key--extract-key "M-a a .. c") "a .. c"))) + (provide 'which-key-tests) ;;; which-key-tests.el ends here diff --git a/which-key.el b/which-key.el index 4a386a1fd73..e9c2170ebdd 100644 --- a/which-key.el +++ b/which-key.el @@ -1439,6 +1439,14 @@ ORIGINAL-DESCRIPTION is the description given by str)))))) desc)) +(defun which-key--extract-key (key-str) + "Pull the last key (or key range) out of KEY-STR." + (save-match-data + (let ((key-range-regexp "\\`.*\\([^ \t]+ \\.\\. [^ \t]+\\)\\'")) + (if (string-match key-range-regexp key-str) + (match-string 1 key-str) + (car (last (split-string key-str " "))))))) + (defun which-key--format-and-replace (unformatted) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement @@ -1451,7 +1459,7 @@ alists. Returns a list (key separator description)." (let* ((key (car key-binding)) (orig-desc (cdr key-binding)) (group (which-key--group-p orig-desc)) - (keys (which-key--current-key-string key)) + (keys (concat (which-key--current-key-string) " " key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern orig-desc))) (hl-face (which-key--highlight-face orig-desc)) @@ -1459,7 +1467,7 @@ alists. Returns a list (key separator description)." (when (consp key-binding) (push (list (which-key--propertize-key - (car (last (split-string (car key-binding) " ")))) + (which-key--extract-key (car key-binding))) sep-w-face (which-key--propertize-description (cdr key-binding) group local hl-face orig-desc)) From 3c7ecc69d48258af66978a685aedcbc8d1ada512 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 15 Mar 2017 13:55:01 -0400 Subject: [PATCH 539/816] Fix replacement of keys when prefix is nil The prefix is nil at the top-level keymap Fixes #163 --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e9c2170ebdd..cc3cc0dc81c 100644 --- a/which-key.el +++ b/which-key.el @@ -1459,7 +1459,10 @@ alists. Returns a list (key separator description)." (let* ((key (car key-binding)) (orig-desc (cdr key-binding)) (group (which-key--group-p orig-desc)) - (keys (concat (which-key--current-key-string) " " key)) + ;; At top-level prefix is nil + (keys (if which-key--current-prefix + (concat (which-key--current-key-string) " " key) + key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern orig-desc))) (hl-face (which-key--highlight-face orig-desc)) From bb30f56868ae4888a8ac5a406c7c7ee2ff168f9b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 7 Apr 2017 09:05:10 -0400 Subject: [PATCH 540/816] Fix customize type for replacement-alist Ref #165 --- which-key.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index cc3cc0dc81c..825e1cb0377 100644 --- a/which-key.el +++ b/which-key.el @@ -183,8 +183,10 @@ Finally, you can multiple replacements to occur for a given key binding by setting `which-key-allow-multiple-replacements' to a non-nil value." :group 'which-key - :type '(alist :key-type (alist :key-type regexp :value-type regexp) - :value-type (alist :key-type regexp :value-type regexp))) + :type '(alist :key-type (cons (choice regexp nil) + (choice regexp nil)) + :value-type (cons (choice string nil) + (choice string nil)))) (when (bound-and-true-p which-key-key-replacement-alist) (mapc From 2e855196c78420b76f6f6cb92822255669599d7e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 18 Apr 2017 08:01:40 -0400 Subject: [PATCH 541/816] Improve which-key--any-match-p --- which-key.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 825e1cb0377..6cc4fd9fc31 100644 --- a/which-key.el +++ b/which-key.el @@ -2023,11 +2023,10 @@ prefix) if `which-key-use-C-h-commands' is non nil." (defun which-key--any-match-p (regexps string) "Non-nil if any of REGEXPS match STRING." - (let (match) + (catch 'match (dolist (regexp regexps) (when (string-match-p regexp string) - (setq match t))) - match)) + (throw 'match t))))) (defun which-key--try-2-side-windows (keys page-n loc1 loc2 &rest _ignore) "Try to show KEYS (PAGE-N) in LOC1 first. Only if no keys fit fallback to LOC2." From cd4310457920721e60eae520df6249aacd86afff Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 26 Apr 2017 20:57:49 -0400 Subject: [PATCH 542/816] Add option to show transient maps Set which-key-show-transient-maps to a non-nil value to use this feature. When a transient map is active and it is not a hydra, show the keys from the map. Fixes #164 --- which-key.el | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 6cc4fd9fc31..16b16c13480 100644 --- a/which-key.el +++ b/which-key.el @@ -457,6 +457,15 @@ by `key-description'." :group 'which-key :type '(repeat regexp)) +(defcustom which-key-show-transient-maps nil + "Show keymaps created by `set-transient-map' when applicable. + +More specifically, detect when `overriding-terminal-local-map' is +set (this is the keymap used by `set-transient-map') and display +it." + :group 'which-key + :type 'boolean) + ;; Hooks (defvar which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized.") @@ -2147,13 +2156,15 @@ is selected interactively by mode in `minor-mode-map-alist'." (which-key--hide-popup) (setq unread-command-events (listify-key-sequence key)))))))) -(defun which-key--create-buffer-and-show (&optional prefix-keys) +(defun which-key--create-buffer-and-show (&optional prefix-keys from-keymap) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." (setq which-key--current-prefix prefix-keys which-key--last-try-2-loc nil) (let ((start-time (when which-key--debug (current-time))) - (formatted-keys (which-key--get-formatted-key-bindings)) + (formatted-keys (which-key--get-formatted-key-bindings + (when from-keymap + (which-key--get-keymap-bindings from-keymap)))) (prefix-keys (key-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys)) @@ -2233,6 +2244,12 @@ Finally, show the buffer." (when (and which-key-idle-secondary-delay (not which-key--secondary-timer-active)) (which-key--start-timer which-key-idle-secondary-delay t)))) + ((and which-key-show-transient-maps + (keymapp overriding-terminal-local-map) + ;; basic test for it being a hydra + (not (eq (lookup-key overriding-terminal-local-map "\C-u") + 'hydra--universal-argument))) + (which-key--create-buffer-and-show nil overriding-terminal-local-map)) ((and which-key-show-operator-state-maps (bound-and-true-p evil-state) (eq evil-state 'operator) From 9d2ba1bcba289fb81f92b797022b238c6b21f82e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 1 May 2017 08:44:32 -0400 Subject: [PATCH 543/816] Make -init-buffer-hook a custom var --- which-key.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 16b16c13480..2bc30ba8f49 100644 --- a/which-key.el +++ b/which-key.el @@ -467,8 +467,10 @@ it." :type 'boolean) ;; Hooks -(defvar which-key-init-buffer-hook '() - "Hook run when which-key buffer is initialized.") +(defcustom which-key-init-buffer-hook '() + "Hook run when which-key buffer is initialized." + :group 'which-key + :type 'hook) ;;;; Faces From 9a97df02c2314946703d062ca0b9c87ba63090f1 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 16 May 2017 07:35:36 -0400 Subject: [PATCH 544/816] Update emacs versions for Travis --- .travis.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis.yml b/.travis.yml index cdea71fe995..b22aa137742 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,14 +11,18 @@ before_install: - cask env: + - EVM_EMACS=emacs-24.3-travis - EVM_EMACS=emacs-24.4-travis - EVM_EMACS=emacs-24.5-travis + - EVM_EMACS=emacs-25.1-travis + - EVM_EMACS=emacs-25.2-travis - EVM_EMACS=emacs-git-snapshot-travis matrix: fast_finish: true allow_failures: env: + - EVM_EMACS=emacs-24.3-travis - EVM_EMACS=emacs-git-snapshot-travis script: From 806ef2439090af09503fc6179f23f95a7eaaef7f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 16 May 2017 08:34:01 -0400 Subject: [PATCH 545/816] Add .cask to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 77633d2fc83..de0966b3271 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.elc # Used to setup library paths for emacs -Q private-test-setup.el +/.cask/ From 20146731c24635d5b86acb19ca5314f269f1892c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 16 May 2017 08:34:44 -0400 Subject: [PATCH 546/816] Prepare for ELPA release Update min emacs version to 24.4 to remove backported functions. Remove outdated comments. --- which-key.el | 38 +++----------------------------------- 1 file changed, 3 insertions(+), 35 deletions(-) diff --git a/which-key.el b/which-key.el index 2bc30ba8f49..4065e645359 100644 --- a/which-key.el +++ b/which-key.el @@ -6,7 +6,7 @@ ;; URL: https://github.com/justbur/emacs-which-key ;; Version: 2.0 ;; Keywords: -;; Package-Requires: ((emacs "24.3")) +;; Package-Requires: ((emacs "24.4")) ;; 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 @@ -1506,7 +1506,6 @@ alists. Returns a list (key separator description)." keymap) bindings)) -;; adapted from helm-descbinds (defun which-key--get-current-bindings () "Generate a list of current active bindings." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) @@ -1530,12 +1529,8 @@ alists. Returns a list (key separator description)." (setq header-p nil) (forward-line 3)) ((= (char-after) ?\f) - ;; (push (cons header (nreverse section)) bindings) - ;; (setq section nil) (setq header-p t)) - ((looking-at "^[ \t]*$") - ;; ignore - ) + ((looking-at "^[ \t]*$")) ((or (not (string-match-p ignore-sections-regexp header)) which-key--current-prefix) (let ((binding-start (save-excursion @@ -1543,10 +1538,7 @@ alists. Returns a list (key separator description)." (match-end 0)))) key binding) (when binding-start - (setq key (buffer-substring-no-properties (point) binding-start) - ;; key (replace-regexp-in-string"^[ \t\n]+" "" key) - ;; key (replace-regexp-in-string"[ \t\n]+$" "" key) - ) + (setq key (buffer-substring-no-properties (point) binding-start)) (setq binding (buffer-substring-no-properties binding-start (line-end-position))) @@ -2185,11 +2177,6 @@ Finally, show the buffer." "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." (let ((prefix-keys (this-single-command-keys)) delay-time) - ;; (when (> (length prefix-keys) 0) - ;; (message "key: %s" (key-description prefix-keys))) - ;; (when (> (length prefix-keys) 0) - ;; (message "key binding: %s" (key-binding prefix-keys))) - ;; Taken from guide-key (when (and (equal prefix-keys [key-chord]) (bound-and-true-p key-chord-mode)) (setq prefix-keys @@ -2295,24 +2282,5 @@ Finally, show the buffer." (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) -;;; backport some functions for 24.3 - -;; found at https://github.com/Lindydancer/andersl-old-emacs-support/blob/master/andersl-old-emacs-support.el -(unless (fboundp 'frame-fringe-width) - (defun frame-fringe-width (&optional frame) - "Return fringe width of FRAME in pixels." - (let ((left-pair (assq 'left-fringe (frame-parameters frame))) - (right-pair (assq 'right-fringe (frame-parameters frame)))) - (+ (if left-pair (cdr left-pair) 0) - (if right-pair (cdr right-pair) 0))))) - -(unless (fboundp 'frame-scroll-bar-width) - (defun frame-scroll-bar-width (&optional frame) - "Return scroll bar width of FRAME in pixels." - (let ((pair (assq 'scroll-bar-width (frame-parameters frame)))) - (if pair - (cdr pair) - 0)))) - (provide 'which-key) ;;; which-key.el ends here From bd20f56ad98edbc7e8a2d1c1e2327209e6cba093 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 16 May 2017 08:37:06 -0400 Subject: [PATCH 547/816] Version 3.0 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 4065e645359..cd77d194a79 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 2.0 +;; Version: 3.0 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From e8db06ec4217d9b91170414d0efc37a7a26f9576 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 19 May 2017 15:48:56 -0400 Subject: [PATCH 548/816] Add which-key-compute-remaps option * which-key.el (which-key--compute-binding): Add (which-key--get-current-bindings): Modify to use prev function (which-key-compute-remaps): Add option Fixes #169 --- which-key.el | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index cd77d194a79..fcb75cbd07b 100644 --- a/which-key.el +++ b/which-key.el @@ -131,6 +131,12 @@ that represent a sub-map). Default is \"+\"." :group 'which-key :type 'string) +(defcustom which-key-compute-remaps nil + "If non-nil, show remapped command if a command has been +remapped given the currently active keymaps." + :group 'which-key + :type 'boolean) + (defvar which-key-key-replacement-alist nil) (make-obsolete-variable 'which-key-key-replacement-alist 'which-key-replacement-alist "2016-11-21") @@ -1506,6 +1512,16 @@ alists. Returns a list (key separator description)." keymap) bindings)) +(defun which-key--compute-binding (binding) + "Replace BINDING with remapped binding if it exists. + +Requires `which-key-compute-remaps' to be non-nil" + (let (remap) + (if (and which-key-compute-remaps + (setq remap (command-remapping (intern binding)))) + (symbol-name remap) + binding))) + (defun which-key--get-current-bindings () "Generate a list of current active bindings." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) @@ -1550,7 +1566,8 @@ alists. Returns a list (key separator description)." (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt) key)) (unless (assoc-string (match-string 1 key) bindings) - (push (cons (match-string 1 key) binding) bindings))) + (push (cons (match-string 1 key) + (which-key--compute-binding binding)) bindings))) ((and which-key--current-prefix (string-match (format @@ -1559,10 +1576,12 @@ alists. Returns a list (key separator description)." (let ((stripped-key (concat (match-string 1 key) " \.\. " (match-string 2 key)))) (unless (assoc-string stripped-key bindings) - (push (cons stripped-key binding) bindings)))) + (push (cons stripped-key + (which-key--compute-binding binding)) bindings)))) ((string-match "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$" key) (unless (assoc-string (match-string 1 key) bindings) - (push (cons (match-string 1 key) binding) bindings))))))))) + (push (cons (match-string 1 key) + (which-key--compute-binding binding)) bindings))))))))) (forward-line)) (nreverse bindings))))) From 23ca489988951823e8a21bb12ca73aac80cb9ba1 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 19 May 2017 17:37:08 -0400 Subject: [PATCH 549/816] Fixup previous commit * which-key.el (which-key--compute-binding): Need to copy name of remapped command Fixes #170 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index fcb75cbd07b..8f1b038292f 100644 --- a/which-key.el +++ b/which-key.el @@ -1519,7 +1519,7 @@ Requires `which-key-compute-remaps' to be non-nil" (let (remap) (if (and which-key-compute-remaps (setq remap (command-remapping (intern binding)))) - (symbol-name remap) + (copy-sequence (symbol-name remap)) binding))) (defun which-key--get-current-bindings () From 5dcf5d9b068ea42b8345dab5bb51e1e6aac19497 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 19 May 2017 17:53:43 -0400 Subject: [PATCH 550/816] Use regexp-opt for regexps * which-key.el (which-key--get-keymap-bindings): Update --- which-key.el | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 8f1b038292f..50a3f84baca 100644 --- a/which-key.el +++ b/which-key.el @@ -40,6 +40,7 @@ (require 'cl-lib) (require 'button) +(require 'regexp-opt) ;; For compiler (defvar evil-operator-shortcut-map) @@ -1526,9 +1527,16 @@ Requires `which-key-compute-remaps' to be non-nil" "Generate a list of current active bindings." (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) (buffer (current-buffer)) - (ignore-bindings '("self-insert-command" "ignore" "ignore-event" "company-ignore")) - (ignore-keys-regexp "mouse-\\|wheel-\\|remap\\|drag-\\|scroll-bar\\|select-window\\|switch-frame\\|-state") - (ignore-sections-regexp "\\(Key translations\\|Function key map translations\\|Input decoding map translations\\)")) + (ignore-bindings '("self-insert-command" "ignore" + "ignore-event" "company-ignore")) + (ignore-keys-regexp + (eval-when-compile + (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" + "select-window" "switch-frame" "-state")))) + (ignore-sections-regexp + (eval-when-compile + (regexp-opt '("Key translations" "Function key map translations" + "Input decoding map translations"))))) (with-temp-buffer (setq-local indent-tabs-mode t) (setq-local tab-width 8) From c61e63e97156a8a15fe75e7251597a0f5f1887f5 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 19 May 2017 17:55:13 -0400 Subject: [PATCH 551/816] Adhere to 80 chars per column --- which-key.el | 140 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 90 insertions(+), 50 deletions(-) diff --git a/which-key.el b/which-key.el index 50a3f84baca..4dc772bfd9c 100644 --- a/which-key.el +++ b/which-key.el @@ -786,7 +786,8 @@ bottom." ;;; Helper functions to modify replacement lists. ;;;###autoload -(defun which-key-add-key-based-replacements (key-sequence replacement &rest more) +(defun which-key-add-key-based-replacements + (key-sequence replacement &rest more) "Replace the description of KEY-SEQUENCE with REPLACEMENT. KEY-SEQUENCE is a string suitable for use in `kbd'. REPLACEMENT may either be a string, as in @@ -795,7 +796,8 @@ may either be a string, as in a cons of two strings as in -\(which-key-add-key-based-replacements \"C-x 8\" '(\"unicode\" . \"Unicode keys\")\) +\(which-key-add-key-based-replacements \"C-x 8\" + '(\"unicode\" . \"Unicode keys\")\) or a function that takes a \(KEY . BINDING\) cons and returns a replacement. @@ -1022,7 +1024,8 @@ is shown, or if there is no need to start the closing timer." (frame (which-key--show-buffer-frame act-popup-dim)) (custom (funcall which-key-custom-show-popup-function act-popup-dim))))) -(defun which-key--fit-buffer-to-window-horizontally (&optional window &rest params) +(defun which-key--fit-buffer-to-window-horizontally + (&optional window &rest params) "Slightly modified version of `fit-buffer-to-window'. Use &rest params because `fit-buffer-to-window' has a different call signature in different emacs versions" @@ -1071,9 +1074,12 @@ call signature in different emacs versions" (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)))) + (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)) @@ -1106,8 +1112,8 @@ call signature in different emacs versions" (defun which-key--show-buffer-reuse-frame (frame-height frame-width) "Helper for `which-key--show-buffer-frame'." (let ((window - (display-buffer-reuse-window which-key--buffer - `((reusable-frames . ,which-key--frame))))) + (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) @@ -1148,8 +1154,10 @@ width) in lines and characters respectively." ;; 1 is a kludge to make sure there is no overlap (- (frame-height) (window-text-height (minibuffer-window)) 1) ;; (window-mode-line-height which-key--window)) - ;; FIXME: change to something like (min which-*-height (calculate-max-height)) - (which-key--height-or-percentage-to-height which-key-side-window-max-height)) + ;; FIXME: change to something like + ;; (min which-*-height (calculate-max-height)) + (which-key--height-or-percentage-to-height + which-key-side-window-max-height)) ;; width (max 0 (- (if (member which-key-side-window-location '(left right)) @@ -1200,18 +1208,22 @@ width) in lines and characters respectively." (cond ((or aem? bem?) (and aem? (not bem?))) ((and asp? bsp?) (if (string-equal (substring a 0 3) (substring b 0 3)) - (which-key--key-description< (substring a 3) (substring b 3) alpha) + (which-key--key-description< + (substring a 3) (substring b 3) alpha) (which-key--string< a b alpha))) ((or asp? bsp?) asp?) ((and a1? b1?) (which-key--string< a b alpha)) ((or a1? b1?) a1?) ((and afn? bfn?) - (< (string-to-number (replace-regexp-in-string "" "\\1" a)) - (string-to-number (replace-regexp-in-string "" "\\1" b)))) + (< (string-to-number + (replace-regexp-in-string "" "\\1" a)) + (string-to-number + (replace-regexp-in-string "" "\\1" b)))) ((or afn? bfn?) afn?) ((and apr? bpr?) (if (string-equal (substring a 0 2) (substring b 0 2)) - (which-key--key-description< (substring a 2) (substring b 2) alpha) + (which-key--key-description< + (substring a 2) (substring b 2) alpha) (which-key--string< a b alpha))) ((or apr? bpr?) apr?) (t (which-key--string< a b alpha)))))) @@ -1288,7 +1300,8 @@ local bindings coming first. Within these categories order using (defun which-key--get-replacements (key-binding &optional use-major-mode) (let ((alist (or (and use-major-mode - (cdr-safe (assq major-mode which-key-replacement-alist))) + (cdr-safe + (assq major-mode which-key-replacement-alist))) which-key-replacement-alist)) res case-fold-search) (catch 'res @@ -1451,7 +1464,8 @@ ORIGINAL-DESCRIPTION is the description given by ((and original-description (fboundp (intern original-description)) (documentation (intern original-description)) - (let* ((doc (documentation (intern original-description))) + (let* ((doc (documentation + (intern original-description))) (str (replace-regexp-in-string "\n" " " doc)) (max (floor (* (frame-width) 0.8)))) (if (> (length str) max) @@ -1562,7 +1576,8 @@ Requires `which-key-compute-remaps' to be non-nil" (match-end 0)))) key binding) (when binding-start - (setq key (buffer-substring-no-properties (point) binding-start)) + (setq key (buffer-substring-no-properties + (point) binding-start)) (setq binding (buffer-substring-no-properties binding-start (line-end-position))) @@ -1575,21 +1590,26 @@ Requires `which-key-compute-remaps' to be non-nil" key-str-qt) key)) (unless (assoc-string (match-string 1 key) bindings) (push (cons (match-string 1 key) - (which-key--compute-binding binding)) bindings))) + (which-key--compute-binding binding)) + bindings))) ((and which-key--current-prefix (string-match (format "^%s[ \t]\\([^ \t]+\\) \\.\\. %s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt key-str-qt) key)) - (let ((stripped-key - (concat (match-string 1 key) " \.\. " (match-string 2 key)))) + (let ((stripped-key (concat (match-string 1 key) + " \.\. " + (match-string 2 key)))) (unless (assoc-string stripped-key bindings) (push (cons stripped-key - (which-key--compute-binding binding)) bindings)))) - ((string-match "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$" key) + (which-key--compute-binding binding)) + bindings)))) + ((string-match + "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$" key) (unless (assoc-string (match-string 1 key) bindings) (push (cons (match-string 1 key) - (which-key--compute-binding binding)) bindings))))))))) + (which-key--compute-binding binding)) + bindings))))))))) (forward-line)) (nreverse bindings))))) @@ -1740,14 +1760,16 @@ is the width of the live window." (when which-key-show-remaining-keys (let ((n-shown (nth page-n (plist-get which-key--pages-plist :keys/page))) (n-tot (plist-get which-key--pages-plist :tot-keys))) - (setq which-key--lighter-backup (cadr (assq 'which-key-mode minor-mode-alist))) + (setq which-key--lighter-backup + (cadr (assq 'which-key-mode minor-mode-alist))) (setcar (cdr (assq 'which-key-mode minor-mode-alist)) (format " WK: %s/%s keys" n-shown n-tot))))) (defun which-key--lighter-restore () "Restore the lighter for which-key." (when which-key-show-remaining-keys - (setcar (cdr (assq 'which-key-mode minor-mode-alist)) which-key--lighter-backup))) + (setcar (cdr (assq 'which-key-mode minor-mode-alist)) + which-key--lighter-backup))) (defun which-key--echo (text) "Echo TEXT to minibuffer without logging." @@ -1772,8 +1794,8 @@ is the width of the live window." (defalias 'which-key--universal-argument--description 'universal-argument--description) (defun which-key--universal-argument--description () - ;; Backport of the definition of universal-argument--description in emacs25 - ;; on 2015-12-04 + ;; Backport of the definition of universal-argument--description in + ;; emacs25 on 2015-12-04 (when prefix-arg (concat "C-u" (pcase prefix-arg @@ -1840,8 +1862,9 @@ and a page count." (prefix (format (concat "%-" (int-to-string first-col-width) "s") full-prefix)) (page-cnt (if (> n-pages 1) - (format (concat "%-" (int-to-string first-col-width) "s") - page-cnt) + (format + (concat "%-" (int-to-string first-col-width) "s") + page-cnt) (make-string first-col-width 32))) lines first-line new-end) (if (= 1 height) @@ -1879,7 +1902,9 @@ and a page count." (lambda () (with-current-buffer which-key--buffer (setq-local mode-line-format - (concat " " full-prefix " " status-line " " nxt-pg-hint)))))) + (concat " " full-prefix + " " status-line + " " nxt-pg-hint)))))) (_ (cons page nil))))) (defun which-key--show-page (n) @@ -1896,7 +1921,8 @@ enough space based on your settings and frame size." prefix-keys) (when (= n-pages (1+ n)) (setq which-key--on-last-page t)) (let ((page-echo (which-key--process-page page-n which-key--pages-plist)) (height (plist-get which-key--pages-plist :page-height)) - (width (nth page-n (plist-get which-key--pages-plist :page-widths)))) + (width + (nth page-n (plist-get which-key--pages-plist :page-widths)))) (which-key--lighter-status page-n) (if (eq which-key-popup-type 'minibuffer) (which-key--echo (car page-echo)) @@ -2029,20 +2055,26 @@ prefix) if `which-key-use-C-h-commands' is non nil." (let* ((prefix-keys (key-description which-key--current-prefix)) (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) (prompt (concat (when (string-equal prefix-keys "") - (propertize (concat " " - (or which-key--current-show-keymap-name - "Top-level bindings")) - 'face 'which-key-note-face)) + (propertize + (concat " " + (or which-key--current-show-keymap-name + "Top-level bindings")) + 'face 'which-key-note-face)) full-prefix (propertize (substitute-command-keys (concat " \\" - " \\[which-key-show-next-page-cycle]" which-key-separator "next-page," - " \\[which-key-show-previous-page-cycle]" which-key-separator "previous-page," - " \\[which-key-undo-key]" which-key-separator "undo-key," - " \\[which-key-show-standard-help]" which-key-separator "help," - " \\[which-key-abort]" which-key-separator "abort")) + " \\[which-key-show-next-page-cycle]" + which-key-separator "next-page," + " \\[which-key-show-previous-page-cycle]" + which-key-separator "previous-page," + " \\[which-key-undo-key]" + which-key-separator "undo-key," + " \\[which-key-show-standard-help]" + which-key-separator "help," + " \\[which-key-abort]" + which-key-separator "abort")) 'face 'which-key-note-face))) (key (string (read-key prompt))) (cmd (lookup-key which-key-C-h-map key)) @@ -2059,7 +2091,9 @@ prefix) if `which-key-use-C-h-commands' is non nil." (throw 'match t))))) (defun which-key--try-2-side-windows (keys page-n loc1 loc2 &rest _ignore) - "Try to show KEYS (PAGE-N) in LOC1 first. Only if no keys fit fallback to LOC2." + "Try to show KEYS (PAGE-N) in LOC1 first. + +Only if no keys fit fallback to LOC2." (let (pages1) (let ((which-key-side-window-location loc1) (which-key--multiple-locations t)) @@ -2088,9 +2122,11 @@ is selected interactively from all available keymaps." (lambda (m) (and (boundp m) (keymapp (symbol-value m)) - (not (equal (symbol-value m) (make-sparse-keymap))))) + (not (equal (symbol-value m) + (make-sparse-keymap))))) t nil 'which-key-keymap-history)))) - (which-key--show-keymap (symbol-name keymap-sym) (symbol-value keymap-sym)))) + (which-key--show-keymap (symbol-name keymap-sym) + (symbol-value keymap-sym)))) (defun which-key-show-minor-mode-keymap () "Show the top-level bindings in KEYMAP using which-key. KEYMAP @@ -2201,7 +2237,8 @@ Finally, show the buffer." (* 1000 (float-time (time-since start-time))))))) (defun which-key--update () - "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." + "Function run by timer to possibly trigger +`which-key--create-buffer-and-show'." (let ((prefix-keys (this-single-command-keys)) delay-time) (when (and (equal prefix-keys [key-chord]) @@ -2251,10 +2288,11 @@ Finally, show the buffer." (null this-command))) (when (and (not (equal prefix-keys which-key--current-prefix)) (or (null which-key-delay-functions) - (null (setq delay-time (run-hook-with-args-until-success - 'which-key-delay-functions - (key-description prefix-keys) - (length prefix-keys)))) + (null (setq delay-time + (run-hook-with-args-until-success + 'which-key-delay-functions + (key-description prefix-keys) + (length prefix-keys)))) (sit-for delay-time))) (which-key--create-buffer-and-show prefix-keys) (when (and which-key-idle-secondary-delay @@ -2265,7 +2303,8 @@ Finally, show the buffer." ;; basic test for it being a hydra (not (eq (lookup-key overriding-terminal-local-map "\C-u") 'hydra--universal-argument))) - (which-key--create-buffer-and-show nil overriding-terminal-local-map)) + (which-key--create-buffer-and-show + nil overriding-terminal-local-map)) ((and which-key-show-operator-state-maps (bound-and-true-p evil-state) (eq evil-state 'operator) @@ -2300,7 +2339,8 @@ Finally, show the buffer." (setq which-key--paging-timer (run-with-idle-timer 0.2 t (lambda () - (when (or (not (member real-last-command which-key--paging-functions)) + (when (or (not (member real-last-command + which-key--paging-functions)) (and (< 0 (length (this-single-command-keys))) (not (equal which-key--current-prefix (this-single-command-keys))))) From 1c280772c357247c1638b843574a1226742b9dfc Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Sat, 20 May 2017 23:46:12 +0100 Subject: [PATCH 552/816] Customize which-key-sort-order with list This will display a list the user can choose from in customize instead of having them to type --- which-key.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 4dc772bfd9c..137ab41d1e2 100644 --- a/which-key.el +++ b/which-key.el @@ -355,7 +355,11 @@ are See the README and the docstrings for those functions for more information." :group 'which-key - :type 'function) + :type '(choice (function-item which-key-key-order) + (function-item which-key-key-order-alpha) + (function-item which-key-description-order) + (function-item which-key-prefix-then-key-order) + (function-item which-key-local-then-key-order))) (defcustom which-key-sort-uppercase-first t "If non-nil, uppercase comes before lowercase in sorting From 000d7a68d1ea383d6cca7dcfb88ebcbb3c54190a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 27 May 2017 15:34:54 -0400 Subject: [PATCH 553/816] Handle C-h when buffer not showing which-key-C-h-dispatch was not doing anything different if the which-key buffer was not showing. This makes it fall back to the standard Emacs behavior. Fixes #172 --- which-key.el | 56 +++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/which-key.el b/which-key.el index 137ab41d1e2..ab3b3e1dea4 100644 --- a/which-key.el +++ b/which-key.el @@ -2056,34 +2056,36 @@ after first page." `which-key-C-h-map'. This command is always accessible (from any prefix) if `which-key-use-C-h-commands' is non nil." (interactive) - (let* ((prefix-keys (key-description which-key--current-prefix)) - (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) - (prompt (concat (when (string-equal prefix-keys "") + (if (not (which-key--popup-showing-p)) + (which-key-show-standard-help) + (let* ((prefix-keys (key-description which-key--current-prefix)) + (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) + (prompt (concat (when (string-equal prefix-keys "") + (propertize + (concat " " + (or which-key--current-show-keymap-name + "Top-level bindings")) + 'face 'which-key-note-face)) + full-prefix (propertize - (concat " " - (or which-key--current-show-keymap-name - "Top-level bindings")) - 'face 'which-key-note-face)) - full-prefix - (propertize - (substitute-command-keys - (concat - " \\" - " \\[which-key-show-next-page-cycle]" - which-key-separator "next-page," - " \\[which-key-show-previous-page-cycle]" - which-key-separator "previous-page," - " \\[which-key-undo-key]" - which-key-separator "undo-key," - " \\[which-key-show-standard-help]" - which-key-separator "help," - " \\[which-key-abort]" - which-key-separator "abort")) - 'face 'which-key-note-face))) - (key (string (read-key prompt))) - (cmd (lookup-key which-key-C-h-map key)) - (which-key-inhibit t)) - (if cmd (funcall cmd) (which-key-turn-page 0)))) + (substitute-command-keys + (concat + " \\" + " \\[which-key-show-next-page-cycle]" + which-key-separator "next-page," + " \\[which-key-show-previous-page-cycle]" + which-key-separator "previous-page," + " \\[which-key-undo-key]" + which-key-separator "undo-key," + " \\[which-key-show-standard-help]" + which-key-separator "help," + " \\[which-key-abort]" + which-key-separator "abort")) + 'face 'which-key-note-face))) + (key (string (read-key prompt))) + (cmd (lookup-key which-key-C-h-map key)) + (which-key-inhibit t)) + (if cmd (funcall cmd) (which-key-turn-page 0))))) ;;; Update From 3ff303b50495d492cfac70cc9f7321971928bdb1 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 28 May 2017 10:06:07 -0400 Subject: [PATCH 554/816] Version 3.0.1 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ab3b3e1dea4..6e4ffeaf76a 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,7 @@ ;; Author: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.0 +;; Version: 3.0.1 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 3144b4c1fc774b63fc2350a0171e8ef01ab63298 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 30 May 2017 08:25:52 -0400 Subject: [PATCH 555/816] Fix which-key-show-remaining-keys option --- which-key.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 6e4ffeaf76a..d3b619c1124 100644 --- a/which-key.el +++ b/which-key.el @@ -590,8 +590,6 @@ Used when `which-key-popup-type' is frame.") "Internal: Backup the value of `prefix-help-command'.") (defvar which-key--pages-plist nil "Internal: Holds page objects") -(defvar which-key--lighter-backup nil - "Internal: Holds lighter backup") (defvar which-key--current-prefix nil "Internal: Holds current prefix") (defvar which-key--current-page-n nil @@ -979,6 +977,7 @@ total height." (when (and which-key-idle-secondary-delay which-key--secondary-timer-active) (which-key--start-timer)) + (which-key--lighter-restore) (cl-case which-key-popup-type ;; Not necessary to hide minibuffer ;; (minibuffer (which-key--hide-buffer-minibuffer)) @@ -1764,8 +1763,6 @@ is the width of the live window." (when which-key-show-remaining-keys (let ((n-shown (nth page-n (plist-get which-key--pages-plist :keys/page))) (n-tot (plist-get which-key--pages-plist :tot-keys))) - (setq which-key--lighter-backup - (cadr (assq 'which-key-mode minor-mode-alist))) (setcar (cdr (assq 'which-key-mode minor-mode-alist)) (format " WK: %s/%s keys" n-shown n-tot))))) @@ -1773,7 +1770,7 @@ is the width of the live window." "Restore the lighter for which-key." (when which-key-show-remaining-keys (setcar (cdr (assq 'which-key-mode minor-mode-alist)) - which-key--lighter-backup))) + which-key-lighter))) (defun which-key--echo (text) "Echo TEXT to minibuffer without logging." From 527113d06ed4a69eeb97ee1359539b29fea8c858 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 7 Aug 2017 16:27:12 -0400 Subject: [PATCH 556/816] Assign copyright to FSF for ELPA --- which-key-tests.el | 4 ++-- which-key.el | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 1312f832c8d..5c17ab7f1c9 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -1,9 +1,9 @@ ;;; which-key-tests.el --- Tests for which-key.el -*- lexical-binding: t; -*- -;; Copyright (C) 2015 Justin Burkett +;; Copyright (C) 2017 Free Software Foundation, Inc. ;; Author: Justin Burkett -;; URL: https://github.com/justbur/emacs-which-key +;; Maintainer: Justin Burkett ;; 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 diff --git a/which-key.el b/which-key.el index d3b619c1124..0c4bb20e887 100644 --- a/which-key.el +++ b/which-key.el @@ -1,8 +1,9 @@ ;;; which-key.el --- Display available keybindings in popup -*- lexical-binding: t; -*- -;; Copyright (C) 2015 Justin Burkett +;; Copyright (C) 2017 Free Software Foundation, Inc. ;; Author: Justin Burkett +;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key ;; Version: 3.0.1 ;; Keywords: @@ -32,9 +33,6 @@ ;; the popup will look like along with information about additional features can ;; be found at https://github.com/justbur/emacs-which-key. ;; -;; which-key started as a rewrite of guide-key -;; (https://github.com/kai2nenobu/guide-key), but the feature sets have since -;; diverged. ;;; Code: From 7c01092e65b2ea520af8ca36ee93cef49981d45a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 8 Aug 2017 20:05:37 -0400 Subject: [PATCH 557/816] Make minor changes to commentary in which-key.el --- which-key.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 0c4bb20e887..78b16654a40 100644 --- a/which-key.el +++ b/which-key.el @@ -24,14 +24,15 @@ ;;; Commentary: -;; which-key is a minor mode for Emacs that displays the key bindings following -;; your currently entered incomplete command (a prefix) in a popup. For example, -;; after enabling the minor mode if you enter C-x and wait for the default of 1 -;; second the minibuffer will expand with all of the available key bindings that -;; follow C-x (or as many as space allows given your settings). This includes -;; prefixes like C-x 8 which are shown in a different face. Screenshots of what -;; the popup will look like along with information about additional features can -;; be found at https://github.com/justbur/emacs-which-key. +;; which-key provides the minor mode which-key-mode for Emacs. The mode displays +;; the key bindings following your currently entered incomplete command (a +;; prefix) in a popup. For example, after enabling the minor mode if you enter +;; C-x and wait for the default of 1 second the minibuffer will expand with all +;; of the available key bindings that follow C-x (or as many as space allows +;; given your settings). This includes prefixes like C-x 8 which are shown in a +;; different face. Screenshots of what the popup will look like along with +;; information about additional features can be found at +;; https://github.com/justbur/emacs-which-key. ;; ;;; Code: From 6d2e17c949ff7bfebfe0b0878a93d94b31585031 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 17 Aug 2017 14:07:50 -0400 Subject: [PATCH 558/816] Update which-key version for GNU ELPA --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 78b16654a40..0e2c6dae586 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.0.1 +;; Version: 3.0.2 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 70d63a8babcc783cf0083b0094405d45303ec401 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 13 Nov 2017 15:17:16 -0500 Subject: [PATCH 559/816] Add which-key-show-major-mode This is a new function to discover bindings, including evil ones, in the keymap of the current major mode. It should be considered experimental at the moment. --- which-key.el | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 0e2c6dae586..0f5b7d45e54 100644 --- a/which-key.el +++ b/which-key.el @@ -1363,6 +1363,18 @@ which are strings. KEY is of the form produced by `key-binding'." (current-local-map) (kbd (which-key--current-key-string (car keydesc)))) (intern (cdr keydesc)))) +(defun which-key--map-binding-p (map keydesc) + (or + (when (bound-and-true-p evil-state) + (eq (which-key--safe-lookup-key + map + (kbd (which-key--current-key-string + (format "<%s-state> %s" evil-state (car keydesc))))) + (intern (cdr keydesc)))) + (eq (which-key--safe-lookup-key + map (kbd (which-key--current-key-string (car keydesc)))) + (intern (cdr keydesc))))) + (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. A title is possibly returned using @@ -1615,10 +1627,12 @@ Requires `which-key-compute-remaps' to be non-nil" (forward-line)) (nreverse bindings))))) -(defun which-key--get-formatted-key-bindings (&optional bindings) +(defun which-key--get-formatted-key-bindings (&optional bindings filter) "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let* ((unformatted (if bindings bindings (which-key--get-current-bindings)))) + (when filter + (setq unformatted (cl-remove-if-not filter unformatted))) (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) @@ -2022,6 +2036,21 @@ after first page." (setq which-key--using-top-level t) (which-key--create-buffer-and-show nil)) +;;;###autoload +(defun which-key-show-major-mode () + "Show top-level bindings in the map of the current major mode. + +This function will also detect evil bindings made using +`evil-define-key' in this map. These bindings will depend on the +current evil state. " + (interactive) + (setq which-key--using-top-level t) + (let ((map-sym (intern (format "%s-map" major-mode)))) + (if (and (boundp map-sym) (keymapp (symbol-value map-sym))) + (which-key--create-buffer-and-show + nil nil (apply-partially #'which-key--map-binding-p (symbol-value map-sym))) + (message "which-key: No map named %s" map-sym)))) + ;;;###autoload (defun which-key-undo-key () "Undo last keypress and force which-key update." @@ -2215,7 +2244,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (which-key--hide-popup) (setq unread-command-events (listify-key-sequence key)))))))) -(defun which-key--create-buffer-and-show (&optional prefix-keys from-keymap) +(defun which-key--create-buffer-and-show (&optional prefix-keys from-keymap filter) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." (setq which-key--current-prefix prefix-keys @@ -2223,7 +2252,8 @@ Finally, show the buffer." (let ((start-time (when which-key--debug (current-time))) (formatted-keys (which-key--get-formatted-key-bindings (when from-keymap - (which-key--get-keymap-bindings from-keymap)))) + (which-key--get-keymap-bindings from-keymap)) + filter)) (prefix-keys (key-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys)) From 917d2ba291eb7fea7b5c1c9097be23ea356b2477 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 14 Nov 2017 09:52:37 -0500 Subject: [PATCH 560/816] Improve echo area note for which-key-show-major-mode --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 0f5b7d45e54..85714c870ab 100644 --- a/which-key.el +++ b/which-key.el @@ -1399,7 +1399,7 @@ no title exists." (if alternate alternate (concat "Following " keys))) (t "")))) - (which-key--using-top-level "Top-level bindings") + (which-key--using-top-level which-key--using-top-level) (which-key--current-show-keymap-name which-key--current-show-keymap-name) (t ""))) @@ -2033,7 +2033,7 @@ after first page." (defun which-key-show-top-level () "Show top-level bindings." (interactive) - (setq which-key--using-top-level t) + (setq which-key--using-top-level "Top-level bindings") (which-key--create-buffer-and-show nil)) ;;;###autoload @@ -2044,7 +2044,7 @@ This function will also detect evil bindings made using `evil-define-key' in this map. These bindings will depend on the current evil state. " (interactive) - (setq which-key--using-top-level t) + (setq which-key--using-top-level "Major-mode bindings") (let ((map-sym (intern (format "%s-map" major-mode)))) (if (and (boundp map-sym) (keymapp (symbol-value map-sym))) (which-key--create-buffer-and-show From 6e8df961f4aecbbb59655ea804c62f09eb13b271 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 14 Nov 2017 10:00:14 -0500 Subject: [PATCH 561/816] Consolidate use of binding filters --- which-key.el | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/which-key.el b/which-key.el index 85714c870ab..348f50d9e23 100644 --- a/which-key.el +++ b/which-key.el @@ -1525,19 +1525,18 @@ alists. Returns a list (key separator description)." new-list)))) (nreverse new-list))) -(defun which-key--get-keymap-bindings (keymap &optional filter) +(defun which-key--get-keymap-bindings (keymap) "Retrieve top-level bindings from KEYMAP." (let (bindings) (map-keymap (lambda (ev def) - (unless (and (functionp filter) (funcall filter ev def)) - (cl-pushnew - (cons (key-description (list ev)) - (cond ((keymapp def) "Prefix Command") - ((symbolp def) (copy-sequence (symbol-name def))) - ((eq 'lambda (car-safe def)) "lambda") - (t (format "%s" def)))) - bindings :test (lambda (a b) (string= (car a) (car b)))))) + (cl-pushnew + (cons (key-description (list ev)) + (cond ((keymapp def) "Prefix Command") + ((symbolp def) (copy-sequence (symbol-name def))) + ((eq 'lambda (car-safe def)) "lambda") + (t (format "%s" def)))) + bindings :test (lambda (a b) (string= (car a) (car b))))) keymap) bindings)) @@ -2204,9 +2203,10 @@ is selected interactively by mode in `minor-mode-map-alist'." (cons keymap-name keymap))) (t (which-key--hide-popup))))) -(defun which-key--evil-operator-filter (_ev def) - (and (functionp def) - (evil-get-command-property def :suppress-operator))) +(defun which-key--evil-operator-filter (binding) + (let ((def (intern (cdr binding)))) + (and (functionp def) + (not (evil-get-command-property def :suppress-operator))))) (defun which-key--show-evil-operator-keymap () (if which-key--inhibit-next-operator-popup @@ -2220,8 +2220,8 @@ is selected interactively by mode in `minor-mode-map-alist'." which-key--using-show-operator-keymap t) (when (keymapp keymap) (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings - keymap 'which-key--evil-operator-filter)))) + (which-key--get-keymap-bindings keymap) + #'which-key--evil-operator-filter))) (cond ((= (length formatted-keys) 0) (message "which-key: Keymap empty")) ((listp which-key-side-window-location) From 29348528d28a76857149d03b9554583856286448 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 14 Nov 2017 10:04:31 -0500 Subject: [PATCH 562/816] Mention which-key-show-major-mode in README --- README.org | 68 +++++++++++++++++++++++++----------------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/README.org b/README.org index ac8b97ffdb8..256abb89e3a 100644 --- a/README.org +++ b/README.org @@ -2,14 +2,8 @@ [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] ** Recent Changes -*** 2016-12-20: Added =which-key-max-display-columns= -Allows control over the number of columns in the popup. See [[#other-options][Other Options]]. -*** 2016-11-21: Replacement list changes -The alists controlling the replacement of key binding descriptions was -simplified to use one centralized alist, =which-key-replacement-alist=. This -change also allows for some new features compared to the old method. The other -alists are deprecated. See [[#custom-string-replacement-options][Custom String Replacement Options]]. - +*** 2017-11-13: Added =which-key-show-major-mode= + Shows active bindings in current major-mode map. ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a popup. For example, @@ -21,34 +15,33 @@ the popup will look like are included below. =which-key= started as a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged to a certain extent. ** Table of Contents :TOC_3: - - [[#which-key][which-key]] - - [[#recent-changes][Recent Changes]] - - [[#2016-12-20-added-which-key-max-display-columns][2016-12-20: Added =which-key-max-display-columns=]] - - [[#2016-11-21-replacement-list-changes][2016-11-21: Replacement list changes]] - - [[#introduction][Introduction]] - - [[#install][Install]] - - [[#melpa][MELPA]] - - [[#manually][Manually]] - - [[#initial-setup][Initial Setup]] - - [[#side-window-bottom-option][Side Window Bottom Option]] - - [[#side-window-right-option][Side Window Right Option]] - - [[#side-window-right-then-bottom][Side Window Right then Bottom]] - - [[#minibuffer-option][Minibuffer Option]] - - [[#additional-commands][Additional Commands]] - - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - - [[#popup-type-options][Popup Type Options]] - - [[#custom-string-replacement-options][Custom String Replacement Options]] - - [[#sorting-options][Sorting Options]] - - [[#paging-options][Paging Options]] - - [[#face-customization-options][Face Customization Options]] - - [[#other-options][Other Options]] - - [[#support-for-third-party-libraries][Support for Third-Party Libraries]] - - [[#key-chord][Key-chord]] - - [[#evil-operators][Evil operators]] - - [[#god-mode][God-mode]] - - [[#more-examples][More Examples]] - - [[#nice-display-with-split-frame][Nice Display with Split Frame]] - - [[#thanks][Thanks]] +- [[#which-key][which-key]] + - [[#recent-changes][Recent Changes]] + - [[#2017-11-13-added-which-key-show-major-mode][2017-11-13: Added =which-key-show-major-mode=]] + - [[#introduction][Introduction]] + - [[#install][Install]] + - [[#melpa][MELPA]] + - [[#manually][Manually]] + - [[#initial-setup][Initial Setup]] + - [[#side-window-bottom-option][Side Window Bottom Option]] + - [[#side-window-right-option][Side Window Right Option]] + - [[#side-window-right-then-bottom][Side Window Right then Bottom]] + - [[#minibuffer-option][Minibuffer Option]] + - [[#additional-commands][Additional Commands]] + - [[#special-features-and-configuration-options][Special Features and Configuration Options]] + - [[#popup-type-options][Popup Type Options]] + - [[#custom-string-replacement-options][Custom String Replacement Options]] + - [[#sorting-options][Sorting Options]] + - [[#paging-options][Paging Options]] + - [[#face-customization-options][Face Customization Options]] + - [[#other-options][Other Options]] + - [[#support-for-third-party-libraries][Support for Third-Party Libraries]] + - [[#key-chord][Key-chord]] + - [[#evil-operators][Evil operators]] + - [[#god-mode][God-mode]] + - [[#more-examples][More Examples]] + - [[#nice-display-with-split-frame][Nice Display with Split Frame]] + - [[#thanks][Thanks]] ** Install *** MELPA @@ -128,6 +121,9 @@ variable =max-mini-window-height=. ** Additional Commands - =which-key-show-top-level= will show most key bindings without a prefix. It is most and not all, because many are probably not interesting to most users. +- =which-key-show-major-mode= will show the currently active major-mode + bindings. It's similar to =C-h m= but in a which-key format. It is also aware + of evil commands defined using =evil-define-key=. - =which-key-show-next-page= is the command used for paging. - =which-key-undo= can be used to undo the last keypress when in the middle of a key sequence. From 1234342878f9c9c9bc23ebe754e85d7fa155a51f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 14 Nov 2017 10:10:43 -0500 Subject: [PATCH 563/816] Re-indent README --- README.org | 776 +++++++++++++++++++++++++++-------------------------- 1 file changed, 393 insertions(+), 383 deletions(-) diff --git a/README.org b/README.org index 256abb89e3a..9ad7cb107d4 100644 --- a/README.org +++ b/README.org @@ -1,19 +1,20 @@ * which-key -[[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] - + [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] + ** Recent Changes *** 2017-11-13: Added =which-key-show-major-mode= Shows active bindings in current major-mode map. ** Introduction -=which-key= is a minor mode for Emacs that displays the key bindings following -your currently entered incomplete command (a prefix) in a popup. For example, -after enabling the minor mode if you enter =C-x= and wait for the default of 1 -second the minibuffer will expand with all of the available key bindings that -follow =C-x= (or as many as space allows given your settings). This includes -prefixes like =C-x 8= which are shown in a different face. Screenshots of what -the popup will look like are included below. =which-key= started as a rewrite of -[[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged to a certain extent. - + =which-key= is a minor mode for Emacs that displays the key bindings + following your currently entered incomplete command (a prefix) in a + popup. For example, after enabling the minor mode if you enter =C-x= and wait + for the default of 1 second the minibuffer will expand with all of the + available key bindings that follow =C-x= (or as many as space allows given + your settings). This includes prefixes like =C-x 8= which are shown in a + different face. Screenshots of what the popup will look like are included + below. =which-key= started as a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature + sets have diverged to a certain extent. + ** Table of Contents :TOC_3: - [[#which-key][which-key]] - [[#recent-changes][Recent Changes]] @@ -45,405 +46,414 @@ the popup will look like are included below. =which-key= started as a rewrite of ** Install *** MELPA -After setting up [[http://melpa.org][MELPA]] as a repository, use =M-x package-install which-key= or -your preferred method. You will need to call =which-key-mode= to enable the -minor mode of course. - + After setting up [[http://melpa.org][MELPA]] as a repository, use =M-x package-install which-key= + or your preferred method. You will need to call =which-key-mode= to enable + the minor mode of course. + *** Manually -Add which-key.el to your =load-path= and require. Something like -#+BEGIN_SRC emacs-lisp -(add-to-list 'load-path "path/to/which-key.el") -(require 'which-key) -(which-key-mode) -#+END_SRC - + Add which-key.el to your =load-path= and require. Something like + #+BEGIN_SRC emacs-lisp + (add-to-list 'load-path "path/to/which-key.el") + (require 'which-key) + (which-key-mode) + #+END_SRC + ** Initial Setup -No further setup is required if you are happy with the default setup. To try -other options, there are 3 choices of default configs that are preconfigured -(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, most of which are described below. - -There are many substitution abilities included, which are quite flexible -(ability to use regexp for example). This makes which-key very customizable. - + No further setup is required if you are happy with the default setup. To try + other options, there are 3 choices of default configs that are preconfigured + (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, most of which are described below. + + There are many substitution abilities included, which are quite flexible + (ability to use regexp for example). This makes which-key very customizable. + *** Side Window Bottom Option -Popup side window on bottom. This is the current default. To restore this setup use - -#+BEGIN_SRC emacs-lisp + Popup side window on bottom. This is the current default. To restore this + setup use + + #+BEGIN_SRC emacs-lisp (which-key-setup-side-window-bottom) -#+END_SRC - -[[./img/which-key-bottom.png]] - + #+END_SRC + + [[./img/which-key-bottom.png]] + *** Side Window Right Option -Popup side window on right. For defaults use - -#+BEGIN_SRC emacs-lisp + Popup side window on right. For defaults use + + #+BEGIN_SRC emacs-lisp (which-key-setup-side-window-right) -#+END_SRC - -Note the defaults are fairly conservative and will tend to not display on -narrower frames. If you get a message saying which-key can't display the keys, -try making your frame wider or adjusting the defaults related to the maximum -width (see =M-x customize-group which-key=). - -[[./img/which-key-right.png]] - + #+END_SRC + + Note the defaults are fairly conservative and will tend to not display on + narrower frames. If you get a message saying which-key can't display the + keys, try making your frame wider or adjusting the defaults related to the + maximum width (see =M-x customize-group which-key=). + + [[./img/which-key-right.png]] + *** Side Window Right then Bottom -This is a combination of the previous two choices. It will try to use the right -side, but if there is no room it will switch to using the bottom, which is -usually easier to fit keys into. This setting can be helpful if the size of -the Emacs frame changes frequently, which might be the case if you are using -a dynamic/tiling window manager. - -#+BEGIN_SRC emacs-lisp -(which-key-setup-side-window-right-bottom) -#+END_SRC - + This is a combination of the previous two choices. It will try to use the + right side, but if there is no room it will switch to using the bottom, + which is usually easier to fit keys into. This setting can be helpful if the + size of the Emacs frame changes frequently, which might be the case if you + are using a dynamic/tiling window manager. + + #+BEGIN_SRC emacs-lisp + (which-key-setup-side-window-right-bottom) + #+END_SRC + *** Minibuffer Option -Take over the minibuffer. For the recommended configuration 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=. - + Take over the minibuffer. For the recommended configuration 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=. + ** Additional Commands -- =which-key-show-top-level= will show most key bindings without a prefix. It is - most and not all, because many are probably not interesting to most users. -- =which-key-show-major-mode= will show the currently active major-mode - bindings. It's similar to =C-h m= but in a which-key format. It is also aware - of evil commands defined using =evil-define-key=. -- =which-key-show-next-page= is the command used for paging. -- =which-key-undo= can be used to undo the last keypress when in the middle of a - key sequence. - + - =which-key-show-top-level= will show most key bindings without a prefix. It + is most and not all, because many are probably not interesting to most + users. + - =which-key-show-major-mode= will show the currently active major-mode + bindings. It's similar to =C-h m= but in a which-key format. It is also + aware of evil commands defined using =evil-define-key=. + - =which-key-show-next-page= is the command used for paging. + - =which-key-undo= can be used to undo the last keypress when in the middle + of a key sequence. + ** Special Features and Configuration Options -There are more options than the ones described here. All of the configurable -variables are available through =M-x customize-group which-key=. + There are more options than the ones described here. All of the configurable + variables are available through =M-x customize-group which-key=. *** Popup Type Options -There are three different popup types that which-key can use by default to -display the available keys. The variable =which-key-popup-type= decides which -one is used. + There are three different popup types that which-key can use by default to + display the available keys. The variable =which-key-popup-type= decides + which one is used. **** minibuffer -#+BEGIN_SRC emacs-lisp -(setq which-key-popup-type 'minibuffer) -#+END_SRC -Show keys in the minibuffer. + #+BEGIN_SRC emacs-lisp + (setq which-key-popup-type 'minibuffer) + #+END_SRC + Show keys in the minibuffer. **** side window -#+BEGIN_SRC emacs-lisp -(setq which-key-popup-type 'side-window) -#+END_SRC -Show keys in a side window. This popup type has further options: -#+BEGIN_SRC emacs-lisp -;; location of which-key window. valid values: top, bottom, left, right, -;; or a list of any of the two. If it's a list, which-key will always try -;; the first location first. It will go to the second location if there is -;; not enough room to display any keys in the first location -(setq which-key-side-window-location 'bottom) - -;; max width of which-key window, when displayed at left or right. -;; valid values: number of columns (integer), or percentage out of current -;; frame's width (float larger than 0 and smaller than 1) -(setq which-key-side-window-max-width 0.33) - -;; max height of which-key window, when displayed at top or bottom. -;; valid values: number of lines (integer), or percentage out of current -;; frame's height (float larger than 0 and smaller than 1) -(setq which-key-side-window-max-height 0.25) -#+END_SRC + #+BEGIN_SRC emacs-lisp + (setq which-key-popup-type 'side-window) + #+END_SRC + Show keys in a side window. This popup type has further options: + #+BEGIN_SRC emacs-lisp + ;; location of which-key window. valid values: top, bottom, left, right, + ;; or a list of any of the two. If it's a list, which-key will always try + ;; the first location first. It will go to the second location if there is + ;; not enough room to display any keys in the first location + (setq which-key-side-window-location 'bottom) + + ;; max width of which-key window, when displayed at left or right. + ;; valid values: number of columns (integer), or percentage out of current + ;; frame's width (float larger than 0 and smaller than 1) + (setq which-key-side-window-max-width 0.33) + + ;; max height of which-key window, when displayed at top or bottom. + ;; valid values: number of lines (integer), or percentage out of current + ;; frame's height (float larger than 0 and smaller than 1) + (setq which-key-side-window-max-height 0.25) + #+END_SRC **** frame - -#+BEGIN_SRC emacs-lisp -(setq which-key-popup-type 'frame) -#+END_SRC -Show keys in a popup frame. This popup won't work very well in a terminal, -where only one frame can be shown at any given moment. This popup type has -further options: -#+BEGIN_SRC emacs-lisp -;; max width of which-key frame: number of columns (an integer) -(setq which-key-frame-max-width 60) - -;; max height of which-key frame: number of lines (an integer) -(setq which-key-frame-max-height 20) -#+END_SRC - + + #+BEGIN_SRC emacs-lisp + (setq which-key-popup-type 'frame) + #+END_SRC + Show keys in a popup frame. This popup won't work very well in a terminal, + where only one frame can be shown at any given moment. This popup type has + further options: + #+BEGIN_SRC emacs-lisp + ;; max width of which-key frame: number of columns (an integer) + (setq which-key-frame-max-width 60) + + ;; max height of which-key frame: number of lines (an integer) + (setq which-key-frame-max-height 20) + #+END_SRC + **** custom -Write your own display functions! This requires you to write three functions, -=which-key-custom-popup-max-dimensions-function=, -=which-key-custom-show-popup-function=, and -=which-key-custom-hide-popup-function=. Refer to the documentation for those -variables for more information, but here is a working example (this is the -current implementation of side-window bottom). - - -#+BEGIN_SRC emacs-lisp -(setq which-key-popup-type 'custom) -(defun which-key-custom-popup-max-dimensions-function (ignore) - (cons - (which-key-height-or-percentage-to-height which-key-side-window-max-height) - (frame-width))) -(defun fit-horizonatally () - (let ((fit-window-to-buffer-horizontally t)) - (fit-window-to-buffer))) -(defun which-key-custom-show-popup-function (act-popup-dim) - (let* ((alist '((window-width . fit-horizontally) - (window-height . fit-window-to-buffer)))) - (if (get-buffer-window which-key--buffer) - (display-buffer-reuse-window which-key--buffer alist) - (display-buffer-in-major-side-window which-key--buffer 'bottom 0 alist)))) -(defun which-key-custom-hide-popup-function () - (when (buffer-live-p which-key--buffer) - (quit-windows-on which-key--buffer))) -#+END_SRC - + Write your own display functions! This requires you to write three + functions, =which-key-custom-popup-max-dimensions-function=, + =which-key-custom-show-popup-function=, and + =which-key-custom-hide-popup-function=. Refer to the documentation for + those variables for more information, but here is a working example (this + is the current implementation of side-window bottom). + + + #+BEGIN_SRC emacs-lisp + (setq which-key-popup-type 'custom) + (defun which-key-custom-popup-max-dimensions-function (ignore) + (cons + (which-key-height-or-percentage-to-height + which-key-side-window-max-height) + (frame-width))) + (defun fit-horizonatally () + (let ((fit-window-to-buffer-horizontally t)) + (fit-window-to-buffer))) + (defun which-key-custom-show-popup-function (act-popup-dim) + (let* ((alist '((window-width . fit-horizontally) + (window-height . fit-window-to-buffer)))) + (if (get-buffer-window which-key--buffer) + (display-buffer-reuse-window which-key--buffer alist) + (display-buffer-in-major-side-window which-key--buffer + 'bottom 0 alist)))) + (defun which-key-custom-hide-popup-function () + (when (buffer-live-p which-key--buffer) + (quit-windows-on which-key--buffer))) + #+END_SRC + *** Custom String Replacement Options #+NAME: #custom-string-replacement-options -You can customize the way the keys show in the buffer using three different -replacement methods, each of which corresponds replacement alist. The basic idea -of behind each alist is that you specify a selection string in the =car= of each -cons cell and the replacement string in the =cdr=. - + You can customize the way the keys show in the buffer using three different + replacement methods, each of which corresponds replacement alist. The basic + idea of behind each alist is that you specify a selection string in the + =car= of each cons cell and the replacement string in the =cdr=. + **** "Key-Based" replacement -Using this method, the description of a key is replaced using a string that you -provide. Here's an example - -#+BEGIN_SRC emacs-lisp -(which-key-add-key-based-replacements - "C-x C-f" "find files") -#+END_SRC - -where the first string is the key combination whose description you want to -replace, in a form suitable for =kbd=. For that key combination, which-key -overwrites the description with the second string, "find files". In the second -type of entry you can restrict the replacements to a major-mode. For example, - -#+BEGIN_SRC emacs-lisp -(which-key-add-major-mode-key-based-replacements 'org-mode - "C-c C-c" "Org C-c C-c" - "C-c C-a" "Org Attach") -#+END_SRC - -Here the first entry is the major-mode followed by a list of the first type of -entries. In case the same key combination is listed under a major-mode and by -itself, the major-mode version takes precedence. - + Using this method, the description of a key is replaced using a string that + you provide. Here's an example + + #+BEGIN_SRC emacs-lisp + (which-key-add-key-based-replacements + "C-x C-f" "find files") + #+END_SRC + + where the first string is the key combination whose description you want to + replace, in a form suitable for =kbd=. For that key combination, which-key + overwrites the description with the second string, "find files". In the + second type of entry you can restrict the replacements to a major-mode. For + example, + + #+BEGIN_SRC emacs-lisp + (which-key-add-major-mode-key-based-replacements 'org-mode + "C-c C-c" "Org C-c C-c" + "C-c C-a" "Org Attach") + #+END_SRC + + Here the first entry is the major-mode followed by a list of the first type + of entries. In case the same key combination is listed under a major-mode + and by itself, the major-mode version takes precedence. + **** Key and Description replacement - -The second and third methods target the text used for the keys and the -descriptions directly. The relevant variable is =which-key-replacement-alist=. -Here's an example of one of the default key replacements - -#+BEGIN_SRC emacs-lisp -(push '(("<\\([[:alnum:]-]+\\)>" . nil) . ("\\1" . nil)) - which-key-replacement-alist) -#+END_SRC - -Each element of the outer cons cell is a cons cell of the form =(KEY -. BINDING)=. The =car= of the outer cons determines how to match key bindings -while the =cdr= determines how those matches are replaced. See the docstring of -=which-key-replacement-alist= for more information. - -The next example shows how to replace the description. - -#+BEGIN_SRC emacs-lisp -(push '((nil . "left") . (nil . "lft")) which-key-replacement-alist) -#+END_SRC - -Here is an example of using key replacement to include Unicode characters in the -results. Unfortunately, using Unicode characters may upset the alignment of the -which-key buffer, because Unicode characters can have different widths even in a -monospace font and alignment is based on character width. - -#+BEGIN_SRC emacs-lisp -(add-to-list 'which-key-replacement-alist '(("TAB" . nil) . ("↹" . nil)) -(add-to-list 'which-key-replacement-alist '(("RET" . nil) . ("⏎" . nil)) -(add-to-list 'which-key-replacement-alist '(("DEL" . nil) . ("⇤" . nil)) -(add-to-list 'which-key-replacement-alist '(("SPC" . nil) . ("␣" . nil)) -#+END_SRC - -The =cdr= may also be a function that receives a =cons= of the form =(KEY -. BINDING)= and produces a =cons= of the same form. This allows for interesting -ideas like this one suggested by [[https://github.com/pdcawley][@pdcawley]] in [[https://github.com/justbur/emacs-which-key/pull/147][PR #147]]. - -#+BEGIN_SRC emacs-lisp -(push (cons '(nil . "paredit-mode") - (lambda (kb) - (cons (car kb) - (if paredit-mode - "[x] paredit-mode" - "[ ] paredit-mode")))) - which-key-replacement-alist) -#+END_SRC - -The box will be checked if =paredit-mode= is currently active. - + + The second and third methods target the text used for the keys and the + descriptions directly. The relevant variable is + =which-key-replacement-alist=. Here's an example of one of the default key + replacements + + #+BEGIN_SRC emacs-lisp + (push '(("<\\([[:alnum:]-]+\\)>" . nil) . ("\\1" . nil)) + which-key-replacement-alist) + #+END_SRC + + Each element of the outer cons cell is a cons cell of the form =(KEY + . BINDING)=. The =car= of the outer cons determines how to match key + bindings while the =cdr= determines how those matches are replaced. See the + docstring of =which-key-replacement-alist= for more information. + + The next example shows how to replace the description. + + #+BEGIN_SRC emacs-lisp + (push '((nil . "left") . (nil . "lft")) which-key-replacement-alist) + #+END_SRC + + Here is an example of using key replacement to include Unicode characters + in the results. Unfortunately, using Unicode characters may upset the + alignment of the which-key buffer, because Unicode characters can have + different widths even in a monospace font and alignment is based on + character width. + + #+BEGIN_SRC emacs-lisp + (add-to-list 'which-key-replacement-alist '(("TAB" . nil) . ("↹" . nil)) + (add-to-list 'which-key-replacement-alist '(("RET" . nil) . ("⏎" . nil)) + (add-to-list 'which-key-replacement-alist '(("DEL" . nil) . ("⇤" . nil)) + (add-to-list 'which-key-replacement-alist '(("SPC" . nil) . ("␣" . nil)) + #+END_SRC + + The =cdr= may also be a function that receives a =cons= of the form =(KEY + . BINDING)= and produces a =cons= of the same form. This allows for + interesting ideas like this one suggested by [[https://github.com/pdcawley][@pdcawley]] in [[https://github.com/justbur/emacs-which-key/pull/147][PR #147]]. + + #+BEGIN_SRC emacs-lisp + (push (cons '(nil . "paredit-mode") + (lambda (kb) + (cons (car kb) + (if paredit-mode + "[x] paredit-mode" + "[ ] paredit-mode")))) + which-key-replacement-alist) + #+END_SRC + + The box will be checked if =paredit-mode= is currently active. + *** Sorting Options -By default the output is sorted by the key in a custom order. The default order -is to sort lexicographically within each "class" of key, where the classes and -their order are - -=Special (SPC, TAB, ...) < Single Character (ASCII) (a, ...) < Modifier (C-, M-, ...) < Other= - -You can control the order by setting this variable. This also shows the other -available options. - -#+BEGIN_SRC emacs-lisp -;; default -(setq which-key-sort-order 'which-key-key-order) -;; same as default, except single characters are sorted alphabetically -;; (setq which-key-sort-order 'which-key-key-order-alpha) -;; same as default, except all prefix keys are grouped together at the end -;; (setq which-key-sort-order 'which-key-prefix-then-key-order) -;; same as default, except all keys from local maps shown first -;; (setq which-key-sort-order 'which-key-local-then-key-order) -;; sort based on the key description ignoring case -;; (setq which-key-sort-order 'which-key-description-order) -#+END_SRC - + By default the output is sorted by the key in a custom order. The default + order is to sort lexicographically within each "class" of key, where the + classes and their order are + + =Special (SPC, TAB, ...) < Single Character (ASCII) (a, ...) < Modifier (C-, M-, ...) < Other= + + You can control the order by setting this variable. This also shows the + other available options. + + #+BEGIN_SRC emacs-lisp + ;; default + (setq which-key-sort-order 'which-key-key-order) + ;; same as default, except single characters are sorted alphabetically + ;; (setq which-key-sort-order 'which-key-key-order-alpha) + ;; same as default, except all prefix keys are grouped together at the end + ;; (setq which-key-sort-order 'which-key-prefix-then-key-order) + ;; same as default, except all keys from local maps shown first + ;; (setq which-key-sort-order 'which-key-local-then-key-order) + ;; sort based on the key description ignoring case + ;; (setq which-key-sort-order 'which-key-description-order) + #+END_SRC + *** Paging Options - -There are at least several prefixes that have many keys bound to them, like -=C-x=. which-key displays as many keys as it can given your settings, but for -these prefixes this may not be enough. The paging feature gives you the ability -to bind a key to the function =which-key-C-h-dispatch= which will allow you to -cycle through the pages without changing the key sequence you were in the middle -of typing. There are two slightly different ways of doing this. - + + There are at least several prefixes that have many keys bound to them, like + =C-x=. which-key displays as many keys as it can given your settings, but + for these prefixes this may not be enough. The paging feature gives you the + ability to bind a key to the function =which-key-C-h-dispatch= which will + allow you to cycle through the pages without changing the key sequence you + were in the middle of typing. There are two slightly different ways of doing + this. + **** Method 1 (default): Using C-h (or =help-char=) -This is the easiest way, and is turned on by default. Use -#+BEGIN_SRC emacs-lisp -(setq which-key-use-C-h-commands nil) -#+END_SRC -to disable the behavior (this will only take effect after toggling -which-key-mode if it is already enabled). =C-h= can be used with any prefix to -switch pages when there are multiple pages of keys. This changes the default -behavior of Emacs which is to show a list of key bindings that apply to a prefix. -For example, if you were to type =C-x C-h= you would get a list of commands that -follow =C-x=. This uses which-key instead to show those keys, and unlike the -Emacs default saves the incomplete prefix that you just entered so that the next -keystroke can complete the command. - -The commands are: - - Cycle through the pages forward with =n= (or =C-n=) - - Cycle backwards with =p= (or =C-p=) - - Undo the last entered key (!) with =u= (or =C-u=) - - Call the default command bound to =C-h=, usually =describe-prefix-bindings=, - with =h= (or =C-h=) - -This is especially useful for those who like =helm-descbinds= but also want to -use =C-h= as their which-key paging key. - -Note =C-h= is by default equivalent to =?= in this context. - + This is the easiest way, and is turned on by default. Use + #+BEGIN_SRC emacs-lisp + (setq which-key-use-C-h-commands nil) + #+END_SRC + to disable the behavior (this will only take effect after toggling + which-key-mode if it is already enabled). =C-h= can be used with any prefix + to switch pages when there are multiple pages of keys. This changes the + default behavior of Emacs which is to show a list of key bindings that + apply to a prefix. For example, if you were to type =C-x C-h= you would + get a list of commands that follow =C-x=. This uses which-key instead to + show those keys, and unlike the Emacs default saves the incomplete prefix + that you just entered so that the next keystroke can complete the command. + + The commands are: + - Cycle through the pages forward with =n= (or =C-n=) + - Cycle backwards with =p= (or =C-p=) + - Undo the last entered key (!) with =u= (or =C-u=) + - Call the default command bound to =C-h=, usually + =describe-prefix-bindings=, with =h= (or =C-h=) + + This is especially useful for those who like =helm-descbinds= but also want to + use =C-h= as their which-key paging key. + + Note =C-h= is by default equivalent to =?= in this context. + **** Method 2: Bind your own keys - -Essentially, all you need to do for a prefix like =C-x= is the following which -will bind == to the relevant command. - -#+BEGIN_SRC emacs-lisp + + Essentially, all you need to do for a prefix like =C-x= is the following + which will bind == to the relevant command. + + #+BEGIN_SRC emacs-lisp (define-key which-key-mode-map (kbd "C-x ") 'which-key-C-h-dispatch) -#+END_SRC - -This is completely equivalent to - -#+BEGIN_SRC emacs-lisp + #+END_SRC + + This is completely equivalent to + + #+BEGIN_SRC emacs-lisp (setq which-key-paging-prefixes '("C-x")) (setq which-key-paging-key "") -#+END_SRC - -where the latter are provided for convenience if you have a lot of prefixes. - + #+END_SRC + + where the latter are provided for convenience if you have a lot of + prefixes. + *** Face Customization Options -The faces that which-key uses are -| Face | Applied To | Default Definition | -|----------------------------------------+-------------------------------+-------------------------------------------------------------| -| =which-key-key-face= | Every key sequence | =:inherit font-lock-constant-face= | -| =which-key-separator-face= | The separator (→) | =:inherit font-lock-comment-face= | -| =which-key-note-face= | Hints and notes | =:inherit which-key-separator-face= | -| =which-key-special-key-face= | User-defined special keys | =:inherit which-key-key-face :inverse-video t :weight bold= | -| =which-key-group-description-face= | Command groups (i.e, keymaps) | =:inherit font-lock-keyword-face= | -| =which-key-command-description-face= | Commands not in local-map | =:inherit font-lock-function-name-face= | -| =which-key-local-map-description-face= | Commands in local-map | =:inherit which-key-command-description-face= | - -The last two deserve some explanation. A command lives in one of many possible -keymaps. You can distinguish between local maps, which depend on the buffer you -are in, which modes are active, etc., and the global map which applies -everywhere. It might be useful for you to distinguish between the two. One way -to do this is to remove the default face from -=which-key-command-description-face= like this - -#+BEGIN_SRC emacs-lisp + The faces that which-key uses are + | Face | Applied To | Default Definition | + |----------------------------------------+-------------------------------+-------------------------------------------------------------| + | =which-key-key-face= | Every key sequence | =:inherit font-lock-constant-face= | + | =which-key-separator-face= | The separator (→) | =:inherit font-lock-comment-face= | + | =which-key-note-face= | Hints and notes | =:inherit which-key-separator-face= | + | =which-key-special-key-face= | User-defined special keys | =:inherit which-key-key-face :inverse-video t :weight bold= | + | =which-key-group-description-face= | Command groups (i.e, keymaps) | =:inherit font-lock-keyword-face= | + | =which-key-command-description-face= | Commands not in local-map | =:inherit font-lock-function-name-face= | + | =which-key-local-map-description-face= | Commands in local-map | =:inherit which-key-command-description-face= | + + The last two deserve some explanation. A command lives in one of many possible + keymaps. You can distinguish between local maps, which depend on the buffer you + are in, which modes are active, etc., and the global map which applies + everywhere. It might be useful for you to distinguish between the two. One way + to do this is to remove the default face from + =which-key-command-description-face= like this + + #+BEGIN_SRC emacs-lisp (set-face-attribute 'which-key-command-description-face nil :inherit nil) -#+END_SRC - -another is to make the local map keys appear in bold - -#+BEGIN_SRC emacs-lisp + #+END_SRC + + another is to make the local map keys appear in bold + + #+BEGIN_SRC emacs-lisp (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) -#+END_SRC - -You can also use =M-x customize-face= to customize any of the above faces to -your liking. - + #+END_SRC + + You can also use =M-x customize-face= to customize any of the above faces to + your liking. + *** Other Options #+NAME: #other-options -The options below are also available through customize. Their defaults are -shown. + The options below are also available through customize. Their defaults are + shown. + + #+BEGIN_SRC emacs-lisp + ;; Set the time delay (in seconds) for the which-key popup to appear. A value of + ;; zero might cause issues so a non-zero value is recommended. + (setq which-key-idle-delay 1.0) -#+BEGIN_SRC emacs-lisp - ;; Set the time delay (in seconds) for the which-key popup to appear. A value of - ;; zero might cause issues so a non-zero value is recommended. - (setq which-key-idle-delay 1.0) + ;; Set the maximum length (in characters) for key descriptions (commands or + ;; prefixes). Descriptions that are longer are truncated and have ".." added. + (setq which-key-max-description-length 27) - ;; Set the maximum length (in characters) for key descriptions (commands or - ;; prefixes). Descriptions that are longer are truncated and have ".." added. - (setq which-key-max-description-length 27) + ;; Use additonal padding between columns of keys. This variable specifies the + ;; number of spaces to add to the left of each column. + (setq which-key-add-column-padding 0) - ;; Use additonal padding between columns of keys. This variable specifies the - ;; number of spaces to add to the left of each column. - (setq which-key-add-column-padding 0) + ;; The maximum number of columns to display in the which-key buffer. nil means + ;; don't impose a maximum. + (setq which-key-max-display-columns nil) - ;; The maximum number of columns to display in the which-key buffer. nil means - ;; don't impose a maximum. - (setq which-key-max-display-columns nil) + ;; Set the separator used between keys and descriptions. Change this setting to + ;; an ASCII character if your font does not show the default arrow. The second + ;; setting here allows for extra padding for Unicode characters. which-key uses + ;; characters as a means of width measurement, so wide Unicode characters can + ;; throw off the calculation. + (setq which-key-separator " → " ) + (setq which-key-unicode-correction 3) - ;; Set the separator used between keys and descriptions. Change this setting to - ;; an ASCII character if your font does not show the default arrow. The second - ;; setting here allows for extra padding for Unicode characters. which-key uses - ;; characters as a means of width measurement, so wide Unicode characters can - ;; throw off the calculation. - (setq which-key-separator " → " ) - (setq which-key-unicode-correction 3) + ;; Set the prefix string that will be inserted in front of prefix commands + ;; (i.e., commands that represent a sub-map). + (setq which-key-prefix-prefix "+" ) - ;; Set the prefix string that will be inserted in front of prefix commands - ;; (i.e., commands that represent a sub-map). - (setq which-key-prefix-prefix "+" ) + ;; Set the special keys. These are automatically truncated to one character and + ;; have which-key-special-key-face applied. Disabled by default. An example + ;; setting is + ;; (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) + (setq which-key-special-keys nil) - ;; Set the special keys. These are automatically truncated to one character and - ;; have which-key-special-key-face applied. Disabled by default. An example - ;; setting is - ;; (setq which-key-special-keys '("SPC" "TAB" "RET" "ESC" "DEL")) - (setq which-key-special-keys nil) + ;; Show the key prefix on the left, top, or bottom (nil means hide the prefix). + ;; The prefix consists of the keys you have typed so far. which-key also shows + ;; the page information along with the prefix. + (setq which-key-show-prefix 'left) - ;; Show the key prefix on the left, top, or bottom (nil means hide the prefix). - ;; The prefix consists of the keys you have typed so far. which-key also shows - ;; the page information along with the prefix. - (setq which-key-show-prefix 'left) - - ;; Set to t to show the count of keys shown vs. total keys in the mode line. - (setq which-key-show-remaining-keys nil) -#+END_SRC + ;; Set to t to show the count of keys shown vs. total keys in the mode line. + (setq which-key-show-remaining-keys nil) + #+END_SRC ** Support for Third-Party Libraries Some support is provided for third-party libraries which don't use standard methods of looking up commands. Some of these need to be enabled @@ -464,16 +474,16 @@ shown. report any issues. ** More Examples *** Nice Display with Split Frame -Unlike guide-key, which-key looks good even if the frame is split into several -windows. -#+CAPTION: which-key in a frame with 3 horizontal splits -[[./img/which-key-right-split.png]] - -#+CAPTION: which-key in a frame with 2 vertical splits -[[./img/which-key-bottom-split.png]] - + Unlike guide-key, which-key looks good even if the frame is split into + several windows. + #+CAPTION: which-key in a frame with 3 horizontal splits + [[./img/which-key-right-split.png]] + + #+CAPTION: which-key in a frame with 2 vertical splits + [[./img/which-key-bottom-split.png]] + ** Thanks -Special thanks to -- [[https://github.com/bmag][@bmag]] for helping with the initial development and finding many bugs. -- [[https://github/iqbalansari][@iqbalansari]] who among other things adapted the code to make - =which-key-show-top-level= possible. + Special thanks to + - [[https://github.com/bmag][@bmag]] for helping with the initial development and finding many bugs. + - [[https://github/iqbalansari][@iqbalansari]] who among other things adapted the code to make + =which-key-show-top-level= possible. From 159f0f9b78753574a1892ae3e47c8c1938965ea9 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 5 Dec 2017 07:17:47 -0500 Subject: [PATCH 564/816] Add notes about paging commands not working with minibuffer --- README.org | 4 +++- which-key.el | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.org b/README.org index 9ad7cb107d4..edde2a4788b 100644 --- a/README.org +++ b/README.org @@ -118,7 +118,9 @@ [[./img/which-key-minibuffer.png]] Note the maximum height of the minibuffer is controlled through the built-in - variable =max-mini-window-height=. + variable =max-mini-window-height=. Also, the paging commands do not work + reliably with the minibuffer option. Use the side window on the bottom + option if you need paging. ** Additional Commands - =which-key-show-top-level= will show most key bindings without a prefix. It diff --git a/which-key.el b/which-key.el index 348f50d9e23..79f7affd852 100644 --- a/which-key.el +++ b/which-key.el @@ -778,7 +778,10 @@ bottom." ;;;###autoload (defun which-key-setup-minibuffer () - "Apply suggested settings for minibuffer." + "Apply suggested settings for minibuffer. +Do not use this setup if you use the paging commands. Instead use +`which-key-setup-side-window-bottom', which is nearly identical +but more functional." (interactive) (which-key--setup-echo-keystrokes) (setq which-key-popup-type 'minibuffer From 78a29434789c7e7af7b3cf10a548d6247a69d3a9 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 7 Dec 2017 17:30:49 -0500 Subject: [PATCH 565/816] Fix ordering of default replacement-alist When which-key-allow-multiple-replacements is nil, this order is required to get the intended behavior with left and right. Ref #181 --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 79f7affd852..e0c03561cfc 100644 --- a/which-key.el +++ b/which-key.el @@ -152,10 +152,10 @@ remapped given the currently active keymaps." `(((nil . "Prefix Command") . (nil . "prefix")) ((nil . "\\`\\?\\?\\'") . (nil . "lambda")) ((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg")) - (("<\\([[:alnum:]-]+\\)>") . ("\\1")) ,@(unless which-key-dont-use-unicode - '((("left") . ("←")) - (("right") . ("→")))))) + '((("") . ("←")) + (("") . ("→")))) + (("<\\([[:alnum:]-]+\\)>") . ("\\1")))) "Association list to determine how to manipulate descriptions of key bindings in the which-key popup. Each element of the list is a nested cons cell with the format From f516b84eab1e307d3ffaa181324dca12c3951936 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 13 Dec 2017 10:56:25 -0500 Subject: [PATCH 566/816] Add which-key-enable-extended-define-key customization option Adds supporting which-key--process-define-key-args. The docstring for the option is Advise `define-key' to make which-key aware of definitions of the form (define-key KEYMAP KEY '("DESCRIPTION" . DEF)) With the advice, this definition will have the side effect of creating a replacement in `which-key-replacement-alist' that replaces DEF with DESCRIPTION when the key sequence ends in KEY. Using a cons cell like this is a valid definition for `define-key'. All this does is to make which-key aware of it. Since many higher level keybinding functions use `define-key' internally, this will affect most if not all of those as well. This variable must be set before loading which-key. --- which-key.el | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/which-key.el b/which-key.el index e0c03561cfc..22bed0869e5 100644 --- a/which-key.el +++ b/which-key.el @@ -476,6 +476,24 @@ it." :group 'which-key :type 'boolean) +(defcustom which-key-enable-extended-define-key nil + "Advise `define-key' to make which-key aware of definitions of the form + + \(define-key KEYMAP KEY '(\"DESCRIPTION\" . DEF)) + +With the advice, this definition will have the side effect of +creating a replacement in `which-key-replacement-alist' that +replaces DEF with DESCRIPTION when the key sequence ends in +KEY. Using a cons cell like this is a valid definition for +`define-key'. All this does is to make which-key aware of it. + +Since many higher level keybinding functions use `define-key' +internally, this will affect most if not all of those as well. + +This variable must be set before loading which-key." + :group 'which-key + :type 'boolean) + ;; Hooks (defcustom which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized." @@ -890,6 +908,24 @@ If AT-ROOT is non-nil the binding is also placed at the root of MAP." (which-key-define-key-recursively df key def t))) map)) +(defun which-key--process-define-key-args (keymap key def) + "When DEF takes the form (\"DESCRIPTION\". DEF), add an entry +to `which-key-replacement-alist' so that this binding is replaced +in which-key with DESCRIPTION. This function is meant to be used +as :before advice for `define-key'." + (when (and (consp def) + (stringp (car def)) + (symbolp (cdr def)) + (cdr def)) + (let ((key-desc (regexp-quote (key-description key)))) + (push (cons (cons (format "%s\\'" key-desc) + (format "\\`%s\\'" (symbol-name (cdr def)))) + (cons nil (car def))) + which-key-replacement-alist)))) + +(when which-key-enable-extended-define-key + (advice-add #'define-key :before #'which-key--process-define-key-args)) + ;;; Functions for computing window sizes (defun which-key--text-width-to-total (text-width) From 3ff8f48193dce6670ac57f8e67469435bc0a71ba Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 13 Dec 2017 11:10:05 -0500 Subject: [PATCH 567/816] Allow null DEF in which-key--process-define-key-args This is useful for naming prefixes --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 22bed0869e5..15b599a4f1c 100644 --- a/which-key.el +++ b/which-key.el @@ -915,11 +915,11 @@ in which-key with DESCRIPTION. This function is meant to be used as :before advice for `define-key'." (when (and (consp def) (stringp (car def)) - (symbolp (cdr def)) - (cdr def)) + (symbolp (cdr def))) (let ((key-desc (regexp-quote (key-description key)))) (push (cons (cons (format "%s\\'" key-desc) - (format "\\`%s\\'" (symbol-name (cdr def)))) + (when (cdr def) + (format "\\`%s\\'" (symbol-name (cdr def))))) (cons nil (car def))) which-key-replacement-alist)))) From 0a212c71fe4ed8bf3006f5936df7ba7c673cdcd9 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 13 Dec 2017 13:02:51 -0500 Subject: [PATCH 568/816] Fix travis build Add support for 25.3. Remove for 24.3 --- .travis.yml | 25 +++++++++---------------- Makefile | 6 +++--- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index b22aa137742..9da955d6225 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,29 +1,22 @@ -language: generic -sudo: false - -branches: - only: - - master - -before_install: - - curl -fsSkL https://gist.github.com/rejeep/ebcd57c3af83b049833b/raw > x.sh && source ./x.sh - - evm install $EVM_EMACS --use --skip - - cask - +# language: emacs-lisp env: - - EVM_EMACS=emacs-24.3-travis - EVM_EMACS=emacs-24.4-travis - EVM_EMACS=emacs-24.5-travis - EVM_EMACS=emacs-25.1-travis - EVM_EMACS=emacs-25.2-travis + - EVM_EMACS=emacs-25.3-travis - EVM_EMACS=emacs-git-snapshot-travis +before_install: + - git clone https://github.com/rejeep/evm.git $HOME/.evm + - export PATH=$HOME/.evm/bin:$PATH + - evm config path /tmp + - evm install $EVM_EMACS --use --skip + matrix: fast_finish: true allow_failures: - env: - - EVM_EMACS=emacs-24.3-travis - - EVM_EMACS=emacs-git-snapshot-travis + - env: EVM_EMACS=emacs-git-snapshot-travis script: - emacs --version diff --git a/Makefile b/Makefile index facb1f80b4b..a60edf68299 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,15 @@ .PHONY : test -EMACS ?= emacs +emacs ?= emacs CASK ?= cask LOADPATH = -L . ELPA_DIR = \ - .cask/$(shell $(EMACS) -Q --batch --eval '(princ emacs-version)')/elpa + .cask/$(shell $(emacs) -Q --batch --eval '(princ emacs-version)')/elpa test: elpa - $(CASK) exec $(EMACS) -Q -batch $(LOADPATH) \ + $(CASK) exec $(emacs) -Q -batch $(LOADPATH) \ -l which-key-tests.el -f ert-run-tests-batch-and-exit elpa: $(ELPA_DIR) From b6d04b3e9c281acf4093cf871b1639c730ad9618 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 13 Dec 2017 13:06:55 -0500 Subject: [PATCH 569/816] Fix .travis.yml Didn't install cask --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9da955d6225..918e5f19e92 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,9 +9,11 @@ env: before_install: - git clone https://github.com/rejeep/evm.git $HOME/.evm - - export PATH=$HOME/.evm/bin:$PATH + - export PATH="$HOME/.evm/bin:$PATH" + - export PATH="$HOME/.cask/bin:$PATH" - evm config path /tmp - evm install $EVM_EMACS --use --skip + - curl -fsSkL https://raw.github.com/cask/cask/master/go | python matrix: fast_finish: true From 555c5c1da8942b24d457578d0fc23564de07fb17 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 13 Dec 2017 20:52:09 -0500 Subject: [PATCH 570/816] Demote errors in which-key--process-define-key-args --- which-key.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index 15b599a4f1c..fdef15b424c 100644 --- a/which-key.el +++ b/which-key.el @@ -913,15 +913,16 @@ If AT-ROOT is non-nil the binding is also placed at the root of MAP." to `which-key-replacement-alist' so that this binding is replaced in which-key with DESCRIPTION. This function is meant to be used as :before advice for `define-key'." - (when (and (consp def) - (stringp (car def)) - (symbolp (cdr def))) - (let ((key-desc (regexp-quote (key-description key)))) - (push (cons (cons (format "%s\\'" key-desc) - (when (cdr def) - (format "\\`%s\\'" (symbol-name (cdr def))))) - (cons nil (car def))) - which-key-replacement-alist)))) + (with-demoted-errors "Which-key extended define-key error: %s" + (when (and (consp def) + (stringp (car def)) + (symbolp (cdr def))) + (let ((key-desc (regexp-quote (key-description key)))) + (push (cons (cons (format "%s\\'" key-desc) + (when (cdr def) + (format "\\`%s\\'" (symbol-name (cdr def))))) + (cons nil (car def))) + which-key-replacement-alist))))) (when which-key-enable-extended-define-key (advice-add #'define-key :before #'which-key--process-define-key-args)) From 7150aa97954483517aa8395e94c39af9b49516fc Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 13 Dec 2017 21:12:50 -0500 Subject: [PATCH 571/816] Announce which-key-enable-extended-define-key in README --- README.org | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/README.org b/README.org index edde2a4788b..4b4f96bfdb0 100644 --- a/README.org +++ b/README.org @@ -2,6 +2,12 @@ [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] ** Recent Changes + +*** 2017-12-13: Added =which-key-enable-extended-define-key= + Allows for a concise syntax to specify replacement text using =define-key= + or alternatives that use =define-key= internally. See the docstring and + [[#custom-string-replacement-options][Custom String Replacement]]. + *** 2017-11-13: Added =which-key-show-major-mode= Shows active bindings in current major-mode map. ** Introduction @@ -18,6 +24,7 @@ ** Table of Contents :TOC_3: - [[#which-key][which-key]] - [[#recent-changes][Recent Changes]] + - [[#2017-12-13-added-which-key-enable-extended-define-key][2017-12-13: Added =which-key-enable-extended-define-key=]] - [[#2017-11-13-added-which-key-show-major-mode][2017-11-13: Added =which-key-show-major-mode=]] - [[#introduction][Introduction]] - [[#install][Install]] @@ -221,6 +228,24 @@ idea of behind each alist is that you specify a selection string in the =car= of each cons cell and the replacement string in the =cdr=. +**** Automatic + A newer option is to set =which-key-enable-extended-define-key= which + advises =define-key= to allow which-key to pre-process its arguments. The + statement + + #+BEGIN_SRC emacs-lisp + (define-key some-map "f" '("foo" . long-name-for-command-foo)) + #+END_SRC + + is valid in Emacs. Setting this variable makes which-key automatically + replace the corresponding command name with the text in the string. A nice + example is in naming prefixes. The following binds "b" to =nil= and names + the binding as a prefix. + + #+BEGIN_SRC emacs-lisp + (define-key some-map "b" '("bar-prefix")) + #+END_SRC + **** "Key-Based" replacement Using this method, the description of a key is replaced using a string that you provide. Here's an example From 1694c6d1790236bce691eacbff00dae5dfa2c24f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 15 Dec 2017 14:18:30 -0500 Subject: [PATCH 572/816] Improve which-key--process-define-key-args Specify Prefix Command as an explicit match string to cut down on false positives. --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index fdef15b424c..1523c00382c 100644 --- a/which-key.el +++ b/which-key.el @@ -919,8 +919,9 @@ as :before advice for `define-key'." (symbolp (cdr def))) (let ((key-desc (regexp-quote (key-description key)))) (push (cons (cons (format "%s\\'" key-desc) - (when (cdr def) - (format "\\`%s\\'" (symbol-name (cdr def))))) + (format "\\`%s\\'" (if (cdr def) + (symbol-name (cdr def)) + "Prefix Command"))) (cons nil (car def))) which-key-replacement-alist))))) From 6247cb5e28c001ffa8e09a92f654990b324db424 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 16 Dec 2017 22:11:59 -0500 Subject: [PATCH 573/816] Simplify implementation of define-key based replacements When a description is provided through define-key using a definition like ("description" . def) place a additional binding in the map to a "pseudo key" making it easy for which-key to find these descriptions on the fly and at the right time (i.e., when the binding is active). which-key-enable-extended-define-key must be enabled for this to have an effect. --- which-key.el | 73 ++++++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/which-key.el b/which-key.el index 1523c00382c..d0d11a69b02 100644 --- a/which-key.el +++ b/which-key.el @@ -909,21 +909,14 @@ If AT-ROOT is non-nil the binding is also placed at the root of MAP." map)) (defun which-key--process-define-key-args (keymap key def) - "When DEF takes the form (\"DESCRIPTION\". DEF), add an entry -to `which-key-replacement-alist' so that this binding is replaced -in which-key with DESCRIPTION. This function is meant to be used -as :before advice for `define-key'." + "When DEF takes the form (\"DESCRIPTION\". DEF), make sure +which-key uses \"DESCRIPTION\" for this binding. This function is +meant to be used as :before advice for `define-key'." (with-demoted-errors "Which-key extended define-key error: %s" (when (and (consp def) (stringp (car def)) (symbolp (cdr def))) - (let ((key-desc (regexp-quote (key-description key)))) - (push (cons (cons (format "%s\\'" key-desc) - (format "\\`%s\\'" (if (cdr def) - (symbol-name (cdr def)) - "Prefix Command"))) - (cons nil (car def))) - which-key-replacement-alist))))) + (define-key keymap (which-key--pseudo-key key) (car def))))) (when which-key-enable-extended-define-key (advice-add #'define-key :before #'which-key--process-define-key-args)) @@ -1341,6 +1334,15 @@ local bindings coming first. Within these categories order using (defsubst which-key--butlast-string (str) (mapconcat #'identity (butlast (split-string str)) " ")) +(defun which-key--pseudo-key (key &optional use-current-prefix) + "Replace the last key in the sequence KEY by a special symbol +in order for which-key to allow looking up a description for the key." + (let* ((seq (listify-key-sequence key)) + (final (intern (format "which-key-%s" (key-description (last seq)))))) + (if use-current-prefix + (vconcat (which-key--current-key-list) (list final)) + (vconcat (butlast seq) (list final))))) + (defun which-key--get-replacements (key-binding &optional use-major-mode) (let ((alist (or (and use-major-mode (cdr-safe @@ -1369,27 +1371,31 @@ local bindings coming first. Within these categories order using "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." - (let* ((mode-res (which-key--get-replacements key-binding t)) - (all-repls (or mode-res - (which-key--get-replacements key-binding)))) - (dolist (repl all-repls key-binding) - (setq key-binding - (cond ((or (not (consp repl)) (null (cdr repl))) - key-binding) - ((functionp (cdr repl)) - (funcall (cdr repl) key-binding)) - ((consp (cdr repl)) - (cons - (cond ((and (caar repl) (cadr repl)) - (replace-regexp-in-string - (caar repl) (cadr repl) (car key-binding) t)) - ((cadr repl) (cadr repl)) - (t (car key-binding))) - (cond ((and (cdar repl) (cddr repl)) - (replace-regexp-in-string - (cdar repl) (cddr repl) (cdr key-binding) t)) - ((cddr repl) (cddr repl)) - (t (cdr key-binding)))))))))) + (let ((menu-item-repl + (key-binding (which-key--pseudo-key (car key-binding) t)))) + (if menu-item-repl + (cons (car key-binding) menu-item-repl) + (let* ((mode-res (which-key--get-replacements key-binding t)) + (all-repls (or mode-res + (which-key--get-replacements key-binding)))) + (dolist (repl all-repls key-binding) + (setq key-binding + (cond ((or (not (consp repl)) (null (cdr repl))) + key-binding) + ((functionp (cdr repl)) + (funcall (cdr repl) key-binding)) + ((consp (cdr repl)) + (cons + (cond ((and (caar repl) (cadr repl)) + (replace-regexp-in-string + (caar repl) (cadr repl) (car key-binding) t)) + ((cadr repl) (cadr repl)) + (t (car key-binding))) + (cond ((and (cdar repl) (cddr repl)) + (replace-regexp-in-string + (cdar repl) (cddr repl) (cdr key-binding) t)) + ((cddr repl) (cddr repl)) + (t (cdr key-binding)))))))))))) (defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence which-key--current-prefix) @@ -1600,7 +1606,8 @@ Requires `which-key-compute-remaps' to be non-nil" (ignore-keys-regexp (eval-when-compile (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" - "select-window" "switch-frame" "-state")))) + "select-window" "switch-frame" "-state" + "which-key-")))) (ignore-sections-regexp (eval-when-compile (regexp-opt '("Key translations" "Function key map translations" From cd8d24d02479d510e20a2854f23a770fa9c9516f Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Sun, 17 Dec 2017 18:57:03 +0100 Subject: [PATCH 574/816] Define which-key--current-key-list before using it Actually move the definition of the caller which-key--pseudo-key instead. --- which-key.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index d0d11a69b02..d28f4a2223c 100644 --- a/which-key.el +++ b/which-key.el @@ -1334,15 +1334,6 @@ local bindings coming first. Within these categories order using (defsubst which-key--butlast-string (str) (mapconcat #'identity (butlast (split-string str)) " ")) -(defun which-key--pseudo-key (key &optional use-current-prefix) - "Replace the last key in the sequence KEY by a special symbol -in order for which-key to allow looking up a description for the key." - (let* ((seq (listify-key-sequence key)) - (final (intern (format "which-key-%s" (key-description (last seq)))))) - (if use-current-prefix - (vconcat (which-key--current-key-list) (list final)) - (vconcat (butlast seq) (list final))))) - (defun which-key--get-replacements (key-binding &optional use-major-mode) (let ((alist (or (and use-major-mode (cdr-safe @@ -1422,6 +1413,15 @@ which are strings. KEY is of the form produced by `key-binding'." map (kbd (which-key--current-key-string (car keydesc)))) (intern (cdr keydesc))))) +(defun which-key--pseudo-key (key &optional use-current-prefix) + "Replace the last key in the sequence KEY by a special symbol +in order for which-key to allow looking up a description for the key." + (let* ((seq (listify-key-sequence key)) + (final (intern (format "which-key-%s" (key-description (last seq)))))) + (if use-current-prefix + (vconcat (which-key--current-key-list) (list final)) + (vconcat (butlast seq) (list final))))) + (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. A title is possibly returned using From ef384e781e6107850c7fadc78cb0675d7fe72e69 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 17 Dec 2017 22:16:24 -0500 Subject: [PATCH 575/816] Fix and improve define-key based replacements Check for equality of definition as well as the key sequence. Unless it's a prefix binding, in which case only check the key sequence. Make sure we apply kbd when looking up pseudo bindings. Move the logic into which-key--get-pseudo-binding. --- which-key.el | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index d28f4a2223c..cb6da90f831 100644 --- a/which-key.el +++ b/which-key.el @@ -916,7 +916,7 @@ meant to be used as :before advice for `define-key'." (when (and (consp def) (stringp (car def)) (symbolp (cdr def))) - (define-key keymap (which-key--pseudo-key key) (car def))))) + (define-key keymap (which-key--pseudo-key key) `(which-key ,def))))) (when which-key-enable-extended-define-key (advice-add #'define-key :before #'which-key--process-define-key-args)) @@ -1358,14 +1358,28 @@ local bindings coming first. Within these categories order using (throw 'res res))))))) (nreverse res))) +(defun which-key--get-pseudo-binding (key-binding) + (let* ((pseudo-binding + (key-binding (which-key--pseudo-key (kbd (car key-binding)) t))) + (pseudo-binding (when pseudo-binding (cadr pseudo-binding))) + (pseudo-desc (when pseudo-binding (car pseudo-binding))) + (pseudo-def (when pseudo-binding (cdr pseudo-binding))) + (real-def (key-binding (kbd (car key-binding)))) + ;; treat keymaps as if they're nil bindings. This creates the + ;; possibility that we rename the wrong binding but this seems + ;; unlikely. + (real-def (unless (keymapp real-def) real-def))) + (when (and pseudo-binding + (eq pseudo-def real-def)) + (cons (car key-binding) pseudo-desc)))) + (defun which-key--maybe-replace (key-binding) "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." - (let ((menu-item-repl - (key-binding (which-key--pseudo-key (car key-binding) t)))) - (if menu-item-repl - (cons (car key-binding) menu-item-repl) + (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding))) + (if pseudo-binding + pseudo-binding (let* ((mode-res (which-key--get-replacements key-binding t)) (all-repls (or mode-res (which-key--get-replacements key-binding)))) From 7559a79e95aada65601f7413a1c3f08bfa34557b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 8 Jan 2018 20:19:10 -0500 Subject: [PATCH 576/816] Version 3.1.0 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index cb6da90f831..f973c1973e0 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.0.2 +;; Version: 3.1.0 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 1dd91df43606de66580060a8b9b6edc9145c34ba Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 8 Jan 2018 22:26:05 -0500 Subject: [PATCH 577/816] Implement #182 Allow single digit arg to be set after C-h --- which-key.el | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/which-key.el b/which-key.el index f973c1973e0..41dfb332c7f 100644 --- a/which-key.el +++ b/which-key.el @@ -412,7 +412,16 @@ prefixes in `which-key-paging-prefixes'" ("\C-p" . which-key-show-previous-page-cycle) ("p" . which-key-show-previous-page-cycle) ("\C-u" . which-key-undo-key) - ("u" . which-key-undo-key))) + ("u" . which-key-undo-key) + ("1" . which-key-digit-argument) + ("2" . which-key-digit-argument) + ("3" . which-key-digit-argument) + ("4" . which-key-digit-argument) + ("5" . which-key-digit-argument) + ("6" . which-key-digit-argument) + ("7" . which-key-digit-argument) + ("8" . which-key-digit-argument) + ("9" . which-key-digit-argument))) (define-key map (car bind) (cdr bind))) map) "Keymap for C-h commands.") @@ -2016,12 +2025,14 @@ enough space based on your settings and frame size." prefix-keys) ;;; Paging functions ;;;###autoload -(defun which-key-reload-key-sequence (key-seq) +(defun which-key-reload-key-sequence (&optional key-seq) "Simulate entering the key sequence KEY-SEQ. KEY-SEQ should be a list of events as produced by -`listify-key-sequence'. Any prefix arguments that were used are -reapplied to the new key sequence." - (let ((next-event (mapcar (lambda (ev) (cons t ev)) key-seq))) +`listify-key-sequence'. If nil, KEY-SEQ defaults to +`which-key--current-key-list'. Any prefix arguments that were +used are reapplied to the new key sequence." + (let* ((key-seq (or key-seq (which-key--current-key-list))) + (next-event (mapcar (lambda (ev) (cons t ev)) key-seq))) (setq prefix-arg current-prefix-arg unread-command-events next-event))) @@ -2029,7 +2040,7 @@ reapplied to the new key sequence." "Show the next page of keys." (let ((next-page (if which-key--current-page-n (+ which-key--current-page-n delta) 0))) - (which-key-reload-key-sequence (which-key--current-key-list)) + (which-key-reload-key-sequence) (if which-key--last-try-2-loc (let ((which-key-side-window-location which-key--last-try-2-loc) (which-key--multiple-locations t)) @@ -2038,7 +2049,7 @@ reapplied to the new key sequence." (which-key--start-paging-timer))) ;;;###autoload -(defun which-key-show-standard-help () +(defun which-key-show-standard-help (&optional _) "Call the command in `which-key--prefix-help-cmd-backup'. Usually this is `describe-prefix-bindings'." (interactive) @@ -2075,7 +2086,7 @@ case do nothing." (which-key-turn-page -1)))) ;;;###autoload -(defun which-key-show-next-page-cycle () +(defun which-key-show-next-page-cycle (&optional _) "Show the next page of keys, cycling from end to beginning after last page." (interactive) @@ -2083,7 +2094,7 @@ after last page." (which-key-turn-page 1))) ;;;###autoload -(defun which-key-show-previous-page-cycle () +(defun which-key-show-previous-page-cycle (&optional _) "Show the previous page of keys, cycling from beginning to end after first page." (interactive) @@ -2091,7 +2102,7 @@ after first page." (which-key-turn-page -1))) ;;;###autoload -(defun which-key-show-top-level () +(defun which-key-show-top-level (&optional _) "Show top-level bindings." (interactive) (setq which-key--using-top-level "Top-level bindings") @@ -2113,7 +2124,7 @@ current evil state. " (message "which-key: No map named %s" map-sym)))) ;;;###autoload -(defun which-key-undo-key () +(defun which-key-undo-key (&optional _) "Undo last keypress and force which-key update." (interactive) (let* ((key-lst (butlast (which-key--current-key-list))) @@ -2129,13 +2140,22 @@ current evil state. " (t (which-key-show-top-level))))) (defalias 'which-key-undo 'which-key-undo-key) -(defun which-key-abort () +(defun which-key-abort (&optional _) "Abort key sequence." (interactive) (let ((which-key-inhibit t)) (which-key--hide-popup-ignore-command) (keyboard-quit))) +(defun which-key-digit-argument (key) + "Version of `digit-argument' for use in `which-key-C-h-map'." + (interactive) + (let ((last-command-event (string-to-char key))) + (digit-argument key)) + (message "lce %s key %s pf %s" last-command-event key prefix-arg) + (let ((current-prefix-arg prefix-arg)) + (which-key-reload-key-sequence))) + ;;;###autoload (defun which-key-C-h-dispatch () "Dispatch C-h commands by looking up key in @@ -2166,12 +2186,14 @@ prefix) if `which-key-use-C-h-commands' is non nil." " \\[which-key-show-standard-help]" which-key-separator "help," " \\[which-key-abort]" - which-key-separator "abort")) + which-key-separator "abort" + " 1..9" + which-key-separator "digit-arg")) 'face 'which-key-note-face))) (key (string (read-key prompt))) (cmd (lookup-key which-key-C-h-map key)) (which-key-inhibit t)) - (if cmd (funcall cmd) (which-key-turn-page 0))))) + (if cmd (funcall cmd key) (which-key-turn-page 0))))) ;;; Update From 1219622b756f149efe4b44c625f2140c5229f936 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 8 Jan 2018 22:30:21 -0500 Subject: [PATCH 578/816] Remove debugging message --- which-key.el | 1 - 1 file changed, 1 deletion(-) diff --git a/which-key.el b/which-key.el index 41dfb332c7f..3400491b867 100644 --- a/which-key.el +++ b/which-key.el @@ -2152,7 +2152,6 @@ current evil state. " (interactive) (let ((last-command-event (string-to-char key))) (digit-argument key)) - (message "lce %s key %s pf %s" last-command-event key prefix-arg) (let ((current-prefix-arg prefix-arg)) (which-key-reload-key-sequence))) From c71fbbbc3ec49bac4b73fe2700d633e3037c7ae4 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 30 Jan 2018 20:29:51 -0500 Subject: [PATCH 579/816] Add option to show docstrings in which-key buffer Implements a simple version of the suggestion in #185 --- which-key.el | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 3400491b867..6ae8b725f82 100644 --- a/which-key.el +++ b/which-key.el @@ -215,6 +215,15 @@ only the first match is used to perform replacements from :group 'which-key :type 'boolean) +(defcustom which-key-show-docstrings nil + "If non-nil, show each command's docstring next to the command +in the which-key buffer. This will only display the docstring up +to the first line break. You probably also want to adjust +`which-key-max-description-length' at the same time if you use +this feature." + :group 'which-key + :type 'boolean) + (defcustom which-key-highlighted-command-list '() "A list of strings and/or cons cells used to highlight certain commands. If the element is a string, assume it is a regexp @@ -1584,14 +1593,24 @@ alists. Returns a list (key separator description)." (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern orig-desc))) (hl-face (which-key--highlight-face orig-desc)) - (key-binding (which-key--maybe-replace (cons keys orig-desc)))) + (key-binding (which-key--maybe-replace (cons keys orig-desc))) + (final-desc (which-key--propertize-description + (cdr key-binding) group local hl-face orig-desc))) + (when (and which-key-show-docstrings + (commandp (intern orig-desc)) + (documentation (intern orig-desc))) + (setq final-desc + (format "%s %s" + final-desc + (car + (split-string + (documentation (intern orig-desc)) "\n"))))) (when (consp key-binding) (push (list (which-key--propertize-key (which-key--extract-key (car key-binding))) sep-w-face - (which-key--propertize-description - (cdr key-binding) group local hl-face orig-desc)) + final-desc) new-list)))) (nreverse new-list))) From 0aae4c8634f5e282d7b0c2037d291ab926134730 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jan 2018 07:45:27 -0500 Subject: [PATCH 580/816] Improve which-key-show-docstrings option Add setting docstring-only to omit command names. Add which-key-docstring-face. See #185 --- which-key.el | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index 6ae8b725f82..1f4bfa14429 100644 --- a/which-key.el +++ b/which-key.el @@ -218,11 +218,15 @@ only the first match is used to perform replacements from (defcustom which-key-show-docstrings nil "If non-nil, show each command's docstring next to the command in the which-key buffer. This will only display the docstring up -to the first line break. You probably also want to adjust -`which-key-max-description-length' at the same time if you use -this feature." +to the first line break. If you set this variable to the symbol +docstring-only, then the command's name with be omitted. You +probably also want to adjust `which-key-max-description-length' +at the same time if you use this feature." :group 'which-key - :type 'boolean) + :type '(radio + (const :tag "Do not show docstrings" nil) + (const :tag "Add docstring to command names" t) + (const :tag "Replace command name with docstring" docstring-only))) (defcustom which-key-highlighted-command-list '() "A list of strings and/or cons cells used to highlight certain @@ -566,6 +570,11 @@ and it matches a string in `which-key-highlighted-command-list'." "Face for special keys (SPC, TAB, RET)" :group 'which-key-faces) +(defface which-key-docstring-face + '((t . (:inherit which-key-note-face))) + "Face for docstrings" + :group 'which-key-faces) + ;;;; Custom popup (defcustom which-key-custom-popup-max-dimensions-function nil @@ -1574,6 +1583,25 @@ ORIGINAL-DESCRIPTION is the description given by (match-string 1 key-str) (car (last (split-string key-str " "))))))) +(defun which-key--maybe-add-docstring (current original) + "Maybe concat a docstring to CURRENT and return result. +Specifically, do this if ORIGINAL is a command with a docstring +and `which-key-show-docstrings' is non-nil. If +`which-key-show-docstrings' is the symbol docstring-only, just +return the docstring." + (let* ((orig-sym (intern original)) + (doc (when (commandp orig-sym) + (documentation orig-sym))) + (docstring (when doc + (propertize (car (split-string doc "\n")) + 'face 'which-key-docstring-face)))) + (cond ((not (and which-key-show-docstrings docstring)) + current) + ((eq which-key-show-docstrings 'docstring-only) + docstring) + (t + (format "%s %s" current docstring))))) + (defun which-key--format-and-replace (unformatted) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement @@ -1596,15 +1624,7 @@ alists. Returns a list (key separator description)." (key-binding (which-key--maybe-replace (cons keys orig-desc))) (final-desc (which-key--propertize-description (cdr key-binding) group local hl-face orig-desc))) - (when (and which-key-show-docstrings - (commandp (intern orig-desc)) - (documentation (intern orig-desc))) - (setq final-desc - (format "%s %s" - final-desc - (car - (split-string - (documentation (intern orig-desc)) "\n"))))) + (setq final-desc (which-key--maybe-add-docstring final-desc orig-desc)) (when (consp key-binding) (push (list (which-key--propertize-key From 5493d22489d159a758cb3f5e5f34f191c35c58de Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jan 2018 08:04:24 -0500 Subject: [PATCH 581/816] Fix description truncation when showing docstrings --- which-key.el | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 1f4bfa14429..ae693713b47 100644 --- a/which-key.el +++ b/which-key.el @@ -1515,10 +1515,12 @@ If KEY contains any \"special keys\" defined in (defsubst which-key--truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." - (if (and which-key-max-description-length - (> (length desc) which-key-max-description-length)) - (concat (substring desc 0 which-key-max-description-length) "..") - desc)) + (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) + (dots (propertize ".." 'face last-face))) + (if (and which-key-max-description-length + (> (length desc) which-key-max-description-length)) + (concat (substring desc 0 which-key-max-description-length) dots) + desc))) (defun which-key--highlight-face (description) "Return the highlight face for DESCRIPTION if it has one." @@ -1549,8 +1551,7 @@ ORIGINAL-DESCRIPTION is the description given by (let* ((desc description) (desc (if (string-match-p "^group:" desc) (substring desc 6) desc)) - (desc (if group (concat which-key-prefix-prefix desc) desc)) - (desc (which-key--truncate-description desc))) + (desc (if group (concat which-key-prefix-prefix desc) desc))) (make-text-button desc nil 'face (cond (hl-face hl-face) (group 'which-key-group-description-face) @@ -1623,8 +1624,9 @@ alists. Returns a list (key separator description)." (hl-face (which-key--highlight-face orig-desc)) (key-binding (which-key--maybe-replace (cons keys orig-desc))) (final-desc (which-key--propertize-description - (cdr key-binding) group local hl-face orig-desc))) - (setq final-desc (which-key--maybe-add-docstring final-desc orig-desc)) + (cdr key-binding) group local hl-face orig-desc)) + (final-desc (which-key--maybe-add-docstring final-desc orig-desc)) + (final-desc (which-key--truncate-description final-desc))) (when (consp key-binding) (push (list (which-key--propertize-key From adc0d660ad495289042dd77bab1e9ca59b63e555 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jan 2018 08:58:15 -0500 Subject: [PATCH 582/816] Use safe version of propertize Should fix #186 --- which-key.el | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/which-key.el b/which-key.el index ae693713b47..ea4767d0c71 100644 --- a/which-key.el +++ b/which-key.el @@ -1492,12 +1492,17 @@ no title exists." which-key--current-show-keymap-name) (t ""))) +(defun which-key--propertize (string &rest properties) + "Version of `propertize' that checks type of STRING." + (when (stringp string) + (apply #'propertize string properties))) + (defun which-key--propertize-key (key) "Add a face to KEY. If KEY contains any \"special keys\" defined in `which-key-special-keys' then truncate and add the corresponding `which-key-special-key-face'." - (let ((key-w-face (propertize key 'face 'which-key-key-face)) + (let ((key-w-face (which-key--propertize key 'face 'which-key-key-face)) (regexp (concat "\\(" (mapconcat 'identity which-key-special-keys "\\|") "\\)")) @@ -1507,7 +1512,7 @@ If KEY contains any \"special keys\" defined in (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)) + (which-key--propertize (substring key-w-face beg (1+ beg)) 'face 'which-key-special-key-face) (substring key-w-face end (which-key--string-width key-w-face)))) @@ -1516,7 +1521,7 @@ If KEY contains any \"special keys\" defined in (defsubst which-key--truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) - (dots (propertize ".." 'face last-face))) + (dots (which-key--propertize ".." 'face last-face))) (if (and which-key-max-description-length (> (length desc) which-key-max-description-length)) (concat (substring desc 0 which-key-max-description-length) dots) @@ -1594,8 +1599,8 @@ return the docstring." (doc (when (commandp orig-sym) (documentation orig-sym))) (docstring (when doc - (propertize (car (split-string doc "\n")) - 'face 'which-key-docstring-face)))) + (which-key--propertize (car (split-string doc "\n")) + 'face 'which-key-docstring-face)))) (cond ((not (and which-key-show-docstrings docstring)) current) ((eq which-key-show-docstrings 'docstring-only) @@ -1608,7 +1613,8 @@ return the docstring." faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." (let ((sep-w-face - (propertize which-key-separator 'face 'which-key-separator-face)) + (which-key--propertize which-key-separator + 'face 'which-key-separator-face)) (local-map (current-local-map)) new-list) (dolist (key-binding unformatted) @@ -1911,8 +1917,8 @@ is the width of the live window." (or which-key--using-show-operator-keymap (not (and which-key-allow-evil-operators (bound-and-true-p evil-this-operator))))) - (propertize (format "[%s paging/help]" key) - 'face 'which-key-note-face)))) + (which-key--propertize (format "[%s paging/help]" key) + 'face 'which-key-note-face)))) (eval-and-compile (if (fboundp 'universal-argument--description) @@ -1947,7 +1953,7 @@ including prefix arguments." (if (or (eq which-key-show-prefix 'echo) dont-prop-keys) (concat str dash) (concat (which-key--propertize-key str) - (propertize dash 'face 'which-key-key-face))))) + (which-key--propertize dash 'face 'which-key-key-face))))) (defun which-key--get-popup-map () "Generate transient-map for use in the top level binding display." @@ -1971,17 +1977,17 @@ and a page count." (nxt-pg-hint (which-key--next-page-hint prefix-keys)) ;; not used in left case (status-line - (concat (propertize (which-key--maybe-get-prefix-title - (which-key--current-key-string)) - 'face 'which-key-note-face) + (concat (which-key--propertize (which-key--maybe-get-prefix-title + (which-key--current-key-string)) + 'face 'which-key-note-face) (when (< 1 n-pages) - (propertize (format " (%s of %s)" - (1+ page-n) n-pages) - 'face 'which-key-note-face))))) + (which-key--propertize (format " (%s of %s)" + (1+ page-n) n-pages) + 'face 'which-key-note-face))))) (pcase which-key-show-prefix (`left - (let* ((page-cnt (propertize (format "%s/%s" (1+ page-n) n-pages) - 'face 'which-key-separator-face)) + (let* ((page-cnt (which-key--propertize (format "%s/%s" (1+ page-n) n-pages) + 'face 'which-key-separator-face)) (first-col-width (+ 2 (max (which-key--string-width full-prefix) (which-key--string-width page-cnt)))) (prefix (format (concat "%-" (int-to-string first-col-width) "s") @@ -2207,13 +2213,13 @@ prefix) if `which-key-use-C-h-commands' is non nil." (let* ((prefix-keys (key-description which-key--current-prefix)) (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) (prompt (concat (when (string-equal prefix-keys "") - (propertize + (which-key--propertize (concat " " (or which-key--current-show-keymap-name "Top-level bindings")) 'face 'which-key-note-face)) full-prefix - (propertize + (which-key--propertize (substitute-command-keys (concat " \\" From e5db4b62560542d43c0763db5a170d5cc1cb2d5d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jan 2018 09:02:55 -0500 Subject: [PATCH 583/816] Handle null description in which-key--propertize-description Fixes #186 --- which-key.el | 56 +++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/which-key.el b/which-key.el index ea4767d0c71..827261dfd83 100644 --- a/which-key.el +++ b/which-key.el @@ -1553,33 +1553,35 @@ removing a \"group:\" prefix. ORIGINAL-DESCRIPTION is the description given by `describe-buffer-bindings'." - (let* ((desc description) - (desc (if (string-match-p "^group:" desc) - (substring desc 6) desc)) - (desc (if group (concat which-key-prefix-prefix desc) desc))) - (make-text-button desc nil - 'face (cond (hl-face hl-face) - (group 'which-key-group-description-face) - (local 'which-key-local-map-description-face) - (t 'which-key-command-description-face)) - 'help-echo (cond - ((and original-description - (fboundp (intern original-description)) - (documentation (intern original-description)) - ;; tooltip-mode doesn't exist in emacs-nox - (boundp 'tooltip-mode) tooltip-mode) - (documentation (intern original-description))) - ((and original-description - (fboundp (intern original-description)) - (documentation (intern original-description)) - (let* ((doc (documentation - (intern original-description))) - (str (replace-regexp-in-string "\n" " " doc)) - (max (floor (* (frame-width) 0.8)))) - (if (> (length str) max) - (concat (substring str 0 max) "...") - str)))))) - desc)) + (when description + (let* ((desc description) + (desc (if (string-match-p "^group:" desc) + (substring desc 6) desc)) + (desc (if group (concat which-key-prefix-prefix desc) desc))) + (make-text-button + desc nil + 'face (cond (hl-face hl-face) + (group 'which-key-group-description-face) + (local 'which-key-local-map-description-face) + (t 'which-key-command-description-face)) + 'help-echo (cond + ((and original-description + (fboundp (intern original-description)) + (documentation (intern original-description)) + ;; tooltip-mode doesn't exist in emacs-nox + (boundp 'tooltip-mode) tooltip-mode) + (documentation (intern original-description))) + ((and original-description + (fboundp (intern original-description)) + (documentation (intern original-description)) + (let* ((doc (documentation + (intern original-description))) + (str (replace-regexp-in-string "\n" " " doc)) + (max (floor (* (frame-width) 0.8)))) + (if (> (length str) max) + (concat (substring str 0 max) "...") + str)))))) + desc))) (defun which-key--extract-key (key-str) "Pull the last key (or key range) out of KEY-STR." From fce520f8af727bd33861f8d0f7655c01ea84ad85 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jan 2018 09:06:19 -0500 Subject: [PATCH 584/816] Improve which-key--format-and-replace Do a better job with nil descriptions --- which-key.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 827261dfd83..89c046846f9 100644 --- a/which-key.el +++ b/which-key.el @@ -1632,9 +1632,11 @@ alists. Returns a list (key separator description)." (hl-face (which-key--highlight-face orig-desc)) (key-binding (which-key--maybe-replace (cons keys orig-desc))) (final-desc (which-key--propertize-description - (cdr key-binding) group local hl-face orig-desc)) - (final-desc (which-key--maybe-add-docstring final-desc orig-desc)) - (final-desc (which-key--truncate-description final-desc))) + (cdr key-binding) group local hl-face orig-desc))) + (when final-desc + (setq final-desc + (which-key--truncate-description + (which-key--maybe-add-docstring final-desc orig-desc)))) (when (consp key-binding) (push (list (which-key--propertize-key From 6a4d2c2cc0e240cae1a4bb3526c3aab2d47665af Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 23 Feb 2018 13:32:19 -0500 Subject: [PATCH 585/816] Extract which-key--ignore-keys-regexp and which-key-show-keymap-1 --- which-key.el | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 89c046846f9..68c5d0e6cbd 100644 --- a/which-key.el +++ b/which-key.el @@ -654,6 +654,11 @@ used.") (defvar which-key--previous-frame-size nil) (defvar which-key--prefix-title-alist nil) (defvar which-key--debug nil) +(defvar which-key--ignore-keys-regexp + (eval-when-compile + (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" + "select-window" "switch-frame" "-state" + "which-key-")))) (make-obsolete-variable 'which-key-prefix-name-alist nil "2016-10-05") (make-obsolete-variable 'which-key-prefix-title-alist nil "2016-10-05") @@ -1677,11 +1682,6 @@ Requires `which-key-compute-remaps' to be non-nil" (buffer (current-buffer)) (ignore-bindings '("self-insert-command" "ignore" "ignore-event" "company-ignore")) - (ignore-keys-regexp - (eval-when-compile - (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" - "select-window" "switch-frame" "-state" - "which-key-")))) (ignore-sections-regexp (eval-when-compile (regexp-opt '("Key translations" "Function key map translations" @@ -1719,7 +1719,7 @@ Requires `which-key-compute-remaps' to be non-nil" (save-match-data (cond ((member binding ignore-bindings)) - ((string-match-p ignore-keys-regexp key)) + ((string-match-p which-key--ignore-keys-regexp key)) ((and which-key--current-prefix (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt) key)) @@ -2276,10 +2276,7 @@ Only if no keys fit fallback to LOC2." (which-key--show-page page-n) loc2)))) -(defun which-key-show-keymap () - "Show the top-level bindings in KEYMAP using which-key. KEYMAP -is selected interactively from all available keymaps." - (interactive) +(defun which-key-show-keymap-1 (&optional all) (let ((keymap-sym (intern (completing-read "Keymap: " obarray @@ -2290,7 +2287,14 @@ is selected interactively from all available keymaps." (make-sparse-keymap))))) t nil 'which-key-keymap-history)))) (which-key--show-keymap (symbol-name keymap-sym) - (symbol-value keymap-sym)))) + (symbol-value keymap-sym) + nil all))) + +(defun which-key-show-keymap () + "Show the top-level bindings in KEYMAP using which-key. KEYMAP +is selected interactively from all available keymaps." + (interactive) + (which-key-show-keymap-1)) (defun which-key-show-minor-mode-keymap () "Show the top-level bindings in KEYMAP using which-key. KEYMAP From 506c34829c6c2211046693c7482d4caa8b1a227f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 23 Feb 2018 13:34:11 -0500 Subject: [PATCH 586/816] Add which-key-show-full-keymap Command to show all bindings in a keymap recursively. Add test for new which-key--get-keymap-bindings functionality. --- which-key-tests.el | 23 +++++++++++++++++++++++ which-key.el | 45 +++++++++++++++++++++++++++++++-------------- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 5c17ab7f1c9..3e75d6fa62c 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -122,5 +122,28 @@ (should (equal (which-key--extract-key " a .. c") "a .. c")) (should (equal (which-key--extract-key "M-a a .. c") "a .. c"))) +(ert-deftest which-key-test--get-keymap-bindings () + (let ((map (make-sparse-keymap)) + which-key-replacement-alist) + (define-key map [which-key-a] '(which-key "blah")) + (define-key map "b" 'ignore) + (define-key map "c" "c") + (define-key map "dd" "dd") + (define-key map "eee" "eee") + (should (equal + (sort (which-key--get-keymap-bindings map) + (lambda (a b) (string-lessp (car a) (car b)))) + '(("b" . "ignore") + ("c" . "c") + ("d" . "Prefix Command") + ("e" . "Prefix Command")))) + (should (equal + (sort (which-key--get-keymap-bindings map t) + (lambda (a b) (string-lessp (car a) (car b)))) + '(("b" . "ignore") + ("c" . "c") + ("d d" . "dd") + ("e e e" . "eee")))))) + (provide 'which-key-tests) ;;; which-key-tests.el ends here diff --git a/which-key.el b/which-key.el index 68c5d0e6cbd..ab25ac9de23 100644 --- a/which-key.el +++ b/which-key.el @@ -1615,7 +1615,7 @@ return the docstring." (t (format "%s %s" current docstring))))) -(defun which-key--format-and-replace (unformatted) +(defun which-key--format-and-replace (unformatted &optional preserve-full-key) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." @@ -1645,24 +1645,34 @@ alists. Returns a list (key separator description)." (when (consp key-binding) (push (list (which-key--propertize-key - (which-key--extract-key (car key-binding))) + (if preserve-full-key + (car key-binding) + (which-key--extract-key (car key-binding)))) sep-w-face final-desc) new-list)))) (nreverse new-list))) -(defun which-key--get-keymap-bindings (keymap) +(defun which-key--get-keymap-bindings (keymap &optional all prefix) "Retrieve top-level bindings from KEYMAP." (let (bindings) (map-keymap (lambda (ev def) - (cl-pushnew - (cons (key-description (list ev)) - (cond ((keymapp def) "Prefix Command") - ((symbolp def) (copy-sequence (symbol-name def))) - ((eq 'lambda (car-safe def)) "lambda") - (t (format "%s" def)))) - bindings :test (lambda (a b) (string= (car a) (car b))))) + (let ((key (if prefix + (concat prefix " " (key-description (list ev))) + (key-description (list ev))))) + (unless (string-match-p which-key--ignore-keys-regexp key) + (if (and all (keymapp def)) + (setq bindings + (append bindings (which-key--get-keymap-bindings def t key))) + (cl-pushnew + (cons key + (cond + ((keymapp def) "Prefix Command") + ((symbolp def) (copy-sequence (symbol-name def))) + ((eq 'lambda (car-safe def)) "lambda") + (t (format "%s" def)))) + bindings :test (lambda (a b) (string= (car a) (car b)))))))) keymap) bindings)) @@ -1748,7 +1758,7 @@ Requires `which-key-compute-remaps' to be non-nil" (forward-line)) (nreverse bindings))))) -(defun which-key--get-formatted-key-bindings (&optional bindings filter) +(defun which-key--get-formatted-key-bindings (&optional bindings filter preserve-full-key) "Uses `describe-buffer-bindings' to collect the key bindings in BUFFER that follow the key sequence KEY-SEQ." (let* ((unformatted (if bindings bindings (which-key--get-current-bindings)))) @@ -1757,7 +1767,7 @@ BUFFER that follow the key sequence KEY-SEQ." (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) - (which-key--format-and-replace unformatted))) + (which-key--format-and-replace unformatted preserve-full-key))) ;;; Functions for laying out which-key buffer pages @@ -2296,6 +2306,12 @@ is selected interactively from all available keymaps." (interactive) (which-key-show-keymap-1)) +(defun which-key-show-full-keymap () + "Show all bindings in KEYMAP using which-key. KEYMAP is +selected interactively from all available keymaps." + (interactive) + (which-key-show-keymap-1 t)) + (defun which-key-show-minor-mode-keymap () "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively by mode in `minor-mode-map-alist'." @@ -2314,14 +2330,15 @@ is selected interactively by mode in `minor-mode-map-alist'." (which-key--show-keymap (symbol-name mode-sym) (cdr (assq mode-sym minor-mode-map-alist))))) -(defun which-key--show-keymap (keymap-name keymap &optional prior-args) +(defun which-key--show-keymap (keymap-name keymap &optional prior-args all) (setq which-key--current-prefix nil which-key--current-show-keymap-name keymap-name which-key--using-show-keymap t) (when prior-args (push prior-args which-key--prior-show-keymap-args)) (when (keymapp keymap) (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings keymap)))) + (which-key--get-keymap-bindings keymap all) + nil all))) (cond ((= (length formatted-keys) 0) (message "which-key: Keymap empty")) ((listp which-key-side-window-location) From ca991b0d3a1c0ff0ffae487d4bd1e7d7671708a7 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 23 Feb 2018 13:48:51 -0500 Subject: [PATCH 587/816] Autoload the show keymap functions --- which-key.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/which-key.el b/which-key.el index ab25ac9de23..fa865bf466a 100644 --- a/which-key.el +++ b/which-key.el @@ -2300,18 +2300,21 @@ Only if no keys fit fallback to LOC2." (symbol-value keymap-sym) nil all))) +;;;###autoload (defun which-key-show-keymap () "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively from all available keymaps." (interactive) (which-key-show-keymap-1)) +;;;###autoload (defun which-key-show-full-keymap () "Show all bindings in KEYMAP using which-key. KEYMAP is selected interactively from all available keymaps." (interactive) (which-key-show-keymap-1 t)) +;;;###autoload (defun which-key-show-minor-mode-keymap () "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively by mode in `minor-mode-map-alist'." From caa18b20860fa9b77798da703fccbd3531ce59b2 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 24 Feb 2018 16:29:33 -0500 Subject: [PATCH 588/816] Fix descriptions of keys involving meta when showing keymaps --- which-key.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index fa865bf466a..8d7256f42e0 100644 --- a/which-key.el +++ b/which-key.el @@ -1658,15 +1658,14 @@ alists. Returns a list (key separator description)." (let (bindings) (map-keymap (lambda (ev def) - (let ((key (if prefix - (concat prefix " " (key-description (list ev))) - (key-description (list ev))))) - (unless (string-match-p which-key--ignore-keys-regexp key) + (let* ((key (append prefix (list ev))) + (key-desc (key-description key))) + (unless (string-match-p which-key--ignore-keys-regexp key-desc) (if (and all (keymapp def)) (setq bindings (append bindings (which-key--get-keymap-bindings def t key))) (cl-pushnew - (cons key + (cons key-desc (cond ((keymapp def) "Prefix Command") ((symbolp def) (copy-sequence (symbol-name def))) From fd714bca146280ddbf363ae25d731f7f964b940f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 24 Feb 2018 16:33:13 -0500 Subject: [PATCH 589/816] Fix docstring of which-key--get-keymap-bindings --- which-key.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 8d7256f42e0..f16361d14c6 100644 --- a/which-key.el +++ b/which-key.el @@ -1654,7 +1654,9 @@ alists. Returns a list (key separator description)." (nreverse new-list))) (defun which-key--get-keymap-bindings (keymap &optional all prefix) - "Retrieve top-level bindings from KEYMAP." + "Retrieve top-level bindings from KEYMAP. +If ALL is non-nil, get all bindings, not just the top-level +one. PREFIX is for internal use and should not be used." (let (bindings) (map-keymap (lambda (ev def) @@ -1663,7 +1665,8 @@ alists. Returns a list (key separator description)." (unless (string-match-p which-key--ignore-keys-regexp key-desc) (if (and all (keymapp def)) (setq bindings - (append bindings (which-key--get-keymap-bindings def t key))) + (append bindings + (which-key--get-keymap-bindings def t key))) (cl-pushnew (cons key-desc (cond From 2e531873073ad2e224aba134ad0e7cc7b79512ae Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 24 Feb 2018 16:35:16 -0500 Subject: [PATCH 590/816] Fix typo in previous commit --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f16361d14c6..c4900e73844 100644 --- a/which-key.el +++ b/which-key.el @@ -1656,7 +1656,7 @@ alists. Returns a list (key separator description)." (defun which-key--get-keymap-bindings (keymap &optional all prefix) "Retrieve top-level bindings from KEYMAP. If ALL is non-nil, get all bindings, not just the top-level -one. PREFIX is for internal use and should not be used." +ones. PREFIX is for internal use and should not be used." (let (bindings) (map-keymap (lambda (ev def) From b5f706398e7114314f34ea2096794cfec964ed30 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 25 Feb 2018 22:35:38 -0500 Subject: [PATCH 591/816] Detect menu-items in which-key--get-keymap-bindings --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index c4900e73844..765fd37bd01 100644 --- a/which-key.el +++ b/which-key.el @@ -1673,6 +1673,7 @@ ones. PREFIX is for internal use and should not be used." ((keymapp def) "Prefix Command") ((symbolp def) (copy-sequence (symbol-name def))) ((eq 'lambda (car-safe def)) "lambda") + ((eq 'menu-item (car-safe def)) "menu-item") (t (format "%s" def)))) bindings :test (lambda (a b) (string= (car a) (car b)))))))) keymap) From 7da9f8caf39cea3895712ce410876b2403d34392 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 25 Feb 2018 22:36:10 -0500 Subject: [PATCH 592/816] Fix which-key--show-keymap when no bidnings found which-key--get-formatted-key-bindings takes a nil argument to mean look for global bindings which is not what we want here. --- which-key.el | 57 ++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/which-key.el b/which-key.el index 765fd37bd01..818ef17d2b7 100644 --- a/which-key.el +++ b/which-key.el @@ -2337,32 +2337,37 @@ is selected interactively by mode in `minor-mode-map-alist'." (cdr (assq mode-sym minor-mode-map-alist))))) (defun which-key--show-keymap (keymap-name keymap &optional prior-args all) - (setq which-key--current-prefix nil - which-key--current-show-keymap-name keymap-name - which-key--using-show-keymap t) - (when prior-args (push prior-args which-key--prior-show-keymap-args)) - (when (keymapp keymap) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings keymap all) - nil all))) - (cond ((= (length formatted-keys) 0) - (message "which-key: Keymap empty")) - ((listp which-key-side-window-location) - (setq which-key--last-try-2-loc - (apply #'which-key--try-2-side-windows - formatted-keys 0 which-key-side-window-location))) - (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys)) - (which-key--show-page 0))))) - (let* ((key (key-description (list (read-key)))) - (next-def (lookup-key keymap (kbd key)))) - (cond ((and which-key-use-C-h-commands (string= "C-h" key)) - (which-key-C-h-dispatch)) - ((keymapp next-def) - (which-key--hide-popup-ignore-command) - (which-key--show-keymap (concat keymap-name " " key) next-def - (cons keymap-name keymap))) - (t (which-key--hide-popup))))) + (let (unformatted-keys formatted-keys) + (setq which-key--current-prefix nil + which-key--current-show-keymap-name keymap-name + which-key--using-show-keymap t) + (when prior-args (push prior-args which-key--prior-show-keymap-args)) + (if (and (keymapp keymap) + (setq unformatted-keys (which-key--get-keymap-bindings keymap all)) + ;; need this in two steps otherwise + ;; `which-key--get-formatted-key-bindings' will look for global + ;; keys if second argument is nil + (setq formatted-keys (which-key--get-formatted-key-bindings + unformatted-keys nil all)) + (> (length formatted-keys) 0)) + (progn + (cond ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + formatted-keys 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages formatted-keys)) + (which-key--show-page 0))) + (let* ((key (key-description (list (read-key)))) + (next-def (lookup-key keymap (kbd key)))) + (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (which-key-C-h-dispatch)) + ((keymapp next-def) + (which-key--hide-popup-ignore-command) + (which-key--show-keymap (concat keymap-name " " key) next-def + (cons keymap-name keymap))) + (t (which-key--hide-popup))))) + (message "which-key: No bindings found in %s" keymap-name)))) (defun which-key--evil-operator-filter (binding) (let ((def (intern (cdr binding)))) From 0f80d0f95cbf133f52f64578d6a152e7e48ceb0e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 25 Feb 2018 22:51:11 -0500 Subject: [PATCH 593/816] Use symbol at point in whow keymap functions --- which-key.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 818ef17d2b7..fe68c9db834 100644 --- a/which-key.el +++ b/which-key.el @@ -2298,7 +2298,12 @@ Only if no keys fit fallback to LOC2." (keymapp (symbol-value m)) (not (equal (symbol-value m) (make-sparse-keymap))))) - t nil 'which-key-keymap-history)))) + t + (let ((sym (symbol-at-point))) + (and (boundp sym) + (keymapp (symbol-value sym)) + (symbol-name sym))) + 'which-key-keymap-history)))) (which-key--show-keymap (symbol-name keymap-sym) (symbol-value keymap-sym) nil all))) From f2515410211c63da0d010ae1882ebd3fc5641a41 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 26 Feb 2018 11:51:58 -0500 Subject: [PATCH 594/816] Refactor show keymap functions --- which-key.el | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/which-key.el b/which-key.el index fe68c9db834..96e71907705 100644 --- a/which-key.el +++ b/which-key.el @@ -2289,38 +2289,38 @@ Only if no keys fit fallback to LOC2." (which-key--show-page page-n) loc2)))) -(defun which-key-show-keymap-1 (&optional all) - (let ((keymap-sym (intern - (completing-read - "Keymap: " obarray - (lambda (m) - (and (boundp m) - (keymapp (symbol-value m)) - (not (equal (symbol-value m) - (make-sparse-keymap))))) - t - (let ((sym (symbol-at-point))) - (and (boundp sym) - (keymapp (symbol-value sym)) - (symbol-name sym))) - 'which-key-keymap-history)))) - (which-key--show-keymap (symbol-name keymap-sym) - (symbol-value keymap-sym) - nil all))) +(defun which-key--read-keymap () + "Read keymap symbol from minibuffer." + (intern + (completing-read "Keymap: " obarray + (lambda (m) + (and (boundp m) + (keymapp (symbol-value m)) + (not (equal (symbol-value m) + (make-sparse-keymap))))) + t + (let ((sym (symbol-at-point))) + (and (boundp sym) + (keymapp (symbol-value sym)) + (symbol-name sym))) + 'which-key-keymap-history))) ;;;###autoload -(defun which-key-show-keymap () +(defun which-key-show-keymap (keymap) "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively from all available keymaps." - (interactive) - (which-key-show-keymap-1)) + (interactive (list (which-key--read-keymap))) + (which-key--show-keymap (symbol-name keymap) + (symbol-value keymap))) ;;;###autoload -(defun which-key-show-full-keymap () +(defun which-key-show-full-keymap (keymap) "Show all bindings in KEYMAP using which-key. KEYMAP is selected interactively from all available keymaps." - (interactive) - (which-key-show-keymap-1 t)) + (interactive (list (which-key--read-keymap))) + (which-key--show-keymap (symbol-name keymap) + (symbol-value keymap) + nil t)) ;;;###autoload (defun which-key-show-minor-mode-keymap () From f77d4210f6215fedd25cebaddaca16c12cc9d0d1 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 26 Feb 2018 13:21:17 -0500 Subject: [PATCH 595/816] Consolidate key binding collection into which-key--get-bindings --- which-key.el | 83 +++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 43 deletions(-) diff --git a/which-key.el b/which-key.el index 96e71907705..2158dd929f5 100644 --- a/which-key.el +++ b/which-key.el @@ -1761,16 +1761,25 @@ Requires `which-key-compute-remaps' to be non-nil" (forward-line)) (nreverse bindings))))) -(defun which-key--get-formatted-key-bindings (&optional bindings filter preserve-full-key) - "Uses `describe-buffer-bindings' to collect the key bindings in -BUFFER that follow the key sequence KEY-SEQ." - (let* ((unformatted (if bindings bindings (which-key--get-current-bindings)))) +(defun which-key--get-bindings (&optional keymap filter recursive) + "Collect key bindings. +If KEYMAP is nil, collect from current buffer using the current +key sequence as a prefix. Otherwise, collect from KEYMAP. FILTER +is a function to use to filter the bindings. If RECURSIVE is +non-nil, then bindings are collected recursively for all prefixes." + (let* ((unformatted + (cond ((keymapp keymap) + (which-key--get-keymap-bindings keymap recursive)) + (keymap + (error "%s is not a keymap" keymap)) + (t + (which-key--get-current-bindings))))) (when filter (setq unformatted (cl-remove-if-not filter unformatted))) (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) - (which-key--format-and-replace unformatted preserve-full-key))) + (which-key--format-and-replace unformatted recursive))) ;;; Functions for laying out which-key buffer pages @@ -2342,37 +2351,29 @@ is selected interactively by mode in `minor-mode-map-alist'." (cdr (assq mode-sym minor-mode-map-alist))))) (defun which-key--show-keymap (keymap-name keymap &optional prior-args all) - (let (unformatted-keys formatted-keys) - (setq which-key--current-prefix nil - which-key--current-show-keymap-name keymap-name - which-key--using-show-keymap t) - (when prior-args (push prior-args which-key--prior-show-keymap-args)) - (if (and (keymapp keymap) - (setq unformatted-keys (which-key--get-keymap-bindings keymap all)) - ;; need this in two steps otherwise - ;; `which-key--get-formatted-key-bindings' will look for global - ;; keys if second argument is nil - (setq formatted-keys (which-key--get-formatted-key-bindings - unformatted-keys nil all)) - (> (length formatted-keys) 0)) - (progn - (cond ((listp which-key-side-window-location) - (setq which-key--last-try-2-loc - (apply #'which-key--try-2-side-windows - formatted-keys 0 which-key-side-window-location))) - (t (setq which-key--pages-plist - (which-key--create-pages formatted-keys)) - (which-key--show-page 0))) - (let* ((key (key-description (list (read-key)))) - (next-def (lookup-key keymap (kbd key)))) - (cond ((and which-key-use-C-h-commands (string= "C-h" key)) - (which-key-C-h-dispatch)) - ((keymapp next-def) - (which-key--hide-popup-ignore-command) - (which-key--show-keymap (concat keymap-name " " key) next-def - (cons keymap-name keymap))) - (t (which-key--hide-popup))))) - (message "which-key: No bindings found in %s" keymap-name)))) + (setq which-key--current-prefix nil + which-key--current-show-keymap-name keymap-name + which-key--using-show-keymap t) + (when prior-args (push prior-args which-key--prior-show-keymap-args)) + (let ((bindings (which-key--get-bindings keymap nil all))) + (if (= (length bindings) 0) + (message "which-key: No bindings found in %s" keymap-name) + (cond ((listp which-key-side-window-location) + (setq which-key--last-try-2-loc + (apply #'which-key--try-2-side-windows + bindings 0 which-key-side-window-location))) + (t (setq which-key--pages-plist + (which-key--create-pages bindings)) + (which-key--show-page 0))) + (let* ((key (key-description (list (read-key)))) + (next-def (lookup-key keymap (kbd key)))) + (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (which-key-C-h-dispatch)) + ((keymapp next-def) + (which-key--hide-popup-ignore-command) + (which-key--show-keymap (concat keymap-name " " key) next-def + (cons keymap-name keymap))) + (t (which-key--hide-popup))))))) (defun which-key--evil-operator-filter (binding) (let ((def (intern (cdr binding)))) @@ -2390,9 +2391,8 @@ is selected interactively by mode in `minor-mode-map-alist'." which-key--current-show-keymap-name "evil operator/motion keys" which-key--using-show-operator-keymap t) (when (keymapp keymap) - (let ((formatted-keys (which-key--get-formatted-key-bindings - (which-key--get-keymap-bindings keymap) - #'which-key--evil-operator-filter))) + (let ((formatted-keys + (which-key--get-bindings keymap #'which-key--evil-operator-filter))) (cond ((= (length formatted-keys) 0) (message "which-key: Keymap empty")) ((listp which-key-side-window-location) @@ -2421,10 +2421,7 @@ Finally, show the buffer." (setq which-key--current-prefix prefix-keys which-key--last-try-2-loc nil) (let ((start-time (when which-key--debug (current-time))) - (formatted-keys (which-key--get-formatted-key-bindings - (when from-keymap - (which-key--get-keymap-bindings from-keymap)) - filter)) + (formatted-keys (which-key--get-bindings from-keymap filter)) (prefix-keys (key-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys)) From 9dc8d3233b6a4d8079c8a8a4b24f61ac146aa694 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 26 Feb 2018 13:24:41 -0500 Subject: [PATCH 596/816] Add which-key-toggle-docstrings --- which-key.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/which-key.el b/which-key.el index 2158dd929f5..82e747a2ed5 100644 --- a/which-key.el +++ b/which-key.el @@ -418,6 +418,8 @@ prefixes in `which-key-paging-prefixes'" (let ((map (make-sparse-keymap))) (dolist (bind '(("\C-a" . which-key-abort) ("a" . which-key-abort) + ("\C-d" . which-key-toggle-docstrings) + ("d" . which-key-toggle-docstrings) ("\C-h" . which-key-show-standard-help) ("h" . which-key-show-standard-help) ("\C-n" . which-key-show-next-page-cycle) @@ -2228,6 +2230,14 @@ current evil state. " (let ((current-prefix-arg prefix-arg)) (which-key-reload-key-sequence))) +(defun which-key-toggle-docstrings (&optional _) + "Toggle the display of docstrings." + (interactive) + (unless (eq which-key-show-docstrings 'docstring-only) + (setq which-key-show-docstrings (null which-key-show-docstrings))) + (which-key-reload-key-sequence) + (which-key--create-buffer-and-show which-key--current-prefix)) + ;;;###autoload (defun which-key-C-h-dispatch () "Dispatch C-h commands by looking up key in @@ -2255,6 +2265,8 @@ prefix) if `which-key-use-C-h-commands' is non nil." which-key-separator "previous-page," " \\[which-key-undo-key]" which-key-separator "undo-key," + " \\[which-key-toggle-docstrings]" + which-key-separator "toggle-docstrings," " \\[which-key-show-standard-help]" which-key-separator "help," " \\[which-key-abort]" From ab6039187314fccf0f5c22d51684f21a394b1f63 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 27 Feb 2018 09:04:39 -0500 Subject: [PATCH 597/816] Use cl-struct to hold which-key pages --- which-key.el | 183 +++++++++++++++++++++++++++++---------------------- 1 file changed, 104 insertions(+), 79 deletions(-) diff --git a/which-key.el b/which-key.el index 82e747a2ed5..ca1aa25e9a8 100644 --- a/which-key.el +++ b/which-key.el @@ -634,15 +634,8 @@ Used when `which-key-popup-type' is frame.") "Internal: Backup the initial value of `echo-keystrokes'.") (defvar which-key--prefix-help-cmd-backup nil "Internal: Backup the value of `prefix-help-command'.") -(defvar which-key--pages-plist nil - "Internal: Holds page objects") (defvar which-key--current-prefix nil "Internal: Holds current prefix") -(defvar which-key--current-page-n nil - "Internal: Current pages of showing buffer. Nil means no buffer -showing.") -(defvar which-key--on-last-page nil - "Internal: Non-nil if showing last page.") (defvar which-key--last-try-2-loc nil "Internal: Last location of side-window when two locations used.") @@ -665,6 +658,40 @@ used.") (make-obsolete-variable 'which-key-prefix-name-alist nil "2016-10-05") (make-obsolete-variable 'which-key-prefix-title-alist nil "2016-10-05") +(defvar which-key--pages-obj nil) +(cl-defstruct which-key--pages + pages + height + widths + keys/page + page-nums + num-pages + total-keys) + +(defun which-key--rotate (list n) + (let* ((len (length list)) + (n (if (< n 0) (+ len n) n)) + (n (mod n len))) + (append (last list (- len n)) (butlast list (- len n))))) + +(defun which-key--pages-set-current-page (pages-obj n) + (setf (which-key--pages-pages pages-obj) + (which-key--rotate (which-key--pages-pages pages-obj) n)) + (setf (which-key--pages-widths pages-obj) + (which-key--rotate (which-key--pages-widths pages-obj) n)) + (setf (which-key--pages-keys/page pages-obj) + (which-key--rotate (which-key--pages-keys/page pages-obj) n)) + (setf (which-key--pages-page-nums pages-obj) + (which-key--rotate (which-key--pages-page-nums pages-obj) n)) + pages-obj) + +(defsubst which-key--on-first-page () + (= (which-key--pages-page-nums which-key--pages-obj) 1)) + +(defsubst which-key--on-last-page () + (= (which-key--pages-page-nums which-key--pages-obj) + (which-key--pages-num-pages which-key--pages-obj))) + ;;; Third-party library support ;;;; Evil @@ -1033,8 +1060,7 @@ total height." (defun which-key--hide-popup () "This function is called to hide the which-key buffer." (unless (member real-this-command which-key--paging-functions) - (setq which-key--current-page-n nil - which-key--current-prefix nil + (setq which-key--current-prefix nil which-key--using-top-level nil which-key--using-show-keymap nil which-key--using-show-operator-keymap nil @@ -1835,16 +1861,15 @@ that width." (defun which-key--list-to-pages (keys avl-lines avl-width) "Convert list of KEYS to columns based on dimensions AVL-LINES and AVL-WIDTH. -Returns a plist that holds the page strings, as well as -metadata." +Returns a `which-key--pages' object that holds the page strings, +as well as metadata." (let ((cols-w-widths (mapcar #'which-key--pad-column (which-key--partition-list avl-lines keys))) (page-width 0) (n-pages 0) (n-keys 0) (n-columns 0) page-cols pages page-widths keys/page col) (if (> (apply #'max (mapcar #'car cols-w-widths)) avl-width) ;; give up if no columns fit - (list :pages nil :page-height 0 :page-widths '(0) - :keys/page '(0) :n-pages 0 :tot-keys 0) + nil (while cols-w-widths ;; start new page (cl-incf n-pages) @@ -1866,10 +1891,14 @@ metadata." (push (which-key--join-columns page-cols) pages) (push n-keys keys/page) (push page-width page-widths)) - (list :pages (nreverse pages) :page-height avl-lines - :page-widths (nreverse page-widths) - :keys/page (reverse keys/page) :n-pages n-pages - :tot-keys (apply #'+ keys/page))))) + (make-which-key--pages + :pages (nreverse pages) + :height avl-lines + :widths (nreverse page-widths) + :keys/page (reverse keys/page) + :page-nums (number-sequence 1 n-pages) + :num-pages n-pages + :total-keys (apply #'+ keys/page))))) (defun which-key--create-pages-1 (keys available-lines available-width &optional min-lines vertical) @@ -1882,8 +1911,9 @@ should be minimized." keys available-lines available-width)) (min-lines (or min-lines 0)) found prev-result) - (if (or vertical - (> (plist-get result :n-pages) 1) + (if (or (null result) + vertical + (> (which-key--pages-num-pages result) 1) (= 1 available-lines)) result ;; simple search for a fitting page @@ -1893,7 +1923,7 @@ should be minimized." prev-result result result (which-key--list-to-pages keys available-lines available-width) - found (> (plist-get result :n-pages) 1))) + found (> (which-key--pages-num-pages result) 1))) (if found prev-result result)))) (defun which-key--create-pages (keys) @@ -1913,14 +1943,18 @@ is the width of the live window." (min-lines (min avl-lines which-key-min-display-lines)) (avl-width (if prefix (- max-width prefix) max-width)) (vertical (and (eq which-key-popup-type 'side-window) - (member which-key-side-window-location '(left right))))) - (which-key--create-pages-1 keys avl-lines avl-width min-lines vertical))) + (member which-key-side-window-location '(left right)))) + result) + (setq result + (which-key--create-pages-1 keys avl-lines avl-width min-lines vertical)) + (when (> (which-key--pages-num-pages result) 0) + result))) -(defun which-key--lighter-status (page-n) +(defun which-key--lighter-status () "Possibly show number of keys and total in the mode line." (when which-key-show-remaining-keys - (let ((n-shown (nth page-n (plist-get which-key--pages-plist :keys/page))) - (n-tot (plist-get which-key--pages-plist :tot-keys))) + (let ((n-shown (car (which-key--pages-keys/page which-key--pages-obj))) + (n-tot (which-key--pages-total-keys which-key--pages-obj))) (setcar (cdr (assq 'which-key-mode minor-mode-alist)) (format " WK: %s/%s keys" n-shown n-tot))))) @@ -1993,13 +2027,14 @@ including prefix arguments." (define-key map (kbd "C-h") #'which-key-C-h-dispatch)) map))) -(defun which-key--process-page (page-n pages-plist) +(defun which-key--process-page (pages-obj) "Add information to the basic list of key bindings, including if applicable the current prefix, the name of the current prefix, and a page count." - (let* ((page (nth page-n (plist-get pages-plist :pages))) - (height (plist-get pages-plist :page-height)) - (n-pages (plist-get pages-plist :n-pages)) + (let* ((page (car (which-key--pages-pages pages-obj))) + (height (which-key--pages-height pages-obj)) + (n-pages (which-key--pages-num-pages pages-obj)) + (page-n (car (which-key--pages-page-nums pages-obj))) (prefix-keys (key-description which-key--current-prefix)) (full-prefix (which-key--full-prefix prefix-keys)) (nxt-pg-hint (which-key--next-page-hint prefix-keys)) @@ -2009,12 +2044,11 @@ and a page count." (which-key--current-key-string)) 'face 'which-key-note-face) (when (< 1 n-pages) - (which-key--propertize (format " (%s of %s)" - (1+ page-n) n-pages) + (which-key--propertize (format " (%s of %s)" page-n n-pages) 'face 'which-key-note-face))))) (pcase which-key-show-prefix (`left - (let* ((page-cnt (which-key--propertize (format "%s/%s" (1+ page-n) n-pages) + (let* ((page-cnt (which-key--propertize (format "%s/%s" page-n n-pages) 'face 'which-key-separator-face)) (first-col-width (+ 2 (max (which-key--string-width full-prefix) (which-key--string-width page-cnt)))) @@ -2066,23 +2100,22 @@ and a page count." " " nxt-pg-hint)))))) (_ (cons page nil))))) -(defun which-key--show-page (n) - "Show page N, starting from 0." +(defun which-key--show-page (&optional n) + "Show current page. N changes the current page to the Nth page +relative to the current one." (which-key--init-buffer) ;; in case it was killed - (let ((n-pages (plist-get which-key--pages-plist :n-pages)) - (prefix-keys (key-description which-key--current-prefix)) - page-n golden-ratio-mode) - (if (= 0 n-pages) + (let ((prefix-keys (key-description which-key--current-prefix)) + golden-ratio-mode) + (if (null which-key--pages-obj) (message "%s- which-key can't show keys: There is not \ enough space based on your settings and frame size." prefix-keys) - (setq page-n (mod n n-pages)) - (setq which-key--current-page-n page-n) - (when (= n-pages (1+ n)) (setq which-key--on-last-page t)) - (let ((page-echo (which-key--process-page page-n which-key--pages-plist)) - (height (plist-get which-key--pages-plist :page-height)) - (width - (nth page-n (plist-get which-key--pages-plist :page-widths)))) - (which-key--lighter-status page-n) + (when n + (setq which-key--pages-obj + (which-key--pages-set-current-page which-key--pages-obj n))) + (let ((page-echo (which-key--process-page which-key--pages-obj)) + (height (which-key--pages-height which-key--pages-obj)) + (width (car (which-key--pages-widths which-key--pages-obj)))) + (which-key--lighter-status) (if (eq which-key-popup-type 'minibuffer) (which-key--echo (car page-echo)) (with-current-buffer which-key--buffer @@ -2113,15 +2146,13 @@ used are reapplied to the new key sequence." (defun which-key-turn-page (delta) "Show the next page of keys." - (let ((next-page (if which-key--current-page-n - (+ which-key--current-page-n delta) 0))) - (which-key-reload-key-sequence) - (if which-key--last-try-2-loc - (let ((which-key-side-window-location which-key--last-try-2-loc) - (which-key--multiple-locations t)) - (which-key--show-page next-page)) - (which-key--show-page next-page)) - (which-key--start-paging-timer))) + (which-key-reload-key-sequence) + (if which-key--last-try-2-loc + (let ((which-key-side-window-location which-key--last-try-2-loc) + (which-key--multiple-locations t)) + (which-key--show-page delta)) + (which-key--show-page delta)) + (which-key--start-paging-timer)) ;;;###autoload (defun which-key-show-standard-help (&optional _) @@ -2144,8 +2175,7 @@ Usually this is `describe-prefix-bindings'." call `which-key-show-standard-help'." (interactive) (let ((which-key-inhibit t)) - (if (and which-key--current-page-n - which-key--on-last-page) + (if (which-key--on-last-page) (which-key-show-standard-help) (which-key-turn-page 1)))) @@ -2155,9 +2185,7 @@ call `which-key-show-standard-help'." case do nothing." (interactive) (let ((which-key-inhibit t)) - (if (and which-key--current-page-n - (eq which-key--current-page-n 0)) - (which-key-turn-page 0) + (unless (which-key--on-first-page) (which-key-turn-page -1)))) ;;;###autoload @@ -2288,7 +2316,7 @@ prefix) if `which-key-use-C-h-commands' is non nil." (when (string-match-p regexp string) (throw 'match t))))) -(defun which-key--try-2-side-windows (keys page-n loc1 loc2 &rest _ignore) +(defun which-key--try-2-side-windows (keys loc1 loc2 &rest _ignore) "Try to show KEYS (PAGE-N) in LOC1 first. Only if no keys fit fallback to LOC2." @@ -2296,18 +2324,18 @@ Only if no keys fit fallback to LOC2." (let ((which-key-side-window-location loc1) (which-key--multiple-locations t)) (setq pages1 (which-key--create-pages keys))) - (if (< 0 (plist-get pages1 :n-pages)) + (if pages1 (progn - (setq which-key--pages-plist pages1) + (setq which-key--pages-obj pages1) (let ((which-key-side-window-location loc1) (which-key--multiple-locations t)) - (which-key--show-page page-n)) + (which-key--show-page)) loc1) (let ((which-key-side-window-location loc2) (which-key--multiple-locations t)) - (setq which-key--pages-plist + (setq which-key--pages-obj (which-key--create-pages keys)) - (which-key--show-page page-n) + (which-key--show-page) loc2)))) (defun which-key--read-keymap () @@ -2373,10 +2401,10 @@ is selected interactively by mode in `minor-mode-map-alist'." (cond ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - bindings 0 which-key-side-window-location))) - (t (setq which-key--pages-plist + bindings which-key-side-window-location))) + (t (setq which-key--pages-obj (which-key--create-pages bindings)) - (which-key--show-page 0))) + (which-key--show-page))) (let* ((key (key-description (list (read-key)))) (next-def (lookup-key keymap (kbd key)))) (cond ((and which-key-use-C-h-commands (string= "C-h" key)) @@ -2410,10 +2438,10 @@ is selected interactively by mode in `minor-mode-map-alist'." ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - formatted-keys 0 which-key-side-window-location))) - (t (setq which-key--pages-plist + formatted-keys which-key-side-window-location))) + (t (setq which-key--pages-obj (which-key--create-pages formatted-keys)) - (which-key--show-page 0))))) + (which-key--show-page))))) (let* ((key (key-description (list (read-key))))) (when (string= key "`") ;; evil-goto-mark reads the next char manually @@ -2440,10 +2468,10 @@ Finally, show the buffer." ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - formatted-keys 0 which-key-side-window-location))) - (t (setq which-key--pages-plist + formatted-keys which-key-side-window-location))) + (t (setq which-key--pages-obj (which-key--create-pages formatted-keys)) - (which-key--show-page 0))) + (which-key--show-page))) (when which-key--debug (message "On prefix \"%s\" which-key took %.0f ms." prefix-keys (* 1000 (float-time (time-since start-time))))))) @@ -2522,8 +2550,7 @@ Finally, show the buffer." (eq evil-state 'operator) (not which-key--using-show-operator-keymap)) (which-key--show-evil-operator-keymap)) - ((and which-key--current-page-n - (not which-key--using-top-level) + ((and (not which-key--using-top-level) (not which-key--using-show-operator-keymap) (not which-key--using-show-keymap)) (which-key--hide-popup))))) @@ -2556,8 +2583,6 @@ Finally, show the buffer." (and (< 0 (length (this-single-command-keys))) (not (equal which-key--current-prefix (this-single-command-keys))))) - (setq which-key--current-page-n nil - which-key--on-last-page nil) (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) From 61e399f75f7ea90f9dfbd1407730e685b7e3f17d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 27 Feb 2018 20:30:07 -0500 Subject: [PATCH 598/816] Add and use which-key--automatic-display --- which-key.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index ca1aa25e9a8..038c4686aad 100644 --- a/which-key.el +++ b/which-key.el @@ -639,6 +639,9 @@ Used when `which-key-popup-type' is frame.") (defvar which-key--last-try-2-loc nil "Internal: Last location of side-window when two locations used.") +(defvar which-key--automatic-display nil + "Internal: Non-nil if popup was triggered with automatic +update.") (defvar which-key--multiple-locations nil) (defvar which-key--using-top-level nil) (defvar which-key--using-show-keymap nil) @@ -1061,6 +1064,7 @@ total height." "This function is called to hide the which-key buffer." (unless (member real-this-command which-key--paging-functions) (setq which-key--current-prefix nil + which-key--automatic-display nil which-key--using-top-level nil which-key--using-show-keymap nil which-key--using-show-operator-keymap nil @@ -2534,6 +2538,7 @@ Finally, show the buffer." (key-description prefix-keys) (length prefix-keys)))) (sit-for delay-time))) + (setq which-key--automatic-display t) (which-key--create-buffer-and-show prefix-keys) (when (and which-key-idle-secondary-delay (not which-key--secondary-timer-active)) @@ -2550,9 +2555,7 @@ Finally, show the buffer." (eq evil-state 'operator) (not which-key--using-show-operator-keymap)) (which-key--show-evil-operator-keymap)) - ((and (not which-key--using-top-level) - (not which-key--using-show-operator-keymap) - (not which-key--using-show-keymap)) + (which-key--automatic-display (which-key--hide-popup))))) ;;; Timers From ed7aa66aadfe23cd318a656d0898a0441f8b395b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 27 Feb 2018 20:32:19 -0500 Subject: [PATCH 599/816] Remove a bunch of global variables Remove need for which-key--using-top-level. Add prefix-title slot to which-key--pages object. Remove which-key--using-show-keymap. Remove which-key--current-show-keymap-name. Remove which-key--using-show-operator-keymap. --- which-key.el | 82 +++++++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 46 deletions(-) diff --git a/which-key.el b/which-key.el index 038c4686aad..4911c4c0cc5 100644 --- a/which-key.el +++ b/which-key.el @@ -643,11 +643,7 @@ used.") "Internal: Non-nil if popup was triggered with automatic update.") (defvar which-key--multiple-locations nil) -(defvar which-key--using-top-level nil) -(defvar which-key--using-show-keymap nil) -(defvar which-key--using-show-operator-keymap nil) (defvar which-key--inhibit-next-operator-popup nil) -(defvar which-key--current-show-keymap-name nil) (defvar which-key--prior-show-keymap-args nil) (defvar which-key--previous-frame-size nil) (defvar which-key--prefix-title-alist nil) @@ -669,7 +665,9 @@ update.") keys/page page-nums num-pages - total-keys) + total-keys + prefix + prefix-title) (defun which-key--rotate (list n) (let* ((len (length list)) @@ -1065,12 +1063,7 @@ total height." (unless (member real-this-command which-key--paging-functions) (setq which-key--current-prefix nil which-key--automatic-display nil - which-key--using-top-level nil - which-key--using-show-keymap nil - which-key--using-show-operator-keymap nil - which-key--current-show-keymap-name nil - which-key--prior-show-keymap-args nil - which-key--on-last-page nil) + which-key--prior-show-keymap-args nil) (when (and which-key-idle-secondary-delay which-key--secondary-timer-active) (which-key--start-timer)) @@ -1524,10 +1517,7 @@ no title exists." (if alternate alternate (concat "Following " keys))) (t "")))) - (which-key--using-top-level which-key--using-top-level) - (which-key--current-show-keymap-name - which-key--current-show-keymap-name) - (t ""))) + (t ""))) (defun which-key--propertize (string &rest properties) "Version of `propertize' that checks type of STRING." @@ -1930,7 +1920,7 @@ should be minimized." found (> (which-key--pages-num-pages result) 1))) (if found prev-result result)))) -(defun which-key--create-pages (keys) +(defun which-key--create-pages (keys &optional prefix-title) "Create page strings using `which-key--list-to-pages'. Will try to find the best number of rows and columns using the given dimensions and the length and wdiths of KEYS. SEL-WIN-WIDTH @@ -1952,6 +1942,10 @@ is the width of the live window." (setq result (which-key--create-pages-1 keys avl-lines avl-width min-lines vertical)) (when (> (which-key--pages-num-pages result) 0) + (setf (which-key--pages-prefix-title result) + (or prefix-title + (which-key--maybe-get-prefix-title + (which-key--current-key-string)))) result))) (defun which-key--lighter-status () @@ -1979,10 +1973,7 @@ is the width of the live window." (paging-key-bound (eq 'which-key-C-h-dispatch (key-binding (kbd paging-key)))) (key (if paging-key-bound which-key-paging-key "C-h"))) - (when (and which-key-use-C-h-commands - (or which-key--using-show-operator-keymap - (not (and which-key-allow-evil-operators - (bound-and-true-p evil-this-operator))))) + (when which-key-use-C-h-commands (which-key--propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) @@ -2040,13 +2031,12 @@ and a page count." (n-pages (which-key--pages-num-pages pages-obj)) (page-n (car (which-key--pages-page-nums pages-obj))) (prefix-keys (key-description which-key--current-prefix)) + (prefix-title (which-key--pages-prefix-title pages-obj)) (full-prefix (which-key--full-prefix prefix-keys)) (nxt-pg-hint (which-key--next-page-hint prefix-keys)) ;; not used in left case (status-line - (concat (which-key--propertize (which-key--maybe-get-prefix-title - (which-key--current-key-string)) - 'face 'which-key-note-face) + (concat (which-key--propertize prefix-title 'face 'which-key-note-face) (when (< 1 n-pages) (which-key--propertize (format " (%s of %s)" page-n n-pages) 'face 'which-key-note-face))))) @@ -2212,8 +2202,7 @@ after first page." (defun which-key-show-top-level (&optional _) "Show top-level bindings." (interactive) - (setq which-key--using-top-level "Top-level bindings") - (which-key--create-buffer-and-show nil)) + (which-key--create-buffer-and-show nil nil nil "Top-level bindings")) ;;;###autoload (defun which-key-show-major-mode () @@ -2223,11 +2212,12 @@ This function will also detect evil bindings made using `evil-define-key' in this map. These bindings will depend on the current evil state. " (interactive) - (setq which-key--using-top-level "Major-mode bindings") (let ((map-sym (intern (format "%s-map" major-mode)))) (if (and (boundp map-sym) (keymapp (symbol-value map-sym))) (which-key--create-buffer-and-show - nil nil (apply-partially #'which-key--map-binding-p (symbol-value map-sym))) + nil nil + (apply-partially #'which-key--map-binding-p (symbol-value map-sym)) + "Major-mode bindings") (message "which-key: No map named %s" map-sym)))) ;;;###autoload @@ -2236,7 +2226,7 @@ current evil state. " (interactive) (let* ((key-lst (butlast (which-key--current-key-list))) (which-key-inhibit t)) - (cond ((stringp which-key--current-show-keymap-name) + (cond (which-key--prior-show-keymap-args (if (keymapp (cdr (car-safe which-key--prior-show-keymap-args))) (let ((args (pop which-key--prior-show-keymap-args))) (which-key--show-keymap (car args) (cdr args))) @@ -2283,8 +2273,8 @@ prefix) if `which-key-use-C-h-commands' is non nil." (prompt (concat (when (string-equal prefix-keys "") (which-key--propertize (concat " " - (or which-key--current-show-keymap-name - "Top-level bindings")) + (which-key--pages-prefix-title + which-key--pages-obj)) 'face 'which-key-note-face)) full-prefix (which-key--propertize @@ -2320,14 +2310,15 @@ prefix) if `which-key-use-C-h-commands' is non nil." (when (string-match-p regexp string) (throw 'match t))))) -(defun which-key--try-2-side-windows (keys loc1 loc2 &rest _ignore) +(defun which-key--try-2-side-windows + (keys prefix-title loc1 loc2 &rest _ignore) "Try to show KEYS (PAGE-N) in LOC1 first. Only if no keys fit fallback to LOC2." (let (pages1) (let ((which-key-side-window-location loc1) (which-key--multiple-locations t)) - (setq pages1 (which-key--create-pages keys))) + (setq pages1 (which-key--create-pages keys prefix-title))) (if pages1 (progn (setq which-key--pages-obj pages1) @@ -2338,7 +2329,7 @@ Only if no keys fit fallback to LOC2." (let ((which-key-side-window-location loc2) (which-key--multiple-locations t)) (setq which-key--pages-obj - (which-key--create-pages keys)) + (which-key--create-pages keys prefix-title)) (which-key--show-page) loc2)))) @@ -2395,9 +2386,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (cdr (assq mode-sym minor-mode-map-alist))))) (defun which-key--show-keymap (keymap-name keymap &optional prior-args all) - (setq which-key--current-prefix nil - which-key--current-show-keymap-name keymap-name - which-key--using-show-keymap t) + (setq which-key--current-prefix nil) (when prior-args (push prior-args which-key--prior-show-keymap-args)) (let ((bindings (which-key--get-bindings keymap nil all))) (if (= (length bindings) 0) @@ -2405,9 +2394,9 @@ is selected interactively by mode in `minor-mode-map-alist'." (cond ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - bindings which-key-side-window-location))) + bindings keymap-name which-key-side-window-location))) (t (setq which-key--pages-obj - (which-key--create-pages bindings)) + (which-key--create-pages bindings keymap-name)) (which-key--show-page))) (let* ((key (key-description (list (read-key)))) (next-def (lookup-key keymap (kbd key)))) @@ -2431,9 +2420,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (make-composed-keymap (list evil-operator-shortcut-map evil-operator-state-map evil-motion-state-map)))) - (setq which-key--current-prefix nil - which-key--current-show-keymap-name "evil operator/motion keys" - which-key--using-show-operator-keymap t) + (setq which-key--current-prefix nil) (when (keymapp keymap) (let ((formatted-keys (which-key--get-bindings keymap #'which-key--evil-operator-filter))) @@ -2442,7 +2429,8 @@ is selected interactively by mode in `minor-mode-map-alist'." ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - formatted-keys which-key-side-window-location))) + formatted-keys "evil operator/motion keys" + which-key-side-window-location))) (t (setq which-key--pages-obj (which-key--create-pages formatted-keys)) (which-key--show-page))))) @@ -2459,7 +2447,8 @@ is selected interactively by mode in `minor-mode-map-alist'." (which-key--hide-popup) (setq unread-command-events (listify-key-sequence key)))))))) -(defun which-key--create-buffer-and-show (&optional prefix-keys from-keymap filter) +(defun which-key--create-buffer-and-show + (&optional prefix-keys from-keymap filter prefix-title) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." (setq which-key--current-prefix prefix-keys @@ -2472,9 +2461,10 @@ Finally, show the buffer." ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - formatted-keys which-key-side-window-location))) + formatted-keys prefix-title + which-key-side-window-location))) (t (setq which-key--pages-obj - (which-key--create-pages formatted-keys)) + (which-key--create-pages formatted-keys prefix-title)) (which-key--show-page))) (when which-key--debug (message "On prefix \"%s\" which-key took %.0f ms." prefix-keys @@ -2553,7 +2543,7 @@ Finally, show the buffer." ((and which-key-show-operator-state-maps (bound-and-true-p evil-state) (eq evil-state 'operator) - (not which-key--using-show-operator-keymap)) + (not (which-key--popup-showing-p))) (which-key--show-evil-operator-keymap)) (which-key--automatic-display (which-key--hide-popup))))) From e97253b0523121f15e1a7965e7f4b792e25e2b6c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 27 Feb 2018 21:05:58 -0500 Subject: [PATCH 600/816] Add prefix arg to which-key--get-current-bindings and .. which-key--get-bindings --- which-key.el | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/which-key.el b/which-key.el index 4911c4c0cc5..2abb5296b6d 100644 --- a/which-key.el +++ b/which-key.el @@ -1711,9 +1711,9 @@ Requires `which-key-compute-remaps' to be non-nil" (copy-sequence (symbol-name remap)) binding))) -(defun which-key--get-current-bindings () +(defun which-key--get-current-bindings (&optional prefix) "Generate a list of current active bindings." - (let ((key-str-qt (regexp-quote (key-description which-key--current-prefix))) + (let ((key-str-qt (regexp-quote (key-description prefix))) (buffer (current-buffer)) (ignore-bindings '("self-insert-command" "ignore" "ignore-event" "company-ignore")) @@ -1724,7 +1724,7 @@ Requires `which-key-compute-remaps' to be non-nil" (with-temp-buffer (setq-local indent-tabs-mode t) (setq-local tab-width 8) - (describe-buffer-bindings buffer which-key--current-prefix) + (describe-buffer-bindings buffer prefix) (goto-char (point-min)) (let ((header-p (not (= (char-after) ?\f))) bindings header) @@ -1739,8 +1739,7 @@ Requires `which-key-compute-remaps' to be non-nil" ((= (char-after) ?\f) (setq header-p t)) ((looking-at "^[ \t]*$")) - ((or (not (string-match-p ignore-sections-regexp header)) - which-key--current-prefix) + ((or (not (string-match-p ignore-sections-regexp header)) prefix) (let ((binding-start (save-excursion (and (re-search-forward "\t+" nil t) (match-end 0)))) @@ -1755,14 +1754,14 @@ Requires `which-key-compute-remaps' to be non-nil" (cond ((member binding ignore-bindings)) ((string-match-p which-key--ignore-keys-regexp key)) - ((and which-key--current-prefix + ((and prefix (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" key-str-qt) key)) (unless (assoc-string (match-string 1 key) bindings) (push (cons (match-string 1 key) (which-key--compute-binding binding)) bindings))) - ((and which-key--current-prefix + ((and prefix (string-match (format "^%s[ \t]\\([^ \t]+\\) \\.\\. %s[ \t]\\([^ \t]+\\)[ \t]+$" @@ -1783,7 +1782,7 @@ Requires `which-key-compute-remaps' to be non-nil" (forward-line)) (nreverse bindings))))) -(defun which-key--get-bindings (&optional keymap filter recursive) +(defun which-key--get-bindings (&optional prefix keymap filter recursive) "Collect key bindings. If KEYMAP is nil, collect from current buffer using the current key sequence as a prefix. Otherwise, collect from KEYMAP. FILTER @@ -1795,7 +1794,7 @@ non-nil, then bindings are collected recursively for all prefixes." (keymap (error "%s is not a keymap" keymap)) (t - (which-key--get-current-bindings))))) + (which-key--get-current-bindings prefix))))) (when filter (setq unformatted (cl-remove-if-not filter unformatted))) (when which-key-sort-order @@ -2388,7 +2387,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (defun which-key--show-keymap (keymap-name keymap &optional prior-args all) (setq which-key--current-prefix nil) (when prior-args (push prior-args which-key--prior-show-keymap-args)) - (let ((bindings (which-key--get-bindings keymap nil all))) + (let ((bindings (which-key--get-bindings nil keymap nil all))) (if (= (length bindings) 0) (message "which-key: No bindings found in %s" keymap-name) (cond ((listp which-key-side-window-location) @@ -2423,7 +2422,8 @@ is selected interactively by mode in `minor-mode-map-alist'." (setq which-key--current-prefix nil) (when (keymapp keymap) (let ((formatted-keys - (which-key--get-bindings keymap #'which-key--evil-operator-filter))) + (which-key--get-bindings + nil keymap #'which-key--evil-operator-filter))) (cond ((= (length formatted-keys) 0) (message "which-key: Keymap empty")) ((listp which-key-side-window-location) @@ -2454,7 +2454,8 @@ Finally, show the buffer." (setq which-key--current-prefix prefix-keys which-key--last-try-2-loc nil) (let ((start-time (when which-key--debug (current-time))) - (formatted-keys (which-key--get-bindings from-keymap filter)) + (formatted-keys (which-key--get-bindings + prefix-keys from-keymap filter)) (prefix-keys (key-description which-key--current-prefix))) (cond ((= (length formatted-keys) 0) (message "%s- which-key: There are no keys to show" prefix-keys)) From ded908ec0b95f8890e11a8ef3a700c583a0ca036 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 28 Feb 2018 07:57:44 -0500 Subject: [PATCH 601/816] Remove which-key--current-prefix --- which-key.el | 86 ++++++++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/which-key.el b/which-key.el index 2abb5296b6d..ba6bc454c1a 100644 --- a/which-key.el +++ b/which-key.el @@ -634,8 +634,6 @@ Used when `which-key-popup-type' is frame.") "Internal: Backup the initial value of `echo-keystrokes'.") (defvar which-key--prefix-help-cmd-backup nil "Internal: Backup the value of `prefix-help-command'.") -(defvar which-key--current-prefix nil - "Internal: Holds current prefix") (defvar which-key--last-try-2-loc nil "Internal: Last location of side-window when two locations used.") @@ -693,6 +691,10 @@ update.") (= (which-key--pages-page-nums which-key--pages-obj) (which-key--pages-num-pages which-key--pages-obj))) +(defsubst which-key--current-prefix () + (when which-key--pages-obj + (which-key--pages-prefix which-key--pages-obj))) + ;;; Third-party library support ;;;; Evil @@ -1061,9 +1063,10 @@ total height." (defun which-key--hide-popup () "This function is called to hide the which-key buffer." (unless (member real-this-command which-key--paging-functions) - (setq which-key--current-prefix nil - which-key--automatic-display nil - which-key--prior-show-keymap-args nil) + (setq which-key--last-try-2-loc nil) + (setq which-key--pages-obj nil) + (setq which-key--automatic-display nil) + (setq which-key--prior-show-keymap-args nil) (when (and which-key-idle-secondary-delay which-key--secondary-timer-active) (which-key--start-timer)) @@ -1460,7 +1463,7 @@ which are strings. KEY is of the form produced by `key-binding'." (t (cdr key-binding)))))))))))) (defsubst which-key--current-key-list (&optional key-str) - (append (listify-key-sequence which-key--current-prefix) + (append (listify-key-sequence (which-key--current-prefix)) (when key-str (listify-key-sequence (kbd key-str))))) @@ -1651,7 +1654,7 @@ alists. Returns a list (key separator description)." (orig-desc (cdr key-binding)) (group (which-key--group-p orig-desc)) ;; At top-level prefix is nil - (keys (if which-key--current-prefix + (keys (if (which-key--current-prefix) (concat (which-key--current-key-string) " " key) key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) @@ -1919,7 +1922,7 @@ should be minimized." found (> (which-key--pages-num-pages result) 1))) (if found prev-result result)))) -(defun which-key--create-pages (keys &optional prefix-title) +(defun which-key--create-pages (keys &optional prefix-keys prefix-title) "Create page strings using `which-key--list-to-pages'. Will try to find the best number of rows and columns using the given dimensions and the length and wdiths of KEYS. SEL-WIN-WIDTH @@ -1927,8 +1930,8 @@ is the width of the live window." (let* ((max-dims (which-key--popup-max-dimensions)) (max-lines (car max-dims)) (max-width (cdr max-dims)) - (prefix-keys-desc (key-description which-key--current-prefix)) - (full-prefix (which-key--full-prefix prefix-keys-desc)) + (prefix-desc (key-description prefix-keys)) + (full-prefix (which-key--full-prefix prefix-desc)) (prefix (when (eq which-key-show-prefix 'left) (+ 2 (which-key--string-width full-prefix)))) (prefix-top-bottom (member which-key-show-prefix '(bottom top))) @@ -1939,8 +1942,10 @@ is the width of the live window." (member which-key-side-window-location '(left right)))) result) (setq result - (which-key--create-pages-1 keys avl-lines avl-width min-lines vertical)) + (which-key--create-pages-1 + keys avl-lines avl-width min-lines vertical)) (when (> (which-key--pages-num-pages result) 0) + (setf (which-key--pages-prefix result) prefix-keys) (setf (which-key--pages-prefix-title result) (or prefix-title (which-key--maybe-get-prefix-title @@ -2004,7 +2009,7 @@ including prefix arguments." (which-key--universal-argument--description) (when prefix-arg " ") prefix-keys)) - (dash (if (and which-key--current-prefix + (dash (if (and (not (string= prefix-keys "")) (null left)) "-" ""))) (if (or (eq which-key-show-prefix 'echo) dont-prop-keys) (concat str dash) @@ -2013,7 +2018,7 @@ including prefix arguments." (defun which-key--get-popup-map () "Generate transient-map for use in the top level binding display." - (unless which-key--current-prefix + (unless (which-key--current-prefix) (let ((map (make-sparse-keymap))) (define-key map (kbd which-key-paging-key) #'which-key-C-h-dispatch) (when which-key-use-C-h-commands @@ -2029,10 +2034,10 @@ and a page count." (height (which-key--pages-height pages-obj)) (n-pages (which-key--pages-num-pages pages-obj)) (page-n (car (which-key--pages-page-nums pages-obj))) - (prefix-keys (key-description which-key--current-prefix)) + (prefix-desc (key-description (which-key--pages-prefix pages-obj))) (prefix-title (which-key--pages-prefix-title pages-obj)) - (full-prefix (which-key--full-prefix prefix-keys)) - (nxt-pg-hint (which-key--next-page-hint prefix-keys)) + (full-prefix (which-key--full-prefix prefix-desc)) + (nxt-pg-hint (which-key--next-page-hint prefix-desc)) ;; not used in left case (status-line (concat (which-key--propertize prefix-title 'face 'which-key-note-face) @@ -2080,7 +2085,7 @@ and a page count." (cons page (lambda () (which-key--echo - (concat full-prefix (when prefix-keys " ") + (concat full-prefix (when prefix-desc " ") status-line (when status-line " ") nxt-pg-hint))))) (`mode-line @@ -2097,7 +2102,7 @@ and a page count." "Show current page. N changes the current page to the Nth page relative to the current one." (which-key--init-buffer) ;; in case it was killed - (let ((prefix-keys (key-description which-key--current-prefix)) + (let ((prefix-keys (key-description (which-key--current-prefix))) golden-ratio-mode) (if (null which-key--pages-obj) (message "%s- which-key can't show keys: There is not \ @@ -2257,7 +2262,7 @@ current evil state. " (unless (eq which-key-show-docstrings 'docstring-only) (setq which-key-show-docstrings (null which-key-show-docstrings))) (which-key-reload-key-sequence) - (which-key--create-buffer-and-show which-key--current-prefix)) + (which-key--create-buffer-and-show (which-key--current-prefix))) ;;;###autoload (defun which-key-C-h-dispatch () @@ -2267,7 +2272,7 @@ prefix) if `which-key-use-C-h-commands' is non nil." (interactive) (if (not (which-key--popup-showing-p)) (which-key-show-standard-help) - (let* ((prefix-keys (key-description which-key--current-prefix)) + (let* ((prefix-keys (key-description (which-key--current-prefix))) (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) (prompt (concat (when (string-equal prefix-keys "") (which-key--propertize @@ -2310,14 +2315,15 @@ prefix) if `which-key-use-C-h-commands' is non nil." (throw 'match t))))) (defun which-key--try-2-side-windows - (keys prefix-title loc1 loc2 &rest _ignore) - "Try to show KEYS (PAGE-N) in LOC1 first. + (bindings prefix-keys prefix-title loc1 loc2 &rest _ignore) + "Try to show BINDINGS (PAGE-N) in LOC1 first. -Only if no keys fit fallback to LOC2." +Only if no bindings fit fallback to LOC2." (let (pages1) (let ((which-key-side-window-location loc1) (which-key--multiple-locations t)) - (setq pages1 (which-key--create-pages keys prefix-title))) + (setq pages1 (which-key--create-pages + bindings prefix-keys prefix-title))) (if pages1 (progn (setq which-key--pages-obj pages1) @@ -2328,7 +2334,7 @@ Only if no keys fit fallback to LOC2." (let ((which-key-side-window-location loc2) (which-key--multiple-locations t)) (setq which-key--pages-obj - (which-key--create-pages keys prefix-title)) + (which-key--create-pages bindings prefix-keys prefix-title)) (which-key--show-page) loc2)))) @@ -2385,7 +2391,6 @@ is selected interactively by mode in `minor-mode-map-alist'." (cdr (assq mode-sym minor-mode-map-alist))))) (defun which-key--show-keymap (keymap-name keymap &optional prior-args all) - (setq which-key--current-prefix nil) (when prior-args (push prior-args which-key--prior-show-keymap-args)) (let ((bindings (which-key--get-bindings nil keymap nil all))) (if (= (length bindings) 0) @@ -2393,9 +2398,10 @@ is selected interactively by mode in `minor-mode-map-alist'." (cond ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - bindings keymap-name which-key-side-window-location))) + bindings nil keymap-name + which-key-side-window-location))) (t (setq which-key--pages-obj - (which-key--create-pages bindings keymap-name)) + (which-key--create-pages bindings nil keymap-name)) (which-key--show-page))) (let* ((key (key-description (list (read-key)))) (next-def (lookup-key keymap (kbd key)))) @@ -2419,7 +2425,6 @@ is selected interactively by mode in `minor-mode-map-alist'." (make-composed-keymap (list evil-operator-shortcut-map evil-operator-state-map evil-motion-state-map)))) - (setq which-key--current-prefix nil) (when (keymapp keymap) (let ((formatted-keys (which-key--get-bindings @@ -2429,10 +2434,12 @@ is selected interactively by mode in `minor-mode-map-alist'." ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - formatted-keys "evil operator/motion keys" + formatted-keys nil "evil operator/motion keys" which-key-side-window-location))) (t (setq which-key--pages-obj - (which-key--create-pages formatted-keys)) + (which-key--create-pages + formatted-keys + nil "evil operator/motion keys")) (which-key--show-page))))) (let* ((key (key-description (list (read-key))))) (when (string= key "`") @@ -2451,24 +2458,23 @@ is selected interactively by mode in `minor-mode-map-alist'." (&optional prefix-keys from-keymap filter prefix-title) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." - (setq which-key--current-prefix prefix-keys - which-key--last-try-2-loc nil) (let ((start-time (when which-key--debug (current-time))) (formatted-keys (which-key--get-bindings prefix-keys from-keymap filter)) - (prefix-keys (key-description which-key--current-prefix))) + (prefix-desc (key-description prefix-keys))) (cond ((= (length formatted-keys) 0) - (message "%s- which-key: There are no keys to show" prefix-keys)) + (message "%s- which-key: There are no keys to show" prefix-desc)) ((listp which-key-side-window-location) (setq which-key--last-try-2-loc (apply #'which-key--try-2-side-windows - formatted-keys prefix-title + formatted-keys prefix-keys prefix-title which-key-side-window-location))) (t (setq which-key--pages-obj - (which-key--create-pages formatted-keys prefix-title)) + (which-key--create-pages + formatted-keys prefix-keys prefix-title)) (which-key--show-page))) (when which-key--debug - (message "On prefix \"%s\" which-key took %.0f ms." prefix-keys + (message "On prefix \"%s\" which-key took %.0f ms." prefix-desc (* 1000 (float-time (time-since start-time))))))) (defun which-key--update () @@ -2521,7 +2527,7 @@ Finally, show the buffer." (bound-and-true-p god-local-mode) (eq this-command 'god-mode-self-insert)) (null this-command))) - (when (and (not (equal prefix-keys which-key--current-prefix)) + (when (and (not (equal prefix-keys (which-key--current-prefix))) (or (null which-key-delay-functions) (null (setq delay-time (run-hook-with-args-until-success @@ -2575,7 +2581,7 @@ Finally, show the buffer." (when (or (not (member real-last-command which-key--paging-functions)) (and (< 0 (length (this-single-command-keys))) - (not (equal which-key--current-prefix + (not (equal (which-key--current-prefix) (this-single-command-keys))))) (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) From 3c05294dc6b9ad97183cb53cf584e273f1eacdb6 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 28 Feb 2018 08:03:16 -0500 Subject: [PATCH 602/816] Fix which-key--create-pages --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ba6bc454c1a..a6a4c3ebc89 100644 --- a/which-key.el +++ b/which-key.el @@ -1944,7 +1944,8 @@ is the width of the live window." (setq result (which-key--create-pages-1 keys avl-lines avl-width min-lines vertical)) - (when (> (which-key--pages-num-pages result) 0) + (when (and result + (> (which-key--pages-num-pages result) 0)) (setf (which-key--pages-prefix result) prefix-keys) (setf (which-key--pages-prefix-title result) (or prefix-title From 0b2739a2bedfb117afc39e9101bdd2ec0a120897 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 28 Feb 2018 11:20:20 -0500 Subject: [PATCH 603/816] Fix display of meta bindings in which-key-show-keymap --- which-key.el | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index a6a4c3ebc89..c76b6538bd9 100644 --- a/which-key.el +++ b/which-key.el @@ -1687,20 +1687,27 @@ ones. PREFIX is for internal use and should not be used." (lambda (ev def) (let* ((key (append prefix (list ev))) (key-desc (key-description key))) - (unless (string-match-p which-key--ignore-keys-regexp key-desc) - (if (and all (keymapp def)) + (unless (or (string-match-p which-key--ignore-keys-regexp key-desc) + (eq ev 'menu-bar)) + (if (and (keymapp def) + (or all + ;; event 27 is escape, so this will pick up meta + ;; bindings and hopefully not too much more + (and (numberp ev) (= ev 27)))) (setq bindings (append bindings (which-key--get-keymap-bindings def t key))) - (cl-pushnew - (cons key-desc - (cond - ((keymapp def) "Prefix Command") - ((symbolp def) (copy-sequence (symbol-name def))) - ((eq 'lambda (car-safe def)) "lambda") - ((eq 'menu-item (car-safe def)) "menu-item") - (t (format "%s" def)))) - bindings :test (lambda (a b) (string= (car a) (car b)))))))) + (when def + (cl-pushnew + (cons key-desc + (cond + ((keymapp def) "Prefix Command") + ((symbolp def) (copy-sequence (symbol-name def))) + ((eq 'lambda (car-safe def)) "lambda") + ((eq 'menu-item (car-safe def)) "menu-item") + ((stringp def) def) + (t "unknown"))) + bindings :test (lambda (a b) (string= (car a) (car b))))))))) keymap) bindings)) From 013681a1e3174071b26eedff57e2f09f6e6e7ad0 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 28 Feb 2018 21:19:23 -0500 Subject: [PATCH 604/816] Fixes related to removal of which-key--current-prefix --- which-key.el | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index c76b6538bd9..580cab5a7dd 100644 --- a/which-key.el +++ b/which-key.el @@ -1418,9 +1418,9 @@ local bindings coming first. Within these categories order using (throw 'res res))))))) (nreverse res))) -(defun which-key--get-pseudo-binding (key-binding) +(defun which-key--get-pseudo-binding (key-binding &optional prefix) (let* ((pseudo-binding - (key-binding (which-key--pseudo-key (kbd (car key-binding)) t))) + (key-binding (which-key--pseudo-key (kbd (car key-binding)) prefix))) (pseudo-binding (when pseudo-binding (cadr pseudo-binding))) (pseudo-desc (when pseudo-binding (car pseudo-binding))) (pseudo-def (when pseudo-binding (cdr pseudo-binding))) @@ -1433,11 +1433,11 @@ local bindings coming first. Within these categories order using (eq pseudo-def real-def)) (cons (car key-binding) pseudo-desc)))) -(defun which-key--maybe-replace (key-binding) +(defun which-key--maybe-replace (key-binding &optional prefix) "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." - (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding))) + (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding prefix))) (if pseudo-binding pseudo-binding (let* ((mode-res (which-key--get-replacements key-binding t)) @@ -1487,13 +1487,13 @@ which are strings. KEY is of the form produced by `key-binding'." map (kbd (which-key--current-key-string (car keydesc)))) (intern (cdr keydesc))))) -(defun which-key--pseudo-key (key &optional use-current-prefix) +(defun which-key--pseudo-key (key &optional prefix) "Replace the last key in the sequence KEY by a special symbol in order for which-key to allow looking up a description for the key." (let* ((seq (listify-key-sequence key)) (final (intern (format "which-key-%s" (key-description (last seq)))))) - (if use-current-prefix - (vconcat (which-key--current-key-list) (list final)) + (if prefix + (vconcat prefix (list final)) (vconcat (butlast seq) (list final))))) (defun which-key--maybe-get-prefix-title (keys) @@ -1640,7 +1640,7 @@ return the docstring." (t (format "%s %s" current docstring))))) -(defun which-key--format-and-replace (unformatted &optional preserve-full-key) +(defun which-key--format-and-replace (unformatted &optional prefix preserve-full-key) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." @@ -1654,13 +1654,13 @@ alists. Returns a list (key separator description)." (orig-desc (cdr key-binding)) (group (which-key--group-p orig-desc)) ;; At top-level prefix is nil - (keys (if (which-key--current-prefix) - (concat (which-key--current-key-string) " " key) + (keys (if prefix + (concat (key-description prefix) " " key) key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern orig-desc))) (hl-face (which-key--highlight-face orig-desc)) - (key-binding (which-key--maybe-replace (cons keys orig-desc))) + (key-binding (which-key--maybe-replace (cons keys orig-desc) prefix)) (final-desc (which-key--propertize-description (cdr key-binding) group local hl-face orig-desc))) (when final-desc @@ -1810,7 +1810,7 @@ non-nil, then bindings are collected recursively for all prefixes." (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) - (which-key--format-and-replace unformatted recursive))) + (which-key--format-and-replace unformatted prefix recursive))) ;;; Functions for laying out which-key buffer pages @@ -1957,7 +1957,7 @@ is the width of the live window." (setf (which-key--pages-prefix-title result) (or prefix-title (which-key--maybe-get-prefix-title - (which-key--current-key-string)))) + (key-description prefix-keys)))) result))) (defun which-key--lighter-status () @@ -2110,7 +2110,7 @@ and a page count." "Show current page. N changes the current page to the Nth page relative to the current one." (which-key--init-buffer) ;; in case it was killed - (let ((prefix-keys (key-description (which-key--current-prefix))) + (let ((prefix-keys (which-key--current-key-string)) golden-ratio-mode) (if (null which-key--pages-obj) (message "%s- which-key can't show keys: There is not \ @@ -2280,7 +2280,7 @@ prefix) if `which-key-use-C-h-commands' is non nil." (interactive) (if (not (which-key--popup-showing-p)) (which-key-show-standard-help) - (let* ((prefix-keys (key-description (which-key--current-prefix))) + (let* ((prefix-keys (which-key--current-key-string)) (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) (prompt (concat (when (string-equal prefix-keys "") (which-key--propertize From 437065886d8ac256c5539d040852c971b922a9b4 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 28 Feb 2018 21:29:52 -0500 Subject: [PATCH 605/816] Factor out which-key--this-command-keys function --- which-key.el | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index 580cab5a7dd..e38571fbb24 100644 --- a/which-key.el +++ b/which-key.el @@ -2026,7 +2026,7 @@ including prefix arguments." (defun which-key--get-popup-map () "Generate transient-map for use in the top level binding display." - (unless (which-key--current-prefix) + (unless which-key--automatic-display (let ((map (make-sparse-keymap))) (define-key map (kbd which-key-paging-key) #'which-key-C-h-dispatch) (when which-key-use-C-h-commands @@ -2485,14 +2485,12 @@ Finally, show the buffer." (message "On prefix \"%s\" which-key took %.0f ms." prefix-desc (* 1000 (float-time (time-since start-time))))))) -(defun which-key--update () - "Function run by timer to possibly trigger -`which-key--create-buffer-and-show'." - (let ((prefix-keys (this-single-command-keys)) - delay-time) - (when (and (equal prefix-keys [key-chord]) +(defun which-key--this-command-keys () + "Version of `this-single-command-keys' corrected for key-chords and god-mode." + (let ((this-command-keys (this-single-command-keys))) + (when (and (equal this-command-keys [key-chord]) (bound-and-true-p key-chord-mode)) - (setq prefix-keys + (setq this-command-keys (condition-case nil (let ((rkeys (recent-keys))) (vector 'key-chord @@ -2509,8 +2507,15 @@ Finally, show the buffer." (when (and which-key--god-mode-support-enabled (bound-and-true-p god-local-mode) (eq this-command 'god-mode-self-insert)) - (setq prefix-keys (when which-key--god-mode-key-string + (setq this-command-keys (when which-key--god-mode-key-string (kbd which-key--god-mode-key-string)))) + this-command-keys)) + +(defun which-key--update () + "Function run by timer to possibly trigger +`which-key--create-buffer-and-show'." + (let ((prefix-keys (which-key--this-command-keys)) + delay-time) (cond ((and (> (length prefix-keys) 0) (or (keymapp (key-binding prefix-keys)) ;; Some keymaps are stored here like iso-transl-ctl-x-8-map @@ -2590,7 +2595,7 @@ Finally, show the buffer." which-key--paging-functions)) (and (< 0 (length (this-single-command-keys))) (not (equal (which-key--current-prefix) - (this-single-command-keys))))) + (which-key--this-command-keys))))) (cancel-timer which-key--paging-timer) (which-key--start-timer)))))) From d19fe4e037baf8a5cd6e8c0609d3999528bb5ac9 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 1 Mar 2018 13:18:43 -0500 Subject: [PATCH 606/816] Fix switching to top-level from which-key-undo-key --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e38571fbb24..010266695b1 100644 --- a/which-key.el +++ b/which-key.el @@ -2246,7 +2246,8 @@ current evil state. " (key-lst (which-key-reload-key-sequence key-lst) (which-key--create-buffer-and-show (apply #'vector key-lst))) - (t (which-key-show-top-level))))) + (t (setq which-key--automatic-display nil) + (which-key-show-top-level))))) (defalias 'which-key-undo 'which-key-undo-key) (defun which-key-abort (&optional _) From bc97659029bffda0861a418da092656b379dd0cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20K?= Date: Wed, 21 Mar 2018 11:31:52 +0100 Subject: [PATCH 607/816] Fix and improve defcustoms --- which-key.el | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 010266695b1..e2a0d2d706c 100644 --- a/which-key.el +++ b/which-key.el @@ -69,7 +69,7 @@ to shorten the delay for subsequent popups in the same key sequence. The default is for this value to be nil, which disables this behavior." :group 'which-key - :type 'float) + :type '(choice float (const :tag "Disabled" nil))) (defcustom which-key-echo-keystrokes (if (and echo-keystrokes (> (+ echo-keystrokes 0.01) @@ -88,7 +88,7 @@ which-key popup." "Truncate the description of keys to this length. Also adds \"..\". If nil, disable any truncation." :group 'which-key - :type 'integer) + :type '(choice integer (const :tag "Disable truncation" nil))) (defcustom which-key-add-column-padding 0 "Additional padding (number of spaces) to add to the left of @@ -115,7 +115,7 @@ of the which-key popup." (defcustom which-key-dont-use-unicode nil "If non-nil, don't use any unicode characters in default setup." :group 'which-key - :type 'integer) + :type 'boolean) (defcustom which-key-separator (if which-key-dont-use-unicode " : " " → ") @@ -189,10 +189,10 @@ Finally, you can multiple replacements to occur for a given key binding by setting `which-key-allow-multiple-replacements' to a non-nil value." :group 'which-key - :type '(alist :key-type (cons (choice regexp nil) - (choice regexp nil)) - :value-type (cons (choice string nil) - (choice string nil)))) + :type '(alist :key-type (cons (choice regexp (const nil)) + (choice regexp (const nil))) + :value-type (cons (choice string (const nil)) + (choice string (const nil))))) (when (bound-and-true-p which-key-key-replacement-alist) (mapc @@ -282,7 +282,7 @@ and nil. Nil turns the feature off." "The maximum number of columns to display in the which-key buffer. nil means don't impose a maximum." :group 'which-key - :type 'integer) + :type '(choice integer (const :tag "Unbounded" nil))) (defcustom which-key-side-window-location 'bottom "Location of which-key popup when `which-key-popup-type' is side-window. @@ -585,13 +585,13 @@ Will be passed the width of the active window and is expected to return the maximum height in lines and width in characters of the which-key popup in the form a cons cell (height . width)." :group 'which-key - :type 'function) + :type '(choice function (const nil))) (defcustom which-key-custom-hide-popup-function nil "Variable to hold a custom hide-popup function. It takes no arguments and the return value is ignored." :group 'which-key - :type 'function) + :type '(choice function (const nil))) (defcustom which-key-custom-show-popup-function nil "Variable to hold a custom show-popup function. @@ -599,7 +599,7 @@ Will be passed the required dimensions in the form (height . width) in lines and characters respectively. The return value is ignored." :group 'which-key - :type 'function) + :type '(choice function (const nil))) (defcustom which-key-lighter " WK" "Minor mode lighter to use in the mode-line." From 8a878de16db5ff83ce78f2a43d22ed2170b3abd3 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 26 Apr 2018 10:33:36 -0400 Subject: [PATCH 608/816] Version 3.2.0 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e2a0d2d706c..1a4212f4fb9 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.1.0 +;; Version: 3.2.0 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 206be7a42be71c357a8c3ff488392f0eeda2cf03 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 22 May 2018 10:11:15 -0400 Subject: [PATCH 609/816] Fix behavior of f and t in evil operator map f and t (also F and T) read characters manually, so the popup should not be shown after these commands. This only applies if which-key-show-operator-state-maps is non-nil. Fixes #191 --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 1a4212f4fb9..c6b89baf934 100644 --- a/which-key.el +++ b/which-key.el @@ -2451,8 +2451,8 @@ is selected interactively by mode in `minor-mode-map-alist'." nil "evil operator/motion keys")) (which-key--show-page))))) (let* ((key (key-description (list (read-key))))) - (when (string= key "`") - ;; evil-goto-mark reads the next char manually + (when (member key '("f" "F" "t" "T" "`")) + ;; these keys trigger commands that read the next char manually (setq which-key--inhibit-next-operator-popup t)) (cond ((and which-key-use-C-h-commands (string= "C-h" key)) (which-key-C-h-dispatch)) From 4042f06564f450838c8ed79d7c0d1bce3124200d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 May 2018 21:43:50 -0400 Subject: [PATCH 610/816] Fix prefix bindings in which-key-show-major-mode --- which-key.el | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index c6b89baf934..e371895cb84 100644 --- a/which-key.el +++ b/which-key.el @@ -1476,16 +1476,21 @@ which are strings. KEY is of the form produced by `key-binding'." (intern (cdr keydesc)))) (defun which-key--map-binding-p (map keydesc) + "Does MAP contain KEYDESC = (key . binding)?" (or (when (bound-and-true-p evil-state) - (eq (which-key--safe-lookup-key - map - (kbd (which-key--current-key-string - (format "<%s-state> %s" evil-state (car keydesc))))) - (intern (cdr keydesc)))) - (eq (which-key--safe-lookup-key - map (kbd (which-key--current-key-string (car keydesc)))) - (intern (cdr keydesc))))) + (let ((lookup + (which-key--safe-lookup-key + map + (kbd (which-key--current-key-string + (format "<%s-state> %s" evil-state (car keydesc))))))) + (or (eq lookup (intern (cdr keydesc))) + (and (keymapp lookup) (string= (cdr keydesc) "Prefix Command"))))) + (let ((lookup + (which-key--safe-lookup-key + map (kbd (which-key--current-key-string (car keydesc)))))) + (or (eq lookup (intern (cdr keydesc))) + (and (keymapp lookup) (string= (cdr keydesc) "Prefix Command")))))) (defun which-key--pseudo-key (key &optional prefix) "Replace the last key in the sequence KEY by a special symbol From 2c915407e15cc2f33d40a5efbc063596dc493991 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 May 2018 22:02:11 -0400 Subject: [PATCH 611/816] Add support for evil's auxiliary maps in show-keymap functions --- which-key.el | 60 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/which-key.el b/which-key.el index e371895cb84..8c9784d8da1 100644 --- a/which-key.el +++ b/which-key.el @@ -646,6 +646,12 @@ update.") (defvar which-key--previous-frame-size nil) (defvar which-key--prefix-title-alist nil) (defvar which-key--debug nil) +(defvar which-key--evil-keys-regexp (eval-when-compile + (regexp-opt '("-state")))) +(defvar which-key--ignore-non-evil-keys-regexp + (eval-when-compile + (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" + "select-window" "switch-frame" "which-key-")))) (defvar which-key--ignore-keys-regexp (eval-when-compile (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" @@ -1692,27 +1698,39 @@ ones. PREFIX is for internal use and should not be used." (lambda (ev def) (let* ((key (append prefix (list ev))) (key-desc (key-description key))) - (unless (or (string-match-p which-key--ignore-keys-regexp key-desc) - (eq ev 'menu-bar)) - (if (and (keymapp def) - (or all - ;; event 27 is escape, so this will pick up meta - ;; bindings and hopefully not too much more - (and (numberp ev) (= ev 27)))) - (setq bindings - (append bindings - (which-key--get-keymap-bindings def t key))) - (when def - (cl-pushnew - (cons key-desc - (cond - ((keymapp def) "Prefix Command") - ((symbolp def) (copy-sequence (symbol-name def))) - ((eq 'lambda (car-safe def)) "lambda") - ((eq 'menu-item (car-safe def)) "menu-item") - ((stringp def) def) - (t "unknown"))) - bindings :test (lambda (a b) (string= (car a) (car b))))))))) + (cond ((or (string-match-p + which-key--ignore-non-evil-keys-regexp key-desc) + (eq ev 'menu-bar))) + ;; extract evil keys corresponding to current state + ((and (keymapp def) + (boundp 'evil-state) + (bound-and-true-p evil-local-mode) + (string-match-p (format "<%s-state>$" evil-state) key-desc)) + (setq bindings + (append bindings + (which-key--get-keymap-bindings def all prefix)))) + ((and (keymapp def) + (string-match-p which-key--evil-keys-regexp key-desc))) + ((and (keymapp def) + (or all + ;; event 27 is escape, so this will pick up meta + ;; bindings and hopefully not too much more + (and (numberp ev) (= ev 27)))) + (setq bindings + (append bindings + (which-key--get-keymap-bindings def t key)))) + (t + (when def + (cl-pushnew + (cons key-desc + (cond + ((keymapp def) "Prefix Command") + ((symbolp def) (copy-sequence (symbol-name def))) + ((eq 'lambda (car-safe def)) "lambda") + ((eq 'menu-item (car-safe def)) "menu-item") + ((stringp def) def) + (t "unknown"))) + bindings :test (lambda (a b) (string= (car a) (car b))))))))) keymap) bindings)) From 0dc4e8472254b8e4317863ca7950f2a428dcb12d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 1 Jun 2018 09:46:35 -0400 Subject: [PATCH 612/816] Use window-size-change-functions for detecting size changes Fixes #193 --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 8c9784d8da1..e4c372d4f3a 100644 --- a/which-key.el +++ b/which-key.el @@ -782,7 +782,7 @@ problems at github. If DISABLE is non-nil disable support." (add-hook 'pre-command-hook #'which-key--hide-popup) (add-hook 'focus-out-hook #'which-key--stop-timer) (add-hook 'focus-in-hook #'which-key--start-timer) - (add-hook 'window-configuration-change-hook + (add-hook 'window-size-change-functions 'which-key--hide-popup-on-frame-size-change) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) @@ -793,7 +793,7 @@ problems at github. If DISABLE is non-nil disable support." (remove-hook 'pre-command-hook #'which-key--hide-popup) (remove-hook 'focus-out-hook #'which-key--stop-timer) (remove-hook 'focus-in-hook #'which-key--start-timer) - (remove-hook 'window-configuration-change-hook + (remove-hook 'window-size-change-functions 'which-key--hide-popup-on-frame-size-change) (which-key--stop-timer))) @@ -1092,7 +1092,7 @@ total height." (frame (which-key--hide-buffer-frame)) (custom (funcall which-key-custom-hide-popup-function)))) -(defun which-key--hide-popup-on-frame-size-change () +(defun which-key--hide-popup-on-frame-size-change (&optional _) "Hide which-key popup if the frame is resized (to trigger a new popup)." (when (which-key--frame-size-changed-p) From a4095e8ee6f932e049cebd90ab41b95b869ce3e4 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 8 Jun 2018 08:51:48 -0400 Subject: [PATCH 613/816] Fix handling of duplicate (evil) bindings in show keymap --- which-key.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index e4c372d4f3a..29b38f0d4de 100644 --- a/which-key.el +++ b/which-key.el @@ -1707,8 +1707,12 @@ ones. PREFIX is for internal use and should not be used." (bound-and-true-p evil-local-mode) (string-match-p (format "<%s-state>$" evil-state) key-desc)) (setq bindings - (append bindings - (which-key--get-keymap-bindings def all prefix)))) + ;; this function keeps the latter of the two duplicates + ;; which will be the evil binding + (cl-remove-duplicates + (append bindings + (which-key--get-keymap-bindings def all prefix)) + :test (lambda (a b) (string= (car a) (car b)))))) ((and (keymapp def) (string-match-p which-key--evil-keys-regexp key-desc))) ((and (keymapp def) From ff79dfff66f880885c5893dd6fd05dc51173a476 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 21 Jun 2018 15:38:47 -0400 Subject: [PATCH 614/816] Version 3.3.0 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 29b38f0d4de..09effbc7aa1 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.2.0 +;; Version: 3.3.0 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 013cdb7259c1ff1ce9fb7ffbc637fc368ebd8144 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 27 Jun 2018 10:28:44 -0400 Subject: [PATCH 615/816] Make Travis test on v26.1 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 918e5f19e92..105d1eabca5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ env: - EVM_EMACS=emacs-25.1-travis - EVM_EMACS=emacs-25.2-travis - EVM_EMACS=emacs-25.3-travis + - EVM_EMACS=emacs-26.1-travis - EVM_EMACS=emacs-git-snapshot-travis before_install: From c938bbf8d4b506d8a16bedf0059703236ce05a50 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 28 Aug 2018 11:44:32 -0400 Subject: [PATCH 616/816] Mention #130 in README --- README.org | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index 4b4f96bfdb0..49915668722 100644 --- a/README.org +++ b/README.org @@ -49,6 +49,7 @@ - [[#god-mode][God-mode]] - [[#more-examples][More Examples]] - [[#nice-display-with-split-frame][Nice Display with Split Frame]] + - [[#known-issues][Known Issues]] - [[#thanks][Thanks]] ** Install @@ -508,7 +509,9 @@ #+CAPTION: which-key in a frame with 2 vertical splits [[./img/which-key-bottom-split.png]] - +** Known Issues + - A few users have reported crashes related to which-key popups when quitting + a key sequence with =C-g=. A possible fix is discussed in [[https://github.com/justbur/emacs-which-key/issues/130][this issue]]. ** Thanks Special thanks to - [[https://github.com/bmag][@bmag]] for helping with the initial development and finding many bugs. From ace569b65f13526781200b479d506274637f1921 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 8 Nov 2018 10:21:07 -0500 Subject: [PATCH 617/816] Check for existence of buffer in which-key--popup-showing-p Fixes #197 --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 09effbc7aa1..c62924da823 100644 --- a/which-key.el +++ b/which-key.el @@ -1111,7 +1111,8 @@ popup)." (delete-frame which-key--frame))) (defun which-key--popup-showing-p () - (window-live-p (get-buffer-window which-key--buffer))) + (and (bufferp which-key--buffer) + (window-live-p (get-buffer-window which-key--buffer)))) (defun which-key--show-popup (act-popup-dim) "Show the which-key buffer. From 43e3e3d7641a8e1c298b37e6a277612bf0898708 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 14 Nov 2018 09:32:27 -0500 Subject: [PATCH 618/816] Fix use of describe-prefix-bindings in which-key-show-standard-help Use describe-prefix-bindings directly if we do not enter through which-key-C-h-dispatch. Fixes #198 --- which-key.el | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index c62924da823..d901a31173a 100644 --- a/which-key.el +++ b/which-key.el @@ -2193,13 +2193,18 @@ used are reapplied to the new key sequence." "Call the command in `which-key--prefix-help-cmd-backup'. Usually this is `describe-prefix-bindings'." (interactive) - (let ((which-key-inhibit t)) + (let ((which-key-inhibit t) + (popup-showing (which-key--popup-showing-p))) (which-key--hide-popup-ignore-command) - (cond ((eq which-key--prefix-help-cmd-backup - 'describe-prefix-bindings) - ;; This is essentially what `describe-prefix-bindings' does - (describe-bindings - (kbd (which-key--current-key-string)))) + (cond ((and (eq which-key--prefix-help-cmd-backup + 'describe-prefix-bindings) + ;; If the popup is not showing, we call + ;; `describe-prefix-bindings' directly. + popup-showing) + ;; This is essentially what `describe-prefix-bindings' does. We can't + ;; use this function directly, because the prefix will not be correct + ;; when we enter using `which-key-C-h-dispatch'. + (describe-bindings (kbd (which-key--current-key-string)))) ((functionp which-key--prefix-help-cmd-backup) (funcall which-key--prefix-help-cmd-backup))))) From 2f5661646b771f6c5a00a8a9aaa3f183abd5f84d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 14 Nov 2018 09:34:39 -0500 Subject: [PATCH 619/816] Version 3.3.1 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d901a31173a..6661f76bc0b 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.3.0 +;; Version: 3.3.1 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 3b184d6f0c78231f9e6c2ed95c2e8d218ae56fb8 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 24 Feb 2019 22:57:31 -0500 Subject: [PATCH 620/816] Simplify finding and matching replacements Don't try to grab all matching replacements ahead of time, because later ones may not match if earlier ones make deletions. Fixes #202 --- which-key.el | 82 ++++++++++++++++++++++++---------------------------- 1 file changed, 38 insertions(+), 44 deletions(-) diff --git a/which-key.el b/which-key.el index 6661f76bc0b..21d159a448d 100644 --- a/which-key.el +++ b/which-key.el @@ -1401,29 +1401,18 @@ local bindings coming first. Within these categories order using (defsubst which-key--butlast-string (str) (mapconcat #'identity (butlast (split-string str)) " ")) -(defun which-key--get-replacements (key-binding &optional use-major-mode) - (let ((alist (or (and use-major-mode - (cdr-safe - (assq major-mode which-key-replacement-alist))) - which-key-replacement-alist)) - res case-fold-search) - (catch 'res - (dolist (replacement alist) - ;; these are mode specific ones to ignore. The mode specific case is - ;; handled in the selection of alist - (unless (symbolp (car replacement)) - (let ((key-regexp (caar replacement)) - (binding-regexp (cdar replacement))) - (when (and (or (null key-regexp) - (string-match-p key-regexp - (car key-binding))) - (or (null binding-regexp) - (string-match-p binding-regexp - (cdr key-binding)))) - (push replacement res) - (when (not which-key-allow-multiple-replacements) - (throw 'res res))))))) - (nreverse res))) +(defun which-key--match-replacement (key-binding replacement) + ;; these are mode specific ones to ignore. The mode specific case is + ;; handled in the selection of alist + (when (and (consp key-binding) (not (symbolp (car replacement)))) + (let ((key-regexp (caar replacement)) + (binding-regexp (cdar replacement))) + (and (or (null key-regexp) + (string-match-p key-regexp + (car key-binding))) + (or (null binding-regexp) + (string-match-p binding-regexp + (cdr key-binding))))))) (defun which-key--get-pseudo-binding (key-binding &optional prefix) (let* ((pseudo-binding @@ -1444,30 +1433,35 @@ local bindings coming first. Within these categories order using "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." - (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding prefix))) + (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding prefix)) + one-match) (if pseudo-binding pseudo-binding - (let* ((mode-res (which-key--get-replacements key-binding t)) - (all-repls (or mode-res - (which-key--get-replacements key-binding)))) + (let* ((all-repls (or (cdr-safe + (assq major-mode which-key-replacement-alist)) + which-key-replacement-alist))) (dolist (repl all-repls key-binding) - (setq key-binding - (cond ((or (not (consp repl)) (null (cdr repl))) - key-binding) - ((functionp (cdr repl)) - (funcall (cdr repl) key-binding)) - ((consp (cdr repl)) - (cons - (cond ((and (caar repl) (cadr repl)) - (replace-regexp-in-string - (caar repl) (cadr repl) (car key-binding) t)) - ((cadr repl) (cadr repl)) - (t (car key-binding))) - (cond ((and (cdar repl) (cddr repl)) - (replace-regexp-in-string - (cdar repl) (cddr repl) (cdr key-binding) t)) - ((cddr repl) (cddr repl)) - (t (cdr key-binding)))))))))))) + (when (and (or which-key-allow-multiple-replacements + (not one-match)) + (which-key--match-replacement key-binding repl)) + (setq one-match t) + (setq key-binding + (cond ((or (not (consp repl)) (null (cdr repl))) + key-binding) + ((functionp (cdr repl)) + (funcall (cdr repl) key-binding)) + ((consp (cdr repl)) + (cons + (cond ((and (caar repl) (cadr repl)) + (replace-regexp-in-string + (caar repl) (cadr repl) (car key-binding) t)) + ((cadr repl) (cadr repl)) + (t (car key-binding))) + (cond ((and (cdar repl) (cddr repl)) + (replace-regexp-in-string + (cdar repl) (cddr repl) (cdr key-binding) t)) + ((cddr repl) (cddr repl)) + (t (cdr key-binding))))))))))))) (defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence (which-key--current-prefix)) From d9122c48b2b702d42cf044cbb80fde2c7caf5869 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 25 Feb 2019 09:57:03 -0500 Subject: [PATCH 621/816] Always check non-major-mode replacements in which-key--maybe-replace --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 21d159a448d..068c23cb5e6 100644 --- a/which-key.el +++ b/which-key.el @@ -1437,9 +1437,9 @@ which are strings. KEY is of the form produced by `key-binding'." one-match) (if pseudo-binding pseudo-binding - (let* ((all-repls (or (cdr-safe - (assq major-mode which-key-replacement-alist)) - which-key-replacement-alist))) + (let* ((all-repls + (append (cdr-safe (assq major-mode which-key-replacement-alist)) + which-key-replacement-alist))) (dolist (repl all-repls key-binding) (when (and (or which-key-allow-multiple-replacements (not one-match)) From 9c5922edbb9ba6d866ac169ea65f100bc96adf72 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 25 Feb 2019 14:10:06 -0500 Subject: [PATCH 622/816] Version 3.3.2 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 068c23cb5e6..70a6d18ae99 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.3.1 +;; Version: 3.3.2 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 51c485f16b4724488bcf2cbf7933fbd9eede1edd Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 1 Mar 2019 10:41:36 -0500 Subject: [PATCH 623/816] Don't ignore case when making replacements Fixes #204 --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 70a6d18ae99..08f259d7ba5 100644 --- a/which-key.el +++ b/which-key.el @@ -1406,7 +1406,8 @@ local bindings coming first. Within these categories order using ;; handled in the selection of alist (when (and (consp key-binding) (not (symbolp (car replacement)))) (let ((key-regexp (caar replacement)) - (binding-regexp (cdar replacement))) + (binding-regexp (cdar replacement)) + case-fold-search) (and (or (null key-regexp) (string-match-p key-regexp (car key-binding))) From c87b0ce78213f922a725be1e0ae2dede1cf29516 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 6 Mar 2019 10:18:52 -0500 Subject: [PATCH 624/816] Add debugging messages for buffer sizing --- which-key.el | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 08f259d7ba5..2aeaeaaa21c 100644 --- a/which-key.el +++ b/which-key.el @@ -640,12 +640,13 @@ used.") (defvar which-key--automatic-display nil "Internal: Non-nil if popup was triggered with automatic update.") +(defvar which-key--debug-buffer-name nil + "If non-nil, use this buffer for debug messages.") (defvar which-key--multiple-locations nil) (defvar which-key--inhibit-next-operator-popup nil) (defvar which-key--prior-show-keymap-args nil) (defvar which-key--previous-frame-size nil) (defvar which-key--prefix-title-alist nil) -(defvar which-key--debug nil) (defvar which-key--evil-keys-regexp (eval-when-compile (regexp-opt '("-state")))) (defvar which-key--ignore-non-evil-keys-regexp @@ -701,6 +702,14 @@ update.") (when which-key--pages-obj (which-key--pages-prefix which-key--pages-obj))) +(defmacro which-key--debug-message (&rest msg) + `(when which-key--debug-buffer-name + (let ((buf (get-buffer-create which-key--debug-buffer-name)) + (fmt-msg (format ,@msg))) + (with-current-buffer buf + (goto-char (point-max)) + (insert "\n" fmt-msg "\n"))))) + ;;; Third-party library support ;;;; Evil @@ -1919,7 +1928,7 @@ as well as metadata." (push page-width page-widths)) (make-which-key--pages :pages (nreverse pages) - :height avl-lines + :height (if (> n-pages 1) avl-lines (min avl-lines n-keys)) :widths (nreverse page-widths) :keys/page (reverse keys/page) :page-nums (number-sequence 1 n-pages) @@ -1981,6 +1990,12 @@ is the width of the live window." (or prefix-title (which-key--maybe-get-prefix-title (key-description prefix-keys)))) + (which-key--debug-message "Frame height: %s +Minibuffer height: %s +Max dimensions: (%s,%s) +Available for bindings: (%s,%s) +Actual lines: %s" (frame-height) (window-text-height (minibuffer-window)) +max-lines max-width avl-lines avl-width (which-key--pages-height result)) result))) (defun which-key--lighter-status () @@ -2495,7 +2510,7 @@ is selected interactively by mode in `minor-mode-map-alist'." (&optional prefix-keys from-keymap filter prefix-title) "Fill `which-key--buffer' with key descriptions and reformat. Finally, show the buffer." - (let ((start-time (when which-key--debug (current-time))) + (let ((start-time (current-time)) (formatted-keys (which-key--get-bindings prefix-keys from-keymap filter)) (prefix-desc (key-description prefix-keys))) @@ -2510,9 +2525,9 @@ Finally, show the buffer." (which-key--create-pages formatted-keys prefix-keys prefix-title)) (which-key--show-page))) - (when which-key--debug - (message "On prefix \"%s\" which-key took %.0f ms." prefix-desc - (* 1000 (float-time (time-since start-time))))))) + (which-key--debug-message + "On prefix \"%s\" which-key took %.0f ms." prefix-desc + (* 1000 (float-time (time-since start-time)))))) (defun which-key--this-command-keys () "Version of `this-single-command-keys' corrected for key-chords and god-mode." From 187ac0eb8990b62d4bfd83aac10a0ae68cdd2ff5 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 15 Mar 2019 08:48:23 -0400 Subject: [PATCH 625/816] Add note to docstring for which-key-idle-delay Ref #206 --- which-key.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 2aeaeaaa21c..6980b78c5b9 100644 --- a/which-key.el +++ b/which-key.el @@ -56,8 +56,11 @@ :prefix "which-key-") (defcustom which-key-idle-delay 1.0 - "Delay (in seconds) for which-key buffer to popup. A value of zero -might lead to issues, so a non-zero value is recommended + "Delay (in seconds) for which-key buffer to popup. This + variable should be set before activating `which-key-mode'. + +A value of zero might lead to issues, so a non-zero value is +recommended (see https://github.com/justbur/emacs-which-key/issues/134)." :group 'which-key :type 'float) From 77586e62b6d306bae07e4e3e093ba488724f4131 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 17 May 2019 21:57:18 -0400 Subject: [PATCH 626/816] Add which-key-dump-bindings Fixes #209 --- which-key.el | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/which-key.el b/which-key.el index 6980b78c5b9..f4b15c4806a 100644 --- a/which-key.el +++ b/which-key.el @@ -2278,6 +2278,21 @@ current evil state. " "Major-mode bindings") (message "which-key: No map named %s" map-sym)))) +;;;###autoload +(defun which-key-dump-bindings (prefix buffer-name) + "Dump bindings from PREFIX into buffer named BUFFER-NAME. + +PREFIX should be a string suitable for `kbd'." + (interactive "sPrefix: \nB") + (let* ((buffer (get-buffer-create buffer-name)) + (keys (which-key--get-bindings (kbd prefix)))) + (with-current-buffer buffer + (point-max) + (save-excursion + (dolist (key keys) + (insert (apply #'format "%s%s%s\n" key))))) + (switch-to-buffer-other-window buffer))) + ;;;###autoload (defun which-key-undo-key (&optional _) "Undo last keypress and force which-key update." From ba03e7e5bcbe3f7d95be2cfddd71454151bb98c8 Mon Sep 17 00:00:00 2001 From: "D.K" Date: Wed, 29 May 2019 04:14:09 +0300 Subject: [PATCH 627/816] Add translation keymap support (#210) --- which-key-tests.el | 7 +++++-- which-key.el | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 3e75d6fa62c..cff7fab56e6 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -130,20 +130,23 @@ (define-key map "c" "c") (define-key map "dd" "dd") (define-key map "eee" "eee") + (define-key map "f" [123 45 6]) (should (equal (sort (which-key--get-keymap-bindings map) (lambda (a b) (string-lessp (car a) (car b)))) '(("b" . "ignore") ("c" . "c") ("d" . "Prefix Command") - ("e" . "Prefix Command")))) + ("e" . "Prefix Command") + ("f" . "{ - C-f")))) (should (equal (sort (which-key--get-keymap-bindings map t) (lambda (a b) (string-lessp (car a) (car b)))) '(("b" . "ignore") ("c" . "c") ("d d" . "dd") - ("e e e" . "eee")))))) + ("e e e" . "eee") + ("f" . "{ - C-f")))))) (provide 'which-key-tests) ;;; which-key-tests.el ends here diff --git a/which-key.el b/which-key.el index f4b15c4806a..99318d5f320 100644 --- a/which-key.el +++ b/which-key.el @@ -1741,6 +1741,7 @@ ones. PREFIX is for internal use and should not be used." ((eq 'lambda (car-safe def)) "lambda") ((eq 'menu-item (car-safe def)) "menu-item") ((stringp def) def) + ((vectorp def) (key-description def)) (t "unknown"))) bindings :test (lambda (a b) (string= (car a) (car b))))))))) keymap) From fb2bc8fd08fc39dd5527b13a65717399c5d6821b Mon Sep 17 00:00:00 2001 From: Uros Perisic Date: Sun, 21 Jul 2019 02:29:54 +0800 Subject: [PATCH 628/816] Add which-key-persistent-popup-p variable (#213) I did not remove the `pre-command-hook', because that would require me to add the hook back every time `which-key--hide-popup' is called, which seems excessive. Hercules.el already handles this more conservatively. But if you want me to, I can add it. --- which-key.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 99318d5f320..9b147bddae3 100644 --- a/which-key.el +++ b/which-key.el @@ -453,6 +453,9 @@ prefixes in `which-key-paging-prefixes'" which-key-undo-key which-key-undo)) +(defvar which-key-persistent-popup-p nil + "Whether or not to disable `which-key--hide-popup'.") + (defcustom which-key-hide-alt-key-translations t "Hide key translations using Alt key if non nil. These translations are not relevant most of the times since a lot @@ -1080,13 +1083,13 @@ total height." (defun which-key--hide-popup () "This function is called to hide the which-key buffer." - (unless (member real-this-command which-key--paging-functions) + (unless (or which-key-persistent-popup-p + (member real-this-command which-key--paging-functions)) (setq which-key--last-try-2-loc nil) (setq which-key--pages-obj nil) (setq which-key--automatic-display nil) (setq which-key--prior-show-keymap-args nil) - (when (and which-key-idle-secondary-delay - which-key--secondary-timer-active) + (when (and which-key-idle-secondary-delay which-key--secondary-timer-active) (which-key--start-timer)) (which-key--lighter-restore) (cl-case which-key-popup-type From cf8572a6888547451e6af461b374f3a5fde28f5d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 23 Jul 2019 11:34:49 -0400 Subject: [PATCH 629/816] which-key-persistent-popup-p -> which-key-persistent-popup --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 9b147bddae3..1d3c21d711f 100644 --- a/which-key.el +++ b/which-key.el @@ -453,7 +453,7 @@ prefixes in `which-key-paging-prefixes'" which-key-undo-key which-key-undo)) -(defvar which-key-persistent-popup-p nil +(defvar which-key-persistent-popup nil "Whether or not to disable `which-key--hide-popup'.") (defcustom which-key-hide-alt-key-translations t @@ -1083,7 +1083,7 @@ total height." (defun which-key--hide-popup () "This function is called to hide the which-key buffer." - (unless (or which-key-persistent-popup-p + (unless (or which-key-persistent-popup (member real-this-command which-key--paging-functions)) (setq which-key--last-try-2-loc nil) (setq which-key--pages-obj nil) From da2e093e916bf9ae7512c104512b92eca8fb224e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 23 Jul 2019 11:52:11 -0400 Subject: [PATCH 630/816] Add no-paging optional arg to which-key-show-keymap --- which-key.el | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/which-key.el b/which-key.el index 1d3c21d711f..c47c576e55e 100644 --- a/which-key.el +++ b/which-key.el @@ -2429,12 +2429,16 @@ Only if no bindings fit fallback to LOC2." 'which-key-keymap-history))) ;;;###autoload -(defun which-key-show-keymap (keymap) +(defun which-key-show-keymap (keymap &optional no-paging) "Show the top-level bindings in KEYMAP using which-key. KEYMAP -is selected interactively from all available keymaps." +is selected interactively from all available keymaps. + +If NO-PAGING is non-nil, which-key will not intercept subsequent +keypresses for the paging functionality." (interactive (list (which-key--read-keymap))) (which-key--show-keymap (symbol-name keymap) - (symbol-value keymap))) + (symbol-value keymap) + nil nil no-paging)) ;;;###autoload (defun which-key-show-full-keymap (keymap) @@ -2464,7 +2468,8 @@ is selected interactively by mode in `minor-mode-map-alist'." (which-key--show-keymap (symbol-name mode-sym) (cdr (assq mode-sym minor-mode-map-alist))))) -(defun which-key--show-keymap (keymap-name keymap &optional prior-args all) +(defun which-key--show-keymap + (keymap-name keymap &optional prior-args all no-paging) (when prior-args (push prior-args which-key--prior-show-keymap-args)) (let ((bindings (which-key--get-bindings nil keymap nil all))) (if (= (length bindings) 0) @@ -2477,15 +2482,16 @@ is selected interactively by mode in `minor-mode-map-alist'." (t (setq which-key--pages-obj (which-key--create-pages bindings nil keymap-name)) (which-key--show-page))) - (let* ((key (key-description (list (read-key)))) - (next-def (lookup-key keymap (kbd key)))) - (cond ((and which-key-use-C-h-commands (string= "C-h" key)) - (which-key-C-h-dispatch)) - ((keymapp next-def) - (which-key--hide-popup-ignore-command) - (which-key--show-keymap (concat keymap-name " " key) next-def - (cons keymap-name keymap))) - (t (which-key--hide-popup))))))) + (unless no-paging + (let* ((key (key-description (list (read-key)))) + (next-def (lookup-key keymap (kbd key)))) + (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (which-key-C-h-dispatch)) + ((keymapp next-def) + (which-key--hide-popup-ignore-command) + (which-key--show-keymap (concat keymap-name " " key) next-def + (cons keymap-name keymap))) + (t (which-key--hide-popup)))))))) (defun which-key--evil-operator-filter (binding) (let ((def (intern (cdr binding)))) From 5cbfccd5fec9b8f75b0933d2f0350592cebd32e8 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jul 2019 12:12:32 -0400 Subject: [PATCH 631/816] Add which-key-manual-update Intended to be used for prefix-help-command Ref #66 --- which-key.el | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/which-key.el b/which-key.el index c47c576e55e..703d9f58912 100644 --- a/which-key.el +++ b/which-key.el @@ -2583,6 +2583,23 @@ Finally, show the buffer." (kbd which-key--god-mode-key-string)))) this-command-keys)) +;;;###autoload +(defun which-key-manual-update () + "Force which-key update. + +This command is intended to be used for `prefix-help-command', as +follows + +\(setq prefix-help-command 'which-key-manual-update). + +This should be set after activating `which-key-mode'." + (interactive) + (let* ((current-prefix + (butlast + (listify-key-sequence (which-key--this-command-keys))))) + (which-key-reload-key-sequence current-prefix) + (which-key--start-timer 0 t))) + (defun which-key--update () "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." From 5cec1133cff535708feda43b8f6daa4dccbc28a2 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jul 2019 12:31:37 -0400 Subject: [PATCH 632/816] Announce which-key-manual-update --- README.org | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index 49915668722..c9992daf0d7 100644 --- a/README.org +++ b/README.org @@ -3,6 +3,10 @@ ** Recent Changes +*** 2019-07-31: Added =which-key-manual-update= + Allows one to trigger =which-key= on demand, rather than automatically. See + the docstring and [[#manual-activation][Manual Activation]]. + *** 2017-12-13: Added =which-key-enable-extended-define-key= Allows for a concise syntax to specify replacement text using =define-key= or alternatives that use =define-key= internally. See the docstring and @@ -24,6 +28,7 @@ ** Table of Contents :TOC_3: - [[#which-key][which-key]] - [[#recent-changes][Recent Changes]] + - [[#2019-07-31-added-which-key-manual-update][2019-07-31: Added =which-key-manual-update=]] - [[#2017-12-13-added-which-key-enable-extended-define-key][2017-12-13: Added =which-key-enable-extended-define-key=]] - [[#2017-11-13-added-which-key-show-major-mode][2017-11-13: Added =which-key-show-major-mode=]] - [[#introduction][Introduction]] @@ -35,6 +40,7 @@ - [[#side-window-right-option][Side Window Right Option]] - [[#side-window-right-then-bottom][Side Window Right then Bottom]] - [[#minibuffer-option][Minibuffer Option]] + - [[#manual-activation][Manual Activation]] - [[#additional-commands][Additional Commands]] - [[#special-features-and-configuration-options][Special Features and Configuration Options]] - [[#popup-type-options][Popup Type Options]] @@ -129,7 +135,23 @@ variable =max-mini-window-height=. Also, the paging commands do not work reliably with the minibuffer option. Use the side window on the bottom option if you need paging. - + +** Manual Activation + #+NAME: #manual-activation + If you only want the =which-key= popup when you need it, you can try a setup + along the following lines + + #+BEGIN_SRC emacs-lisp + ;; make sure which-key doesn't show normally + (setq which-key-idle-delay 1000) + (which-key-mode) + (setq prefix-help-command 'which-key-manual-update) + #+END_SRC + + This will prevent which-key from showing automatically, and allow you to use + =C-h= in the middle of a key sequence to show the =which-key= buffer and keep + it open for the remainder of the key sequence. + ** Additional Commands - =which-key-show-top-level= will show most key bindings without a prefix. It is most and not all, because many are probably not interesting to most From c47c72d1fe0d2e15482eee4af1bff2881bbe218e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jul 2019 12:31:57 -0400 Subject: [PATCH 633/816] Cleanup whitespace in README --- README.org | 150 ++++++++++++++++++++++++++--------------------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/README.org b/README.org index c9992daf0d7..a4133449149 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,6 @@ -* which-key +* which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] - + ** Recent Changes *** 2019-07-31: Added =which-key-manual-update= @@ -24,7 +24,7 @@ different face. Screenshots of what the popup will look like are included below. =which-key= started as a rewrite of [[https://github.com/kai2nenobu/guide-key][guide-key-mode]], but the feature sets have diverged to a certain extent. - + ** Table of Contents :TOC_3: - [[#which-key][which-key]] - [[#recent-changes][Recent Changes]] @@ -63,7 +63,7 @@ After setting up [[http://melpa.org][MELPA]] as a repository, use =M-x package-install which-key= or your preferred method. You will need to call =which-key-mode= to enable the minor mode of course. - + *** Manually Add which-key.el to your =load-path= and require. Something like #+BEGIN_SRC emacs-lisp @@ -71,66 +71,66 @@ (require 'which-key) (which-key-mode) #+END_SRC - + ** Initial Setup No further setup is required if you are happy with the default setup. To try other options, there are 3 choices of default configs that are preconfigured (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, most of which are described below. - + There are many substitution abilities included, which are quite flexible (ability to use regexp for example). This makes which-key very customizable. - + *** Side Window Bottom Option Popup side window on bottom. This is the current default. To restore this setup use - + #+BEGIN_SRC emacs-lisp (which-key-setup-side-window-bottom) #+END_SRC - + [[./img/which-key-bottom.png]] - + *** Side Window Right Option Popup side window on right. For defaults use - + #+BEGIN_SRC emacs-lisp (which-key-setup-side-window-right) #+END_SRC - + Note the defaults are fairly conservative and will tend to not display on narrower frames. If you get a message saying which-key can't display the keys, try making your frame wider or adjusting the defaults related to the maximum width (see =M-x customize-group which-key=). - + [[./img/which-key-right.png]] - + *** Side Window Right then Bottom This is a combination of the previous two choices. It will try to use the right side, but if there is no room it will switch to using the bottom, which is usually easier to fit keys into. This setting can be helpful if the size of the Emacs frame changes frequently, which might be the case if you are using a dynamic/tiling window manager. - + #+BEGIN_SRC emacs-lisp (which-key-setup-side-window-right-bottom) #+END_SRC - + *** Minibuffer Option Take over the minibuffer. For the recommended configuration 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=. Also, the paging commands do not work reliably with the minibuffer option. Use the side window on the bottom @@ -162,7 +162,7 @@ - =which-key-show-next-page= is the command used for paging. - =which-key-undo= can be used to undo the last keypress when in the middle of a key sequence. - + ** Special Features and Configuration Options There are more options than the ones described here. All of the configurable variables are available through =M-x customize-group which-key=. @@ -181,24 +181,24 @@ #+END_SRC Show keys in a side window. This popup type has further options: #+BEGIN_SRC emacs-lisp - ;; location of which-key window. valid values: top, bottom, left, right, + ;; location of which-key window. valid values: top, bottom, left, right, ;; or a list of any of the two. If it's a list, which-key will always try ;; the first location first. It will go to the second location if there is ;; not enough room to display any keys in the first location (setq which-key-side-window-location 'bottom) - + ;; max width of which-key window, when displayed at left or right. ;; valid values: number of columns (integer), or percentage out of current ;; frame's width (float larger than 0 and smaller than 1) (setq which-key-side-window-max-width 0.33) - + ;; max height of which-key window, when displayed at top or bottom. ;; valid values: number of lines (integer), or percentage out of current ;; frame's height (float larger than 0 and smaller than 1) (setq which-key-side-window-max-height 0.25) #+END_SRC **** frame - + #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'frame) #+END_SRC @@ -208,11 +208,11 @@ #+BEGIN_SRC emacs-lisp ;; max width of which-key frame: number of columns (an integer) (setq which-key-frame-max-width 60) - + ;; max height of which-key frame: number of lines (an integer) (setq which-key-frame-max-height 20) #+END_SRC - + **** custom Write your own display functions! This requires you to write three functions, =which-key-custom-popup-max-dimensions-function=, @@ -220,8 +220,8 @@ =which-key-custom-hide-popup-function=. Refer to the documentation for those variables for more information, but here is a working example (this is the current implementation of side-window bottom). - - + + #+BEGIN_SRC emacs-lisp (setq which-key-popup-type 'custom) (defun which-key-custom-popup-max-dimensions-function (ignore) @@ -243,14 +243,14 @@ (when (buffer-live-p which-key--buffer) (quit-windows-on which-key--buffer))) #+END_SRC - + *** Custom String Replacement Options #+NAME: #custom-string-replacement-options You can customize the way the keys show in the buffer using three different replacement methods, each of which corresponds replacement alist. The basic idea of behind each alist is that you specify a selection string in the =car= of each cons cell and the replacement string in the =cdr=. - + **** Automatic A newer option is to set =which-key-enable-extended-define-key= which advises =define-key= to allow which-key to pre-process its arguments. The @@ -272,70 +272,70 @@ **** "Key-Based" replacement Using this method, the description of a key is replaced using a string that you provide. Here's an example - + #+BEGIN_SRC emacs-lisp (which-key-add-key-based-replacements "C-x C-f" "find files") #+END_SRC - + where the first string is the key combination whose description you want to replace, in a form suitable for =kbd=. For that key combination, which-key overwrites the description with the second string, "find files". In the second type of entry you can restrict the replacements to a major-mode. For example, - + #+BEGIN_SRC emacs-lisp (which-key-add-major-mode-key-based-replacements 'org-mode "C-c C-c" "Org C-c C-c" "C-c C-a" "Org Attach") #+END_SRC - + Here the first entry is the major-mode followed by a list of the first type of entries. In case the same key combination is listed under a major-mode and by itself, the major-mode version takes precedence. - + **** Key and Description replacement - + The second and third methods target the text used for the keys and the descriptions directly. The relevant variable is =which-key-replacement-alist=. Here's an example of one of the default key replacements - + #+BEGIN_SRC emacs-lisp (push '(("<\\([[:alnum:]-]+\\)>" . nil) . ("\\1" . nil)) which-key-replacement-alist) #+END_SRC - + Each element of the outer cons cell is a cons cell of the form =(KEY . BINDING)=. The =car= of the outer cons determines how to match key bindings while the =cdr= determines how those matches are replaced. See the docstring of =which-key-replacement-alist= for more information. - + The next example shows how to replace the description. - + #+BEGIN_SRC emacs-lisp (push '((nil . "left") . (nil . "lft")) which-key-replacement-alist) #+END_SRC - + Here is an example of using key replacement to include Unicode characters in the results. Unfortunately, using Unicode characters may upset the alignment of the which-key buffer, because Unicode characters can have different widths even in a monospace font and alignment is based on character width. - + #+BEGIN_SRC emacs-lisp (add-to-list 'which-key-replacement-alist '(("TAB" . nil) . ("↹" . nil)) (add-to-list 'which-key-replacement-alist '(("RET" . nil) . ("⏎" . nil)) (add-to-list 'which-key-replacement-alist '(("DEL" . nil) . ("⇤" . nil)) (add-to-list 'which-key-replacement-alist '(("SPC" . nil) . ("␣" . nil)) #+END_SRC - + The =cdr= may also be a function that receives a =cons= of the form =(KEY . BINDING)= and produces a =cons= of the same form. This allows for interesting ideas like this one suggested by [[https://github.com/pdcawley][@pdcawley]] in [[https://github.com/justbur/emacs-which-key/pull/147][PR #147]]. - + #+BEGIN_SRC emacs-lisp - (push (cons '(nil . "paredit-mode") + (push (cons '(nil . "paredit-mode") (lambda (kb) (cons (car kb) (if paredit-mode @@ -343,19 +343,19 @@ "[ ] paredit-mode")))) which-key-replacement-alist) #+END_SRC - - The box will be checked if =paredit-mode= is currently active. - + + The box will be checked if =paredit-mode= is currently active. + *** Sorting Options By default the output is sorted by the key in a custom order. The default order is to sort lexicographically within each "class" of key, where the classes and their order are - + =Special (SPC, TAB, ...) < Single Character (ASCII) (a, ...) < Modifier (C-, M-, ...) < Other= - + You can control the order by setting this variable. This also shows the other available options. - + #+BEGIN_SRC emacs-lisp ;; default (setq which-key-sort-order 'which-key-key-order) @@ -368,9 +368,9 @@ ;; sort based on the key description ignoring case ;; (setq which-key-sort-order 'which-key-description-order) #+END_SRC - + *** Paging Options - + There are at least several prefixes that have many keys bound to them, like =C-x=. which-key displays as many keys as it can given your settings, but for these prefixes this may not be enough. The paging feature gives you the @@ -378,7 +378,7 @@ allow you to cycle through the pages without changing the key sequence you were in the middle of typing. There are two slightly different ways of doing this. - + **** Method 1 (default): Using C-h (or =help-char=) This is the easiest way, and is turned on by default. Use #+BEGIN_SRC emacs-lisp @@ -392,38 +392,38 @@ get a list of commands that follow =C-x=. This uses which-key instead to show those keys, and unlike the Emacs default saves the incomplete prefix that you just entered so that the next keystroke can complete the command. - + The commands are: - Cycle through the pages forward with =n= (or =C-n=) - Cycle backwards with =p= (or =C-p=) - Undo the last entered key (!) with =u= (or =C-u=) - Call the default command bound to =C-h=, usually =describe-prefix-bindings=, with =h= (or =C-h=) - + This is especially useful for those who like =helm-descbinds= but also want to use =C-h= as their which-key paging key. - + Note =C-h= is by default equivalent to =?= in this context. - + **** Method 2: Bind your own keys - + Essentially, all you need to do for a prefix like =C-x= is the following which will bind == to the relevant command. - + #+BEGIN_SRC emacs-lisp (define-key which-key-mode-map (kbd "C-x ") 'which-key-C-h-dispatch) #+END_SRC - - This is completely equivalent to - + + This is completely equivalent to + #+BEGIN_SRC emacs-lisp (setq which-key-paging-prefixes '("C-x")) (setq which-key-paging-key "") #+END_SRC - + where the latter are provided for convenience if you have a lot of prefixes. - + *** Face Customization Options The faces that which-key uses are | Face | Applied To | Default Definition | @@ -435,32 +435,32 @@ | =which-key-group-description-face= | Command groups (i.e, keymaps) | =:inherit font-lock-keyword-face= | | =which-key-command-description-face= | Commands not in local-map | =:inherit font-lock-function-name-face= | | =which-key-local-map-description-face= | Commands in local-map | =:inherit which-key-command-description-face= | - + The last two deserve some explanation. A command lives in one of many possible keymaps. You can distinguish between local maps, which depend on the buffer you are in, which modes are active, etc., and the global map which applies everywhere. It might be useful for you to distinguish between the two. One way to do this is to remove the default face from =which-key-command-description-face= like this - + #+BEGIN_SRC emacs-lisp (set-face-attribute 'which-key-command-description-face nil :inherit nil) #+END_SRC - + another is to make the local map keys appear in bold - + #+BEGIN_SRC emacs-lisp (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) #+END_SRC - + You can also use =M-x customize-face= to customize any of the above faces to your liking. - + *** Other Options #+NAME: #other-options The options below are also available through customize. Their defaults are shown. - + #+BEGIN_SRC emacs-lisp ;; Set the time delay (in seconds) for the which-key popup to appear. A value of ;; zero might cause issues so a non-zero value is recommended. @@ -517,7 +517,7 @@ before which-key and through =which-key-show-operator-state-maps= which needs to be enabled explicitly because it is more of a hack. The former allows for the inner and outer text object maps to show, while the latter - shows motions as well. + shows motions as well. *** God-mode Call =(which-key-enable-god-mode-support)= after loading god-mode to enable support for god-mode key sequences. This is new and experimental, so please @@ -528,7 +528,7 @@ several windows. #+CAPTION: which-key in a frame with 3 horizontal splits [[./img/which-key-right-split.png]] - + #+CAPTION: which-key in a frame with 2 vertical splits [[./img/which-key-bottom-split.png]] ** Known Issues From 2cb5ceba55fb9c671bcf794a795059673633113a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 31 Jul 2019 13:59:11 -0400 Subject: [PATCH 634/816] Fix paging in which-key-manual-update --- which-key.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 703d9f58912..b6ae9125f1e 100644 --- a/which-key.el +++ b/which-key.el @@ -445,6 +445,7 @@ prefixes in `which-key-paging-prefixes'" "Keymap for C-h commands.") (defvar which-key--paging-functions '(which-key-C-h-dispatch + which-key-manual-update which-key-turn-page which-key-show-next-page-cycle which-key-show-next-page-no-cycle @@ -2594,11 +2595,13 @@ follows This should be set after activating `which-key-mode'." (interactive) - (let* ((current-prefix - (butlast - (listify-key-sequence (which-key--this-command-keys))))) - (which-key-reload-key-sequence current-prefix) - (which-key--start-timer 0 t))) + (if (which-key--popup-showing-p) + (which-key-C-h-dispatch) + (let* ((current-prefix + (butlast + (listify-key-sequence (which-key--this-command-keys))))) + (which-key-reload-key-sequence current-prefix) + (which-key--start-timer 0.05 t)))) (defun which-key--update () "Function run by timer to possibly trigger From a256c4bce66d3805af07cc9f3dec5baeae1808de Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 1 Aug 2019 15:31:33 -0400 Subject: [PATCH 635/816] Use which-key-idle-secondary-delay value in manual updates --- README.org | 11 +++++++---- which-key.el | 21 ++++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/README.org b/README.org index a4133449149..ee573886365 100644 --- a/README.org +++ b/README.org @@ -142,10 +142,13 @@ along the following lines #+BEGIN_SRC emacs-lisp - ;; make sure which-key doesn't show normally - (setq which-key-idle-delay 1000) - (which-key-mode) - (setq prefix-help-command 'which-key-manual-update) + ;; make sure which-key doesn't show normally + (setq which-key-idle-delay 1000) + ;; which-key-manual-update uses this variable to control refreshing the + ;; which-key buffer after new keypresses + (setq which-key-idle-secondary-delay 0.05) + (which-key-mode) + (setq prefix-help-command 'which-key-manual-update) #+END_SRC This will prevent which-key from showing automatically, and allow you to use diff --git a/which-key.el b/which-key.el index b6ae9125f1e..8937436bd22 100644 --- a/which-key.el +++ b/which-key.el @@ -2588,12 +2588,13 @@ Finally, show the buffer." (defun which-key-manual-update () "Force which-key update. -This command is intended to be used for `prefix-help-command', as -follows +This command is intended to be used for `prefix-help-command'. An +example configuration for using this command is the following. -\(setq prefix-help-command 'which-key-manual-update). - -This should be set after activating `which-key-mode'." +\(setq which-key-idle-delay 1000) +\(setq which-key-idle-secondary-delay 0.05) +\(which-key-mode) +\(setq prefix-help-command 'which-key-manual-update)" (interactive) (if (which-key--popup-showing-p) (which-key-C-h-dispatch) @@ -2601,7 +2602,9 @@ This should be set after activating `which-key-mode'." (butlast (listify-key-sequence (which-key--this-command-keys))))) (which-key-reload-key-sequence current-prefix) - (which-key--start-timer 0.05 t)))) + (if which-key-idle-secondary-delay + (which-key--start-timer which-key-idle-secondary-delay t) + (which-key--start-timer 0.05 t))))) (defun which-key--update () "Function run by timer to possibly trigger @@ -2689,7 +2692,11 @@ This should be set after activating `which-key-mode'." (not (equal (which-key--current-prefix) (which-key--this-command-keys))))) (cancel-timer which-key--paging-timer) - (which-key--start-timer)))))) + (if which-key-idle-secondary-delay + ;; we haven't executed a command yet so the secandary + ;; timer is more relevant here + (which-key--start-timer which-key-idle-secondary-delay t) + (which-key--start-timer))))))) (provide 'which-key) ;;; which-key.el ends here From 42a25055163141165aa0269dbca69735e704825c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 1 Aug 2019 22:40:30 -0400 Subject: [PATCH 636/816] Rework implementation of manual updating Instead of having people mess with prefix-help-command, use a new variable which-key-show-early-on-C-h and control everything through which-key-C-h-dispatch. --- README.org | 14 +++--- which-key.el | 120 +++++++++++++++++++++++++++------------------------ 2 files changed, 70 insertions(+), 64 deletions(-) diff --git a/README.org b/README.org index ee573886365..b21711f586a 100644 --- a/README.org +++ b/README.org @@ -3,7 +3,7 @@ ** Recent Changes -*** 2019-07-31: Added =which-key-manual-update= +*** 2019-08-01: Added =which-key-show-early-on-C-h= Allows one to trigger =which-key= on demand, rather than automatically. See the docstring and [[#manual-activation][Manual Activation]]. @@ -28,7 +28,7 @@ ** Table of Contents :TOC_3: - [[#which-key][which-key]] - [[#recent-changes][Recent Changes]] - - [[#2019-07-31-added-which-key-manual-update][2019-07-31: Added =which-key-manual-update=]] + - [[#2019-08-01-added-which-key-show-early-on-c-h][2019-08-01: Added =which-key-show-early-on-C-h=]] - [[#2017-12-13-added-which-key-enable-extended-define-key][2017-12-13: Added =which-key-enable-extended-define-key=]] - [[#2017-11-13-added-which-key-show-major-mode][2017-11-13: Added =which-key-show-major-mode=]] - [[#introduction][Introduction]] @@ -142,13 +142,13 @@ along the following lines #+BEGIN_SRC emacs-lisp - ;; make sure which-key doesn't show normally - (setq which-key-idle-delay 1000) - ;; which-key-manual-update uses this variable to control refreshing the - ;; which-key buffer after new keypresses + ;; Allow C-h to trigger which-key before it is done automatically + (setq which-key-show-early-on-C-h t) + ;; make sure which-key doesn't show normally but refreshes quickly after it is + ;; triggered. + (setq which-key-idle-delay 10000) (setq which-key-idle-secondary-delay 0.05) (which-key-mode) - (setq prefix-help-command 'which-key-manual-update) #+END_SRC This will prevent which-key from showing automatically, and allow you to use diff --git a/which-key.el b/which-key.el index 8937436bd22..7a495ec097a 100644 --- a/which-key.el +++ b/which-key.el @@ -412,6 +412,21 @@ prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'boolean) +(defcustom which-key-show-early-on-C-h nil + "Show the which-key buffer before if C-h is pressed in the +middle of a prefix before the which-key buffer would normally be +triggered through the idle delay. If combined with the following +settings, which-key will effectively only show when triggered +\"manually\" using C-h. + +\(setq `which-key-idle-delay' 10000) +\(setq `which-key-idle-secondary-delay' 0.05) + +Note that `which-key-idle-delay' should be set before turning on +`which-key-mode'. " + :group 'which-key + :type 'boolean) + (defcustom which-key-is-verbose nil "Whether to warn about potential mistakes in configuration." :group 'which-key @@ -791,7 +806,8 @@ problems at github. If DISABLE is non-nil disable support." (which-key--setup-echo-keystrokes)) (unless (member prefix-help-command which-key--paging-functions) (setq which-key--prefix-help-cmd-backup prefix-help-command)) - (when which-key-use-C-h-commands + (when (or which-key-use-C-h-commands + which-key-show-early-on-C-h) (setq prefix-help-command #'which-key-C-h-dispatch)) (when which-key-show-remaining-keys (add-hook 'pre-command-hook #'which-key--lighter-restore)) @@ -2345,40 +2361,52 @@ PREFIX should be a string suitable for `kbd'." `which-key-C-h-map'. This command is always accessible (from any prefix) if `which-key-use-C-h-commands' is non nil." (interactive) - (if (not (which-key--popup-showing-p)) - (which-key-show-standard-help) - (let* ((prefix-keys (which-key--current-key-string)) - (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) - (prompt (concat (when (string-equal prefix-keys "") - (which-key--propertize - (concat " " - (which-key--pages-prefix-title - which-key--pages-obj)) - 'face 'which-key-note-face)) - full-prefix - (which-key--propertize - (substitute-command-keys - (concat - " \\" - " \\[which-key-show-next-page-cycle]" - which-key-separator "next-page," - " \\[which-key-show-previous-page-cycle]" - which-key-separator "previous-page," - " \\[which-key-undo-key]" - which-key-separator "undo-key," - " \\[which-key-toggle-docstrings]" - which-key-separator "toggle-docstrings," - " \\[which-key-show-standard-help]" - which-key-separator "help," - " \\[which-key-abort]" - which-key-separator "abort" - " 1..9" - which-key-separator "digit-arg")) - 'face 'which-key-note-face))) - (key (string (read-key prompt))) - (cmd (lookup-key which-key-C-h-map key)) - (which-key-inhibit t)) - (if cmd (funcall cmd key) (which-key-turn-page 0))))) + (cond ((and (not (which-key--popup-showing-p)) + which-key-show-early-on-C-h) + (let* ((current-prefix + (butlast + (listify-key-sequence (which-key--this-command-keys))))) + (which-key-reload-key-sequence current-prefix) + (if which-key-idle-secondary-delay + (which-key--start-timer which-key-idle-secondary-delay t) + (which-key--start-timer 0.05 t)))) + ((not (which-key--popup-showing-p)) + (which-key-show-standard-help)) + (t + (if (not (which-key--popup-showing-p)) + (which-key-show-standard-help) + (let* ((prefix-keys (which-key--current-key-string)) + (full-prefix (which-key--full-prefix prefix-keys current-prefix-arg t)) + (prompt (concat (when (string-equal prefix-keys "") + (which-key--propertize + (concat " " + (which-key--pages-prefix-title + which-key--pages-obj)) + 'face 'which-key-note-face)) + full-prefix + (which-key--propertize + (substitute-command-keys + (concat + " \\" + " \\[which-key-show-next-page-cycle]" + which-key-separator "next-page," + " \\[which-key-show-previous-page-cycle]" + which-key-separator "previous-page," + " \\[which-key-undo-key]" + which-key-separator "undo-key," + " \\[which-key-toggle-docstrings]" + which-key-separator "toggle-docstrings," + " \\[which-key-show-standard-help]" + which-key-separator "help," + " \\[which-key-abort]" + which-key-separator "abort" + " 1..9" + which-key-separator "digit-arg")) + 'face 'which-key-note-face))) + (key (string (read-key prompt))) + (cmd (lookup-key which-key-C-h-map key)) + (which-key-inhibit t)) + (if cmd (funcall cmd key) (which-key-turn-page 0))))))) ;;; Update @@ -2584,28 +2612,6 @@ Finally, show the buffer." (kbd which-key--god-mode-key-string)))) this-command-keys)) -;;;###autoload -(defun which-key-manual-update () - "Force which-key update. - -This command is intended to be used for `prefix-help-command'. An -example configuration for using this command is the following. - -\(setq which-key-idle-delay 1000) -\(setq which-key-idle-secondary-delay 0.05) -\(which-key-mode) -\(setq prefix-help-command 'which-key-manual-update)" - (interactive) - (if (which-key--popup-showing-p) - (which-key-C-h-dispatch) - (let* ((current-prefix - (butlast - (listify-key-sequence (which-key--this-command-keys))))) - (which-key-reload-key-sequence current-prefix) - (if which-key-idle-secondary-delay - (which-key--start-timer which-key-idle-secondary-delay t) - (which-key--start-timer 0.05 t))))) - (defun which-key--update () "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." From a916c9ae28e961922d8d8419e633f9321fcdbe53 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Mon, 11 Nov 2019 20:51:32 +0100 Subject: [PATCH 637/816] Fix typos (#222) --- README.org | 2 +- which-key.el | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.org b/README.org index b21711f586a..7b0de1c3cb7 100644 --- a/README.org +++ b/README.org @@ -473,7 +473,7 @@ ;; prefixes). Descriptions that are longer are truncated and have ".." added. (setq which-key-max-description-length 27) - ;; Use additonal padding between columns of keys. This variable specifies the + ;; Use additional padding between columns of keys. This variable specifies the ;; number of spaces to add to the left of each column. (setq which-key-add-column-padding 0) diff --git a/which-key.el b/which-key.el index 7a495ec097a..88775d4b839 100644 --- a/which-key.el +++ b/which-key.el @@ -110,7 +110,7 @@ artificially reducing the available width in the buffer. The default of 3 means allow for the total extra width contributed by any wide unicode characters to be up to one additional ASCII character in the which-key buffer. Increase this -number if you are seeing charaters get cutoff on the right side +number if you are seeing characters get cutoff on the right side of the which-key popup." :group 'which-key :type 'integer) @@ -1538,7 +1538,7 @@ in order for which-key to allow looking up a description for the key." (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. A title is possibly returned using -`which-key--prefix-title-alist'. An empty stiring is returned if +`which-key--prefix-title-alist'. An empty string is returned if no title exists." (cond ((not (string-equal keys "")) From dcb9820c2decd326465ec3dfc792d30429cec564 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 27 Nov 2019 12:00:57 -0500 Subject: [PATCH 638/816] Default to imprecise window fitting on terminal See #225. --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 88775d4b839..1a0f5c68f65 100644 --- a/which-key.el +++ b/which-key.el @@ -341,12 +341,13 @@ a percentage out of the frame's height." :group 'which-key :type 'integer) -(defcustom which-key-allow-imprecise-window-fit nil +(defcustom which-key-allow-imprecise-window-fit (not (display-graphic-p)) "If non-nil allow which-key to use a less intensive method of fitting the popup window to the buffer. If you are noticing lag when the which-key popup displays turning this on may help. -See https://github.com/justbur/emacs-which-key/issues/130" +See https://github.com/justbur/emacs-which-key/issues/130 +and https://github.com/justbur/emacs-which-key/issues/225." :group 'which-key :type 'boolean) From 8554a9f171d565d13ff5c18d594ae055adcd53f1 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 21 Dec 2019 13:47:54 -0500 Subject: [PATCH 639/816] Generalize C-h commands to use help-char help-char defaults to C-h. This removes the assumption that help-char is set to C-h. See #228 --- which-key.el | 52 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/which-key.el b/which-key.el index 1a0f5c68f65..f3334e128d9 100644 --- a/which-key.el +++ b/which-key.el @@ -407,18 +407,20 @@ prefixes in `which-key-paging-prefixes'" ;; :type '(repeat symbol)) (defcustom which-key-use-C-h-commands t - "Use C-h for paging if non-nil. Normally C-h after a prefix - calls `describe-prefix-bindings'. This changes that command to - a which-key paging command when which-key-mode is active." + "Use C-h (or whatever `help-char' is set to) for paging if +non-nil. Normally C-h after a prefix calls +`describe-prefix-bindings'. This changes that command to a +which-key paging command when which-key-mode is active." :group 'which-key :type 'boolean) (defcustom which-key-show-early-on-C-h nil - "Show the which-key buffer before if C-h is pressed in the -middle of a prefix before the which-key buffer would normally be -triggered through the idle delay. If combined with the following -settings, which-key will effectively only show when triggered -\"manually\" using C-h. + "Show the which-key buffer before if C-h (or whatever +`help-char' is set to) is pressed in the middle of a prefix +before the which-key buffer would normally be triggered through +the idle delay. If combined with the following settings, +which-key will effectively only show when triggered \"manually\" +using C-h. \(setq `which-key-idle-delay' 10000) \(setq `which-key-idle-secondary-delay' 0.05) @@ -435,11 +437,11 @@ Note that `which-key-idle-delay' should be set before turning on (defvar which-key-C-h-map (let ((map (make-sparse-keymap))) - (dolist (bind '(("\C-a" . which-key-abort) + (dolist (bind `(("\C-a" . which-key-abort) ("a" . which-key-abort) ("\C-d" . which-key-toggle-docstrings) ("d" . which-key-toggle-docstrings) - ("\C-h" . which-key-show-standard-help) + (,(vector help-char) . which-key-show-standard-help) ("h" . which-key-show-standard-help) ("\C-n" . which-key-show-next-page-cycle) ("n" . which-key-show-next-page-cycle) @@ -2047,7 +2049,9 @@ max-lines max-width avl-lines avl-width (which-key--pages-height result)) (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) (paging-key-bound (eq 'which-key-C-h-dispatch (key-binding (kbd paging-key)))) - (key (if paging-key-bound which-key-paging-key "C-h"))) + (key (if paging-key-bound + which-key-paging-key + (key-description (vector help-char))))) (when which-key-use-C-h-commands (which-key--propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) @@ -2094,7 +2098,7 @@ including prefix arguments." (define-key map (kbd which-key-paging-key) #'which-key-C-h-dispatch) (when which-key-use-C-h-commands ;; Show next page even when C-h is pressed - (define-key map (kbd "C-h") #'which-key-C-h-dispatch)) + (define-key map (vector help-char) #'which-key-C-h-dispatch)) map))) (defun which-key--process-page (pages-obj) @@ -2513,14 +2517,18 @@ is selected interactively by mode in `minor-mode-map-alist'." (which-key--create-pages bindings nil keymap-name)) (which-key--show-page))) (unless no-paging - (let* ((key (key-description (list (read-key)))) - (next-def (lookup-key keymap (kbd key)))) - (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (let* ((key (read-key)) + (key-desc (key-description (list key))) + (next-def (lookup-key keymap (vector key)))) + (cond ((and which-key-use-C-h-commands + (numberp key) (= key help-char)) (which-key-C-h-dispatch)) ((keymapp next-def) (which-key--hide-popup-ignore-command) - (which-key--show-keymap (concat keymap-name " " key) next-def - (cons keymap-name keymap))) + (which-key--show-keymap + (concat keymap-name " " key-desc) + next-def + (cons keymap-name keymap))) (t (which-key--hide-popup)))))))) (defun which-key--evil-operator-filter (binding) @@ -2551,18 +2559,18 @@ is selected interactively by mode in `minor-mode-map-alist'." formatted-keys nil "evil operator/motion keys")) (which-key--show-page))))) - (let* ((key (key-description (list (read-key))))) - (when (member key '("f" "F" "t" "T" "`")) + (let* ((key (read-key))) + (when (member key '(?f ?F ?t ?T ?`)) ;; these keys trigger commands that read the next char manually (setq which-key--inhibit-next-operator-popup t)) - (cond ((and which-key-use-C-h-commands (string= "C-h" key)) + (cond ((and which-key-use-C-h-commands (numberp key) (= key help-char)) (which-key-C-h-dispatch)) - ((string= key "ESC") + ((and (numberp key) (= key ?\C-\[)) (which-key--hide-popup) (keyboard-quit)) (t (which-key--hide-popup) - (setq unread-command-events (listify-key-sequence key)))))))) + (setq unread-command-events (vector key)))))))) (defun which-key--create-buffer-and-show (&optional prefix-keys from-keymap filter prefix-title) From 1e3640e48c31f8062f018b5fc84acad696a0ea2a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 21 Dec 2019 13:57:34 -0500 Subject: [PATCH 640/816] Make next page hint more consistent --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index f3334e128d9..1da0cfb019e 100644 --- a/which-key.el +++ b/which-key.el @@ -2049,9 +2049,10 @@ max-lines max-width avl-lines avl-width (which-key--pages-height result)) (let* ((paging-key (concat prefix-keys " " which-key-paging-key)) (paging-key-bound (eq 'which-key-C-h-dispatch (key-binding (kbd paging-key)))) + (key (key-description (vector help-char))) (key (if paging-key-bound - which-key-paging-key - (key-description (vector help-char))))) + (concat key " or " which-key-paging-key) + key))) (when which-key-use-C-h-commands (which-key--propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) From 0d0af8a0a291aec409992bfcdae06dc36e2634b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Dec 2019 20:27:17 -0500 Subject: [PATCH 641/816] Strip out advice in command docstrings --- which-key.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 1da0cfb019e..74de73741ea 100644 --- a/which-key.el +++ b/which-key.el @@ -1671,7 +1671,12 @@ and `which-key-show-docstrings' is non-nil. If return the docstring." (let* ((orig-sym (intern original)) (doc (when (commandp orig-sym) - (documentation orig-sym))) + (string-trim-left + (documentation orig-sym) + (concat "\\(?::" + "\\(?:\\(?:after\\|before\\)\\(?:-\\(?:until\\|while\\)\\)?\\|around\\|override\\|filter-\\(?:args\\|return\\)\\)" + " advice: [^\n]+\n" + "\\)+\n")))) (docstring (when doc (which-key--propertize (car (split-string doc "\n")) 'face 'which-key-docstring-face)))) From 9d1de2f1273135cafc567e7ae43a3f6ca8f32f6b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Jan 2020 16:41:11 -0500 Subject: [PATCH 642/816] Refactor regexp & fix incompatibility + error --- which-key.el | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 74de73741ea..c8029b7d723 100644 --- a/which-key.el +++ b/which-key.el @@ -1671,12 +1671,17 @@ and `which-key-show-docstrings' is non-nil. If return the docstring." (let* ((orig-sym (intern original)) (doc (when (commandp orig-sym) - (string-trim-left - (documentation orig-sym) - (concat "\\(?::" - "\\(?:\\(?:after\\|before\\)\\(?:-\\(?:until\\|while\\)\\)?\\|around\\|override\\|filter-\\(?:args\\|return\\)\\)" + (documentation orig-sym))) + (doc (when doc + (replace-regexp-in-string + (concat "^\\(?::" + (regexp-opt '("around" "override" + "after" "after-until" "after-while" + "before" "before-until" "before-while" + "filter-args" "filter-return")) " advice: [^\n]+\n" - "\\)+\n")))) + "\\)+\n") + "" doc))) (docstring (when doc (which-key--propertize (car (split-string doc "\n")) 'face 'which-key-docstring-face)))) From db3d003e903deb07394b4e572206f809578278c6 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 19 Jan 2020 15:10:12 -0500 Subject: [PATCH 643/816] Add full keymap versions of show-{major,minor}-mode Fixes #236 --- which-key.el | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 1da0cfb019e..d343be0fc7c 100644 --- a/which-key.el +++ b/which-key.el @@ -2290,7 +2290,7 @@ after first page." (which-key--create-buffer-and-show nil nil nil "Top-level bindings")) ;;;###autoload -(defun which-key-show-major-mode () +(defun which-key-show-major-mode (&optional all) "Show top-level bindings in the map of the current major mode. This function will also detect evil bindings made using @@ -2299,12 +2299,23 @@ current evil state. " (interactive) (let ((map-sym (intern (format "%s-map" major-mode)))) (if (and (boundp map-sym) (keymapp (symbol-value map-sym))) - (which-key--create-buffer-and-show - nil nil + (which-key--show-keymap + "Major-mode bindings" + (symbol-value map-sym) (apply-partially #'which-key--map-binding-p (symbol-value map-sym)) - "Major-mode bindings") + all) (message "which-key: No map named %s" map-sym)))) +;;;###autoload +(defun which-key-show-full-major-mode () + "Show all bindings in the map of the current major mode. + +This function will also detect evil bindings made using +`evil-define-key' in this map. These bindings will depend on the +current evil state. " + (interactive) + (which-key-show-major-mode t)) + ;;;###autoload (defun which-key-dump-bindings (prefix buffer-name) "Dump bindings from PREFIX into buffer named BUFFER-NAME. @@ -2485,7 +2496,7 @@ selected interactively from all available keymaps." nil t)) ;;;###autoload -(defun which-key-show-minor-mode-keymap () +(defun which-key-show-minor-mode-keymap (&optional all) "Show the top-level bindings in KEYMAP using which-key. KEYMAP is selected interactively by mode in `minor-mode-map-alist'." (interactive) @@ -2501,12 +2512,19 @@ is selected interactively by mode in `minor-mode-map-alist'." minor-mode-map-alist)) nil t nil 'which-key-keymap-history)))) (which-key--show-keymap (symbol-name mode-sym) - (cdr (assq mode-sym minor-mode-map-alist))))) + (cdr (assq mode-sym minor-mode-map-alist)) + all))) +;;;###autoload +(defun which-key-show-full-minor-mode-keymap () + "Show all bindings in KEYMAP using which-key. KEYMAP +is selected interactively by mode in `minor-mode-map-alist'." + (interactive) + (which-key-show-minor-mode-keymap t)) (defun which-key--show-keymap - (keymap-name keymap &optional prior-args all no-paging) + (keymap-name keymap &optional prior-args all no-paging filter) (when prior-args (push prior-args which-key--prior-show-keymap-args)) - (let ((bindings (which-key--get-bindings nil keymap nil all))) + (let ((bindings (which-key--get-bindings nil keymap filter all))) (if (= (length bindings) 0) (message "which-key: No bindings found in %s" keymap-name) (cond ((listp which-key-side-window-location) From 45bfcd3041942a3938791bfa34f28f2a9827d42a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 3 Feb 2020 20:57:53 -0500 Subject: [PATCH 644/816] Make which-key-show prefix mode-line work like top and bottom Fixes #234 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d343be0fc7c..de96a498fb2 100644 --- a/which-key.el +++ b/which-key.el @@ -1556,7 +1556,7 @@ no title exists." ((not (string-equal repl-res "")) repl-res) ((and (eq which-key-show-prefix 'echo) alternate) alternate) - ((and (member which-key-show-prefix '(bottom top)) + ((and (member which-key-show-prefix '(bottom top mode-line)) (eq which-key-side-window-location 'bottom) echo-keystrokes) (if alternate alternate From b11227b24be1c56b31380395f266983e889a7f8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Dec 2019 20:27:17 -0500 Subject: [PATCH 645/816] Strip out advice in command docstrings --- which-key.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index de96a498fb2..2adda882efd 100644 --- a/which-key.el +++ b/which-key.el @@ -1671,7 +1671,12 @@ and `which-key-show-docstrings' is non-nil. If return the docstring." (let* ((orig-sym (intern original)) (doc (when (commandp orig-sym) - (documentation orig-sym))) + (string-trim-left + (documentation orig-sym) + (concat "\\(?::" + "\\(?:\\(?:after\\|before\\)\\(?:-\\(?:until\\|while\\)\\)?\\|around\\|override\\|filter-\\(?:args\\|return\\)\\)" + " advice: [^\n]+\n" + "\\)+\n")))) (docstring (when doc (which-key--propertize (car (split-string doc "\n")) 'face 'which-key-docstring-face)))) From d1dfddcd1e3eaa418daa76414109994451044cdd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Jan 2020 16:41:11 -0500 Subject: [PATCH 646/816] Refactor regexp & fix incompatibility + error --- which-key.el | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 2adda882efd..09f50417ab7 100644 --- a/which-key.el +++ b/which-key.el @@ -1671,12 +1671,17 @@ and `which-key-show-docstrings' is non-nil. If return the docstring." (let* ((orig-sym (intern original)) (doc (when (commandp orig-sym) - (string-trim-left - (documentation orig-sym) - (concat "\\(?::" - "\\(?:\\(?:after\\|before\\)\\(?:-\\(?:until\\|while\\)\\)?\\|around\\|override\\|filter-\\(?:args\\|return\\)\\)" + (documentation orig-sym))) + (doc (when doc + (replace-regexp-in-string + (concat "^\\(?::" + (regexp-opt '("around" "override" + "after" "after-until" "after-while" + "before" "before-until" "before-while" + "filter-args" "filter-return")) " advice: [^\n]+\n" - "\\)+\n")))) + "\\)+\n") + "" doc))) (docstring (when doc (which-key--propertize (car (split-string doc "\n")) 'face 'which-key-docstring-face)))) From fcc509f49352245dc8ca26054585b0d8ccccc975 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 6 Feb 2020 21:31:18 -0500 Subject: [PATCH 647/816] Update travis versions --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 105d1eabca5..60d8d31e675 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,9 @@ # language: emacs-lisp env: - - EVM_EMACS=emacs-24.4-travis - - EVM_EMACS=emacs-24.5-travis - - EVM_EMACS=emacs-25.1-travis - - EVM_EMACS=emacs-25.2-travis - EVM_EMACS=emacs-25.3-travis - EVM_EMACS=emacs-26.1-travis + - EVM_EMACS=emacs-26.2-travis + - EVM_EMACS=emacs-26.3-travis - EVM_EMACS=emacs-git-snapshot-travis before_install: From a66bf9336a2499d1231d460ff35c56db1df477ac Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 6 Feb 2020 21:44:46 -0500 Subject: [PATCH 648/816] Try purcell's workflow action --- .github/workflows/test.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000000..3af184721c4 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,33 @@ +name: which-key-test-workflow +on: + pull-request: + push: + branches: + - master + +jobs: + build: + runs-on: [ubuntu-latest, macos-latest] + strategy: + matrix: + emacs_version: + - 24.1 + - 24.2 + - 24.3 + - 24.4 + - 24.5 + - 25.1 + - 25.2 + - 25.3 + - 26.1 + - 26.2 + - 26.3 + - snapshot + steps: + - uses: purcell/setup-emacs@master + with: + version: ${{ matrix.emacs_version }} + + - uses: actions/checkout@v2 + - name: Run tests + run: 'emacs -Q -batch -L . -l which-key-tests.el -f ert-run-tests-batch-and-exit' From da1abb4d9f59714d8d3d5201c78a6b88886f92cd Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 6 Feb 2020 21:46:12 -0500 Subject: [PATCH 649/816] Fix previous commit --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3af184721c4..8a7ad41d616 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,6 @@ name: which-key-test-workflow on: - pull-request: + pull_request: push: branches: - master From 340144071499f677e8669352e15b04ede6b35984 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 6 Feb 2020 21:48:04 -0500 Subject: [PATCH 650/816] Fix workflow --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8a7ad41d616..91a8c7df0bc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -7,7 +7,7 @@ on: jobs: build: - runs-on: [ubuntu-latest, macos-latest] + runs-on: ubuntu-latest strategy: matrix: emacs_version: From 12310164a45f3ff19c4fd21c5487b6d804cbc80a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 6 Feb 2020 21:50:04 -0500 Subject: [PATCH 651/816] More workflow fixes --- .github/workflows/test.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 91a8c7df0bc..0bf32f2e8e4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,10 +11,6 @@ jobs: strategy: matrix: emacs_version: - - 24.1 - - 24.2 - - 24.3 - - 24.4 - 24.5 - 25.1 - 25.2 From 190310d59e7be998d8a3ec7b92c2df3116b2e00c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 6 Feb 2020 21:54:34 -0500 Subject: [PATCH 652/816] Disable travis and cask --- .travis.yml | 24 ------------------------ Cask | 8 -------- 2 files changed, 32 deletions(-) delete mode 100644 .travis.yml delete mode 100644 Cask diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 60d8d31e675..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -# language: emacs-lisp -env: - - EVM_EMACS=emacs-25.3-travis - - EVM_EMACS=emacs-26.1-travis - - EVM_EMACS=emacs-26.2-travis - - EVM_EMACS=emacs-26.3-travis - - EVM_EMACS=emacs-git-snapshot-travis - -before_install: - - git clone https://github.com/rejeep/evm.git $HOME/.evm - - export PATH="$HOME/.evm/bin:$PATH" - - export PATH="$HOME/.cask/bin:$PATH" - - evm config path /tmp - - evm install $EVM_EMACS --use --skip - - curl -fsSkL https://raw.github.com/cask/cask/master/go | python - -matrix: - fast_finish: true - allow_failures: - - env: EVM_EMACS=emacs-git-snapshot-travis - -script: - - emacs --version - - make test diff --git a/Cask b/Cask deleted file mode 100644 index d8171e342fc..00000000000 --- a/Cask +++ /dev/null @@ -1,8 +0,0 @@ -(source gnu) -(source melpa) - -(package-file "which-key.el") - -(development - (depends-on "ert")) - From cf446414850d93d6bb218cd54cec6d3c0d459a00 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 6 Feb 2020 21:55:41 -0500 Subject: [PATCH 653/816] Replace travis badge with github workflow badge --- README.org | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index 7b0de1c3cb7..40bcca7ecee 100644 --- a/README.org +++ b/README.org @@ -1,5 +1,6 @@ * which-key - [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[https://travis-ci.org/justbur/emacs-which-key][file:https://travis-ci.org/justbur/emacs-which-key.svg?branch=master]] + [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] + [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[build][https://github.com/justbur/emacs-which-key/workflows/which-key-test-workflow/badge.svg]] ** Recent Changes From c4b7aaefc160478b7bbd07251a9772c75944ffe5 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 7 Feb 2020 10:02:52 -0500 Subject: [PATCH 654/816] Revive Cask file --- Cask | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 Cask diff --git a/Cask b/Cask new file mode 100644 index 00000000000..60fa07cbdf2 --- /dev/null +++ b/Cask @@ -0,0 +1,7 @@ +(source gnu) +(source melpa) + +(package-file "which-key.el") + +(development + (depends-on "ert")) From 90d10a8fb335a21008084ab8b4ba722347ec6c74 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 7 Feb 2020 22:29:40 -0500 Subject: [PATCH 655/816] Fix sorting of keys and add test Fixes #233 --- which-key-tests.el | 65 ++++++++++++++++++++++++++++++++++++++++++++++ which-key.el | 26 +++++++++++++------ 2 files changed, 83 insertions(+), 8 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index cff7fab56e6..81797975184 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -148,5 +148,70 @@ ("e e e" . "eee") ("f" . "{ - C-f")))))) +(ert-deftest which-key-test--key-sorting () + (let ((keys '(("a" . "z") + ("A" . "Z") + ("b" . "y") + ("B" . "Y") + ("p" . "Prefix") + ("SPC" . "x") + ("C-a" . "w")))) + (let ((which-key-sort-uppercase-first t)) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order)) + '("SPC" "A" "B" "a" "b" "p" "C-a")))) + (let (which-key-sort-uppercase-first) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order)) + '("SPC" "a" "b" "p" "A" "B" "C-a")))) + (let ((which-key-sort-uppercase-first t)) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order-alpha)) + '("SPC" "a" "A" "b" "B" "p" "C-a")))) + (let (which-key-sort-uppercase-first) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order-alpha)) + '("SPC" "A" "a" "B" "b" "p" "C-a")))) + (let ((which-key-sort-uppercase-first t)) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) + 'which-key-prefix-then-key-order)) + '("SPC" "A" "B" "a" "b" "C-a" "p")))) + (let (which-key-sort-uppercase-first) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) + 'which-key-prefix-then-key-order)) + '("SPC" "a" "b" "A" "B" "C-a" "p")))) + (let ((which-key-sort-uppercase-first t)) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) + 'which-key-prefix-then-key-order-reverse)) + '("p" "SPC" "A" "B" "a" "b" "C-a")))) + (let (which-key-sort-uppercase-first) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) + 'which-key-prefix-then-key-order-reverse)) + '("p" "SPC" "a" "b" "A" "B" "C-a")))) + (let ((which-key-sort-uppercase-first t)) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) + 'which-key-description-order)) + '("p" "C-a" "SPC" "b" "B" "a" "A")))) + (let (which-key-sort-uppercase-first) + (should + (equal + (mapcar 'car (sort (copy-sequence keys) + 'which-key-description-order)) + '("p" "C-a" "SPC" "b" "B" "a" "A")))))) + (provide 'which-key-tests) ;;; which-key-tests.el ends here diff --git a/which-key.el b/which-key.el index 09f50417ab7..f7bab55d317 100644 --- a/which-key.el +++ b/which-key.el @@ -1315,14 +1315,24 @@ width) in lines and characters respectively." ;;; Sorting functions (defun which-key--string< (a b &optional alpha) - (let* ((da (downcase a)) - (db (downcase b))) - (cond ((string-equal da db) - (if which-key-sort-uppercase-first - (string-lessp a b) - (not (string-lessp a b)))) - (alpha (string-lessp da db)) - (t (string-lessp a b))))) + (let ((da (downcase a)) + (db (downcase b))) + (cond + ((and alpha (not which-key-sort-uppercase-first)) + (if (string-equal da db) + (string-lessp a b) + (string-lessp da db))) + ((and alpha which-key-sort-uppercase-first) + (if (string-equal da db) + (not (string-lessp a b)) + (string-lessp da db))) + ((not which-key-sort-uppercase-first) + (let ((aup (not (string-equal da a))) + (bup (not (string-equal db b)))) + (if (not (xor aup bup)) + (string-lessp a b) + bup))) + (t (string-lessp a b))))) (defun which-key--key-description< (a b &optional alpha) "Sorting function used for `which-key-key-order' and From a135e6f2c83e296da3ccfebc57a71e2b45a4f7c2 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 7 Feb 2020 22:32:41 -0500 Subject: [PATCH 656/816] Change name of workflow --- .github/workflows/test.yml | 2 +- README.org | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0bf32f2e8e4..eb2a91ea091 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,4 @@ -name: which-key-test-workflow +name: which-key-test on: pull_request: push: diff --git a/README.org b/README.org index 40bcca7ecee..cb31655237b 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,6 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] - [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[build][https://github.com/justbur/emacs-which-key/workflows/which-key-test-workflow/badge.svg]] + [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[build][https://github.com/justbur/emacs-which-key/workflows/which-key-test/badge.svg]] ** Recent Changes From d5a42732a6f39bb4284f378a6996aacecf888dc0 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 7 Feb 2020 22:34:41 -0500 Subject: [PATCH 657/816] Replace use of xor Apparently this is a recent function --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f7bab55d317..e0b30de8895 100644 --- a/which-key.el +++ b/which-key.el @@ -1329,7 +1329,7 @@ width) in lines and characters respectively." ((not which-key-sort-uppercase-first) (let ((aup (not (string-equal da a))) (bup (not (string-equal db b)))) - (if (not (xor aup bup)) + (if (or (and aup bup) (and (not aup) (not bup))) (string-lessp a b) bup))) (t (string-lessp a b))))) From 6e4b4c5419b7b981da6300302278de167f76126b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 7 Feb 2020 22:40:28 -0500 Subject: [PATCH 658/816] Simplify last commit --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e0b30de8895..312272c6b7b 100644 --- a/which-key.el +++ b/which-key.el @@ -1329,7 +1329,7 @@ width) in lines and characters respectively." ((not which-key-sort-uppercase-first) (let ((aup (not (string-equal da a))) (bup (not (string-equal db b)))) - (if (or (and aup bup) (and (not aup) (not bup))) + (if (eq aup bup) (string-lessp a b) bup))) (t (string-lessp a b))))) From 9ff54fffbb20ad92361aeeae4bc5966dbe793dd0 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 11 Feb 2020 21:48:57 -0500 Subject: [PATCH 659/816] Fix short windows being resized fit-window-to-buffer defaults to a min height of 4. For some reason, the order in which fit-window-to-buffer is called in display-buffer-in-side-window seems to have changed. This makes the order not matter. --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 312272c6b7b..d0a28a10589 100644 --- a/which-key.el +++ b/which-key.el @@ -1167,7 +1167,8 @@ is shown, or if there is no need to start the closing timer." "Slightly modified version of `fit-buffer-to-window'. Use &rest params because `fit-buffer-to-window' has a different call signature in different emacs versions" - (let ((fit-window-to-buffer-horizontally t)) + (let ((fit-window-to-buffer-horizontally t) + (window-min-height 1)) (apply #'fit-window-to-buffer window params))) (defun which-key--show-buffer-side-window (act-popup-dim) From 7b068f3e95a0d777cbdba92aecb6c876ccddbae5 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 12 Feb 2020 09:23:18 -0500 Subject: [PATCH 660/816] Fix case sorting in alpha sort functions --- which-key-tests.el | 4 ++-- which-key.el | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 81797975184..ae015bec6ef 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -170,12 +170,12 @@ (should (equal (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order-alpha)) - '("SPC" "a" "A" "b" "B" "p" "C-a")))) + '("SPC" "A" "a" "B" "b" "p" "C-a")))) (let (which-key-sort-uppercase-first) (should (equal (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order-alpha)) - '("SPC" "A" "a" "B" "b" "p" "C-a")))) + '("SPC" "a" "A" "b" "B" "p" "C-a")))) (let ((which-key-sort-uppercase-first t)) (should (equal diff --git a/which-key.el b/which-key.el index d0a28a10589..e5127eefdbe 100644 --- a/which-key.el +++ b/which-key.el @@ -1321,11 +1321,11 @@ width) in lines and characters respectively." (cond ((and alpha (not which-key-sort-uppercase-first)) (if (string-equal da db) - (string-lessp a b) + (not (string-lessp a b)) (string-lessp da db))) ((and alpha which-key-sort-uppercase-first) (if (string-equal da db) - (not (string-lessp a b)) + (string-lessp a b) (string-lessp da db))) ((not which-key-sort-uppercase-first) (let ((aup (not (string-equal da a))) From f9d8d49d1f955202514196de23369d61a42d816c Mon Sep 17 00:00:00 2001 From: Yunhao Zhao Date: Sun, 16 Feb 2020 21:50:11 +0800 Subject: [PATCH 661/816] Fix prefix argument for which-key-show-major-mode (#239) --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index e5127eefdbe..8c88b44c177 100644 --- a/which-key.el +++ b/which-key.el @@ -2317,7 +2317,7 @@ after first page." This function will also detect evil bindings made using `evil-define-key' in this map. These bindings will depend on the current evil state. " - (interactive) + (interactive "P") (let ((map-sym (intern (format "%s-map" major-mode)))) (if (and (boundp map-sym) (keymapp (symbol-value map-sym))) (which-key--show-keymap From 7bc87e0f93bd0258bf115cb02c4e8f86f57b38fc Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 16 Feb 2020 13:54:20 -0500 Subject: [PATCH 662/816] Test once a month --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index eb2a91ea091..56b2e9e007e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,6 +4,8 @@ on: push: branches: - master + schedule: + - cron: '* * 1 * *' jobs: build: From 8b49ae978cceca65967f3544c236f32964ddbed0 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 16 Feb 2020 18:22:45 -0500 Subject: [PATCH 663/816] Fix last commit --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 56b2e9e007e..c4eaf232756 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ on: branches: - master schedule: - - cron: '* * 1 * *' + - cron: '0 0 1 * *' jobs: build: From 8f2427a69bc0388ddfb14a10eaf71e589f3b0913 Mon Sep 17 00:00:00 2001 From: N V <44036031+progfolio@users.noreply.github.com> Date: Wed, 1 Jul 2020 22:19:37 -0400 Subject: [PATCH 664/816] Fix which-key--propertize-description use make-text-button return value (#249) As of: https://github.com/emacs-mirror/emacs/commit/7ac79872aed63110c0d26c1e62e1838d6101c9bd make-text-button no longer modifies a string when it is passed as the first argument. which-key--propertize-description relied on the mutation of the string argument. Using the return value of make-text-button will return the propertized string with both the new and old behavior. Fixes #248 --- which-key.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 8c88b44c177..475772f0e3c 100644 --- a/which-key.el +++ b/which-key.el @@ -1663,8 +1663,7 @@ ORIGINAL-DESCRIPTION is the description given by (max (floor (* (frame-width) 0.8)))) (if (> (length str) max) (concat (substring str 0 max) "...") - str)))))) - desc))) + str))))))))) (defun which-key--extract-key (key-str) "Pull the last key (or key range) out of KEY-STR." From ce25fb260003eb965e1c104804f690d9405ec8b4 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 21 Jul 2020 10:16:25 -0400 Subject: [PATCH 665/816] Add basic PR template --- .github/pull_request_template.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000000..70cf8f0739a --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,4 @@ +Pull requests are welcome as long as the following apply. + +1. The issue you are fixing or feature you are adding is clearly described and/or referenced in the pull request or github issue. +2. Since which-key is on [GNU ELPA](https://elpa.gnu.org/packages/), any [legally significant](https://www.gnu.org/prep/maintain/html_node/Legally-Significant.html#Legally-Significant) changes must have their copyright assigned to the FSF ([more info](https://www.gnu.org/prep/maintain/html_node/Copyright-Papers.html)). If you have not done so and would like to assign copyright, please see the [request form](https://git.savannah.gnu.org/cgit/gnulib.git/tree/doc/Copyright/request-assign.future). This process is easy, but can be slow. From 3642c11d5ef9be3c6fb9edb8fd5ec3c370abd889 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Thu, 16 Jul 2020 18:14:09 -0700 Subject: [PATCH 666/816] Speed up which-key--maybe-replace The first optimization is avoiding the intermediate list created by append. Instead we just iterate over the two lists in turn The second opimitization occurs where which-key-allow-multiple-replacements is nil, in which case we can stop the iteration once we've found a replacement Signed-off-by: Rudi Grinberg --- which-key.el | 67 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/which-key.el b/which-key.el index 475772f0e3c..143540f2ee4 100644 --- a/which-key.el +++ b/which-key.el @@ -1476,39 +1476,54 @@ local bindings coming first. Within these categories order using (eq pseudo-def real-def)) (cons (car key-binding) pseudo-desc)))) +(defsubst which-key--replace-in-binding (key-binding repl) + (cond ((or (not (consp repl)) (null (cdr repl))) + key-binding) + ((functionp (cdr repl)) + (funcall (cdr repl) key-binding)) + ((consp (cdr repl)) + (cons + (cond ((and (caar repl) (cadr repl)) + (replace-regexp-in-string + (caar repl) (cadr repl) (car key-binding) t)) + ((cadr repl) (cadr repl)) + (t (car key-binding))) + (cond ((and (cdar repl) (cddr repl)) + (replace-regexp-in-string + (cdar repl) (cddr repl) (cdr key-binding) t)) + ((cddr repl) (cddr repl)) + (t (cdr key-binding))))))) + +(defun which-key--replace-in-repl-list-once (key-binding repls) + (cl-dolist (repl repls) + (when (which-key--match-replacement key-binding repl) + (cl-return (which-key--replace-in-binding key-binding repl))))) + +(defun which-key--replace-in-repl-list-many (key-binding repls) + (dolist (repl repls key-binding) + (when (which-key--match-replacement key-binding repl) + (setq key-binding (which-key--replace-in-binding key-binding repl))))) + (defun which-key--maybe-replace (key-binding &optional prefix) "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding prefix)) - one-match) + replaced-key-binding) (if pseudo-binding pseudo-binding - (let* ((all-repls - (append (cdr-safe (assq major-mode which-key-replacement-alist)) - which-key-replacement-alist))) - (dolist (repl all-repls key-binding) - (when (and (or which-key-allow-multiple-replacements - (not one-match)) - (which-key--match-replacement key-binding repl)) - (setq one-match t) - (setq key-binding - (cond ((or (not (consp repl)) (null (cdr repl))) - key-binding) - ((functionp (cdr repl)) - (funcall (cdr repl) key-binding)) - ((consp (cdr repl)) - (cons - (cond ((and (caar repl) (cadr repl)) - (replace-regexp-in-string - (caar repl) (cadr repl) (car key-binding) t)) - ((cadr repl) (cadr repl)) - (t (car key-binding))) - (cond ((and (cdar repl) (cddr repl)) - (replace-regexp-in-string - (cdar repl) (cddr repl) (cdr key-binding) t)) - ((cddr repl) (cddr repl)) - (t (cdr key-binding))))))))))))) + (let* ((replacer (if which-key-allow-multiple-replacements + #'which-key--replace-in-repl-list-many + #'which-key--replace-in-repl-list-once))) + (setq replaced-key-binding + (apply replacer + (list key-binding + (cdr-safe (assq major-mode which-key-replacement-alist))))) + ;; terminate early if we're only looking for one replacement and we found it + (if (and replaced-key-binding (not which-key-allow-multiple-replacements)) + replaced-key-binding + (setq key-binding (or replaced-key-binding key-binding)) + (or (apply replacer (list key-binding which-key-replacement-alist)) key-binding)))))) (defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence (which-key--current-prefix)) From e48e190a75a0c176e1deac218b891e77792d6921 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Tue, 18 Aug 2020 07:58:31 +0800 Subject: [PATCH 667/816] Fix #257 (#258) * Add test for #257 Signed-off-by: Rudi Grinberg * Fix #257 Explicitly distinguish between replacing with `nil` and not replacing at all. I'm also simplifying the code by making all the branches more explicit. This is a little longer, but makes all the clauses obvious. Signed-off-by: Rudi Grinberg --- which-key-tests.el | 7 +++++++ which-key.el | 37 ++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index ae015bec6ef..f9fac65c73b 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -148,6 +148,13 @@ ("e e e" . "eee") ("f" . "{ - C-f")))))) +(ert-deftest which-key-test--nil-replacement () + (let ((which-key-replacement-alist + '(((nil . "winum-select-window-[1-9]") . t)))) + (should (equal + (which-key--maybe-replace '("C-c C-c" . "winum-select-window-1")) + '())))) + (ert-deftest which-key-test--key-sorting () (let ((keys '(("a" . "z") ("A" . "Z") diff --git a/which-key.el b/which-key.el index 143540f2ee4..766c8f1f86a 100644 --- a/which-key.el +++ b/which-key.el @@ -1497,33 +1497,40 @@ local bindings coming first. Within these categories order using (defun which-key--replace-in-repl-list-once (key-binding repls) (cl-dolist (repl repls) (when (which-key--match-replacement key-binding repl) - (cl-return (which-key--replace-in-binding key-binding repl))))) + (cl-return `(replaced . ,(which-key--replace-in-binding key-binding repl)))))) (defun which-key--replace-in-repl-list-many (key-binding repls) - (dolist (repl repls key-binding) - (when (which-key--match-replacement key-binding repl) - (setq key-binding (which-key--replace-in-binding key-binding repl))))) + (let (found) + (dolist (repl repls) + (when (which-key--match-replacement key-binding repl) + (setq found 't) + (setq key-binding (which-key--replace-in-binding key-binding repl)))) + (when found `(replaced . ,key-binding)))) (defun which-key--maybe-replace (key-binding &optional prefix) "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." - (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding prefix)) - replaced-key-binding) + (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding prefix))) (if pseudo-binding pseudo-binding (let* ((replacer (if which-key-allow-multiple-replacements #'which-key--replace-in-repl-list-many #'which-key--replace-in-repl-list-once))) - (setq replaced-key-binding - (apply replacer - (list key-binding - (cdr-safe (assq major-mode which-key-replacement-alist))))) - ;; terminate early if we're only looking for one replacement and we found it - (if (and replaced-key-binding (not which-key-allow-multiple-replacements)) - replaced-key-binding - (setq key-binding (or replaced-key-binding key-binding)) - (or (apply replacer (list key-binding which-key-replacement-alist)) key-binding)))))) + (pcase + (apply replacer + (list key-binding + (cdr-safe (assq major-mode which-key-replacement-alist)))) + (`(replaced . ,repl) + (if which-key-allow-multiple-replacements + (pcase (apply replacer (list repl which-key-replacement-alist)) + (`(replaced . ,repl) repl) + ('() repl)) + repl)) + ('() + (pcase (apply replacer (list key-binding which-key-replacement-alist)) + (`(replaced . ,repl) repl) + ('() key-binding)))))))) (defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence (which-key--current-prefix)) From ebb4e92b3ccab1d813346e24dccf9692850754db Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 28 Aug 2020 10:17:40 -0400 Subject: [PATCH 668/816] Add which-key-add-keymap-based-replacements This is an alternative to advising define-key using which-key-enable-extended-define-key, but functions the same beneath the surface. Ref #226 #261 --- README.org | 28 +++++++++++++++++++++++- which-key.el | 60 ++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 74 insertions(+), 14 deletions(-) diff --git a/README.org b/README.org index cb31655237b..c335e457b30 100644 --- a/README.org +++ b/README.org @@ -4,6 +4,11 @@ ** Recent Changes +*** 2020-08-28: Added =which-key-add-keymap-based-replacements= + This function provides an alternative interface allowing replacements to be + stored directly in keymaps, allowing one to avoid using + =which-key-replacement-alist=, which may cause performance issues when it + gets very big. *** 2019-08-01: Added =which-key-show-early-on-C-h= Allows one to trigger =which-key= on demand, rather than automatically. See the docstring and [[#manual-activation][Manual Activation]]. @@ -29,6 +34,7 @@ ** Table of Contents :TOC_3: - [[#which-key][which-key]] - [[#recent-changes][Recent Changes]] + - [[#2020-08-28-added-which-key-add-keymap-based-replacements][2020-08-28: Added =which-key-add-keymap-based-replacements=]] - [[#2019-08-01-added-which-key-show-early-on-c-h][2019-08-01: Added =which-key-show-early-on-C-h=]] - [[#2017-12-13-added-which-key-enable-extended-define-key][2017-12-13: Added =which-key-enable-extended-define-key=]] - [[#2017-11-13-added-which-key-show-major-mode][2017-11-13: Added =which-key-show-major-mode=]] @@ -255,7 +261,7 @@ idea of behind each alist is that you specify a selection string in the =car= of each cons cell and the replacement string in the =cdr=. -**** Automatic +**** Automatic ("keymap-based") replacement A newer option is to set =which-key-enable-extended-define-key= which advises =define-key= to allow which-key to pre-process its arguments. The statement @@ -273,6 +279,26 @@ (define-key some-map "b" '("bar-prefix")) #+END_SRC + If you do not want to enable the advise on =define-key=, you may also use + =which-key-add-keymap-based-replacements=. The above examples can be + alternatively written as + + #+BEGIN_SRC emacs-lisp + (which-key-add-keymap-based-replacements some-map + "f" '("foo" . long-name-for-command-foo) + ;; or + ;; "f" "foo" + "b" '("bar-prefix") + ;; or + ;; "b" "bar-prefix" + ) + #+END_SRC + + Note that while the alternative methods below use + =which-key-replacement-alist=, the "keymap-based" replacements store + replacements in the keymaps themselves, so should avoid performance issues + when =which-key-replacement-alist= becomes very large. + **** "Key-Based" replacement Using this method, the description of a key is replaced using a string that you provide. Here's an example diff --git a/which-key.el b/which-key.el index 766c8f1f86a..6eb8e359959 100644 --- a/which-key.el +++ b/which-key.el @@ -912,6 +912,41 @@ but more functional." ;;; Helper functions to modify replacement lists. +;;;###autoload +(defun which-key-add-keymap-based-replacements (keymap key replacement &rest more) + "Replace the description of KEY using REPLACEMENT in KEYMAP. +KEY should take a format suitable for use in +`kbd'. REPLACEMENT is the string to use to describe the +command associated with KEY in the KEYMAP. You may also use a +cons cell of the form \(STRING . COMMAND\) for each REPLACEMENT, +where STRING is the replacement string and COMMAND is a symbol +corresponding to the intended command to be replaced. In the +latter case, which-key will verify the intended command before +performing the replacement. COMMAND should be nil if the binding +corresponds to a key prefix. For example, + +\(which-key-add-keymap-based-replacements global-map + \"C-x w\" \"Save as\"\) + +and + +\(which-key-add-keymap-based-replacements global-map + \"C-x w\" '\(\"Save as\" . write-file\)\) + +both have the same effect for the \"C-x C-w\" key binding, but +the latter causes which-key to verify that the key sequence is +actually bound to write-file before performing the replacement." + (while key + (let ((string (if (stringp replacement) + replacement + (car-safe replacement))) + (command (cdr-safe replacement))) + (define-key keymap (which-key--pseudo-key (kbd key)) + `(which-key ,(cons string command)))) + (setq key (pop more) + replacement (pop more)))) +(put 'which-key-add-keymap-based-replacements 'lisp-indent-function 'defun) + ;;;###autoload (defun which-key-add-key-based-replacements (key-sequence replacement &rest more) @@ -1462,19 +1497,18 @@ local bindings coming first. Within these categories order using (cdr key-binding))))))) (defun which-key--get-pseudo-binding (key-binding &optional prefix) - (let* ((pseudo-binding - (key-binding (which-key--pseudo-key (kbd (car key-binding)) prefix))) - (pseudo-binding (when pseudo-binding (cadr pseudo-binding))) - (pseudo-desc (when pseudo-binding (car pseudo-binding))) - (pseudo-def (when pseudo-binding (cdr pseudo-binding))) - (real-def (key-binding (kbd (car key-binding)))) - ;; treat keymaps as if they're nil bindings. This creates the - ;; possibility that we rename the wrong binding but this seems - ;; unlikely. - (real-def (unless (keymapp real-def) real-def))) - (when (and pseudo-binding - (eq pseudo-def real-def)) - (cons (car key-binding) pseudo-desc)))) + (let* ((key (kbd (car key-binding))) + (pseudo-binding (key-binding (which-key--pseudo-key key prefix)))) + (when pseudo-binding + (let* ((command-replacement (cadr pseudo-binding)) + (pseudo-desc (car command-replacement)) + (pseudo-def (cdr command-replacement))) + (when (and (stringp pseudo-desc) + (or (null pseudo-def) + ;; don't verify keymaps + (keymapp pseudo-def) + (eq pseudo-def (key-binding key)))) + (cons (car key-binding) pseudo-desc)))))) (defsubst which-key--replace-in-binding (key-binding repl) (cond ((or (not (consp repl)) (null (cdr repl))) From e048b2ae6ba890be0100f20bacaf291e83359e26 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 28 Aug 2020 10:24:31 -0400 Subject: [PATCH 669/816] Stop testing against v24.5 It's old enough now --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c4eaf232756..3ae62889444 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,6 @@ jobs: strategy: matrix: emacs_version: - - 24.5 - 25.1 - 25.2 - 25.3 From e5543269fc2295e196a7824715b2e88b1b70345d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 28 Aug 2020 10:27:24 -0400 Subject: [PATCH 670/816] Remove testing badge from README Github integrates the results into the interface already, and it doesn't seem to work. --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index c335e457b30..301849e37ff 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,6 @@ * which-key [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] - [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] [[build][https://github.com/justbur/emacs-which-key/workflows/which-key-test/badge.svg]] + [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] ** Recent Changes From 2b10b8e77dc53f4d88191ac6e6675ecf1f1ccc63 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 1 Sep 2020 21:35:43 -0400 Subject: [PATCH 671/816] Remove use of focus-{in,out}-hook Fix #259 #260 #262 --- which-key.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/which-key.el b/which-key.el index 6eb8e359959..c08cfd8af64 100644 --- a/which-key.el +++ b/which-key.el @@ -815,8 +815,6 @@ problems at github. If DISABLE is non-nil disable support." (when which-key-show-remaining-keys (add-hook 'pre-command-hook #'which-key--lighter-restore)) (add-hook 'pre-command-hook #'which-key--hide-popup) - (add-hook 'focus-out-hook #'which-key--stop-timer) - (add-hook 'focus-in-hook #'which-key--start-timer) (add-hook 'window-size-change-functions 'which-key--hide-popup-on-frame-size-change) (which-key--start-timer)) @@ -826,8 +824,6 @@ problems at github. If DISABLE is non-nil disable support." (when which-key-show-remaining-keys (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) - (remove-hook 'focus-out-hook #'which-key--stop-timer) - (remove-hook 'focus-in-hook #'which-key--start-timer) (remove-hook 'window-size-change-functions 'which-key--hide-popup-on-frame-size-change) (which-key--stop-timer))) From d794c4a0afdf9b9f0a9df86a9797789c703591ee Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Fri, 4 Sep 2020 16:06:48 -0400 Subject: [PATCH 672/816] Improve keymap-based-replacement description in README Ref #263 --- README.org | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/README.org b/README.org index 301849e37ff..92745fff308 100644 --- a/README.org +++ b/README.org @@ -263,27 +263,29 @@ **** Automatic ("keymap-based") replacement A newer option is to set =which-key-enable-extended-define-key= which - advises =define-key= to allow which-key to pre-process its arguments. The - statement + advises =define-key= to allow which-key to pre-process its arguments. With + this option enabled, the statement #+BEGIN_SRC emacs-lisp - (define-key some-map "f" '("foo" . long-name-for-command-foo)) + (define-key some-map "f" '("foo" . command-foo)) #+END_SRC - is valid in Emacs. Setting this variable makes which-key automatically - replace the corresponding command name with the text in the string. A nice - example is in naming prefixes. The following binds "b" to =nil= and names - the binding as a prefix. + will both bind the command =command-foo= to "f" in =some-map= and tell + which-key to use the string "foo" for this command. This also works with + naming prefixes if you use =nil= for the command. The following binds "b" + to =nil= and names the binding as a prefix. #+BEGIN_SRC emacs-lisp (define-key some-map "b" '("bar-prefix")) #+END_SRC If you do not want to enable the advise on =define-key=, you may also use - =which-key-add-keymap-based-replacements=. The above examples can be + =which-key-add-keymap-based-replacements=. The first example can be alternatively written as #+BEGIN_SRC emacs-lisp + (define-key some-map "f" 'command-foo) + (define-key some-map "b" some-prefix-map) (which-key-add-keymap-based-replacements some-map "f" '("foo" . long-name-for-command-foo) ;; or @@ -294,10 +296,15 @@ ) #+END_SRC - Note that while the alternative methods below use - =which-key-replacement-alist=, the "keymap-based" replacements store - replacements in the keymaps themselves, so should avoid performance issues - when =which-key-replacement-alist= becomes very large. + Note that =which-key-add-keymap-based-replacements= will not bind a + command, so =define-key= must still be used. + + There are other methods of telling which-key to replace command names, + which are described next. The keymap-based replacements should be the most + performant since they use built-in functionality of emacs. However, the + alternatives can be more flexible in telling which-key how and when to + replace text. They can be used simultaneously, but which-key will give + precedence to the keymap-based replacement when it exists. **** "Key-Based" replacement Using this method, the description of a key is replaced using a string that From a70fc16adcf604f2cb8061d77813354da018c541 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 8 Sep 2020 14:18:21 -0400 Subject: [PATCH 673/816] Hide paging hint when prefix is help-char We can't do paging in this case. --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index c08cfd8af64..a25337f3d9a 100644 --- a/which-key.el +++ b/which-key.el @@ -2125,7 +2125,9 @@ max-lines max-width avl-lines avl-width (which-key--pages-height result)) (key (if paging-key-bound (concat key " or " which-key-paging-key) key))) - (when which-key-use-C-h-commands + (when (and which-key-use-C-h-commands + (not (string-equal (char-to-string help-char) + (kbd prefix-keys)))) (which-key--propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) From 5b37abcbe74ae5012802eacaba3235e310905949 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 8 Sep 2020 18:59:30 -0400 Subject: [PATCH 674/816] Fix which-key--next-page-hint prefix-keys might be a vector. Fixes #265 --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index a25337f3d9a..1dbdd08400b 100644 --- a/which-key.el +++ b/which-key.el @@ -2126,8 +2126,9 @@ max-lines max-width avl-lines avl-width (which-key--pages-height result)) (concat key " or " which-key-paging-key) key))) (when (and which-key-use-C-h-commands - (not (string-equal (char-to-string help-char) - (kbd prefix-keys)))) + (or (not (stringp (kbd prefix-keys))) + (not (string-equal (char-to-string help-char) + (kbd prefix-keys))))) (which-key--propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) From ae59b7edb0d82aa0251803fdfbde6b865083c8b8 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 8 Sep 2020 19:01:44 -0400 Subject: [PATCH 675/816] Version 3.5.0 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 1dbdd08400b..de1aa678cfe 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.3.2 +;; Version: 3.5.0 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 427c3f4a53fe70799b08ff49c23ddd41ab2376c6 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 18 Oct 2020 15:34:53 -0400 Subject: [PATCH 676/816] Clarify README's description of keymap-based replacement --- README.org | 72 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/README.org b/README.org index 92745fff308..d2d375d3a98 100644 --- a/README.org +++ b/README.org @@ -257,47 +257,49 @@ *** Custom String Replacement Options #+NAME: #custom-string-replacement-options You can customize the way the keys show in the buffer using three different - replacement methods, each of which corresponds replacement alist. The basic - idea of behind each alist is that you specify a selection string in the - =car= of each cons cell and the replacement string in the =cdr=. + replacement methods. The first, keymap-based replacement, is preferred and + will take precedence over the others. The remaining methods are still + available, because they pre-date the first and are more flexible in what + they can accomplish. -**** Automatic ("keymap-based") replacement - A newer option is to set =which-key-enable-extended-define-key= which - advises =define-key= to allow which-key to pre-process its arguments. With - this option enabled, the statement +**** Keymap-based replacement + Using this method, which-key can display a custom string for a key + definition in some keymap. There are two ways to define a keymap-based + replacement. The first is to use + =which-key-add-keymap-based-replacements=. The statement + + #+BEGIN_SRC emacs-lisp + (define-key some-map "f" 'long-command-name-foo) + (define-key some-map "b" some-prefix-map) + (which-key-add-keymap-based-replacements some-map + "f" '("foo" . long-command-name-foo) + ;; or + ;; "f" "foo" (see the docstring) + "b" '("bar-prefix") + ;; or + ;; "b" "bar-prefix" (see the docstring) + ) + #+END_SRC + + uses =define-key= to add two bindings and tells which-key to use the string + "foo" in place of "command-foo" and the string "bar-prefix" for + some-prefix-map. Note that =which-key-add-keymap-based-replacements= will + not bind a command, so =define-key= must still be used. + + Alternatively, you may set =which-key-enable-extended-define-key= to =t= + before loading which-key and accomplish the same effect using only + =define-key= as follows. #+BEGIN_SRC emacs-lisp (define-key some-map "f" '("foo" . command-foo)) - #+END_SRC - - will both bind the command =command-foo= to "f" in =some-map= and tell - which-key to use the string "foo" for this command. This also works with - naming prefixes if you use =nil= for the command. The following binds "b" - to =nil= and names the binding as a prefix. - - #+BEGIN_SRC emacs-lisp (define-key some-map "b" '("bar-prefix")) #+END_SRC - If you do not want to enable the advise on =define-key=, you may also use - =which-key-add-keymap-based-replacements=. The first example can be - alternatively written as - - #+BEGIN_SRC emacs-lisp - (define-key some-map "f" 'command-foo) - (define-key some-map "b" some-prefix-map) - (which-key-add-keymap-based-replacements some-map - "f" '("foo" . long-name-for-command-foo) - ;; or - ;; "f" "foo" - "b" '("bar-prefix") - ;; or - ;; "b" "bar-prefix" - ) - #+END_SRC - - Note that =which-key-add-keymap-based-replacements= will not bind a - command, so =define-key= must still be used. + The option =which-key-enable-extended-define-key= advises =define-key= to + allow which-key to use the =(NAME . COMMAND)= notation to simultaneously + define a command and give that command a name using =define-key=. Since + many key-binding utilities use =define-key= internally, this functionality + should be available with your favorite method of defining keys as well. There are other methods of telling which-key to replace command names, which are described next. The keymap-based replacements should be the most @@ -306,7 +308,7 @@ replace text. They can be used simultaneously, but which-key will give precedence to the keymap-based replacement when it exists. -**** "Key-Based" replacement +**** Key-Based replacement Using this method, the description of a key is replaced using a string that you provide. Here's an example From c011b268196b8356c70f668506a1133086bc9477 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 19 Oct 2020 11:15:35 -0400 Subject: [PATCH 677/816] Add tests for keymap-based-bindings --- which-key-tests.el | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/which-key-tests.el b/which-key-tests.el index f9fac65c73b..1611d51cc04 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -27,7 +27,24 @@ (require 'which-key) (require 'ert) -(ert-deftest which-key-test-prefix-declaration () +(ert-deftest which-key-test--keymap-based-bindings () + (let ((map (make-sparse-keymap)) + (emacs-lisp-mode-map (copy-keymap emacs-lisp-mode-map))) + (emacs-lisp-mode) + (define-key map "x" 'ignore) + (define-key emacs-lisp-mode-map "\C-c\C-a" 'complete) + (define-key emacs-lisp-mode-map "\C-c\C-b" map) + (which-key-add-keymap-based-replacements emacs-lisp-mode-map + "C-c C-a" '("mycomplete" . complete) + "C-c C-b" "mymap") + (should (equal + (which-key--maybe-replace '("C-c C-a" . "complete")) + '("C-c C-a" . "mycomplete"))) + (should (equal + (which-key--maybe-replace '("C-c C-b" . "")) + '("C-c C-b" . "mymap"))))) + +(ert-deftest which-key-test--prefix-declaration () "Test `which-key-declare-prefixes' and `which-key-declare-prefixes-for-mode'. See Bug #109." (let* ((major-mode 'test-mode) From ca268fd313d3fb2bd03a8b5e4bdcca675ce58ca7 Mon Sep 17 00:00:00 2001 From: BlaCk_Void Date: Fri, 13 Nov 2020 01:22:08 +0000 Subject: [PATCH 678/816] REAMDE code's Number of parentheses pairs (#270) --- README.org | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.org b/README.org index d2d375d3a98..c417b04873e 100644 --- a/README.org +++ b/README.org @@ -363,10 +363,10 @@ character width. #+BEGIN_SRC emacs-lisp - (add-to-list 'which-key-replacement-alist '(("TAB" . nil) . ("↹" . nil)) - (add-to-list 'which-key-replacement-alist '(("RET" . nil) . ("⏎" . nil)) - (add-to-list 'which-key-replacement-alist '(("DEL" . nil) . ("⇤" . nil)) - (add-to-list 'which-key-replacement-alist '(("SPC" . nil) . ("␣" . nil)) + (add-to-list 'which-key-replacement-alist '(("TAB" . nil) . ("↹" . nil))) + (add-to-list 'which-key-replacement-alist '(("RET" . nil) . ("⏎" . nil))) + (add-to-list 'which-key-replacement-alist '(("DEL" . nil) . ("⇤" . nil))) + (add-to-list 'which-key-replacement-alist '(("SPC" . nil) . ("␣" . nil))) #+END_SRC The =cdr= may also be a function that receives a =cons= of the form =(KEY From 3908719ff2cf45ef886fa484af0cf8a81e95c9aa Mon Sep 17 00:00:00 2001 From: Daniel Mendler Date: Tue, 15 Dec 2020 23:49:28 +0100 Subject: [PATCH 679/816] simplify pseudo key --- which-key.el | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index de1aa678cfe..b2635ea6ad9 100644 --- a/which-key.el +++ b/which-key.el @@ -677,12 +677,12 @@ update.") (defvar which-key--ignore-non-evil-keys-regexp (eval-when-compile (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" - "select-window" "switch-frame" "which-key-")))) + "select-window" "switch-frame" "which-key")))) (defvar which-key--ignore-keys-regexp (eval-when-compile (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" "select-window" "switch-frame" "-state" - "which-key-")))) + "which-key")))) (make-obsolete-variable 'which-key-prefix-name-alist nil "2016-10-05") (make-obsolete-variable 'which-key-prefix-title-alist nil "2016-10-05") @@ -1595,11 +1595,8 @@ which are strings. KEY is of the form produced by `key-binding'." (defun which-key--pseudo-key (key &optional prefix) "Replace the last key in the sequence KEY by a special symbol in order for which-key to allow looking up a description for the key." - (let* ((seq (listify-key-sequence key)) - (final (intern (format "which-key-%s" (key-description (last seq)))))) - (if prefix - (vconcat prefix (list final)) - (vconcat (butlast seq) (list final))))) + (let ((seq (listify-key-sequence key))) + (vconcat (or prefix (butlast seq)) (vector 'which-key (last seq))))) (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. From 428aedfce0157920814fbb2ae5d00b4aea89df88 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 16 Dec 2020 12:20:14 -0500 Subject: [PATCH 680/816] Further simplify which-key--pseudo-key --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index b2635ea6ad9..ba3efe3e8a3 100644 --- a/which-key.el +++ b/which-key.el @@ -1596,7 +1596,7 @@ which are strings. KEY is of the form produced by `key-binding'." "Replace the last key in the sequence KEY by a special symbol in order for which-key to allow looking up a description for the key." (let ((seq (listify-key-sequence key))) - (vconcat (or prefix (butlast seq)) (vector 'which-key (last seq))))) + (vconcat (or prefix (butlast seq)) [which-key] (last seq)))) (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. From c0608e812a8d1bc7aefeacdfaeb56a7272eabf44 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 31 Jan 2021 13:37:08 -0500 Subject: [PATCH 681/816] Version 3.5.1 --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index ba3efe3e8a3..529bcfadc75 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.5.0 +;; Version: 3.5.1 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From c632dbf27a77c1c73ce559041b3a78ec5f78b187 Mon Sep 17 00:00:00 2001 From: Celestial Nebula <41875671+CelestialNebula@users.noreply.github.com> Date: Wed, 24 Mar 2021 18:21:16 +0000 Subject: [PATCH 682/816] Update reference to obsolete variable in DOCSTRING (#285) --- which-key.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 529bcfadc75..55767a97f69 100644 --- a/which-key.el +++ b/which-key.el @@ -964,8 +964,7 @@ In the second case, the second string is used to provide a longer name for the keys under a prefix. MORE allows you to specifcy additional KEY REPLACEMENT pairs. All -replacements are added to -`which-key-key-based-description-replacement-alist'." +replacements are added to `which-key-replacement-alist'." ;; TODO: Make interactive (while key-sequence ;; normalize key sequences before adding From 5fb30301cb3b4fca5a0e1ce8ec1ef59290b79199 Mon Sep 17 00:00:00 2001 From: Frank Terbeck Date: Tue, 6 Apr 2021 17:18:16 +0200 Subject: [PATCH 683/816] Unset header-line-format format in " *which-key*" buffer Similarly to mode-line-format, header-line-format just takes up space and currently also breaks window size calculations for the buffer. This sets it to nil in order to suppress its display. Signed-off-by: Frank Terbeck --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index 55767a97f69..8b4c60fdee8 100644 --- a/which-key.el +++ b/which-key.el @@ -840,6 +840,7 @@ problems at github. If DISABLE is non-nil disable support." (setq-local cursor-type nil) (setq-local cursor-in-non-selected-windows nil) (setq-local mode-line-format nil) + (setq-local header-line-format nil) (setq-local word-wrap nil) (setq-local show-trailing-whitespace nil) (run-hooks 'which-key-init-buffer-hook)))) From 7927209c1bec93920bf68cf36ddd6832317a0ae7 Mon Sep 17 00:00:00 2001 From: Jiangbin Zhao Date: Sun, 23 May 2021 14:07:53 -0700 Subject: [PATCH 684/816] fix which-key--show-keymap for which-key-enable-extended-define-key With which-key-enable-extended-define-key set to 't, given the keymap and bindings below: (setq a-map (make-sparse-keymap)) (bind-keys :map a-map ("a" . ("key 1" . command-1)) ("b" . ("key b" . command-2))) The output of (which-key--get-keymap-bindings a-map) was having "unknown" as the key descriptions. This change fixes it therefore allows the following to work as expected: (which-key--show-keymap "A map" a-map) --- which-key.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/which-key.el b/which-key.el index 8b4c60fdee8..c5652d803bd 100644 --- a/which-key.el +++ b/which-key.el @@ -1823,6 +1823,9 @@ ones. PREFIX is for internal use and should not be used." (setq bindings (append bindings (which-key--get-keymap-bindings def t key)))) + ((and def (consp def)) + (cl-pushnew (cons key-desc (car def)) + bindings :test (lambda (a b) (string= (car a) (car b))))) (t (when def (cl-pushnew From aa91a7cd8347dca8978e9897b41063859e606892 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Sun, 30 May 2021 20:16:53 +0200 Subject: [PATCH 685/816] Fix nesting-level of "God-mode" section --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 8b4c60fdee8..3514226f936 100644 --- a/which-key.el +++ b/which-key.el @@ -753,7 +753,7 @@ valid keys missing and it might be showing some invalid keys." :group 'which-key :type 'boolean) -;;;;; God-mode +;;;; God-mode (defvar which-key--god-mode-support-enabled nil "Support god-mode if non-nil. This is experimental, From 1f5e53285282416be34846698fdfafc29dac034d Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Sun, 30 May 2021 20:17:49 +0200 Subject: [PATCH 686/816] Avoid code-duplication in which-key--hide-popup --- which-key.el | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 3514226f936..b576a5b3786 100644 --- a/which-key.el +++ b/which-key.el @@ -1143,17 +1143,14 @@ total height." (when (and which-key-idle-secondary-delay which-key--secondary-timer-active) (which-key--start-timer)) (which-key--lighter-restore) - (cl-case which-key-popup-type - ;; Not necessary to hide minibuffer - ;; (minibuffer (which-key--hide-buffer-minibuffer)) - (side-window (which-key--hide-buffer-side-window)) - (frame (which-key--hide-buffer-frame)) - (custom (funcall which-key-custom-hide-popup-function))))) + (which-key--hide-popup-ignore-command))) (defun which-key--hide-popup-ignore-command () "Version of `which-key--hide-popup' without the check of `real-this-command'." (cl-case which-key-popup-type + ;; Not necessary to hide minibuffer + ;; (minibuffer (which-key--hide-buffer-minibuffer)) (side-window (which-key--hide-buffer-side-window)) (frame (which-key--hide-buffer-frame)) (custom (funcall which-key-custom-hide-popup-function)))) From 016b9bbf869767d0a6a32b2644444dd2d85e9fc1 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Sun, 30 May 2021 20:18:50 +0200 Subject: [PATCH 687/816] Cosmetics --- which-key.el | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/which-key.el b/which-key.el index b576a5b3786..3f5f8097cd1 100644 --- a/which-key.el +++ b/which-key.el @@ -724,8 +724,8 @@ update.") (which-key--pages-num-pages which-key--pages-obj))) (defsubst which-key--current-prefix () - (when which-key--pages-obj - (which-key--pages-prefix which-key--pages-obj))) + (and which-key--pages-obj + (which-key--pages-prefix which-key--pages-obj))) (defmacro which-key--debug-message (&rest msg) `(when which-key--debug-buffer-name @@ -1182,7 +1182,8 @@ popup)." 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." - (when (and (> (car act-popup-dim) 0) (> (cdr act-popup-dim) 0)) + (when (and (> (car act-popup-dim) 0) + (> (cdr act-popup-dim) 0)) (cl-case which-key-popup-type ;; Not called for minibuffer ;; (minibuffer (which-key--show-buffer-minibuffer act-popup-dim)) @@ -2449,9 +2450,9 @@ prefix) if `which-key-use-C-h-commands' is non nil." (interactive) (cond ((and (not (which-key--popup-showing-p)) which-key-show-early-on-C-h) - (let* ((current-prefix - (butlast - (listify-key-sequence (which-key--this-command-keys))))) + (let ((current-prefix + (butlast + (listify-key-sequence (which-key--this-command-keys))))) (which-key-reload-key-sequence current-prefix) (if which-key-idle-secondary-delay (which-key--start-timer which-key-idle-secondary-delay t) @@ -2773,10 +2774,8 @@ Finally, show the buffer." (which-key--stop-timer) (setq which-key--secondary-timer-active secondary) (setq which-key--timer - (run-with-idle-timer - (if delay - delay - which-key-idle-delay) t #'which-key--update))) + (run-with-idle-timer (or delay which-key-idle-delay) + t #'which-key--update))) (defun which-key--stop-timer () "Deactivate idle timer for `which-key--update'." From f6ce67d7053d00e11e0eda653e2f39d7955fb3b4 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Sun, 30 May 2021 20:39:55 +0200 Subject: [PATCH 688/816] Get which-key--buffer's window from any frame Previously we assumed the buffer was being displayed in a window of the current frame, which isn't the case if e.g. a child frame is being used. We also cannot assume that the third-party code that sets up such a child frame also deletes it. `which-key-posframe' for example merely hides it. --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 3f5f8097cd1..74accfa3383 100644 --- a/which-key.el +++ b/which-key.el @@ -1175,7 +1175,10 @@ popup)." (defun which-key--popup-showing-p () (and (bufferp which-key--buffer) - (window-live-p (get-buffer-window which-key--buffer)))) + (or (window-live-p (get-buffer-window which-key--buffer)) + (let ((window (get-buffer-window which-key--buffer t))) + (and (window-live-p window) + (frame-visible-p (window-frame window))))))) (defun which-key--show-popup (act-popup-dim) "Show the which-key buffer. From ef1fc43fcb6dce6060d8d362f921dafe78fc3e26 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 31 May 2021 22:30:32 -0400 Subject: [PATCH 689/816] Reference issues #93 and #175 in README Fixes #291 --- README.org | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.org b/README.org index c417b04873e..0f67f20262b 100644 --- a/README.org +++ b/README.org @@ -444,6 +444,9 @@ Note =C-h= is by default equivalent to =?= in this context. + Note also that using =C-h= will not work with the =C-h= prefix, unless you + make further adjustments. See Issues #93 and #175, for example. + **** Method 2: Bind your own keys Essentially, all you need to do for a prefix like =C-x= is the following From 81d93952afe0bc36d95fd166de62529b656ab49f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 31 May 2021 22:34:08 -0400 Subject: [PATCH 690/816] Fix README links --- README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.org b/README.org index 0f67f20262b..3064466a558 100644 --- a/README.org +++ b/README.org @@ -445,7 +445,7 @@ Note =C-h= is by default equivalent to =?= in this context. Note also that using =C-h= will not work with the =C-h= prefix, unless you - make further adjustments. See Issues #93 and #175, for example. + make further adjustments. See Issues [[https://github.com/justbur/emacs-which-key/issues/93][#93]] and [[https://github.com/justbur/emacs-which-key/issues/175][#175]] for example. **** Method 2: Bind your own keys From 7e854d02037c8ec84ac26bb77b98f670d8d3eb2e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 31 May 2021 22:48:53 -0400 Subject: [PATCH 691/816] Fix recent commit --- which-key.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 2f89f400ae5..d66cec5d261 100644 --- a/which-key.el +++ b/which-key.el @@ -1824,9 +1824,6 @@ ones. PREFIX is for internal use and should not be used." (setq bindings (append bindings (which-key--get-keymap-bindings def t key)))) - ((and def (consp def)) - (cl-pushnew (cons key-desc (car def)) - bindings :test (lambda (a b) (string= (car a) (car b))))) (t (when def (cl-pushnew @@ -1838,6 +1835,7 @@ ones. PREFIX is for internal use and should not be used." ((eq 'menu-item (car-safe def)) "menu-item") ((stringp def) def) ((vectorp def) (key-description def)) + ((consp def) (car def)) (t "unknown"))) bindings :test (lambda (a b) (string= (car a) (car b))))))))) keymap) From fc29864395fdaf688e2ef5111831663bad89a020 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 31 May 2021 22:52:43 -0400 Subject: [PATCH 692/816] Fix whitespace --- which-key.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index d66cec5d261..89ab2aecb09 100644 --- a/which-key.el +++ b/which-key.el @@ -1176,9 +1176,9 @@ popup)." (defun which-key--popup-showing-p () (and (bufferp which-key--buffer) (or (window-live-p (get-buffer-window which-key--buffer)) - (let ((window (get-buffer-window which-key--buffer t))) - (and (window-live-p window) - (frame-visible-p (window-frame window))))))) + (let ((window (get-buffer-window which-key--buffer t))) + (and (window-live-p window) + (frame-visible-p (window-frame window))))))) (defun which-key--show-popup (act-popup-dim) "Show the which-key buffer. @@ -1186,7 +1186,7 @@ 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." (when (and (> (car act-popup-dim) 0) - (> (cdr act-popup-dim) 0)) + (> (cdr act-popup-dim) 0)) (cl-case which-key-popup-type ;; Not called for minibuffer ;; (minibuffer (which-key--show-buffer-minibuffer act-popup-dim)) @@ -2779,7 +2779,7 @@ Finally, show the buffer." (setq which-key--secondary-timer-active secondary) (setq which-key--timer (run-with-idle-timer (or delay which-key-idle-delay) - t #'which-key--update))) + t #'which-key--update))) (defun which-key--stop-timer () "Deactivate idle timer for `which-key--update'." From 12f743c6955c89352f8d49d292895bd45e82d26f Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Tue, 15 Jun 2021 19:19:44 +0200 Subject: [PATCH 693/816] Fix whitespace --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 89ab2aecb09..9b4005a8d78 100644 --- a/which-key.el +++ b/which-key.el @@ -997,7 +997,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (title-mode-alist (or (cdr-safe (assq mode which-key--prefix-title-alist)) (list)))) (while key-sequence - ;; normalize key sequences before adding + ;; normalize key sequences before adding (let ((key-seq (key-description (kbd key-sequence))) (replace (or (and (functionp replacement) replacement) (car-safe replacement) @@ -1646,7 +1646,7 @@ If KEY contains any \"special keys\" defined in (let ((beg (match-beginning 0)) (end (match-end 0))) (concat (substring key-w-face 0 beg) (which-key--propertize (substring key-w-face beg (1+ beg)) - 'face 'which-key-special-key-face) + 'face 'which-key-special-key-face) (substring key-w-face end (which-key--string-width key-w-face)))) key-w-face)))) @@ -2711,7 +2711,7 @@ Finally, show the buffer." (bound-and-true-p god-local-mode) (eq this-command 'god-mode-self-insert)) (setq this-command-keys (when which-key--god-mode-key-string - (kbd which-key--god-mode-key-string)))) + (kbd which-key--god-mode-key-string)))) this-command-keys)) (defun which-key--update () From 0f6bda622e19d8b7f3d39acddbff5263c69a51de Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 17 Jun 2021 01:24:17 +0200 Subject: [PATCH 694/816] Improve first doc-string line in trivial cases The first line of a doc-string should form a complete sentence. Many doc-strings in this package do not follow that convention but fixing them all would be difficult and is beyond the scope of this commit. However, in a few cases the fix is trivial and this commit tackles those instances. --- which-key.el | 62 +++++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/which-key.el b/which-key.el index 9b4005a8d78..6d69482d41d 100644 --- a/which-key.el +++ b/which-key.el @@ -56,8 +56,8 @@ :prefix "which-key-") (defcustom which-key-idle-delay 1.0 - "Delay (in seconds) for which-key buffer to popup. This - variable should be set before activating `which-key-mode'. + "Delay (in seconds) for which-key buffer to popup. +This variable should be set before activating `which-key-mode'. A value of zero might lead to issues, so a non-zero value is recommended @@ -276,14 +276,13 @@ and nil. Nil turns the feature off." (const :tag "Use your custom display functions" custom))) (defcustom which-key-min-display-lines 1 - "The minimum number of horizontal lines to display in the - which-key buffer." + "The minimum number of horizontal lines to display in the which-key buffer." :group 'which-key :type 'integer) (defcustom which-key-max-display-columns nil - "The maximum number of columns to display in the which-key -buffer. nil means don't impose a maximum." + "The maximum number of columns to display in the which-key buffer. +nil means don't impose a maximum." :group 'which-key :type '(choice integer (const :tag "Unbounded" nil))) @@ -500,10 +499,10 @@ The delay time is effectively added to the normal :type '(repeat function)) (defcustom which-key-allow-regexps nil - "A list of regexp strings to use to filter key sequences. When -non-nil, for a key sequence to trigger the which-key popup it -must match one of the regexps in this list. The format of the key -sequences is what is produced by `key-description'." + "A list of regexp strings to use to filter key sequences. +When non-nil, for a key sequence to trigger the which-key popup +it must match one of the regexps in this list. The format of the +key sequences is what is produced by `key-description'." :group 'which-key :type '(repeat regexp)) @@ -739,9 +738,10 @@ update.") ;;;; Evil (defcustom which-key-allow-evil-operators (boundp 'evil-this-operator) - "Allow popup to show for evil operators. The popup is normally - inhibited in the middle of commands, but setting this to - non-nil will override this behavior for evil operators." + "Allow popup to show for evil operators. +The popup is normally inhibited in the middle of commands, but +setting this to non-nil will override this behavior for evil +operators." :group 'which-key :type 'boolean) @@ -772,9 +772,10 @@ problems at github.") (which-key--hide-popup)))) (defun which-key-enable-god-mode-support (&optional disable) - "Enable support for god-mode if non-nil. This is experimental, -so you need to explicitly opt-in for now. Please report any -problems at github. If DISABLE is non-nil disable support." + "Enable support for god-mode if non-nil. +This is experimental, so you need to explicitly opt-in for +now. Please report any problems at github. If DISABLE is non-nil +disable support." (interactive "P") (setq which-key--god-mode-support-enabled (null disable)) (if disable @@ -888,8 +889,7 @@ if there is space and the bottom otherwise." ;;;###autoload (defun which-key-setup-side-window-bottom () - "Apply suggested settings for side-window that opens on -bottom." + "Apply suggested settings for side-window that opens on bottom." (interactive) (which-key--setup-echo-keystrokes) (setq which-key-popup-type 'side-window @@ -1156,8 +1156,7 @@ total height." (custom (funcall which-key-custom-hide-popup-function)))) (defun which-key--hide-popup-on-frame-size-change (&optional _) - "Hide which-key popup if the frame is resized (to trigger a new -popup)." + "Hide which-key popup if the frame is resized (to trigger a new popup)." (when (which-key--frame-size-changed-p) (which-key--hide-popup))) @@ -2249,8 +2248,9 @@ and a page count." (_ (cons page nil))))) (defun which-key--show-page (&optional n) - "Show current page. N changes the current page to the Nth page -relative to the current one." + "Show current page. +N changes the current page to the Nth page relative to the +current one." (which-key--init-buffer) ;; in case it was killed (let ((prefix-keys (which-key--current-key-string)) golden-ratio-mode) @@ -2550,8 +2550,8 @@ Only if no bindings fit fallback to LOC2." ;;;###autoload (defun which-key-show-keymap (keymap &optional no-paging) - "Show the top-level bindings in KEYMAP using which-key. KEYMAP -is selected interactively from all available keymaps. + "Show the top-level bindings in KEYMAP using which-key. +KEYMAP is selected interactively from all available keymaps. If NO-PAGING is non-nil, which-key will not intercept subsequent keypresses for the paging functionality." @@ -2562,8 +2562,8 @@ keypresses for the paging functionality." ;;;###autoload (defun which-key-show-full-keymap (keymap) - "Show all bindings in KEYMAP using which-key. KEYMAP is -selected interactively from all available keymaps." + "Show all bindings in KEYMAP using which-key. +KEYMAP is selected interactively from all available keymaps." (interactive (list (which-key--read-keymap))) (which-key--show-keymap (symbol-name keymap) (symbol-value keymap) @@ -2571,8 +2571,9 @@ selected interactively from all available keymaps." ;;;###autoload (defun which-key-show-minor-mode-keymap (&optional all) - "Show the top-level bindings in KEYMAP using which-key. KEYMAP -is selected interactively by mode in `minor-mode-map-alist'." + "Show the top-level bindings in KEYMAP using which-key. +KEYMAP is selected interactively by mode in +`minor-mode-map-alist'." (interactive) (let ((mode-sym (intern @@ -2590,8 +2591,9 @@ is selected interactively by mode in `minor-mode-map-alist'." all))) ;;;###autoload (defun which-key-show-full-minor-mode-keymap () - "Show all bindings in KEYMAP using which-key. KEYMAP -is selected interactively by mode in `minor-mode-map-alist'." + "Show all bindings in KEYMAP using which-key. +KEYMAP is selected interactively by mode in +`minor-mode-map-alist'." (interactive) (which-key-show-minor-mode-keymap t)) From a55b90844c837e157c289ad4b10f5f2e3a4d53ff Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 12:10:08 -0400 Subject: [PATCH 695/816] Alternative approach to retrieving bindings (WIP) --- which-key.el | 185 ++++++++++++++++++--------------------------------- 1 file changed, 65 insertions(+), 120 deletions(-) diff --git a/which-key.el b/which-key.el index 9b4005a8d78..e6ac0c4f19a 100644 --- a/which-key.el +++ b/which-key.el @@ -1790,57 +1790,6 @@ alists. Returns a list (key separator description)." new-list)))) (nreverse new-list))) -(defun which-key--get-keymap-bindings (keymap &optional all prefix) - "Retrieve top-level bindings from KEYMAP. -If ALL is non-nil, get all bindings, not just the top-level -ones. PREFIX is for internal use and should not be used." - (let (bindings) - (map-keymap - (lambda (ev def) - (let* ((key (append prefix (list ev))) - (key-desc (key-description key))) - (cond ((or (string-match-p - which-key--ignore-non-evil-keys-regexp key-desc) - (eq ev 'menu-bar))) - ;; extract evil keys corresponding to current state - ((and (keymapp def) - (boundp 'evil-state) - (bound-and-true-p evil-local-mode) - (string-match-p (format "<%s-state>$" evil-state) key-desc)) - (setq bindings - ;; this function keeps the latter of the two duplicates - ;; which will be the evil binding - (cl-remove-duplicates - (append bindings - (which-key--get-keymap-bindings def all prefix)) - :test (lambda (a b) (string= (car a) (car b)))))) - ((and (keymapp def) - (string-match-p which-key--evil-keys-regexp key-desc))) - ((and (keymapp def) - (or all - ;; event 27 is escape, so this will pick up meta - ;; bindings and hopefully not too much more - (and (numberp ev) (= ev 27)))) - (setq bindings - (append bindings - (which-key--get-keymap-bindings def t key)))) - (t - (when def - (cl-pushnew - (cons key-desc - (cond - ((keymapp def) "Prefix Command") - ((symbolp def) (copy-sequence (symbol-name def))) - ((eq 'lambda (car-safe def)) "lambda") - ((eq 'menu-item (car-safe def)) "menu-item") - ((stringp def) def) - ((vectorp def) (key-description def)) - ((consp def) (car def)) - (t "unknown"))) - bindings :test (lambda (a b) (string= (car a) (car b))))))))) - keymap) - bindings)) - (defun which-key--compute-binding (binding) "Replace BINDING with remapped binding if it exists. @@ -1849,78 +1798,74 @@ Requires `which-key-compute-remaps' to be non-nil" (if (and which-key-compute-remaps (setq remap (command-remapping (intern binding)))) (copy-sequence (symbol-name remap)) - binding))) + (copy-sequence (symbol-name binding))))) + +(defun which-key--get-keymap-bindings-1 + "Helper function for `which-key--get-keymap-bindings'" + (keymap start &optional prefix all ignore-commands) + (let ((bindings start) + (prefix-map (if prefix (lookup-key keymap prefix) keymap))) + (when (keymapp prefix-map) + (map-keymap + (lambda (ev def) + (let* ((key (append prefix (list ev))) + (key-desc (key-description key))) + (cond + ((assoc key-desc bindings)) + ((and (listp ignore-commands) (symbolp def) (memq def ignore-commands))) + ((or (string-match-p + which-key--ignore-non-evil-keys-regexp key-desc) + (eq ev 'menu-bar))) + ((and (keymapp def) + (string-match-p which-key--evil-keys-regexp key-desc))) + ((and (keymapp def) + (or all + ;; event 27 is escape, so this will pick up meta + ;; bindings and hopefully not too much more + (and (numberp ev) (= ev 27)))) + (setq bindings + (which-key--get-keymap-bindings-1 + keymap bindings key all ignore-commands))) + (def + (push + (cons key-desc + (cond + ((keymapp def) "+prefix") + ((symbolp def) (which-key--compute-binding def)) + ((eq 'lambda (car-safe def)) "lambda") + ((eq 'menu-item (car-safe def)) + (keymap--menu-item-binding def)) + ((stringp def) def) + ((vectorp def) (key-description def)) + ((consp def) (car def)) + (t "unknown"))) + bindings))))) + prefix-map)) + bindings)) + +(defun which-key--get-keymap-bindings (keymap &optional prefix start all evil) + "Retrieve top-level bindings from KEYMAP. +PREFIX limits bindings to those starting with this key +sequence. START is a list of existing bindings to add to. If ALL +is non-nil, recursively retrieve all bindings below PREFIX. If +EVIL is non-nil, extract active evil bidings." + (let ((bindings start) + (ignore '(self-insert-command ignore ignore-event company-ignore)) + (evil-map + (when (and evil (bound-and-true-p evil-local-mode)) + (lookup-key keymap (kbd (format "<%s-state>" evil-state)))))) + (when (keymapp evil-map) + (setq bindings (which-key--get-keymap-bindings-1 + evil-map bindings prefix all ignore))) + (which-key--get-keymap-bindings-1 keymap bindings prefix all ignore))) (defun which-key--get-current-bindings (&optional prefix) "Generate a list of current active bindings." - (let ((key-str-qt (regexp-quote (key-description prefix))) - (buffer (current-buffer)) - (ignore-bindings '("self-insert-command" "ignore" - "ignore-event" "company-ignore")) - (ignore-sections-regexp - (eval-when-compile - (regexp-opt '("Key translations" "Function key map translations" - "Input decoding map translations"))))) - (with-temp-buffer - (setq-local indent-tabs-mode t) - (setq-local tab-width 8) - (describe-buffer-bindings buffer prefix) - (goto-char (point-min)) - (let ((header-p (not (= (char-after) ?\f))) - bindings header) - (while (not (eobp)) - (cond - (header-p - (setq header (buffer-substring-no-properties - (point) - (line-end-position))) - (setq header-p nil) - (forward-line 3)) - ((= (char-after) ?\f) - (setq header-p t)) - ((looking-at "^[ \t]*$")) - ((or (not (string-match-p ignore-sections-regexp header)) prefix) - (let ((binding-start (save-excursion - (and (re-search-forward "\t+" nil t) - (match-end 0)))) - key binding) - (when binding-start - (setq key (buffer-substring-no-properties - (point) binding-start)) - (setq binding (buffer-substring-no-properties - binding-start - (line-end-position))) - (save-match-data - (cond - ((member binding ignore-bindings)) - ((string-match-p which-key--ignore-keys-regexp key)) - ((and prefix - (string-match (format "^%s[ \t]\\([^ \t]+\\)[ \t]+$" - key-str-qt) key)) - (unless (assoc-string (match-string 1 key) bindings) - (push (cons (match-string 1 key) - (which-key--compute-binding binding)) - bindings))) - ((and prefix - (string-match - (format - "^%s[ \t]\\([^ \t]+\\) \\.\\. %s[ \t]\\([^ \t]+\\)[ \t]+$" - key-str-qt key-str-qt) key)) - (let ((stripped-key (concat (match-string 1 key) - " \.\. " - (match-string 2 key)))) - (unless (assoc-string stripped-key bindings) - (push (cons stripped-key - (which-key--compute-binding binding)) - bindings)))) - ((string-match - "^\\([^ \t]+\\|[^ \t]+ \\.\\. [^ \t]+\\)[ \t]+$" key) - (unless (assoc-string (match-string 1 key) bindings) - (push (cons (match-string 1 key) - (which-key--compute-binding binding)) - bindings))))))))) - (forward-line)) - (nreverse bindings))))) + (let (bindings) + (dolist (map (current-active-maps t) bindings) + (when (cdr map) + (setq bindings + (which-key--get-keymap-bindings map prefix bindings)))))) (defun which-key--get-bindings (&optional prefix keymap filter recursive) "Collect key bindings. From fc8855187f087635de4162071882405861460e05 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 13:35:38 -0400 Subject: [PATCH 696/816] Remove pseudo binding stuff It's not necessary anymore with manual parsing of the keymaps --- which-key.el | 89 ++++++++++------------------------------------------ 1 file changed, 17 insertions(+), 72 deletions(-) diff --git a/which-key.el b/which-key.el index e6ac0c4f19a..5c2ca802f74 100644 --- a/which-key.el +++ b/which-key.el @@ -525,24 +525,6 @@ it." :group 'which-key :type 'boolean) -(defcustom which-key-enable-extended-define-key nil - "Advise `define-key' to make which-key aware of definitions of the form - - \(define-key KEYMAP KEY '(\"DESCRIPTION\" . DEF)) - -With the advice, this definition will have the side effect of -creating a replacement in `which-key-replacement-alist' that -replaces DEF with DESCRIPTION when the key sequence ends in -KEY. Using a cons cell like this is a valid definition for -`define-key'. All this does is to make which-key aware of it. - -Since many higher level keybinding functions use `define-key' -internally, this will affect most if not all of those as well. - -This variable must be set before loading which-key." - :group 'which-key - :type 'boolean) - ;; Hooks (defcustom which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized." @@ -938,8 +920,7 @@ actually bound to write-file before performing the replacement." replacement (car-safe replacement))) (command (cdr-safe replacement))) - (define-key keymap (which-key--pseudo-key (kbd key)) - `(which-key ,(cons string command)))) + (define-key keymap (kbd key) (cons string command))) (setq key (pop more) replacement (pop more)))) (put 'which-key-add-keymap-based-replacements 'lisp-indent-function 'defun) @@ -1044,19 +1025,6 @@ If AT-ROOT is non-nil the binding is also placed at the root of MAP." (which-key-define-key-recursively df key def t))) map)) -(defun which-key--process-define-key-args (keymap key def) - "When DEF takes the form (\"DESCRIPTION\". DEF), make sure -which-key uses \"DESCRIPTION\" for this binding. This function is -meant to be used as :before advice for `define-key'." - (with-demoted-errors "Which-key extended define-key error: %s" - (when (and (consp def) - (stringp (car def)) - (symbolp (cdr def))) - (define-key keymap (which-key--pseudo-key key) `(which-key ,def))))) - -(when which-key-enable-extended-define-key - (advice-add #'define-key :before #'which-key--process-define-key-args)) - ;;; Functions for computing window sizes (defun which-key--text-width-to-total (text-width) @@ -1493,20 +1461,6 @@ local bindings coming first. Within these categories order using (string-match-p binding-regexp (cdr key-binding))))))) -(defun which-key--get-pseudo-binding (key-binding &optional prefix) - (let* ((key (kbd (car key-binding))) - (pseudo-binding (key-binding (which-key--pseudo-key key prefix)))) - (when pseudo-binding - (let* ((command-replacement (cadr pseudo-binding)) - (pseudo-desc (car command-replacement)) - (pseudo-def (cdr command-replacement))) - (when (and (stringp pseudo-desc) - (or (null pseudo-def) - ;; don't verify keymaps - (keymapp pseudo-def) - (eq pseudo-def (key-binding key)))) - (cons (car key-binding) pseudo-desc)))))) - (defsubst which-key--replace-in-binding (key-binding repl) (cond ((or (not (consp repl)) (null (cdr repl))) key-binding) @@ -1542,26 +1496,23 @@ local bindings coming first. Within these categories order using "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." - (let* ((pseudo-binding (which-key--get-pseudo-binding key-binding prefix))) - (if pseudo-binding - pseudo-binding - (let* ((replacer (if which-key-allow-multiple-replacements - #'which-key--replace-in-repl-list-many - #'which-key--replace-in-repl-list-once))) - (pcase - (apply replacer - (list key-binding - (cdr-safe (assq major-mode which-key-replacement-alist)))) - (`(replaced . ,repl) - (if which-key-allow-multiple-replacements - (pcase (apply replacer (list repl which-key-replacement-alist)) - (`(replaced . ,repl) repl) - ('() repl)) - repl)) - ('() - (pcase (apply replacer (list key-binding which-key-replacement-alist)) + (let* ((replacer (if which-key-allow-multiple-replacements + #'which-key--replace-in-repl-list-many + #'which-key--replace-in-repl-list-once))) + (pcase + (apply replacer + (list key-binding + (cdr-safe (assq major-mode which-key-replacement-alist)))) + (`(replaced . ,repl) + (if which-key-allow-multiple-replacements + (pcase (apply replacer (list repl which-key-replacement-alist)) (`(replaced . ,repl) repl) - ('() key-binding)))))))) + ('() repl)) + repl)) + ('() + (pcase (apply replacer (list key-binding which-key-replacement-alist)) + (`(replaced . ,repl) repl) + ('() key-binding)))))) (defsubst which-key--current-key-list (&optional key-str) (append (listify-key-sequence (which-key--current-prefix)) @@ -1593,12 +1544,6 @@ which are strings. KEY is of the form produced by `key-binding'." (or (eq lookup (intern (cdr keydesc))) (and (keymapp lookup) (string= (cdr keydesc) "Prefix Command")))))) -(defun which-key--pseudo-key (key &optional prefix) - "Replace the last key in the sequence KEY by a special symbol -in order for which-key to allow looking up a description for the key." - (let ((seq (listify-key-sequence key))) - (vconcat (or prefix (butlast seq)) [which-key] (last seq)))) - (defun which-key--maybe-get-prefix-title (keys) "KEYS is a string produced by `key-description'. A title is possibly returned using From 8a558e6a794da76f689f8404f9e7e8d030cfb49c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 13:59:56 -0400 Subject: [PATCH 697/816] Update tests --- which-key-tests.el | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 1611d51cc04..17d5d0d4944 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -151,16 +151,14 @@ (should (equal (sort (which-key--get-keymap-bindings map) (lambda (a b) (string-lessp (car a) (car b)))) - '(("b" . "ignore") - ("c" . "c") - ("d" . "Prefix Command") - ("e" . "Prefix Command") + '(("c" . "c") + ("d" . "prefix") + ("e" . "prefix") ("f" . "{ - C-f")))) (should (equal - (sort (which-key--get-keymap-bindings map t) + (sort (which-key--get-keymap-bindings map nil nil nil t) (lambda (a b) (string-lessp (car a) (car b)))) - '(("b" . "ignore") - ("c" . "c") + '(("c" . "c") ("d d" . "dd") ("e e e" . "eee") ("f" . "{ - C-f")))))) From fffd3e5ebfbd5a38f1f78197452c13330762dc9a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 14:00:54 -0400 Subject: [PATCH 698/816] Fix default of which-key-replacement-alist --- which-key.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 5c2ca802f74..bb1cf01ba45 100644 --- a/which-key.el +++ b/which-key.el @@ -152,9 +152,7 @@ remapped given the currently active keymaps." (defcustom which-key-replacement-alist (delq nil - `(((nil . "Prefix Command") . (nil . "prefix")) - ((nil . "\\`\\?\\?\\'") . (nil . "lambda")) - ((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg")) + `(((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg")) ,@(unless which-key-dont-use-unicode '((("") . ("←")) (("") . ("→")))) From 4e592ed7b913aecd13ce8d4e316ca4f8e2f34d7c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 14:09:18 -0400 Subject: [PATCH 699/816] Fix type usage and arglists for new functions --- which-key.el | 62 ++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/which-key.el b/which-key.el index bb1cf01ba45..d6baa70b537 100644 --- a/which-key.el +++ b/which-key.el @@ -1399,8 +1399,7 @@ Uses `string-lessp' after applying lowercase." (string-lessp (downcase (cdr acons)) (downcase (cdr bcons)))) (defsubst which-key--group-p (description) - (or (string-match-p "^\\(group:\\|Prefix\\)" description) - (keymapp (intern description)))) + (keymapp (intern description))) (defun which-key-prefix-then-key-order (acons bcons) "Order first by whether A and/or B is a prefix with no prefix @@ -1739,19 +1738,19 @@ alists. Returns a list (key separator description)." Requires `which-key-compute-remaps' to be non-nil" (let (remap) (if (and which-key-compute-remaps - (setq remap (command-remapping (intern binding)))) + (setq remap (command-remapping binding))) (copy-sequence (symbol-name remap)) (copy-sequence (symbol-name binding))))) (defun which-key--get-keymap-bindings-1 - "Helper function for `which-key--get-keymap-bindings'" - (keymap start &optional prefix all ignore-commands) + (keymap start &optional prefix filter all ignore-commands) + "See `which-key--get-keymap-bindings'." (let ((bindings start) (prefix-map (if prefix (lookup-key keymap prefix) keymap))) (when (keymapp prefix-map) (map-keymap (lambda (ev def) - (let* ((key (append prefix (list ev))) + (let* ((key (vconcat prefix (list ev))) (key-desc (key-description key))) (cond ((assoc key-desc bindings)) @@ -1768,25 +1767,29 @@ Requires `which-key-compute-remaps' to be non-nil" (and (numberp ev) (= ev 27)))) (setq bindings (which-key--get-keymap-bindings-1 - keymap bindings key all ignore-commands))) + keymap bindings key nil all ignore-commands))) (def - (push - (cons key-desc - (cond - ((keymapp def) "+prefix") - ((symbolp def) (which-key--compute-binding def)) - ((eq 'lambda (car-safe def)) "lambda") - ((eq 'menu-item (car-safe def)) - (keymap--menu-item-binding def)) - ((stringp def) def) - ((vectorp def) (key-description def)) - ((consp def) (car def)) - (t "unknown"))) - bindings))))) + (let ((binding + (cons key-desc + (cond + ((keymapp def) "prefix") + ((symbolp def) (which-key--compute-binding def)) + ((eq 'lambda (car-safe def)) "lambda") + ((eq 'menu-item (car-safe def)) + (keymap--menu-item-binding def)) + ((stringp def) def) + ((vectorp def) (key-description def)) + ((consp def) (car def)) + (t "unknown"))))) + (when (or (null filter) + (and (functionp filter) + (funcall filter binding))) + (push binding bindings))))))) prefix-map)) bindings)) -(defun which-key--get-keymap-bindings (keymap &optional prefix start all evil) +(defun which-key--get-keymap-bindings + (keymap &optional start prefix filter all evil) "Retrieve top-level bindings from KEYMAP. PREFIX limits bindings to those starting with this key sequence. START is a list of existing bindings to add to. If ALL @@ -1799,16 +1802,18 @@ EVIL is non-nil, extract active evil bidings." (lookup-key keymap (kbd (format "<%s-state>" evil-state)))))) (when (keymapp evil-map) (setq bindings (which-key--get-keymap-bindings-1 - evil-map bindings prefix all ignore))) - (which-key--get-keymap-bindings-1 keymap bindings prefix all ignore))) + evil-map bindings prefix filter all ignore))) + (which-key--get-keymap-bindings-1 + keymap bindings prefix filter all ignore))) -(defun which-key--get-current-bindings (&optional prefix) +(defun which-key--get-current-bindings (&optional prefix filter) "Generate a list of current active bindings." (let (bindings) (dolist (map (current-active-maps t) bindings) (when (cdr map) (setq bindings - (which-key--get-keymap-bindings map prefix bindings)))))) + (which-key--get-keymap-bindings + map bindings prefix filter)))))) (defun which-key--get-bindings (&optional prefix keymap filter recursive) "Collect key bindings. @@ -1818,13 +1823,12 @@ is a function to use to filter the bindings. If RECURSIVE is non-nil, then bindings are collected recursively for all prefixes." (let* ((unformatted (cond ((keymapp keymap) - (which-key--get-keymap-bindings keymap recursive)) + (which-key--get-keymap-bindings + keymap prefix filter recursive)) (keymap (error "%s is not a keymap" keymap)) (t - (which-key--get-current-bindings prefix))))) - (when filter - (setq unformatted (cl-remove-if-not filter unformatted))) + (which-key--get-current-bindings prefix filter))))) (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) From 8d6d81da4c7be4c929e908b1737dfd6d4c2aaa63 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 14:35:04 -0400 Subject: [PATCH 700/816] Expand get-keymap-bindings test --- Cask | 1 + which-key-tests.el | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Cask b/Cask index 60fa07cbdf2..6ff7bbe21da 100644 --- a/Cask +++ b/Cask @@ -4,4 +4,5 @@ (package-file "which-key.el") (development + (depends-on "evil") (depends-on "ert")) diff --git a/which-key-tests.el b/which-key-tests.el index 17d5d0d4944..eeedb557370 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -141,24 +141,41 @@ (ert-deftest which-key-test--get-keymap-bindings () (let ((map (make-sparse-keymap)) + (evil-local-mode t) + (evil-state 'normal) which-key-replacement-alist) + (require 'evil) (define-key map [which-key-a] '(which-key "blah")) (define-key map "b" 'ignore) (define-key map "c" "c") (define-key map "dd" "dd") (define-key map "eee" "eee") (define-key map "f" [123 45 6]) + (define-key map (kbd "M-g g") "M-gg") + (evil-define-key* 'normal map (kbd "C-h") "C-h-normal") + (evil-define-key* 'insert map (kbd "C-h") "C-h-insert") (should (equal (sort (which-key--get-keymap-bindings map) (lambda (a b) (string-lessp (car a) (car b)))) - '(("c" . "c") + '(("M-g" . "prefix") + ("c" . "c") + ("d" . "prefix") + ("e" . "prefix") + ("f" . "{ - C-f")))) + (should (equal + (sort (which-key--get-keymap-bindings map nil nil nil nil t) + (lambda (a b) (string-lessp (car a) (car b)))) + '(("C-h" . "C-h-normal") + ("M-g" . "prefix") + ("c" . "c") ("d" . "prefix") ("e" . "prefix") ("f" . "{ - C-f")))) (should (equal (sort (which-key--get-keymap-bindings map nil nil nil t) (lambda (a b) (string-lessp (car a) (car b)))) - '(("c" . "c") + '(("M-g g" . "M-gg") + ("c" . "c") ("d d" . "dd") ("e e e" . "eee") ("f" . "{ - C-f")))))) From 465d2fb2e4540257ad515f37f2cb4e419b286f8c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 14:46:51 -0400 Subject: [PATCH 701/816] Fix add-keymap-based-bindings and associated test --- which-key-tests.el | 23 ++++++++++------------- which-key.el | 12 +++++++----- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index eeedb557370..04617377999 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -29,20 +29,17 @@ (ert-deftest which-key-test--keymap-based-bindings () (let ((map (make-sparse-keymap)) - (emacs-lisp-mode-map (copy-keymap emacs-lisp-mode-map))) - (emacs-lisp-mode) - (define-key map "x" 'ignore) - (define-key emacs-lisp-mode-map "\C-c\C-a" 'complete) - (define-key emacs-lisp-mode-map "\C-c\C-b" map) - (which-key-add-keymap-based-replacements emacs-lisp-mode-map - "C-c C-a" '("mycomplete" . complete) - "C-c C-b" "mymap") + (prefix-map (make-sparse-keymap))) + (define-key prefix-map "x" 'ignore) + (define-key map "\C-a" 'complete) + (define-key map "\C-b" prefix-map) + (which-key-add-keymap-based-replacements map + "C-a" '("mycomplete" . complete) + "C-b" "mymap") (should (equal - (which-key--maybe-replace '("C-c C-a" . "complete")) - '("C-c C-a" . "mycomplete"))) - (should (equal - (which-key--maybe-replace '("C-c C-b" . "")) - '("C-c C-b" . "mymap"))))) + (which-key--get-keymap-bindings map) + '(("C-a" . "mycomplete") + ("C-b" . "mymap")))))) (ert-deftest which-key-test--prefix-declaration () "Test `which-key-declare-prefixes' and diff --git a/which-key.el b/which-key.el index d6baa70b537..ec3f760159b 100644 --- a/which-key.el +++ b/which-key.el @@ -914,11 +914,13 @@ both have the same effect for the \"C-x C-w\" key binding, but the latter causes which-key to verify that the key sequence is actually bound to write-file before performing the replacement." (while key - (let ((string (if (stringp replacement) - replacement - (car-safe replacement))) - (command (cdr-safe replacement))) - (define-key keymap (kbd key) (cons string command))) + (cond ((consp replacement) + (define-key keymap (kbd key) replacement)) + ((stringp replacement) + (define-key keymap (kbd key) (cons replacement + (lookup-key keymap (kbd key))))) + (t + (user-error "replacement is neither a cons cell or a string"))) (setq key (pop more) replacement (pop more)))) (put 'which-key-add-keymap-based-replacements 'lisp-indent-function 'defun) From e42d946cd98f914a0e9c31fe6cb677305a9f2d30 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 14:55:05 -0400 Subject: [PATCH 702/816] Fix prefix sorting --- which-key-tests.el | 2 +- which-key.el | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 04617377999..705099b0603 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -189,7 +189,7 @@ ("A" . "Z") ("b" . "y") ("B" . "Y") - ("p" . "Prefix") + ("p" . "prefix") ("SPC" . "x") ("C-a" . "w")))) (let ((which-key-sort-uppercase-first t)) diff --git a/which-key.el b/which-key.el index ec3f760159b..55e65b884f3 100644 --- a/which-key.el +++ b/which-key.el @@ -1401,7 +1401,8 @@ Uses `string-lessp' after applying lowercase." (string-lessp (downcase (cdr acons)) (downcase (cdr bcons)))) (defsubst which-key--group-p (description) - (keymapp (intern description))) + (or (equal description "prefix") + (keymapp (intern description)))) (defun which-key-prefix-then-key-order (acons bcons) "Order first by whether A and/or B is a prefix with no prefix From 244483334044ebd87a10608eae124111c8837823 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 15:07:36 -0400 Subject: [PATCH 703/816] Fix menu-item bidning retrieval --- which-key.el | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 55e65b884f3..ebed572255a 100644 --- a/which-key.el +++ b/which-key.el @@ -1745,6 +1745,14 @@ Requires `which-key-compute-remaps' to be non-nil" (copy-sequence (symbol-name remap)) (copy-sequence (symbol-name binding))))) +(defun which-key--get-menu-item-binding (def) + "Retrieve binding for menu-item" + ;; see `keymap--menu-item-binding' + (let* ((binding (nth 2 def)) + (plist (nthcdr 3 def)) + (filter (plist-get plist :filter))) + (if filter (funcall filter binding) binding))) + (defun which-key--get-keymap-bindings-1 (keymap start &optional prefix filter all ignore-commands) "See `which-key--get-keymap-bindings'." @@ -1772,14 +1780,17 @@ Requires `which-key-compute-remaps' to be non-nil" (which-key--get-keymap-bindings-1 keymap bindings key nil all ignore-commands))) (def - (let ((binding + (let* ((def (if (eq 'menu-item (car-safe def)) + (which-key--get-menu-item-binding def) + def)) + (binding (cons key-desc (cond ((keymapp def) "prefix") ((symbolp def) (which-key--compute-binding def)) ((eq 'lambda (car-safe def)) "lambda") ((eq 'menu-item (car-safe def)) - (keymap--menu-item-binding def)) + (which-key--get-menu-item-binding def)) ((stringp def) def) ((vectorp def) (key-description def)) ((consp def) (car def)) From d6b56f3e0c0295578db9b88330f1dee38156855e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 15:44:07 -0400 Subject: [PATCH 704/816] Fix detection of named prefix bindings --- which-key.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index ebed572255a..831e7d51a92 100644 --- a/which-key.el +++ b/which-key.el @@ -1401,7 +1401,9 @@ Uses `string-lessp' after applying lowercase." (string-lessp (downcase (cdr acons)) (downcase (cdr bcons)))) (defsubst which-key--group-p (description) - (or (equal description "prefix") + (or (string-equal description "prefix") + (and (length> description 6) + (string-equal (substring description 0 6) "group:")) (keymapp (intern description)))) (defun which-key-prefix-then-key-order (acons bcons) @@ -1789,11 +1791,11 @@ Requires `which-key-compute-remaps' to be non-nil" ((keymapp def) "prefix") ((symbolp def) (which-key--compute-binding def)) ((eq 'lambda (car-safe def)) "lambda") - ((eq 'menu-item (car-safe def)) - (which-key--get-menu-item-binding def)) ((stringp def) def) ((vectorp def) (key-description def)) - ((consp def) (car def)) + ((consp def) (concat (when (keymapp (cdr-safe def)) + "group:") + (car def))) (t "unknown"))))) (when (or (null filter) (and (functionp filter) From 8b707ef6c51808e944f8056b546ceb168a445079 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 15:51:22 -0400 Subject: [PATCH 705/816] Make enable-extended-define-key obsolete --- which-key.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/which-key.el b/which-key.el index c133bebdab9..2c4004f950d 100644 --- a/which-key.el +++ b/which-key.el @@ -522,6 +522,11 @@ it." :group 'which-key :type 'boolean) +(make-obsolete-variable + 'which-key-enable-extended-define-key + "which-key-enable-extended-define-key is obsolete and has no effect." + "2021-06-21") + ;; Hooks (defcustom which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized." From 300c098be55d78d5d94da59da0280a8a56cc3792 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 15:57:40 -0400 Subject: [PATCH 706/816] Update README --- README.org | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.org b/README.org index 3064466a558..2280f704acf 100644 --- a/README.org +++ b/README.org @@ -3,6 +3,11 @@ [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] ** Recent Changes +*** 2021-06-21: Add support for menu-item bindings + =which-key= will now detect and compute the result of =menu-item= + bindings. As a consequence of reworking the internals, + =which-key-enable-extended-define-key= is now obsolete (the associated + behavior is supported by default). *** 2020-08-28: Added =which-key-add-keymap-based-replacements= This function provides an alternative interface allowing replacements to be @@ -34,6 +39,7 @@ ** Table of Contents :TOC_3: - [[#which-key][which-key]] - [[#recent-changes][Recent Changes]] + - [[#2021-06-21-add-support-for-menu-item-bindings][2021-06-21: Add support for menu-item bindings]] - [[#2020-08-28-added-which-key-add-keymap-based-replacements][2020-08-28: Added =which-key-add-keymap-based-replacements=]] - [[#2019-08-01-added-which-key-show-early-on-c-h][2019-08-01: Added =which-key-show-early-on-C-h=]] - [[#2017-12-13-added-which-key-enable-extended-define-key][2017-12-13: Added =which-key-enable-extended-define-key=]] @@ -275,30 +281,26 @@ "f" '("foo" . long-command-name-foo) ;; or ;; "f" "foo" (see the docstring) - "b" '("bar-prefix") + "b" '("bar-prefix" . (keymap)) ;; or ;; "b" "bar-prefix" (see the docstring) ) #+END_SRC uses =define-key= to add two bindings and tells which-key to use the string - "foo" in place of "command-foo" and the string "bar-prefix" for - some-prefix-map. Note that =which-key-add-keymap-based-replacements= will - not bind a command, so =define-key= must still be used. - - Alternatively, you may set =which-key-enable-extended-define-key= to =t= - before loading which-key and accomplish the same effect using only - =define-key= as follows. + "foo" in place of "command-foo" and the string "bar-prefix" for an empty + prefix map. =which-key-add-keymap-based-replacements= uses =define-key= to + bind (or rebind) the command, and you may also use =define-key= directly as + follows. #+BEGIN_SRC emacs-lisp (define-key some-map "f" '("foo" . command-foo)) - (define-key some-map "b" '("bar-prefix")) + (define-key some-map "b" '("bar-prefix" . (keymap))) #+END_SRC - The option =which-key-enable-extended-define-key= advises =define-key= to - allow which-key to use the =(NAME . COMMAND)= notation to simultaneously - define a command and give that command a name using =define-key=. Since - many key-binding utilities use =define-key= internally, this functionality + Here =define-key= uses the natively supported =(NAME . COMMAND)= notation + to simultaneously define a command and give that command a name. Since many + key-binding utilities use =define-key= internally, this functionality should be available with your favorite method of defining keys as well. There are other methods of telling which-key to replace command names, From 7d344ce9661549f9b516ac4c308ec7b8d53aaf51 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 16:02:45 -0400 Subject: [PATCH 707/816] Fix test --- which-key-tests.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key-tests.el b/which-key-tests.el index 705099b0603..e2cd0ef6e3d 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -39,7 +39,7 @@ (should (equal (which-key--get-keymap-bindings map) '(("C-a" . "mycomplete") - ("C-b" . "mymap")))))) + ("C-b" . "group:mymap")))))) (ert-deftest which-key-test--prefix-declaration () "Test `which-key-declare-prefixes' and From 063b8670305527f027c4ddeb7861f4ad7f6ca2a5 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 22:15:34 -0400 Subject: [PATCH 708/816] Fix github action --- .github/workflows/test.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3ae62889444..c2f1491cbb9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,12 +13,11 @@ jobs: strategy: matrix: emacs_version: - - 25.1 - - 25.2 - - 25.3 - 26.1 - 26.2 - 26.3 + - 27.1 + - 27.2 - snapshot steps: - uses: purcell/setup-emacs@master @@ -26,5 +25,11 @@ jobs: version: ${{ matrix.emacs_version }} - uses: actions/checkout@v2 + - name: Install cask + run: | + git clone https://github.com/cask/cask ~/.cask + echo "${HOME}/.cask/bin" >> $GITHUB_PATH + - name: Install dependencies + run: 'cask install' - name: Run tests run: 'emacs -Q -batch -L . -l which-key-tests.el -f ert-run-tests-batch-and-exit' From d621634eb606ab68b718f1eeda71bff2763733ca Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 22:25:15 -0400 Subject: [PATCH 709/816] Try with cask again --- .github/workflows/test.yml | 10 +++++----- Cask | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c2f1491cbb9..5b3078c3266 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -25,11 +25,11 @@ jobs: version: ${{ matrix.emacs_version }} - uses: actions/checkout@v2 - - name: Install cask - run: | - git clone https://github.com/cask/cask ~/.cask - echo "${HOME}/.cask/bin" >> $GITHUB_PATH + - name: Install Cask + uses: conao3/setup-cask@master + with: + version: 'snapshot' - name: Install dependencies run: 'cask install' - name: Run tests - run: 'emacs -Q -batch -L . -l which-key-tests.el -f ert-run-tests-batch-and-exit' + run: 'cask exec emacs -Q -batch -L . -l which-key-tests.el -f ert-run-tests-batch-and-exit' diff --git a/Cask b/Cask index 6ff7bbe21da..31a9ca10f9d 100644 --- a/Cask +++ b/Cask @@ -4,5 +4,4 @@ (package-file "which-key.el") (development - (depends-on "evil") - (depends-on "ert")) + (depends-on "evil")) From 3f76f5178d28e3b45c236ca83c37613851598abd Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 22:32:23 -0400 Subject: [PATCH 710/816] Fix which-key--group-p length> is a new function maybe --- which-key.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 2c4004f950d..13c440d68ba 100644 --- a/which-key.el +++ b/which-key.el @@ -1406,8 +1406,7 @@ Uses `string-lessp' after applying lowercase." (defsubst which-key--group-p (description) (or (string-equal description "prefix") - (and (length> description 6) - (string-equal (substring description 0 6) "group:")) + (string-match-p "^group:" description) (keymapp (intern description)))) (defun which-key-prefix-then-key-order (acons bcons) From 11471fb73804fbe6b2bc19f2a1133f4a46853e20 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 22:40:54 -0400 Subject: [PATCH 711/816] Add install python step to github action --- .github/workflows/test.yml | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5b3078c3266..f764d3202fd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,16 +20,21 @@ jobs: - 27.2 - snapshot steps: - - uses: purcell/setup-emacs@master - with: - version: ${{ matrix.emacs_version }} + - name: Install Python + uses: actions/setup-python@v2 + with: + python-version: '3.6' + architecture: 'x64' + - uses: purcell/setup-emacs@master + with: + version: ${{ matrix.emacs_version }} - - uses: actions/checkout@v2 - - name: Install Cask - uses: conao3/setup-cask@master - with: - version: 'snapshot' - - name: Install dependencies - run: 'cask install' - - name: Run tests - run: 'cask exec emacs -Q -batch -L . -l which-key-tests.el -f ert-run-tests-batch-and-exit' + - uses: actions/checkout@v2 + - name: Install Cask + uses: conao3/setup-cask@master + with: + version: 'snapshot' + - name: Install dependencies + run: 'cask install' + - name: Run tests + run: 'cask exec emacs -Q -batch -L . -l which-key-tests.el -f ert-run-tests-batch-and-exit' From 6ae80f50af838ff2bcf6448a55366fb37fb20682 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 22:55:33 -0400 Subject: [PATCH 712/816] Try without cask --- .github/workflows/test.yml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f764d3202fd..87331b72025 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,21 +20,11 @@ jobs: - 27.2 - snapshot steps: - - name: Install Python - uses: actions/setup-python@v2 - with: - python-version: '3.6' - architecture: 'x64' - uses: purcell/setup-emacs@master with: version: ${{ matrix.emacs_version }} - - uses: actions/checkout@v2 - - name: Install Cask - uses: conao3/setup-cask@master - with: - version: 'snapshot' - name: Install dependencies - run: 'cask install' + run: 'git clone https://github.com/emacs-evil/evil' - name: Run tests - run: 'cask exec emacs -Q -batch -L . -l which-key-tests.el -f ert-run-tests-batch-and-exit' + run: 'emacs -Q -batch -L . -L ./evil -l which-key-tests.el -f ert-run-tests-batch-and-exit' From 7cfbf8cee74ec92bf1a4177323bead288a8dff16 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 23:03:20 -0400 Subject: [PATCH 713/816] Turn off fail-fast in github action --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 87331b72025..6b4d511a8af 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,6 +11,7 @@ jobs: build: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: emacs_version: - 26.1 From d8445fd80e81b6ad2acdb5be2e36740e6d4839d7 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 23:10:22 -0400 Subject: [PATCH 714/816] Try again to fix tests --- which-key-tests.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key-tests.el b/which-key-tests.el index e2cd0ef6e3d..40566e73aa4 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -26,6 +26,7 @@ (require 'which-key) (require 'ert) +(require 'evil) (ert-deftest which-key-test--keymap-based-bindings () (let ((map (make-sparse-keymap)) @@ -141,7 +142,6 @@ (evil-local-mode t) (evil-state 'normal) which-key-replacement-alist) - (require 'evil) (define-key map [which-key-a] '(which-key "blah")) (define-key map "b" 'ignore) (define-key map "c" "c") From 28f386cc4af8c0fe21269bb587a5bb229ba3834e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 21 Jun 2021 23:34:18 -0400 Subject: [PATCH 715/816] Fix key sort order functions We now always get the full key description (prefix + binding) --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 13c440d68ba..2d81d2e2739 100644 --- a/which-key.el +++ b/which-key.el @@ -1343,7 +1343,9 @@ width) in lines and characters respectively." "Sorting function used for `which-key-key-order' and `which-key-key-order-alpha'." (save-match-data - (let* ((rngrgxp "^\\([^ ]+\\) \\.\\. [^ ]+") + (let* ((a (which-key--extract-key a)) + (b (which-key--extract-key b)) + (rngrgxp "^\\([^ ]+\\) \\.\\. [^ ]+") (a (if (string-match rngrgxp a) (match-string 1 a) a)) (b (if (string-match rngrgxp b) (match-string 1 b) b)) (aem? (string-equal a "")) From 6290c9e21710c3ebbcdec795c916994682e07c94 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 22 Jun 2021 07:37:04 -0400 Subject: [PATCH 716/816] Improve which-key-add-keymap-based-bindings Add a test --- which-key-tests.el | 7 +++++-- which-key.el | 11 +++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/which-key-tests.el b/which-key-tests.el index 40566e73aa4..877f0091964 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -36,11 +36,14 @@ (define-key map "\C-b" prefix-map) (which-key-add-keymap-based-replacements map "C-a" '("mycomplete" . complete) - "C-b" "mymap") + "C-b" "mymap" + "C-c" "mymap2") + (define-key map "\C-ca" 'foo) (should (equal (which-key--get-keymap-bindings map) '(("C-a" . "mycomplete") - ("C-b" . "group:mymap")))))) + ("C-b" . "group:mymap") + ("C-c" . "group:mymap2")))))) (ert-deftest which-key-test--prefix-declaration () "Test `which-key-declare-prefixes' and diff --git a/which-key.el b/which-key.el index 2d81d2e2739..2bfbb3975f3 100644 --- a/which-key.el +++ b/which-key.el @@ -922,8 +922,15 @@ actually bound to write-file before performing the replacement." (cond ((consp replacement) (define-key keymap (kbd key) replacement)) ((stringp replacement) - (define-key keymap (kbd key) (cons replacement - (lookup-key keymap (kbd key))))) + (let ((binding (lookup-key keymap (kbd key)))) + (if (or (null binding) + (numberp binding)) + ;; using a keymap in case someone intends to make this a + ;; prefix. If they want to bind something else, they will just + ;; end up overriding the prefix map + (define-key keymap (kbd key) + (cons replacement (make-sparse-keymap))) + (define-key keymap (kbd key) (cons replacement binding))))) (t (user-error "replacement is neither a cons cell or a string"))) (setq key (pop more) From b83c0deca652ee3d42c1501dd09416b2505304b7 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 22 Jun 2021 11:22:32 -0400 Subject: [PATCH 717/816] Clean up which-key--maybe-replace --- which-key.el | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/which-key.el b/which-key.el index 2bfbb3975f3..9a2883dbaa6 100644 --- a/which-key.el +++ b/which-key.el @@ -1506,7 +1506,7 @@ local bindings coming first. Within these categories order using (setq key-binding (which-key--replace-in-binding key-binding repl)))) (when found `(replaced . ,key-binding)))) -(defun which-key--maybe-replace (key-binding &optional prefix) +(defun which-key--maybe-replace (key-binding) "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of which are strings. KEY is of the form produced by `key-binding'." @@ -1721,17 +1721,13 @@ alists. Returns a list (key separator description)." (local-map (current-local-map)) new-list) (dolist (key-binding unformatted) - (let* ((key (car key-binding)) + (let* ((keys (car key-binding)) (orig-desc (cdr key-binding)) (group (which-key--group-p orig-desc)) - ;; At top-level prefix is nil - (keys (if prefix - (concat (key-description prefix) " " key) - key)) (local (eq (which-key--safe-lookup-key local-map (kbd keys)) (intern orig-desc))) (hl-face (which-key--highlight-face orig-desc)) - (key-binding (which-key--maybe-replace (cons keys orig-desc) prefix)) + (key-binding (which-key--maybe-replace key-binding)) (final-desc (which-key--propertize-description (cdr key-binding) group local hl-face orig-desc))) (when final-desc From eb5a2e3de16dca7286a323bad62b55d3c08349e0 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 22 Jun 2021 11:26:11 -0400 Subject: [PATCH 718/816] Clean up some docstrings --- which-key.el | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index 9a2883dbaa6..3a0ce9753fe 100644 --- a/which-key.el +++ b/which-key.el @@ -254,7 +254,7 @@ disabled by default. Try this to see the effect. :type 'string) (defcustom which-key-show-prefix 'echo - "Whether to and where to display the current prefix sequence. + "Whether to and where to display the current prefix sequence Possible choices are echo for echo area (the default), left, top and nil. Nil turns the feature off." :group 'which-key @@ -266,7 +266,7 @@ and nil. Nil turns the feature off." (const :tag "Hide" nil))) (defcustom which-key-popup-type 'side-window - "Supported types are minibuffer, side-window, frame, and custom." + "Supported types are minibuffer, side-window, frame, and custom" :group 'which-key :type '(radio (const :tag "Show in minibuffer" minibuffer) (const :tag "Show in side window" side-window) @@ -274,12 +274,12 @@ and nil. Nil turns the feature off." (const :tag "Use your custom display functions" custom))) (defcustom which-key-min-display-lines 1 - "The minimum number of horizontal lines to display in the which-key buffer." + "Minimum number of horizontal lines to display in the which-key buffer" :group 'which-key :type 'integer) (defcustom which-key-max-display-columns nil - "The maximum number of columns to display in the which-key buffer. + "Maximum number of columns to display in the which-key buffer nil means don't impose a maximum." :group 'which-key :type '(choice integer (const :tag "Unbounded" nil))) @@ -304,25 +304,23 @@ location is tried." docstring of `display-buffer-in-side-window', ‘slot’ if non-nil, specifies the window slot where to display - BUFFER. A value of zero or nil means use the middle slot on - the specified side. A negative value means use a slot - preceding (that is, above or on the left of) the middle slot. - A positive value means use a slot following (that is, below or - on the right of) the middle slot. The default is zero." +BUFFER. A value of zero or nil means use the middle slot on the +specified side. A negative value means use a slot +preceding (that is, above or on the left of) the middle slot. A +positive value means use a slot following (that is, below or on +the right of) the middle slot. The default is zero." :group 'which-key :type 'integer) (defcustom which-key-side-window-max-width 0.333 - "Maximum width of which-key popup when type is side-window and -location is left or right. -This variable can also be a number between 0 and 1. In that case, it denotes -a percentage out of the frame's width." + "Maximum width of which-key popup when type is side-window +This variable can also be a number between 0 and 1. In that case, +it denotes a percentage out of the frame's width." :group 'which-key :type 'float) (defcustom which-key-side-window-max-height 0.25 - "Maximum height of which-key popup when type is side-window and -location is top or bottom. + "Maximum height of which-key popup when type is side-window This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's height." :group 'which-key From cd0c48cda2e7cc1d3bc93d3611e267a7d022de8a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 22 Jun 2021 11:36:27 -0400 Subject: [PATCH 719/816] Clarify usage of keymap replacements in docstrings and README --- README.org | 51 ++++++++++++++++++++++++++------------------------- which-key.el | 28 ++++++++++------------------ 2 files changed, 36 insertions(+), 43 deletions(-) diff --git a/README.org b/README.org index 2280f704acf..37c742edcce 100644 --- a/README.org +++ b/README.org @@ -271,37 +271,38 @@ **** Keymap-based replacement Using this method, which-key can display a custom string for a key definition in some keymap. There are two ways to define a keymap-based - replacement. The first is to use - =which-key-add-keymap-based-replacements=. The statement - - #+BEGIN_SRC emacs-lisp - (define-key some-map "f" 'long-command-name-foo) - (define-key some-map "b" some-prefix-map) - (which-key-add-keymap-based-replacements some-map - "f" '("foo" . long-command-name-foo) - ;; or - ;; "f" "foo" (see the docstring) - "b" '("bar-prefix" . (keymap)) - ;; or - ;; "b" "bar-prefix" (see the docstring) - ) - #+END_SRC - - uses =define-key= to add two bindings and tells which-key to use the string - "foo" in place of "command-foo" and the string "bar-prefix" for an empty - prefix map. =which-key-add-keymap-based-replacements= uses =define-key= to - bind (or rebind) the command, and you may also use =define-key= directly as - follows. + replacement. The preferred way is to use =define-key= (or a command that + uses =define-key= internally) with a cons cell as the definition. For + example, #+BEGIN_SRC emacs-lisp (define-key some-map "f" '("foo" . command-foo)) (define-key some-map "b" '("bar-prefix" . (keymap))) #+END_SRC - Here =define-key= uses the natively supported =(NAME . COMMAND)= notation - to simultaneously define a command and give that command a name. Since many - key-binding utilities use =define-key= internally, this functionality - should be available with your favorite method of defining keys as well. + binds =command-foo= to =f= in =some-map=, but also stores the string "foo" + which which-key will extract to use to describe this command. The second + example binds an empty keymap to =b= in =some-map= and uses "bar-prefix" to + describe it. These bindings are accepted by =define-key= natively (i.e., + with or without which-key being loaded). Since many key-binding utilities + use =define-key= internally, this functionality should be available with + your favorite method of defining keys as well. + + The second method is to use =which-key-add-keymap-based-replacements=. The + statement + + #+BEGIN_SRC emacs-lisp + (define-key some-map "f" 'long-command-name-foo) + (define-key some-map "b" some-prefix-map) + (which-key-add-keymap-based-replacements some-map + "f" '("foo" . long-command-name-foo) + "b" '("bar-prefix" . (keymap))) + #+END_SRC + + uses =define-key= to add two bindings and tells which-key to use the string + "foo" in place of "command-foo" and the string "bar-prefix" for an empty + prefix map. =which-key-add-keymap-based-replacements= just uses + =define-key= to bind (or rebind) the command. There are other methods of telling which-key to replace command names, which are described next. The keymap-based replacements should be the most diff --git a/which-key.el b/which-key.el index 3a0ce9753fe..8598fa666e1 100644 --- a/which-key.el +++ b/which-key.el @@ -895,27 +895,19 @@ but more functional." ;;;###autoload (defun which-key-add-keymap-based-replacements (keymap key replacement &rest more) "Replace the description of KEY using REPLACEMENT in KEYMAP. -KEY should take a format suitable for use in -`kbd'. REPLACEMENT is the string to use to describe the -command associated with KEY in the KEYMAP. You may also use a -cons cell of the form \(STRING . COMMAND\) for each REPLACEMENT, -where STRING is the replacement string and COMMAND is a symbol -corresponding to the intended command to be replaced. In the -latter case, which-key will verify the intended command before -performing the replacement. COMMAND should be nil if the binding -corresponds to a key prefix. For example, +KEY should take a format suitable for use in `kbd'. REPLACEMENT +should be a cons cell of the form \(STRING . COMMAND\) for each +REPLACEMENT, where STRING is the replacement string and COMMAND +is a symbol corresponding to the intended command to be +replaced. COMMAND can be nil if the binding corresponds to a key +prefix. An example is \(which-key-add-keymap-based-replacements global-map - \"C-x w\" \"Save as\"\) + \"C-x w\" '\(\"Save as\" . write-file\)\). -and - -\(which-key-add-keymap-based-replacements global-map - \"C-x w\" '\(\"Save as\" . write-file\)\) - -both have the same effect for the \"C-x C-w\" key binding, but -the latter causes which-key to verify that the key sequence is -actually bound to write-file before performing the replacement." +For backwards compatibility, REPLACEMENT can also be a string, +but the above format is preferred, and the option to use a string +for REPLACEMENT will eventually be removed." (while key (cond ((consp replacement) (define-key keymap (kbd key) replacement)) From 4c27fc0c565cdda58270dae4024ad03a0017de43 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 22 Jun 2021 13:20:40 -0400 Subject: [PATCH 720/816] Improve which-key-add-keymap-based-replacements. Also, teach which-key--safe-lookup-key to handle numeric results. --- which-key.el | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index 8598fa666e1..67b185f2c24 100644 --- a/which-key.el +++ b/which-key.el @@ -909,20 +909,16 @@ For backwards compatibility, REPLACEMENT can also be a string, but the above format is preferred, and the option to use a string for REPLACEMENT will eventually be removed." (while key - (cond ((consp replacement) - (define-key keymap (kbd key) replacement)) - ((stringp replacement) - (let ((binding (lookup-key keymap (kbd key)))) - (if (or (null binding) - (numberp binding)) - ;; using a keymap in case someone intends to make this a - ;; prefix. If they want to bind something else, they will just - ;; end up overriding the prefix map - (define-key keymap (kbd key) - (cons replacement (make-sparse-keymap))) - (define-key keymap (kbd key) (cons replacement binding))))) - (t - (user-error "replacement is neither a cons cell or a string"))) + (let ((def + (cond + ((consp replacement) replacement) + ((stringp replacement) + (cons replacement + (or (which-key--safe-lookup-key keymap (kbd key)) + (make-sparse-keymap)))) + (t + (user-error "replacement is neither a cons cell or a string"))))) + (define-key keymap (kbd key) def)) (setq key (pop more) replacement (pop more)))) (put 'which-key-add-keymap-based-replacements 'lisp-indent-function 'defun) @@ -1445,8 +1441,13 @@ local bindings coming first. Within these categories order using (if (stringp maybe-string) (string-width maybe-string) 0)) (defsubst which-key--safe-lookup-key (keymap key) - "Version of `lookup-key' that allows KEYMAP to be nil. KEY is not checked." - (when (keymapp keymap) (lookup-key keymap key))) + "Version of `lookup-key' that allows KEYMAP to be nil. +Also convert numeric results of `lookup-key' to nil. KEY is not +checked." + (when (keymapp keymap) + (let ((result (lookup-key keymap key))) + (when (and result (not (numberp result))) + result)))) (defsubst which-key--butlast-string (str) (mapconcat #'identity (butlast (split-string str)) " ")) From 7abe54fa1d4aa714d9414bc6877ef2124ce126fe Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 29 Jun 2021 22:35:58 -0400 Subject: [PATCH 721/816] Handle closure definition type Fixes #311 --- which-key.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 67b185f2c24..1213d14a833 100644 --- a/which-key.el +++ b/which-key.el @@ -1790,11 +1790,15 @@ Requires `which-key-compute-remaps' to be non-nil" ((keymapp def) "prefix") ((symbolp def) (which-key--compute-binding def)) ((eq 'lambda (car-safe def)) "lambda") + ((eq 'closure (car-safe def)) "closure") ((stringp def) def) ((vectorp def) (key-description def)) - ((consp def) (concat (when (keymapp (cdr-safe def)) - "group:") - (car def))) + ((and (consp def) + ;; looking for (STRING . DEFN) + (stringp (car def))) + (concat (when (keymapp (cdr-safe def)) + "group:") + (car def))) (t "unknown"))))) (when (or (null filter) (and (functionp filter) From 27d9fec33abb989b030f7677ccf5f799287d6472 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 30 Jun 2021 08:17:03 -0400 Subject: [PATCH 722/816] Fix compiler warnings Fixes #312 --- which-key.el | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 1213d14a833..ff0db279ed7 100644 --- a/which-key.el +++ b/which-key.el @@ -717,9 +717,20 @@ update.") (goto-char (point-max)) (insert "\n" fmt-msg "\n"))))) +(defsubst which-key--safe-lookup-key (keymap key) + "Version of `lookup-key' that allows KEYMAP to be nil. +Also convert numeric results of `lookup-key' to nil. KEY is not +checked." + (when (keymapp keymap) + (let ((result (lookup-key keymap key))) + (when (and result (not (numberp result))) + result)))) + ;;; Third-party library support ;;;; Evil +(defvar evil-state nil) + (defcustom which-key-allow-evil-operators (boundp 'evil-this-operator) "Allow popup to show for evil operators. The popup is normally inhibited in the middle of commands, but @@ -1440,15 +1451,6 @@ local bindings coming first. Within these categories order using "If MAYBE-STRING is a string use `which-key--string-width' o/w return 0." (if (stringp maybe-string) (string-width maybe-string) 0)) -(defsubst which-key--safe-lookup-key (keymap key) - "Version of `lookup-key' that allows KEYMAP to be nil. -Also convert numeric results of `lookup-key' to nil. KEY is not -checked." - (when (keymapp keymap) - (let ((result (lookup-key keymap key))) - (when (and result (not (numberp result))) - result)))) - (defsubst which-key--butlast-string (str) (mapconcat #'identity (butlast (split-string str)) " ")) @@ -1702,7 +1704,7 @@ return the docstring." (t (format "%s %s" current docstring))))) -(defun which-key--format-and-replace (unformatted &optional prefix preserve-full-key) +(defun which-key--format-and-replace (unformatted &optional preserve-full-key) "Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." @@ -1851,7 +1853,7 @@ non-nil, then bindings are collected recursively for all prefixes." (when which-key-sort-order (setq unformatted (sort unformatted which-key-sort-order))) - (which-key--format-and-replace unformatted prefix recursive))) + (which-key--format-and-replace unformatted recursive))) ;;; Functions for laying out which-key buffer pages From 253751458e66f44a6e7deac83a47eabf3958f064 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 6 Jul 2021 10:33:39 -0400 Subject: [PATCH 723/816] Don't require evil in which-key-tests.el Patch from Stefan Monnier --- .gitignore | 5 +++++ which-key-tests.el | 45 ++++++++++++++++++++++++--------------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/.gitignore b/.gitignore index de0966b3271..5998b430cd1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,10 @@ *~ *.elc + +# Autogenerated by GNU ELPA scripts +/which-key-autoloads.el +/which-key-pkg.el + # Used to setup library paths for emacs -Q private-test-setup.el /.cask/ diff --git a/which-key-tests.el b/which-key-tests.el index 877f0091964..cce75ce4066 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -1,6 +1,6 @@ ;;; which-key-tests.el --- Tests for which-key.el -*- lexical-binding: t; -*- -;; Copyright (C) 2017 Free Software Foundation, Inc. +;; Copyright (C) 2017-2021 Free Software Foundation, Inc. ;; Author: Justin Burkett ;; Maintainer: Justin Burkett @@ -26,12 +26,11 @@ (require 'which-key) (require 'ert) -(require 'evil) (ert-deftest which-key-test--keymap-based-bindings () (let ((map (make-sparse-keymap)) (prefix-map (make-sparse-keymap))) - (define-key prefix-map "x" 'ignore) + (define-key prefix-map "x" #'ignore) (define-key map "\C-a" 'complete) (define-key map "\C-b" prefix-map) (which-key-add-keymap-based-replacements map @@ -68,8 +67,8 @@ (let ((which-key-replacement-alist '((("C-c [a-d]" . nil) . ("C-c a" . "c-c a")) (("C-c .+" . nil) . ("C-c *" . "c-c *")))) - (test-mode-1 t) - (test-mode-2 nil) + (test-mode-1 't) + (test-mode-2 'nil) which-key-allow-multiple-replacements) (which-key-add-key-based-replacements "C-c ." "test ." @@ -141,12 +140,16 @@ (should (equal (which-key--extract-key "M-a a .. c") "a .. c"))) (ert-deftest which-key-test--get-keymap-bindings () + (skip-unless (require 'evil nil t)) + (defvar evil-local-mode) + (defvar evil-state) + (declare-function evil-define-key* "ext:evil") (let ((map (make-sparse-keymap)) (evil-local-mode t) (evil-state 'normal) which-key-replacement-alist) (define-key map [which-key-a] '(which-key "blah")) - (define-key map "b" 'ignore) + (define-key map "b" #'ignore) (define-key map "c" "c") (define-key map "dd" "dd") (define-key map "eee" "eee") @@ -198,58 +201,58 @@ (let ((which-key-sort-uppercase-first t)) (should (equal - (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order)) + (mapcar #'car (sort (copy-sequence keys) #'which-key-key-order)) '("SPC" "A" "B" "a" "b" "p" "C-a")))) (let (which-key-sort-uppercase-first) (should (equal - (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order)) + (mapcar #'car (sort (copy-sequence keys) #'which-key-key-order)) '("SPC" "a" "b" "p" "A" "B" "C-a")))) (let ((which-key-sort-uppercase-first t)) (should (equal - (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order-alpha)) + (mapcar #'car (sort (copy-sequence keys) #'which-key-key-order-alpha)) '("SPC" "A" "a" "B" "b" "p" "C-a")))) (let (which-key-sort-uppercase-first) (should (equal - (mapcar 'car (sort (copy-sequence keys) 'which-key-key-order-alpha)) + (mapcar #'car (sort (copy-sequence keys) #'which-key-key-order-alpha)) '("SPC" "a" "A" "b" "B" "p" "C-a")))) (let ((which-key-sort-uppercase-first t)) (should (equal - (mapcar 'car (sort (copy-sequence keys) - 'which-key-prefix-then-key-order)) + (mapcar #'car (sort (copy-sequence keys) + #'which-key-prefix-then-key-order)) '("SPC" "A" "B" "a" "b" "C-a" "p")))) (let (which-key-sort-uppercase-first) (should (equal - (mapcar 'car (sort (copy-sequence keys) - 'which-key-prefix-then-key-order)) + (mapcar #'car (sort (copy-sequence keys) + #'which-key-prefix-then-key-order)) '("SPC" "a" "b" "A" "B" "C-a" "p")))) (let ((which-key-sort-uppercase-first t)) (should (equal (mapcar 'car (sort (copy-sequence keys) - 'which-key-prefix-then-key-order-reverse)) + #'which-key-prefix-then-key-order-reverse)) '("p" "SPC" "A" "B" "a" "b" "C-a")))) (let (which-key-sort-uppercase-first) (should (equal - (mapcar 'car (sort (copy-sequence keys) - 'which-key-prefix-then-key-order-reverse)) + (mapcar #'car (sort (copy-sequence keys) + #'which-key-prefix-then-key-order-reverse)) '("p" "SPC" "a" "b" "A" "B" "C-a")))) (let ((which-key-sort-uppercase-first t)) (should (equal - (mapcar 'car (sort (copy-sequence keys) - 'which-key-description-order)) + (mapcar #'car (sort (copy-sequence keys) + #'which-key-description-order)) '("p" "C-a" "SPC" "b" "B" "a" "A")))) (let (which-key-sort-uppercase-first) (should (equal - (mapcar 'car (sort (copy-sequence keys) - 'which-key-description-order)) + (mapcar #'car (sort (copy-sequence keys) + #'which-key-description-order)) '("p" "C-a" "SPC" "b" "B" "a" "A")))))) (provide 'which-key-tests) From 1e1b7cb6f0b17835876ce772e1bce9d43e7cafbb Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 10 Jul 2021 21:03:55 -0400 Subject: [PATCH 724/816] Remove some obsolete variables/functions --- which-key.el | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/which-key.el b/which-key.el index ff0db279ed7..a493557ae3a 100644 --- a/which-key.el +++ b/which-key.el @@ -140,16 +140,6 @@ remapped given the currently active keymaps." :group 'which-key :type 'boolean) -(defvar which-key-key-replacement-alist nil) -(make-obsolete-variable 'which-key-key-replacement-alist - 'which-key-replacement-alist "2016-11-21") -(defvar which-key-description-replacement-alist nil) -(make-obsolete-variable 'which-key-description-replacement-alist - 'which-key-replacement-alist "2016-11-21") -(defvar which-key-key-based-description-replacement-alist nil) -(make-obsolete-variable 'which-key-key-based-description-replacement-alist - 'which-key-replacement-alist "2016-11-21") - (defcustom which-key-replacement-alist (delq nil `(((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg")) @@ -666,9 +656,6 @@ update.") "select-window" "switch-frame" "-state" "which-key")))) -(make-obsolete-variable 'which-key-prefix-name-alist nil "2016-10-05") -(make-obsolete-variable 'which-key-prefix-title-alist nil "2016-10-05") - (defvar which-key--pages-obj nil) (cl-defstruct which-key--pages pages @@ -1008,22 +995,6 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (put 'which-key-add-major-mode-key-based-replacements 'lisp-indent-function 'defun) -(defalias 'which-key-add-prefix-title 'which-key-add-key-based-replacements) -(make-obsolete 'which-key-add-prefix-title - 'which-key-add-key-based-replacements - "2016-10-05") - -(defalias 'which-key-declare-prefixes 'which-key-add-key-based-replacements) -(make-obsolete 'which-key-declare-prefixes - 'which-key-add-key-based-replacements - "2016-10-05") - -(defalias 'which-key-declare-prefixes-for-mode - 'which-key-add-major-mode-key-based-replacements) -(make-obsolete 'which-key-declare-prefixes-for-mode - 'which-key-add-major-mode-key-based-replacements - "2016-10-05") - (defun which-key-define-key-recursively (map key def &optional at-root) "Recursively bind KEY in MAP to DEF on every level of MAP except the first. If AT-ROOT is non-nil the binding is also placed at the root of MAP." From 55fcce0c6143044535bc6825a68f42ca83f58f00 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 12 Jul 2021 14:52:52 -0400 Subject: [PATCH 725/816] Remove more instances of obsolete variables. --- which-key.el | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/which-key.el b/which-key.el index a493557ae3a..0fdcb7aefb2 100644 --- a/which-key.el +++ b/which-key.el @@ -185,19 +185,6 @@ non-nil value." :value-type (cons (choice string (const nil)) (choice string (const nil))))) -(when (bound-and-true-p which-key-key-replacement-alist) - (mapc - (lambda (repl) - (push (cons (cons (car repl) nil) (cons (cdr repl) nil)) - which-key-replacement-alist)) - which-key-key-replacement-alist)) -(when (bound-and-true-p which-key-description-replacement-alist) - (mapc - (lambda (repl) - (push (cons (cons nil (car repl)) (cons nil (cdr repl))) - which-key-replacement-alist)) - which-key-description-replacement-alist)) - (defcustom which-key-allow-multiple-replacements nil "Allow a key binding to match and be modified by multiple elements in `which-key-replacement-alist' if non-nil. When nil, @@ -843,11 +830,7 @@ function, but it's included here in case someone cannot set that variable early enough in their configuration, if they are using a starter kit for example." (when (string-equal which-key-separator " → ") - (setq which-key-separator " : ")) - (setq which-key-key-replacement-alist - (delete '("left" . "←") which-key-key-replacement-alist)) - (setq which-key-key-replacement-alist - (delete '("right" . "→") which-key-key-replacement-alist))) + (setq which-key-separator " : "))) ;;; Default configuration functions for use by users. From 31532874651bf3268c87601eb7478e1756e220af Mon Sep 17 00:00:00 2001 From: Duncan Burke Date: Wed, 14 Jul 2021 01:24:05 +1000 Subject: [PATCH 726/816] Add support for help-char being a generalized input event Not all keyboard events can be represented as a character. For example, while ?\C-h is a character, represented as 8 in decimal, C-M-h is represented by 134217736 in decimal, as can be obtained from: (elt (kbd "C-M-h") 0) It is useful to allow help-char to be set to something other than a character, as characters cover only a very small region of possible input events. This is especially important because help-char is used to bring up the pagination menu (when which-key-use-C-h-commands is t), and this won't work if it conflicts with any keybinding within the prefix command that led to the activation of which-key. If help-char is left set to ?\C-h things work fine because as a convention keymaps avoid binding that due to it being the default binding for help. That is just a convention, however, and things become more difficult with a heavily user-customized set of keybindings that preclude the use of ?\C-h for that purpose. In that case, if ?\C-h cannot be used, it is much easier to find a binding for help-char that is unlikely to conflict with any bindings if it is permitted to use the full range of modifier keys. This patch modifies which-key--next-page-hint, which is the only place that broke when I set help-char to a keyboard event that wasn't a character. Rather than doing a string comparison, help-char and prefix keys are put in vectors and equality is checked that way. --- which-key.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 0fdcb7aefb2..62f0f6153c5 100644 --- a/which-key.el +++ b/which-key.el @@ -1992,9 +1992,8 @@ max-lines max-width avl-lines avl-width (which-key--pages-height result)) (concat key " or " which-key-paging-key) key))) (when (and which-key-use-C-h-commands - (or (not (stringp (kbd prefix-keys))) - (not (string-equal (char-to-string help-char) - (kbd prefix-keys))))) + (not (equal (vector help-char) + (vconcat (kbd prefix-keys))))) (which-key--propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) From 5ced0016f6fd44f6318f75367557fa129be36655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Le=20Gouguec?= Date: Sun, 18 Jul 2021 18:53:14 +0200 Subject: [PATCH 727/816] Fix some keymap names not showing up Closes #314. --- which-key-tests.el | 8 ++++++++ which-key.el | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/which-key-tests.el b/which-key-tests.el index cce75ce4066..1f2b1965ec3 100644 --- a/which-key-tests.el +++ b/which-key-tests.el @@ -44,6 +44,14 @@ ("C-b" . "group:mymap") ("C-c" . "group:mymap2")))))) +(ert-deftest which-key-test--named-prefix-keymap () + (define-prefix-command 'which-key-test--named-map) + (let ((map (make-sparse-keymap))) + (define-key map "\C-a" 'which-key-test--named-map) + (should (equal + (which-key--get-keymap-bindings map) + '(("C-a" . "which-key-test--named-map")))))) + (ert-deftest which-key-test--prefix-declaration () "Test `which-key-declare-prefixes' and `which-key-declare-prefixes-for-mode'. See Bug #109." diff --git a/which-key.el b/which-key.el index 0fdcb7aefb2..9a334ccc1ac 100644 --- a/which-key.el +++ b/which-key.el @@ -1743,8 +1743,8 @@ Requires `which-key-compute-remaps' to be non-nil" (binding (cons key-desc (cond - ((keymapp def) "prefix") ((symbolp def) (which-key--compute-binding def)) + ((keymapp def) "prefix") ((eq 'lambda (car-safe def)) "lambda") ((eq 'closure (car-safe def)) "closure") ((stringp def) def) From 2042f11eb1c036f3e4dcf3ce447e978b9ee64357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Giquel?= Date: Fri, 30 Jul 2021 18:06:29 +0200 Subject: [PATCH 728/816] Preserve window configuration --- which-key.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 9a334ccc1ac..061afee73b8 100644 --- a/which-key.el +++ b/which-key.el @@ -655,6 +655,8 @@ update.") prefix prefix-title) +(defvar which-key--saved-window-configuration nil) + (defun which-key--rotate (list n) (let* ((len (length list)) (n (if (< n 0) (+ len n) n)) @@ -1096,7 +1098,10 @@ total height." (when (buffer-live-p 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))) + (quit-windows-on which-key--buffer) + (when which-key--saved-window-configuration + (set-window-configuration which-key--saved-window-configuration) + (setq which-key--saved-window-configuration nil)))) (defun which-key--hide-buffer-frame () "Hide which-key buffer when frame popup is used." @@ -1135,6 +1140,8 @@ call signature in different emacs versions" (defun which-key--show-buffer-side-window (act-popup-dim) "Show which-key buffer when popup type is side-window." + (unless which-key--saved-window-configuration + (setq which-key--saved-window-configuration (current-window-configuration))) (let* ((height (car act-popup-dim)) (width (cdr act-popup-dim)) (alist From 507292dfde002d9d58c36034427feb8df2f421e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Giquel?= Date: Wed, 18 Aug 2021 10:17:28 +0200 Subject: [PATCH 729/816] Add option (default off) to restore window configuration --- which-key.el | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 061afee73b8..6bbe2922bea 100644 --- a/which-key.el +++ b/which-key.el @@ -407,6 +407,15 @@ Note that `which-key-idle-delay' should be set before turning on :group 'which-key :type 'boolean) +(defcustom which-key-preserve-window-configuration nil + "If non-nil, save window configuration before which-key buffer is shown +and restore it after which-key buffer is hidden. It prevents which-key from +changing window position of visible buffers. +Only takken into account when popup type is side-window." + :group + 'which-key + :type 'boolean) + (defvar which-key-C-h-map (let ((map (make-sparse-keymap))) (dolist (bind `(("\C-a" . which-key-abort) @@ -1099,7 +1108,8 @@ total height." ;; 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) - (when which-key--saved-window-configuration + (when (and which-key-preserve-window-configuration + which-key--saved-window-configuration) (set-window-configuration which-key--saved-window-configuration) (setq which-key--saved-window-configuration nil)))) @@ -1140,7 +1150,8 @@ call signature in different emacs versions" (defun which-key--show-buffer-side-window (act-popup-dim) "Show which-key buffer when popup type is side-window." - (unless which-key--saved-window-configuration + (when (and which-key-preserve-window-configuration + (not which-key--saved-window-configuration)) (setq which-key--saved-window-configuration (current-window-configuration))) (let* ((height (car act-popup-dim)) (width (cdr act-popup-dim)) From 843d1c58bbebb3359732cb88f07e8908487f4d1c Mon Sep 17 00:00:00 2001 From: Leo Okawa Ericson Date: Mon, 23 Aug 2021 13:01:01 +0200 Subject: [PATCH 730/816] Add missing argument to function call --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index bb007e81eb1..470d173862c 100644 --- a/which-key.el +++ b/which-key.el @@ -1799,7 +1799,7 @@ non-nil, then bindings are collected recursively for all prefixes." (let* ((unformatted (cond ((keymapp keymap) (which-key--get-keymap-bindings - keymap prefix filter recursive)) + keymap nil prefix filter recursive)) (keymap (error "%s is not a keymap" keymap)) (t From 9a3e50ee2a7fea05ae5c39a464960e003c6902f3 Mon Sep 17 00:00:00 2001 From: anis-semmar <78486514+anis-semmar@users.noreply.github.com> Date: Thu, 18 Nov 2021 17:30:41 +0100 Subject: [PATCH 731/816] README.org: fix page flipping command names `which-key-show-next-page` / `which-key-show-previous-page` do not exist, state the correct command name. --- README.org | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.org b/README.org index 37c742edcce..ea80bfda88a 100644 --- a/README.org +++ b/README.org @@ -175,7 +175,8 @@ - =which-key-show-major-mode= will show the currently active major-mode bindings. It's similar to =C-h m= but in a which-key format. It is also aware of evil commands defined using =evil-define-key=. - - =which-key-show-next-page= is the command used for paging. + - =which-key-show-next-page-cycle= / =which-key-show-previous-page-cycle= will flip pages in a circle. + - =which-key-show-next-page-no-cycle= / =which-key-show-previous-page-no-cycle= will flip pages and stop at first/last page. - =which-key-undo= can be used to undo the last keypress when in the middle of a key sequence. From 2165957749e4874425b5c03f079b23725b331819 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 25 Nov 2021 21:32:18 -0500 Subject: [PATCH 732/816] Allow binding to symbols in which-key-C-h-dispatch Fixes #326 --- which-key.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 1daebc94241..e55197ee4a0 100644 --- a/which-key.el +++ b/which-key.el @@ -2379,7 +2379,10 @@ prefix) if `which-key-use-C-h-commands' is non nil." " 1..9" which-key-separator "digit-arg")) 'face 'which-key-note-face))) - (key (string (read-key prompt))) + (key (let ((key (read-key prompt))) + (if (numberp key) + (string key) + (vector key)))) (cmd (lookup-key which-key-C-h-map key)) (which-key-inhibit t)) (if cmd (funcall cmd key) (which-key-turn-page 0))))))) From 521a59b6f461232a008fba62f79bbb14f487b16e Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 25 Nov 2021 22:45:35 -0500 Subject: [PATCH 733/816] Respect which-key-min-display-lines setting Fixes #325 --- which-key.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/which-key.el b/which-key.el index e55197ee4a0..0fa2fa39ad7 100644 --- a/which-key.el +++ b/which-key.el @@ -1973,6 +1973,13 @@ is the width of the live window." (or prefix-title (which-key--maybe-get-prefix-title (key-description prefix-keys)))) + (when (and (= (which-key--pages-num-pages result) 1) + (> which-key-min-display-lines + (which-key--pages-height result))) + ;; result is shorter than requested, so we artificially increase the + ;; height. See #325. Note this only has an effect if + ;; `which-key-allow-imprecise-window-fit' is non-nil. + (setf (which-key--pages-height result) which-key-min-display-lines)) (which-key--debug-message "Frame height: %s Minibuffer height: %s Max dimensions: (%s,%s) From 1bb1f723dab2fc8b88b7f7273d0a7fa11134b936 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 8 Dec 2021 23:57:20 -0500 Subject: [PATCH 734/816] Fix key-chord handling It turns out we don't need to do anything too tricky for key-chords, because this-single-command-raw-keys returns the correct key-sequence Fixes #254 --- which-key.el | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/which-key.el b/which-key.el index 0fa2fa39ad7..edbad7a3687 100644 --- a/which-key.el +++ b/which-key.el @@ -2588,22 +2588,11 @@ Finally, show the buffer." (defun which-key--this-command-keys () "Version of `this-single-command-keys' corrected for key-chords and god-mode." (let ((this-command-keys (this-single-command-keys))) - (when (and (equal this-command-keys [key-chord]) + (when (and (vectorp this-command-keys) + (> (length this-command-keys) 0) + (eq (aref this-command-keys 0) 'key-chord) (bound-and-true-p key-chord-mode)) - (setq this-command-keys - (condition-case nil - (let ((rkeys (recent-keys))) - (vector 'key-chord - ;; Take the two preceding the last one, because the - ;; read-event call in key-chord seems to add a - ;; spurious key press to this list. Note this is - ;; different from guide-key's method which didn't work - ;; for me. - (aref rkeys (- (length rkeys) 3)) - (aref rkeys (- (length rkeys) 2)))) - (error (progn - (message "which-key error in key-chord handling") - [key-chord]))))) + (setq this-command-keys (this-single-command-raw-keys))) (when (and which-key--god-mode-support-enabled (bound-and-true-p god-local-mode) (eq this-command 'god-mode-self-insert)) From 5f19ec67f58585ab0b8fa713905243ea0de190e0 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 13 Dec 2021 21:27:32 -0500 Subject: [PATCH 735/816] Update to the newer advice API Patch submitted by Stefan Monnier --- which-key.el | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/which-key.el b/which-key.el index edbad7a3687..c71c741ee32 100644 --- a/which-key.el +++ b/which-key.el @@ -1,6 +1,6 @@ ;;; which-key.el --- Display available keybindings in popup -*- lexical-binding: t; -*- -;; Copyright (C) 2017 Free Software Foundation, Inc. +;; Copyright (C) 2017-2021 Free Software Foundation, Inc. ;; Author: Justin Burkett ;; Maintainer: Justin Burkett @@ -742,11 +742,10 @@ problems at github.") (defvar which-key--god-mode-key-string nil "Holds key string to use for god-mode support.") -(defadvice god-mode-lookup-command - (around which-key--god-mode-lookup-command-advice disable) - (setq which-key--god-mode-key-string (ad-get-arg 0)) +(defun which-key--god-mode-lookup-command-advice (orig-fun arg1 &rest args) + (setq which-key--god-mode-key-string arg1) (unwind-protect - ad-do-it + (apply orig-fun arg1 args) (when (bound-and-true-p which-key-mode) (which-key--hide-popup)))) @@ -758,13 +757,10 @@ disable support." (interactive "P") (setq which-key--god-mode-support-enabled (null disable)) (if disable - (ad-disable-advice - 'god-mode-lookup-command - 'around 'which-key--god-mode-lookup-command-advice) - (ad-enable-advice - 'god-mode-lookup-command - 'around 'which-key--god-mode-lookup-command-advice)) - (ad-activate 'god-mode-lookup-command)) + (advice-remove 'god-mode-lookup-command + #'which-key--god-mode-lookup-command-advice) + (advice-add 'god-mode-lookup-command :around + #'which-key--god-mode-lookup-command-advice))) ;;; Mode @@ -796,7 +792,7 @@ disable support." (add-hook 'pre-command-hook #'which-key--lighter-restore)) (add-hook 'pre-command-hook #'which-key--hide-popup) (add-hook 'window-size-change-functions - 'which-key--hide-popup-on-frame-size-change) + #'which-key--hide-popup-on-frame-size-change) (which-key--start-timer)) (setq echo-keystrokes which-key--echo-keystrokes-backup) (when which-key--prefix-help-cmd-backup @@ -805,7 +801,7 @@ disable support." (remove-hook 'pre-command-hook #'which-key--lighter-restore)) (remove-hook 'pre-command-hook #'which-key--hide-popup) (remove-hook 'window-size-change-functions - 'which-key--hide-popup-on-frame-size-change) + #'which-key--hide-popup-on-frame-size-change) (which-key--stop-timer))) (defun which-key--init-buffer () @@ -1561,8 +1557,9 @@ If KEY contains any \"special keys\" defined in `which-key-special-key-face'." (let ((key-w-face (which-key--propertize key 'face 'which-key-key-face)) (regexp (concat "\\(" - (mapconcat 'identity which-key-special-keys - "\\|") "\\)")) + (mapconcat #'identity which-key-special-keys + "\\|") + "\\)")) case-fold-search) (save-match-data (if (and which-key-special-keys @@ -2025,7 +2022,7 @@ max-lines max-width avl-lines avl-width (which-key--pages-height result)) (eval-and-compile (if (fboundp 'universal-argument--description) (defalias 'which-key--universal-argument--description - 'universal-argument--description) + #'universal-argument--description) (defun which-key--universal-argument--description () ;; Backport of the definition of universal-argument--description in ;; emacs25 on 2015-12-04 @@ -2313,7 +2310,7 @@ PREFIX should be a string suitable for `kbd'." (which-key--create-buffer-and-show (apply #'vector key-lst))) (t (setq which-key--automatic-display nil) (which-key-show-top-level))))) -(defalias 'which-key-undo 'which-key-undo-key) +(defalias 'which-key-undo #'which-key-undo-key) (defun which-key-abort (&optional _) "Abort key sequence." @@ -2474,7 +2471,7 @@ KEYMAP is selected interactively by mode in (intern (completing-read "Minor Mode: " - (mapcar 'car + (mapcar #'car (cl-remove-if-not (lambda (entry) (and (symbol-value (car entry)) From 95abb89145cd6c6c1cf7503622e8c2d42232d415 Mon Sep 17 00:00:00 2001 From: Hans Donner Date: Fri, 24 Dec 2021 08:26:04 +0100 Subject: [PATCH 736/816] add which-key-min-column-description-width --- which-key.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index c71c741ee32..a499e2a8833 100644 --- a/which-key.el +++ b/which-key.el @@ -93,6 +93,11 @@ Also adds \"..\". If nil, disable any truncation." :group 'which-key :type '(choice integer (const :tag "Disable truncation" nil))) +(defcustom which-key-min-column-description-width 0 + "Every column should at least have this width." + :group 'which-key + :type 'integer) + (defcustom which-key-add-column-padding 0 "Additional padding (number of spaces) to add to the left of each key column." @@ -1843,12 +1848,12 @@ non-nil, then bindings are collected recursively for all prefixes." (rows (apply #'cl-mapcar #'list padded))) (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n"))) -(defsubst which-key--max-len (keys index) +(defsubst which-key--max-len (keys index &optional initial-value) "Internal function for finding the max length of the INDEX element in each list element of KEYS." (cl-reduce (lambda (x y) (max x (which-key--string-width (nth index y)))) - keys :initial-value 0)) + keys :initial-value (if initial-value initial-value 0))) (defun which-key--pad-column (col-keys) "Take a column of (key separator description) COL-KEYS, @@ -1857,7 +1862,7 @@ that width." (let* ((col-key-width (+ which-key-add-column-padding (which-key--max-len col-keys 0))) (col-sep-width (which-key--max-len col-keys 1)) - (col-desc-width (which-key--max-len col-keys 2)) + (col-desc-width (which-key--max-len col-keys 2 which-key-min-column-description-width)) (col-width (+ 1 col-key-width col-sep-width col-desc-width))) (cons col-width (mapcar (lambda (k) From 8361479d78a2c5dcca25a96b5e70164bb521268c Mon Sep 17 00:00:00 2001 From: Hans Donner Date: Fri, 24 Dec 2021 20:00:51 +0100 Subject: [PATCH 737/816] add which-key-elipsis --- which-key.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index c71c741ee32..2828224c2fe 100644 --- a/which-key.el +++ b/which-key.el @@ -128,6 +128,15 @@ the default is \" : \"." :group 'which-key :type 'string) +(defcustom which-key-elipsis + (if which-key-dont-use-unicode ".." "…") + "Elipsis to use when truncating. Default is \"…\", unless +`which-key-dont-use-unicode' is non nil, in which case +the default is \"..\"." + :group 'which-key + :type 'string) + + (defcustom which-key-prefix-prefix "+" "String to insert in front of prefix commands (i.e., commands that represent a sub-map). Default is \"+\"." @@ -1575,7 +1584,7 @@ If KEY contains any \"special keys\" defined in (defsubst which-key--truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) - (dots (which-key--propertize ".." 'face last-face))) + (dots (which-key--propertize which-key-elipsis 'face last-face))) (if (and which-key-max-description-length (> (length desc) which-key-max-description-length)) (concat (substring desc 0 which-key-max-description-length) dots) From b432fcf581e34b4078b0c08b102b90406aad66b1 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sat, 1 Jan 2022 01:38:56 +0100 Subject: [PATCH 738/816] Add GNU ELPA badge to README.org --- README.org | 1 + 1 file changed, 1 insertion(+) diff --git a/README.org b/README.org index ea80bfda88a..994931813d7 100644 --- a/README.org +++ b/README.org @@ -1,4 +1,5 @@ * which-key + [[https://elpa.gnu.org/packages/which-key.html][https://elpa.gnu.org/packages/which-key.svg]] [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] From 0abac5e0253f9ae04763958cf30c8e14cd997430 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 1 Jan 2022 23:25:59 -0500 Subject: [PATCH 739/816] Fix code column width --- which-key.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index a499e2a8833..644d755c13c 100644 --- a/which-key.el +++ b/which-key.el @@ -1862,7 +1862,8 @@ that width." (let* ((col-key-width (+ which-key-add-column-padding (which-key--max-len col-keys 0))) (col-sep-width (which-key--max-len col-keys 1)) - (col-desc-width (which-key--max-len col-keys 2 which-key-min-column-description-width)) + (col-desc-width (which-key--max-len + col-keys 2 which-key-min-column-description-width)) (col-width (+ 1 col-key-width col-sep-width col-desc-width))) (cons col-width (mapcar (lambda (k) From 9f64733e4ac563c0cda3685acf4e1c2cf600319b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 2 Jan 2022 09:33:02 -0500 Subject: [PATCH 740/816] Fix typo in ellipsis --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 870894644db..c13f4af25aa 100644 --- a/which-key.el +++ b/which-key.el @@ -133,9 +133,9 @@ the default is \" : \"." :group 'which-key :type 'string) -(defcustom which-key-elipsis +(defcustom which-key-ellipsis (if which-key-dont-use-unicode ".." "…") - "Elipsis to use when truncating. Default is \"…\", unless + "Ellipsis to use when truncating. Default is \"…\", unless `which-key-dont-use-unicode' is non nil, in which case the default is \"..\"." :group 'which-key @@ -1589,7 +1589,7 @@ If KEY contains any \"special keys\" defined in (defsubst which-key--truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) - (dots (which-key--propertize which-key-elipsis 'face last-face))) + (dots (which-key--propertize which-key-ellipsis 'face last-face))) (if (and which-key-max-description-length (> (length desc) which-key-max-description-length)) (concat (substring desc 0 which-key-max-description-length) dots) From 8d934c571fb954232c4cbe6f1dab554a35ad5e7d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sun, 13 Feb 2022 22:33:02 -0500 Subject: [PATCH 741/816] Don't allow transient maps when prefix length is zero. Fixes #335 --- which-key.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/which-key.el b/which-key.el index c13f4af25aa..d2743198fa1 100644 --- a/which-key.el +++ b/which-key.el @@ -2655,6 +2655,9 @@ Finally, show the buffer." (not which-key--secondary-timer-active)) (which-key--start-timer which-key-idle-secondary-delay t)))) ((and which-key-show-transient-maps + ;; Assuming that if this is not true we're in + ;; `which-key-show-top-level', which would then be overwritten. + (> (length prefix-keys) 0) (keymapp overriding-terminal-local-map) ;; basic test for it being a hydra (not (eq (lookup-key overriding-terminal-local-map "\C-u") From 1217db8c6356659e67b35dedd9f5f260c06f6e99 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 14 Feb 2022 13:18:32 -0500 Subject: [PATCH 742/816] Bump version --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d2743198fa1..c9d60b88ca3 100644 --- a/which-key.el +++ b/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; URL: https://github.com/justbur/emacs-which-key -;; Version: 3.5.1 +;; Version: 3.6.0 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 1692a1e54f690a07292f0ebab53640178044fd5a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Mon, 18 Apr 2022 22:26:35 -0400 Subject: [PATCH 743/816] Add an example to README for keymap binding See #338 --- README.org | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/README.org b/README.org index 994931813d7..9d9a4c4a57b 100644 --- a/README.org +++ b/README.org @@ -278,17 +278,22 @@ example, #+BEGIN_SRC emacs-lisp - (define-key some-map "f" '("foo" . command-foo)) - (define-key some-map "b" '("bar-prefix" . (keymap))) + (define-key some-map "f" '("foo" . command-foo)) + (define-key some-map "b" '("bar-prefix" . (keymap))) + (setq my-map (make-sparse-keymap)) + (define-key some-map "b" (cons "bar-prefix" my-map)) #+END_SRC binds =command-foo= to =f= in =some-map=, but also stores the string "foo" which which-key will extract to use to describe this command. The second example binds an empty keymap to =b= in =some-map= and uses "bar-prefix" to - describe it. These bindings are accepted by =define-key= natively (i.e., - with or without which-key being loaded). Since many key-binding utilities - use =define-key= internally, this functionality should be available with - your favorite method of defining keys as well. + describe it. The last two lines replicate the functionality of the second + line, while assigning the new keymap to the symbol =my-map= (note the use + of =cons= to ensure that =my-map= is evaluated for =define-key=). These + bindings are accepted by =define-key= natively (i.e., with or without + which-key being loaded). Since many key-binding utilities use =define-key= + internally, this functionality should be available with your favorite + method of defining keys as well. The second method is to use =which-key-add-keymap-based-replacements=. The statement From 1ab1d0cc88843c9a614ed3226c5a1070e32e4823 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 18 May 2022 15:41:11 -0400 Subject: [PATCH 744/816] Add group to minor-mode definition Fixes #339 --- which-key.el | 1 + 1 file changed, 1 insertion(+) diff --git a/which-key.el b/which-key.el index c9d60b88ca3..19d1f9fb3d1 100644 --- a/which-key.el +++ b/which-key.el @@ -782,6 +782,7 @@ disable support." (define-minor-mode which-key-mode "Toggle which-key-mode." :global t + :group 'which-key :lighter which-key-lighter :keymap (let ((map (make-sparse-keymap))) (mapc From 55b2440de048f338a1e762afe17e02950b48a0b6 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Sat, 28 May 2022 00:28:57 +0200 Subject: [PATCH 745/816] Replace or quote certain single quotes in docstrings The byte-compiler recently got more fussy about quotes. --- which-key.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 19d1f9fb3d1..4eac1bab69c 100644 --- a/which-key.el +++ b/which-key.el @@ -235,7 +235,7 @@ face to apply)." and have `which-key-special-key-face' applied to them. This is disabled by default. Try this to see the effect. -\(setq which-key-special-keys '(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)" +\(setq which-key-special-keys \\='(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)" :group 'which-key :type '(repeat string)) @@ -291,10 +291,10 @@ location is tried." (defcustom which-key-side-window-slot 0 "The `slot' to use for `display-buffer-in-side-window' when -`which-key-popup-type' is 'side-window. Quoting from the +`which-key-popup-type' is `side-window'. Quoting from the docstring of `display-buffer-in-side-window', -‘slot’ if non-nil, specifies the window slot where to display +`slot' if non-nil, specifies the window slot where to display BUFFER. A value of zero or nil means use the middle slot on the specified side. A negative value means use a slot preceding (that is, above or on the left of) the middle slot. A @@ -906,7 +906,7 @@ replaced. COMMAND can be nil if the binding corresponds to a key prefix. An example is \(which-key-add-keymap-based-replacements global-map - \"C-x w\" '\(\"Save as\" . write-file\)\). + \"C-x w\" \\='\(\"Save as\" . write-file\)\). For backwards compatibility, REPLACEMENT can also be a string, but the above format is preferred, and the option to use a string @@ -938,7 +938,7 @@ may either be a string, as in a cons of two strings as in \(which-key-add-key-based-replacements \"C-x 8\" - '(\"unicode\" . \"Unicode keys\")\) + \\='(\"unicode\" . \"Unicode keys\")\) or a function that takes a \(KEY . BINDING\) cons and returns a replacement. From d924a4a766d3f895acbddf02d01db1e3f049f899 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:06 +0200 Subject: [PATCH 746/816] Calculate format string only once --- which-key.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 19d1f9fb3d1..d9dcf8dee9a 100644 --- a/which-key.el +++ b/which-key.el @@ -1874,13 +1874,12 @@ that width." (col-sep-width (which-key--max-len col-keys 1)) (col-desc-width (which-key--max-len col-keys 2 which-key-min-column-description-width)) - (col-width (+ 1 col-key-width col-sep-width col-desc-width))) + (col-width (+ 1 col-key-width col-sep-width col-desc-width)) + (col-format (concat "%" (int-to-string col-key-width) + "s%s%-" (int-to-string col-desc-width) "s"))) (cons col-width - (mapcar (lambda (k) - (format (concat "%" (int-to-string col-key-width) - "s%s%-" (int-to-string col-desc-width) "s") - (nth 0 k) (nth 1 k) (nth 2 k))) - col-keys)))) + (mapcar (lambda (k) (apply #'format col-format k)) + col-keys)))) (defun which-key--partition-list (n list) "Partition LIST into N-sized sublists." From 16c992f80fa6394b4dc5166e6c14129ec4946e12 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:07 +0200 Subject: [PATCH 747/816] Displaying just one column means pages are arranged vertically Third-party display methods may do that without using a side-window, and therefore they don't set `which-key-popup-type' to `side-window'. Likewise they might not set `which-key-side-window-location', e.g., because their display method only supports one location. `which-key-max-display-columns' being 1 is by itself already enough of an indicator to know that there won't be multiple columns. --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index d9dcf8dee9a..89bdbe86457 100644 --- a/which-key.el +++ b/which-key.el @@ -1972,8 +1972,9 @@ is the width of the live window." (avl-lines (if prefix-top-bottom (- max-lines 1) max-lines)) (min-lines (min avl-lines which-key-min-display-lines)) (avl-width (if prefix (- max-width prefix) max-width)) - (vertical (and (eq which-key-popup-type 'side-window) - (member which-key-side-window-location '(left right)))) + (vertical (or (and (eq which-key-popup-type 'side-window) + (member which-key-side-window-location '(left right))) + (eq which-key-max-display-columns 1))) result) (setq result (which-key--create-pages-1 From 254d6fdc2b3c993b599fc3ca29cda14bc6c0a5fb Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:08 +0200 Subject: [PATCH 748/816] Don't pad beyond maximal width The old implementation behaved as if the "description" is the only information that is being displayed, however in actuality the available width has to be shared with the key (and the separator between the two). Failing to take that into account meant that every binding whose description isn't *by itself* wider than the width available to display all the information got excessive padding, which later has to be removed during truncation again (resulting in misleading ellipses). --- which-key.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index 89bdbe86457..8162d207f70 100644 --- a/which-key.el +++ b/which-key.el @@ -1865,15 +1865,18 @@ element in each list element of KEYS." (lambda (x y) (max x (which-key--string-width (nth index y)))) keys :initial-value (if initial-value initial-value 0))) -(defun which-key--pad-column (col-keys) +(defun which-key--pad-column (col-keys avl-width) "Take a column of (key separator description) COL-KEYS, calculate the max width in the column and pad all cells out to that width." (let* ((col-key-width (+ which-key-add-column-padding (which-key--max-len col-keys 0))) (col-sep-width (which-key--max-len col-keys 1)) - (col-desc-width (which-key--max-len - col-keys 2 which-key-min-column-description-width)) + (avl-width (- avl-width col-key-width col-sep-width)) + (col-desc-width (min avl-width + (which-key--max-len + col-keys 2 + which-key-min-column-description-width))) (col-width (+ 1 col-key-width col-sep-width col-desc-width)) (col-format (concat "%" (int-to-string col-key-width) "s%s%-" (int-to-string col-desc-width) "s"))) @@ -1893,8 +1896,8 @@ that width." "Convert list of KEYS to columns based on dimensions AVL-LINES and AVL-WIDTH. Returns a `which-key--pages' object that holds the page strings, as well as metadata." - (let ((cols-w-widths (mapcar #'which-key--pad-column - (which-key--partition-list avl-lines keys))) + (let ((cols-w-widths (mapcar (lambda (c) (which-key--pad-column c avl-width)) + (which-key--partition-list avl-lines keys))) (page-width 0) (n-pages 0) (n-keys 0) (n-columns 0) page-cols pages page-widths keys/page col) (if (> (apply #'max (mapcar #'car cols-w-widths)) avl-width) From 5fe2d3317d60411970e662d62ffc05fe5eac7319 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:09 +0200 Subject: [PATCH 749/816] Fix horizontal off-by-one error Delay increasing width used by columns until we know that we have to do so because we have determined that there is enough room to add an additional column and a space between the last two columns. If we don't do that, then we can easily get an off-by-one error. If docstrings are shown and the window is narrow, then it is likely that we end up using the maximal width. If we then add one to the actual width and later compare that again with the maximal width, then that is too width. --- which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 8162d207f70..9d5e403f6d8 100644 --- a/which-key.el +++ b/which-key.el @@ -1877,7 +1877,7 @@ that width." (which-key--max-len col-keys 2 which-key-min-column-description-width))) - (col-width (+ 1 col-key-width col-sep-width col-desc-width)) + (col-width (+ col-key-width col-sep-width col-desc-width)) (col-format (concat "%" (int-to-string col-key-width) "s%s%-" (int-to-string col-desc-width) "s"))) (cons col-width @@ -1915,10 +1915,10 @@ as well as metadata." (while (and cols-w-widths (or (null which-key-max-display-columns) (< n-columns which-key-max-display-columns)) - (<= (+ (caar cols-w-widths) page-width) avl-width)) + (<= (+ page-width 1 (caar cols-w-widths)) avl-width)) (setq col (pop cols-w-widths)) (push (cdr col) page-cols) - (cl-incf page-width (car col)) + (cl-incf page-width (1+ (car col))) (cl-incf n-keys (length (cdr col))) (cl-incf n-columns)) (push (which-key--join-columns page-cols) pages) From 245be33189fdba26997fc565742ce7a0e78232aa Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:11 +0200 Subject: [PATCH 750/816] Fix vertical off-by-one error When the usage information is displayed at the top or bottom (as controlled by `which-key-show-prefix'), then we already accounted for that by putting (- max-height 1) bindings in each row. But we did not ensure that the max-height is used when displaying the result. Instead we used (- max-height 1) here too. When trying to display usage information at the bottom, the result is that it is not displayed because it is off-window. When displaying at the top, then it is displayed, but the last binding is off-window and never displayed. This bug did not matter (much) when using the default settings because then the code used for displaying the window actually ignores the max-height and just uses the height appropriate to display all lines in the buffer (i.e., (+ max-height 1)). However, other display methods, including but not necessarily limited to third-party methods (such as `which-key-posframe') may choose to, or absolutely have to, respect max-height. In particular, anything that tries to use the full height of a frame or window, will be affected by this. --- which-key.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/which-key.el b/which-key.el index 9d5e403f6d8..ba446a56737 100644 --- a/which-key.el +++ b/which-key.el @@ -1989,6 +1989,9 @@ is the width of the live window." (or prefix-title (which-key--maybe-get-prefix-title (key-description prefix-keys)))) + (when prefix-top-bottom + ;; Add back the line earlier reserved for the page information. + (setf (which-key--pages-height result) max-lines)) (when (and (= (which-key--pages-num-pages result) 1) (> which-key-min-display-lines (which-key--pages-height result))) From fe68fe28126efa44a1050a2eedfc719c23054db1 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:12 +0200 Subject: [PATCH 751/816] Avoid unnecessary work --- which-key.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index ba446a56737..529cceb40a1 100644 --- a/which-key.el +++ b/which-key.el @@ -1589,12 +1589,12 @@ If KEY contains any \"special keys\" defined in (defsubst which-key--truncate-description (desc) "Truncate DESC description to `which-key-max-description-length'." - (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) - (dots (which-key--propertize which-key-ellipsis 'face last-face))) - (if (and which-key-max-description-length - (> (length desc) which-key-max-description-length)) - (concat (substring desc 0 which-key-max-description-length) dots) - desc))) + (if (and which-key-max-description-length + (> (length desc) which-key-max-description-length)) + (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) + (dots (which-key--propertize which-key-ellipsis 'face last-face))) + (concat (substring desc 0 which-key-max-description-length) dots)) + desc)) (defun which-key--highlight-face (description) "Return the highlight face for DESCRIPTION if it has one." From 783d6954bcea18c94d7eee723286f820fbd8b4b2 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:13 +0200 Subject: [PATCH 752/816] Support different types for which-key-max-description-length Using a function is useful, e.g., to use a different maximal width, depending on the value of `which-key-show-docstrings'. --- README.org | 1 + which-key.el | 35 +++++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/README.org b/README.org index 9d9a4c4a57b..82a1466961f 100644 --- a/README.org +++ b/README.org @@ -520,6 +520,7 @@ ;; Set the maximum length (in characters) for key descriptions (commands or ;; prefixes). Descriptions that are longer are truncated and have ".." added. + ;; This can also be a float (fraction of available width) or a function. (setq which-key-max-description-length 27) ;; Use additional padding between columns of keys. This variable specifies the diff --git a/which-key.el b/which-key.el index 529cceb40a1..a2986269fdd 100644 --- a/which-key.el +++ b/which-key.el @@ -89,9 +89,16 @@ which-key popup." (defcustom which-key-max-description-length 27 "Truncate the description of keys to this length. -Also adds \"..\". If nil, disable any truncation." +Either nil (no truncation), an integer (truncate after that many +characters), a float (use that fraction of the available width), +or a function, which takes one argument, the available width in +characters, and whose return value has one of the types mentioned +before. Truncation is done using `which-key-ellipsis'." :group 'which-key - :type '(choice integer (const :tag "Disable truncation" nil))) + :type '(choice (const :tag "Disable truncation" nil) + (integer :tag "Width in characters") + (float :tag "Use fraction of available width") + function)) (defcustom which-key-min-column-description-width 0 "Every column should at least have this width." @@ -1587,14 +1594,20 @@ If KEY contains any \"special keys\" defined in (which-key--string-width key-w-face)))) key-w-face)))) -(defsubst which-key--truncate-description (desc) +(defsubst which-key--truncate-description (desc avl-width) "Truncate DESC description to `which-key-max-description-length'." - (if (and which-key-max-description-length - (> (length desc) which-key-max-description-length)) - (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) - (dots (which-key--propertize which-key-ellipsis 'face last-face))) - (concat (substring desc 0 which-key-max-description-length) dots)) - desc)) + (let* ((max which-key-max-description-length) + (max (cl-etypecase max + (null nil) + (integer max) + (float (truncate (* max avl-width))) + (function (let ((val (funcall max avl-width))) + (if (floatp val) (truncate val) val)))))) + (if (and max (> (length desc) max)) + (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) + (dots (which-key--propertize which-key-ellipsis 'face last-face))) + (concat (substring desc 0 max) dots)) + desc))) (defun which-key--highlight-face (description) "Return the highlight face for DESCRIPTION if it has one." @@ -1696,6 +1709,7 @@ alists. Returns a list (key separator description)." (which-key--propertize which-key-separator 'face 'which-key-separator-face)) (local-map (current-local-map)) + (avl-width (cdr (which-key--popup-max-dimensions))) new-list) (dolist (key-binding unformatted) (let* ((keys (car key-binding)) @@ -1710,7 +1724,8 @@ alists. Returns a list (key separator description)." (when final-desc (setq final-desc (which-key--truncate-description - (which-key--maybe-add-docstring final-desc orig-desc)))) + (which-key--maybe-add-docstring final-desc orig-desc) + avl-width))) (when (consp key-binding) (push (list (which-key--propertize-key From 08d57febc4bcebc6d228c215e363a589498894da Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:15 +0200 Subject: [PATCH 753/816] Don't make description longer than allowed when truncating Truncating the description to the allowed maximal length and then appending an ellipsis, makes the final text longer than allowed. The length of the ellipsis has to be taken into account. --- which-key.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index a2986269fdd..2062a737abe 100644 --- a/which-key.el +++ b/which-key.el @@ -1605,8 +1605,9 @@ If KEY contains any \"special keys\" defined in (if (floatp val) (truncate val) val)))))) (if (and max (> (length desc) max)) (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) - (dots (which-key--propertize which-key-ellipsis 'face last-face))) - (concat (substring desc 0 max) dots)) + (dots (which-key--propertize which-key-ellipsis + 'face last-face))) + (concat (substring desc 0 (- max (length dots))) dots)) desc))) (defun which-key--highlight-face (description) From e993113868305221db8dff8b37be81cca2bfa139 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Thu, 4 Aug 2022 14:05:16 +0200 Subject: [PATCH 754/816] Allow truncating without using any ellipsis Depending on how bindings are displayed showing docstrings can result in most lines being too long and adding ellipses to most lines can be quite ugly and distracting. --- which-key.el | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 2062a737abe..552b6a749a0 100644 --- a/which-key.el +++ b/which-key.el @@ -142,13 +142,13 @@ the default is \" : \"." (defcustom which-key-ellipsis (if which-key-dont-use-unicode ".." "…") - "Ellipsis to use when truncating. Default is \"…\", unless -`which-key-dont-use-unicode' is non nil, in which case -the default is \"..\"." + "Ellipsis to use when truncating. +Default is \"…\", unless `which-key-dont-use-unicode' is non nil, +in which case the default is \"..\". This can also be the empty +string to truncate without using any ellipsis." :group 'which-key :type 'string) - (defcustom which-key-prefix-prefix "+" "String to insert in front of prefix commands (i.e., commands that represent a sub-map). Default is \"+\"." @@ -1604,10 +1604,13 @@ If KEY contains any \"special keys\" defined in (function (let ((val (funcall max avl-width))) (if (floatp val) (truncate val) val)))))) (if (and max (> (length desc) max)) - (let* ((last-face (get-text-property (1- (length desc)) 'face desc)) - (dots (which-key--propertize which-key-ellipsis - 'face last-face))) - (concat (substring desc 0 (- max (length dots))) dots)) + (let ((dots (and (not (equal which-key-ellipsis "")) + (which-key--propertize + which-key-ellipsis 'face + (get-text-property (1- (length desc)) 'face desc))))) + (if dots + (concat (substring desc 0 (- max (length dots))) dots) + (substring desc 0 max))) desc))) (defun which-key--highlight-face (description) From 2875fcdc93acb02863ed0315588cb9e8e9a732e5 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 11 Aug 2022 09:32:24 -0400 Subject: [PATCH 755/816] Ignore .DS_Store --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5998b430cd1..0d9e6e119b0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *~ *.elc +.DS_Store # Autogenerated by GNU ELPA scripts /which-key-autoloads.el From bd34ede7bf77ad3988330b37207f3978e7342c79 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 30 Mar 2023 17:21:49 -0400 Subject: [PATCH 756/816] Catch errors in kbd Fixes #346 --- which-key.el | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index f46d6e224a8..f7c4f160625 100644 --- a/which-key.el +++ b/which-key.el @@ -732,6 +732,16 @@ checked." (when (and result (not (numberp result))) result)))) +(defsubst which-key--safe-lookup-key-description (keymap key) + "Version of `lookup-key' that allows KEYMAP to be nil. +Also convert numeric results of `lookup-key' to nil. KEY +should be formatted as an input for `kbd'." + (let ((key (ignore-errors (kbd key)))) + (when (and key (keymapp keymap)) + (let ((result (lookup-key keymap key))) + (when (and result (not (numberp result))) + result))))) + ;;; Third-party library support ;;;; Evil @@ -924,7 +934,7 @@ for REPLACEMENT will eventually be removed." ((consp replacement) replacement) ((stringp replacement) (cons replacement - (or (which-key--safe-lookup-key keymap (kbd key)) + (or (which-key--safe-lookup-key-description keymap key) (make-sparse-keymap)))) (t (user-error "replacement is neither a cons cell or a string"))))) @@ -1520,8 +1530,9 @@ which are strings. KEY is of the form produced by `key-binding'." (key-description (which-key--current-key-list key-str))) (defun which-key--local-binding-p (keydesc) - (eq (which-key--safe-lookup-key - (current-local-map) (kbd (which-key--current-key-string (car keydesc)))) + (eq (which-key--safe-lookup-key-description + (current-local-map) + (which-key--current-key-string (car keydesc))) (intern (cdr keydesc)))) (defun which-key--map-binding-p (map keydesc) @@ -1529,15 +1540,15 @@ which are strings. KEY is of the form produced by `key-binding'." (or (when (bound-and-true-p evil-state) (let ((lookup - (which-key--safe-lookup-key + (which-key--safe-lookup-key-description map - (kbd (which-key--current-key-string - (format "<%s-state> %s" evil-state (car keydesc))))))) + (which-key--current-key-string + (format "<%s-state> %s" evil-state (car keydesc)))))) (or (eq lookup (intern (cdr keydesc))) (and (keymapp lookup) (string= (cdr keydesc) "Prefix Command"))))) (let ((lookup - (which-key--safe-lookup-key - map (kbd (which-key--current-key-string (car keydesc)))))) + (which-key--safe-lookup-key-description + map (which-key--current-key-string (car keydesc))))) (or (eq lookup (intern (cdr keydesc))) (and (keymapp lookup) (string= (cdr keydesc) "Prefix Command")))))) @@ -1719,7 +1730,8 @@ alists. Returns a list (key separator description)." (let* ((keys (car key-binding)) (orig-desc (cdr key-binding)) (group (which-key--group-p orig-desc)) - (local (eq (which-key--safe-lookup-key local-map (kbd keys)) + (local (eq (which-key--safe-lookup-key-description + local-map keys) (intern orig-desc))) (hl-face (which-key--highlight-face orig-desc)) (key-binding (which-key--maybe-replace key-binding)) From ee6f0637f75ded903653b7a300a8588e3a8427f7 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 6 Jun 2023 18:27:27 -0400 Subject: [PATCH 757/816] Remove old "recent changes" from README --- README.org | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/README.org b/README.org index 82a1466961f..cc7d0cfb65f 100644 --- a/README.org +++ b/README.org @@ -3,29 +3,6 @@ [[http://melpa.org/#/which-key][http://melpa.org/packages/which-key-badge.svg]] [[http://stable.melpa.org/#/which-key][file:http://stable.melpa.org/packages/which-key-badge.svg]] -** Recent Changes -*** 2021-06-21: Add support for menu-item bindings - =which-key= will now detect and compute the result of =menu-item= - bindings. As a consequence of reworking the internals, - =which-key-enable-extended-define-key= is now obsolete (the associated - behavior is supported by default). - -*** 2020-08-28: Added =which-key-add-keymap-based-replacements= - This function provides an alternative interface allowing replacements to be - stored directly in keymaps, allowing one to avoid using - =which-key-replacement-alist=, which may cause performance issues when it - gets very big. -*** 2019-08-01: Added =which-key-show-early-on-C-h= - Allows one to trigger =which-key= on demand, rather than automatically. See - the docstring and [[#manual-activation][Manual Activation]]. - -*** 2017-12-13: Added =which-key-enable-extended-define-key= - Allows for a concise syntax to specify replacement text using =define-key= - or alternatives that use =define-key= internally. See the docstring and - [[#custom-string-replacement-options][Custom String Replacement]]. - -*** 2017-11-13: Added =which-key-show-major-mode= - Shows active bindings in current major-mode map. ** Introduction =which-key= is a minor mode for Emacs that displays the key bindings following your currently entered incomplete command (a prefix) in a @@ -39,12 +16,6 @@ ** Table of Contents :TOC_3: - [[#which-key][which-key]] - - [[#recent-changes][Recent Changes]] - - [[#2021-06-21-add-support-for-menu-item-bindings][2021-06-21: Add support for menu-item bindings]] - - [[#2020-08-28-added-which-key-add-keymap-based-replacements][2020-08-28: Added =which-key-add-keymap-based-replacements=]] - - [[#2019-08-01-added-which-key-show-early-on-c-h][2019-08-01: Added =which-key-show-early-on-C-h=]] - - [[#2017-12-13-added-which-key-enable-extended-define-key][2017-12-13: Added =which-key-enable-extended-define-key=]] - - [[#2017-11-13-added-which-key-show-major-mode][2017-11-13: Added =which-key-show-major-mode=]] - [[#introduction][Introduction]] - [[#install][Install]] - [[#melpa][MELPA]] From df6b0cb8449812e7fb200bc852107fa7eb708496 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Wed, 12 Jul 2023 17:51:08 -0400 Subject: [PATCH 758/816] Add which-key-C-h-map-prompt to make it customizable Fixes #350 --- which-key.el | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/which-key.el b/which-key.el index f7c4f160625..25f2397a9a8 100644 --- a/which-key.el +++ b/which-key.el @@ -437,6 +437,25 @@ Only takken into account when popup type is side-window." 'which-key :type 'boolean) +(defvar which-key-C-h-map-prompt + (concat " \\" + " \\[which-key-show-next-page-cycle]" + which-key-separator "next-page," + " \\[which-key-show-previous-page-cycle]" + which-key-separator "previous-page," + " \\[which-key-undo-key]" + which-key-separator "undo-key," + " \\[which-key-toggle-docstrings]" + which-key-separator "toggle-docstrings," + " \\[which-key-show-standard-help]" + which-key-separator "help," + " \\[which-key-abort]" + which-key-separator "abort" + " 1..9" + which-key-separator "digit-arg") + "Prompt to display when invoking `which-key-C-h-map'. This string +is fed into `substitute-command-keys'") + (defvar which-key-C-h-map (let ((map (make-sparse-keymap))) (dolist (bind `(("\C-a" . which-key-abort) @@ -2419,22 +2438,7 @@ prefix) if `which-key-use-C-h-commands' is non nil." full-prefix (which-key--propertize (substitute-command-keys - (concat - " \\" - " \\[which-key-show-next-page-cycle]" - which-key-separator "next-page," - " \\[which-key-show-previous-page-cycle]" - which-key-separator "previous-page," - " \\[which-key-undo-key]" - which-key-separator "undo-key," - " \\[which-key-toggle-docstrings]" - which-key-separator "toggle-docstrings," - " \\[which-key-show-standard-help]" - which-key-separator "help," - " \\[which-key-abort]" - which-key-separator "abort" - " 1..9" - which-key-separator "digit-arg")) + which-key-C-h-map-prompt) 'face 'which-key-note-face))) (key (let ((key (read-key prompt))) (if (numberp key) From 4d20bc852545a2e602f59084a630f888542052b1 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 5 Sep 2023 17:28:29 -0400 Subject: [PATCH 759/816] Fix popup with no space Fixes #317 --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 25f2397a9a8..d68942cf8b1 100644 --- a/which-key.el +++ b/which-key.el @@ -2682,7 +2682,9 @@ Finally, show the buffer." (and which-key--god-mode-support-enabled (bound-and-true-p god-local-mode) (eq this-command 'god-mode-self-insert)) - (null this-command))) + (null this-command)) + (let ((max-dim (which-key--popup-max-dimensions))) + (> (min (car-safe max-dim) (cdr-safe max-dim)) 0))) (when (and (not (equal prefix-keys (which-key--current-prefix))) (or (null which-key-delay-functions) (null (setq delay-time From bf1cf8147b7ff5087e7a7d771784fb393878ce0c Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Thu, 8 Feb 2024 23:28:10 +0000 Subject: [PATCH 760/816] * which-key.el: Add two spaces in docstrings and punctation (which-key-echo-keystrokes): (which-key-popup-type): (which-key-min-display-lines): (which-key-side-window-location): (which-key-show-early-on-C-h): (which-key-allow-regexps): (which-key-group-description-face): (which-key-docstring-face): (which-key-enable-god-mode-support): (which-key-setup-minibuffer): (which-key-add-keymap-based-replacements): (which-key--maybe-replace): (which-key--maybe-add-docstring): (which-key--get-keymap-bindings): (which-key-reload-key-sequence): --- which-key.el | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/which-key.el b/which-key.el index d68942cf8b1..4a19d1622f6 100644 --- a/which-key.el +++ b/which-key.el @@ -24,13 +24,13 @@ ;;; Commentary: -;; which-key provides the minor mode which-key-mode for Emacs. The mode displays +;; which-key provides the minor mode which-key-mode for Emacs. The mode displays ;; the key bindings following your currently entered incomplete command (a -;; prefix) in a popup. For example, after enabling the minor mode if you enter +;; prefix) in a popup. For example, after enabling the minor mode if you enter ;; C-x and wait for the default of 1 second the minibuffer will expand with all ;; of the available key bindings that follow C-x (or as many as space allows -;; given your settings). This includes prefixes like C-x 8 which are shown in a -;; different face. Screenshots of what the popup will look like along with +;; given your settings). This includes prefixes like C-x 8 which are shown in a +;; different face. Screenshots of what the popup will look like along with ;; information about additional features can be found at ;; https://github.com/justbur/emacs-which-key. ;; @@ -51,7 +51,7 @@ ;;; Options (defgroup which-key nil - "Customization options for which-key-mode" + "Customization options for which-key-mode." :group 'help :prefix "which-key-") @@ -81,7 +81,7 @@ this behavior." echo-keystrokes) "Value to use for `echo-keystrokes'. This only applies if `which-key-popup-type' is minibuffer or -`which-key-show-prefix' is echo. It needs to be less than +`which-key-show-prefix' is echo. It needs to be less than `which-key-idle-delay' or else the keystroke echo will erase the which-key popup." :group 'which-key @@ -264,7 +264,7 @@ and nil. Nil turns the feature off." (const :tag "Hide" nil))) (defcustom which-key-popup-type 'side-window - "Supported types are minibuffer, side-window, frame, and custom" + "Supported types are minibuffer, side-window, frame, and custom." :group 'which-key :type '(radio (const :tag "Show in minibuffer" minibuffer) (const :tag "Show in side window" side-window) @@ -272,7 +272,7 @@ and nil. Nil turns the feature off." (const :tag "Use your custom display functions" custom))) (defcustom which-key-min-display-lines 1 - "Minimum number of horizontal lines to display in the which-key buffer" + "Minimum number of horizontal lines to display in the which-key buffer." :group 'which-key :type 'integer) @@ -284,9 +284,9 @@ nil means don't impose a maximum." (defcustom 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. You can also specify -a list of two locations, like (right bottom). In this case, the -first location is tried. If there is not enough room, the second +Should be one of top, bottom, left or right. You can also specify +a list of two locations, like (right bottom). In this case, the +first location is tried. If there is not enough room, the second location is tried." :group 'which-key :type '(radio (const right) @@ -419,7 +419,7 @@ using C-h. \(setq `which-key-idle-secondary-delay' 0.05) Note that `which-key-idle-delay' should be set before turning on -`which-key-mode'. " +`which-key-mode'." :group 'which-key :type 'boolean) @@ -523,7 +523,7 @@ The delay time is effectively added to the normal (defcustom which-key-allow-regexps nil "A list of regexp strings to use to filter key sequences. When non-nil, for a key sequence to trigger the which-key popup -it must match one of the regexps in this list. The format of the +it must match one of the regexps in this list. The format of the key sequences is what is produced by `key-description'." :group 'which-key :type '(repeat regexp)) @@ -597,7 +597,7 @@ and it matches a string in `which-key-highlighted-command-list'." (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-faces) (defface which-key-special-key-face @@ -607,7 +607,7 @@ and it matches a string in `which-key-highlighted-command-list'." (defface which-key-docstring-face '((t . (:inherit which-key-note-face))) - "Face for docstrings" + "Face for docstrings." :group 'which-key-faces) ;;;; Custom popup @@ -802,7 +802,7 @@ problems at github.") (defun which-key-enable-god-mode-support (&optional disable) "Enable support for god-mode if non-nil. This is experimental, so you need to explicitly opt-in for -now. Please report any problems at github. If DISABLE is non-nil +now. Please report any problems at github. If DISABLE is non-nil disable support." (interactive "P") (setq which-key--god-mode-support-enabled (null disable)) @@ -921,7 +921,7 @@ if there is space and the bottom otherwise." ;;;###autoload (defun which-key-setup-minibuffer () "Apply suggested settings for minibuffer. -Do not use this setup if you use the paging commands. Instead use +Do not use this setup if you use the paging commands. Instead use `which-key-setup-side-window-bottom', which is nearly identical but more functional." (interactive) @@ -956,7 +956,7 @@ for REPLACEMENT will eventually be removed." (or (which-key--safe-lookup-key-description keymap key) (make-sparse-keymap)))) (t - (user-error "replacement is neither a cons cell or a string"))))) + (user-error "Replacement is neither a cons cell or a string"))))) (define-key keymap (kbd key) def)) (setq key (pop more) replacement (pop more)))) @@ -1521,7 +1521,7 @@ local bindings coming first. Within these categories order using (defun which-key--maybe-replace (key-binding) "Use `which-key--replacement-alist' to maybe replace KEY-BINDING. KEY-BINDING is a cons cell of the form \(KEY . BINDING\) each of -which are strings. KEY is of the form produced by `key-binding'." +which are strings. KEY is of the form produced by `key-binding'." (let* ((replacer (if which-key-allow-multiple-replacements #'which-key--replace-in-repl-list-many #'which-key--replace-in-repl-list-once))) @@ -1709,7 +1709,7 @@ ORIGINAL-DESCRIPTION is the description given by (defun which-key--maybe-add-docstring (current original) "Maybe concat a docstring to CURRENT and return result. Specifically, do this if ORIGINAL is a command with a docstring -and `which-key-show-docstrings' is non-nil. If +and `which-key-show-docstrings' is non-nil. If `which-key-show-docstrings' is the symbol docstring-only, just return the docstring." (let* ((orig-sym (intern original)) @@ -1847,7 +1847,7 @@ Requires `which-key-compute-remaps' to be non-nil" (keymap &optional start prefix filter all evil) "Retrieve top-level bindings from KEYMAP. PREFIX limits bindings to those starting with this key -sequence. START is a list of existing bindings to add to. If ALL +sequence. START is a list of existing bindings to add to. If ALL is non-nil, recursively retrieve all bindings below PREFIX. If EVIL is non-nil, extract active evil bidings." (let ((bindings start) @@ -2245,7 +2245,7 @@ enough space based on your settings and frame size." prefix-keys) (defun which-key-reload-key-sequence (&optional key-seq) "Simulate entering the key sequence KEY-SEQ. KEY-SEQ should be a list of events as produced by -`listify-key-sequence'. If nil, KEY-SEQ defaults to +`listify-key-sequence'. If nil, KEY-SEQ defaults to `which-key--current-key-list'. Any prefix arguments that were used are reapplied to the new key sequence." (let* ((key-seq (or key-seq (which-key--current-key-list))) From f2eae30c62a347dade351c9d39a34258b9fd094d Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 8 Feb 2024 21:36:45 -0500 Subject: [PATCH 761/816] Format first sentences of docstrings. Ensure a complete sentence (at least a phrase with a period at the end) that fits on one line. --- which-key.el | 279 +++++++++++++++++++++++++-------------------------- 1 file changed, 136 insertions(+), 143 deletions(-) diff --git a/which-key.el b/which-key.el index 4a19d1622f6..cf0c723f4fe 100644 --- a/which-key.el +++ b/which-key.el @@ -66,11 +66,10 @@ recommended :type 'float) (defcustom which-key-idle-secondary-delay nil - "Once the which-key buffer shows once for a key sequence reduce -the idle time to this amount (in seconds). This makes it possible -to shorten the delay for subsequent popups in the same key -sequence. The default is for this value to be nil, which disables -this behavior." + "Seconds to wait for which-key to pop up after initial display. +This makes it possible to shorten the delay for subsequent popups +in the same key sequence. The default is for this value to be +nil, which disables this behavior." :group 'which-key :type '(choice float (const :tag "Disabled" nil))) @@ -106,8 +105,7 @@ before. Truncation is done using `which-key-ellipsis'." :type 'integer) (defcustom which-key-add-column-padding 0 - "Additional padding (number of spaces) to add to the left of -each key column." + "Additional spaces to add to the left of each key column." :group 'which-key :type 'integer) @@ -134,9 +132,9 @@ of the which-key popup." (defcustom which-key-separator (if which-key-dont-use-unicode " : " " → ") - "Separator to use between key and description. Default is \" → -\", unless `which-key-dont-use-unicode' is non nil, in which case -the default is \" : \"." + "Separator to use between key and description. +Default is \" → \", unless `which-key-dont-use-unicode' is non +nil, in which case the default is \" : \"." :group 'which-key :type 'string) @@ -150,14 +148,15 @@ string to truncate without using any ellipsis." :type 'string) (defcustom which-key-prefix-prefix "+" - "String to insert in front of prefix commands (i.e., commands -that represent a sub-map). Default is \"+\"." + "Prefix string to indicate a key bound to a keymap. +Default is \"+\"." :group 'which-key :type 'string) (defcustom which-key-compute-remaps nil - "If non-nil, show remapped command if a command has been -remapped given the currently active keymaps." + "If non-nil, show remapped commands. +This applies to commands that have been remapped given the +currently active keymaps." :group 'which-key :type 'boolean) @@ -168,9 +167,8 @@ remapped given the currently active keymaps." '((("") . ("←")) (("") . ("→")))) (("<\\([[:alnum:]-]+\\)>") . ("\\1")))) - "Association list to determine how to manipulate descriptions -of key bindings in the which-key popup. Each element of the list -is a nested cons cell with the format + "ALIST for manipulating display of binding descriptions. +Each element of the list is a nested cons cell with the format \(MATCH CONS . REPLACEMENT\). @@ -207,20 +205,21 @@ non-nil value." (choice string (const nil))))) (defcustom which-key-allow-multiple-replacements nil - "Allow a key binding to match and be modified by multiple -elements in `which-key-replacement-alist' if non-nil. When nil, -only the first match is used to perform replacements from + "Allow a key binding to be modified by multiple elements. +When non-nil, this allows a single key binding to match multiple +patterns in `which-key-replacement-alist'. When nil, only the +first match is used to perform replacements from `which-key-replacement-alist'." :group 'which-key :type 'boolean) (defcustom which-key-show-docstrings nil - "If non-nil, show each command's docstring next to the command -in the which-key buffer. This will only display the docstring up -to the first line break. If you set this variable to the symbol -docstring-only, then the command's name with be omitted. You -probably also want to adjust `which-key-max-description-length' -at the same time if you use this feature." + "If non-nil, show each command's docstring in the which-key popup. +This will only display the docstring up to the first line +break. If you set this variable to the symbol docstring-only, +then the command's name with be omitted. You probably also want +to adjust `which-key-max-description-length' at the same time if +you use this feature." :group 'which-key :type '(radio (const :tag "Do not show docstrings" nil) @@ -228,9 +227,9 @@ at the same time if you use this feature." (const :tag "Replace command name with docstring" docstring-only))) (defcustom which-key-highlighted-command-list '() - "A list of strings and/or cons cells used to highlight certain -commands. If the element is a string, assume it is a regexp -pattern for matching command names and use + "Rules used to highlight certain commands. +If the element is a string, assume it is a regexp pattern for +matching command names and use `which-key-highlighted-command-face' for any matching names. If the element is a cons cell, it should take the form (regexp . face to apply)." @@ -238,9 +237,9 @@ face to apply)." :type '(repeat (choice string (cons regexp face)))) (defcustom which-key-special-keys '() - "These keys will automatically be truncated to one character -and have `which-key-special-key-face' applied to them. This is -disabled by default. Try this to see the effect. + "These keys will automatically be truncated to one character. +They also have `which-key-special-key-face' applied to them. This +is disabled by default. An example configuration is \(setq which-key-special-keys \\='(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)" :group 'which-key @@ -252,7 +251,7 @@ disabled by default. Try this to see the effect. :type 'string) (defcustom which-key-show-prefix 'echo - "Whether to and where to display the current prefix sequence + "Whether to and where to display the current prefix sequence. Possible choices are echo for echo area (the default), left, top and nil. Nil turns the feature off." :group 'which-key @@ -277,8 +276,8 @@ and nil. Nil turns the feature off." :type 'integer) (defcustom which-key-max-display-columns nil - "Maximum number of columns to display in the which-key buffer -nil means don't impose a maximum." + "Maximum number of columns to display in the which-key buffer. +A value of nil means don't impose a maximum." :group 'which-key :type '(choice integer (const :tag "Unbounded" nil))) @@ -297,9 +296,9 @@ location is tried." (const (bottom right)))) (defcustom which-key-side-window-slot 0 - "The `slot' to use for `display-buffer-in-side-window' when -`which-key-popup-type' is `side-window'. Quoting from the -docstring of `display-buffer-in-side-window', + "The `slot' to use for `display-buffer-in-side-window'. +This applies when `which-key-popup-type' is `side-window'. +Quoting from the docstring of `display-buffer-in-side-window', `slot' if non-nil, specifies the window slot where to display BUFFER. A value of zero or nil means use the middle slot on the @@ -311,14 +310,14 @@ the right of) the middle slot. The default is zero." :type 'integer) (defcustom which-key-side-window-max-width 0.333 - "Maximum width of which-key popup when type is side-window + "Maximum width of which-key popup when type is side-window. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's width." :group 'which-key :type 'float) (defcustom which-key-side-window-max-height 0.25 - "Maximum height of which-key popup when type is side-window + "Maximum height of which-key popup when type is side-window. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's height." :group 'which-key @@ -335,9 +334,9 @@ a percentage out of the frame's height." :type 'integer) (defcustom which-key-allow-imprecise-window-fit (not (display-graphic-p)) - "If non-nil allow which-key to use a less intensive method of -fitting the popup window to the buffer. If you are noticing lag -when the which-key popup displays turning this on may help. + "Allow which-key to use a simpler method for resizing the popup. +If you are noticing lag when the which-key popup displays turning +this on may help. See https://github.com/justbur/emacs-which-key/issues/130 and https://github.com/justbur/emacs-which-key/issues/225." @@ -351,8 +350,9 @@ and https://github.com/justbur/emacs-which-key/issues/225." (const :tag "No" nil))) (defcustom which-key-sort-order 'which-key-key-order - "If nil, do not resort the output from -`describe-buffer-bindings' which groups by mode. Ordering options + "Order in which the key bindings are sorted. +If nil, do not resort the output from `describe-buffer-bindings' +which groups by mode. Ordering options are 1. `which-key-key-order': by key (default) @@ -371,9 +371,9 @@ information." (function-item which-key-local-then-key-order))) (defcustom which-key-sort-uppercase-first t - "If non-nil, uppercase comes before lowercase in sorting -function chosen in `which-key-sort-order'. Otherwise, the order -is reversed." + "If non-nil, uppercase comes before lowercase in sorting. +This applies to the function chosen in +`which-key-sort-order'. Otherwise, the order is reversed." :group 'which-key :type 'boolean) @@ -383,8 +383,8 @@ is reversed." :type '(repeat string)) (defcustom which-key-paging-key "" - "Key to use for changing pages. Bound after each of the -prefixes in `which-key-paging-prefixes'" + "Key to use for changing pages. +Bound after each of the prefixes in `which-key-paging-prefixes'" :group 'which-key :type 'string) @@ -400,18 +400,18 @@ prefixes in `which-key-paging-prefixes'" ;; :type '(repeat symbol)) (defcustom which-key-use-C-h-commands t - "Use C-h (or whatever `help-char' is set to) for paging if -non-nil. Normally C-h after a prefix calls + "Use C-h (`help-char') for paging if non-nil. +Normally `help-char' after a prefix calls `describe-prefix-bindings'. This changes that command to a which-key paging command when which-key-mode is active." :group 'which-key :type 'boolean) (defcustom which-key-show-early-on-C-h nil - "Show the which-key buffer before if C-h (or whatever -`help-char' is set to) is pressed in the middle of a prefix -before the which-key buffer would normally be triggered through -the idle delay. If combined with the following settings, + "Allow C-h (`help-char') to trigger which-key popup before timer. +Show the which-key buffer if `help-char' is pressed in the middle +of a prefix before the which-key buffer would normally be +triggered by the time. If combined with the following settings, which-key will effectively only show when triggered \"manually\" using C-h. @@ -429,10 +429,12 @@ Note that `which-key-idle-delay' should be set before turning on :type 'boolean) (defcustom which-key-preserve-window-configuration nil - "If non-nil, save window configuration before which-key buffer is shown -and restore it after which-key buffer is hidden. It prevents which-key from -changing window position of visible buffers. -Only takken into account when popup type is side-window." + "Save and restore window configuration around which-key popup display. +If non-nil, save window configuration before which-key buffer is +shown and restore it after which-key buffer is hidden. It +prevents which-key from changing window position of visible +buffers. Only takken into account when popup type is +side-window." :group 'which-key :type 'boolean) @@ -453,8 +455,8 @@ Only takken into account when popup type is side-window." which-key-separator "abort" " 1..9" which-key-separator "digit-arg") - "Prompt to display when invoking `which-key-C-h-map'. This string -is fed into `substitute-command-keys'") + "Prompt to display when invoking `which-key-C-h-map'. +This string is fed into `substitute-command-keys'") (defvar which-key-C-h-map (let ((map (make-sparse-keymap))) @@ -506,7 +508,8 @@ See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" :type 'boolean) (defcustom which-key-delay-functions nil - "A list of functions that may decide whether to delay the + "List of functions that may delay the which-key popup. +A list of functions that may decide whether to delay the which-key popup based on the current incomplete key sequence. Each function in the list is run with two arguments, the current key sequence as produced by `key-description' and the @@ -529,11 +532,10 @@ key sequences is what is produced by `key-description'." :type '(repeat regexp)) (defcustom which-key-inhibit-regexps nil - "Similar to `which-key-allow-regexps', a list of regexp strings -to use to filter key sequences. When non-nil, for a key sequence -to trigger the which-key popup it cannot match one of the regexps -in this list. The format of the key sequences is what is produced -by `key-description'." + "A list of regexp strings to use to filter key sequences. +When non-nil, for a key sequence to trigger the which-key popup +it cannot match one of the regexps in this list. The format of +the key sequences is what is produced by `key-description'." :group 'which-key :type '(repeat regexp)) @@ -613,7 +615,7 @@ and it matches a string in `which-key-highlighted-command-list'." ;;;; Custom popup (defcustom which-key-custom-popup-max-dimensions-function nil - "Variable to hold a custom max-dimensions function. + "Set a custom max-dimensions function. Will be passed the width of the active window and is expected to return the maximum height in lines and width in characters of the which-key popup in the form a cons cell (height . width)." @@ -621,13 +623,13 @@ which-key popup in the form a cons cell (height . width)." :type '(choice function (const nil))) (defcustom which-key-custom-hide-popup-function nil - "Variable to hold a custom hide-popup function. + "Set a custom hide-popup function. It takes no arguments and the return value is ignored." :group 'which-key :type '(choice function (const nil))) (defcustom which-key-custom-show-popup-function nil - "Variable to hold a custom show-popup function. + "Set a custom show-popup function. Will be passed the required dimensions in the form (height . width) in lines and characters respectively. The return value is ignored." @@ -640,15 +642,16 @@ ignored." :type 'string) (defvar which-key-inhibit nil - "Prevent which-key from popping up momentarily by setting this -to a non-nil value for the execution of a command. Like this + "Prevent which-key from popping up momentarily. +This can be used by setting this to a non-nil value for the +execution of a command, as in \(let \(\(which-key-inhibit t\)\) ...\)") (defvar which-key-keymap-history nil - "History of keymap selections in functions like -`which-key-show-keymap'.") + "History of keymap selections. +Used in functions like `which-key-show-keymap'.") ;;; Internal Vars @@ -775,22 +778,21 @@ operators." :type 'boolean) (defcustom which-key-show-operator-state-maps nil - "Experimental: Try to show the right keys following an evil -command that reads a motion, such as \"y\", \"d\" and \"c\" from -normal state. This is experimental, because there might be some -valid keys missing and it might be showing some invalid keys." + "Show the keys following an evil command that reads a motion. +These are commands typically mapped to keys such as \"y\", \"d\" +and \"c\" from normal state. This is experimental, because there +might be some valid keys missing and it might be showing some +invalid keys." :group 'which-key :type 'boolean) ;;;; God-mode (defvar which-key--god-mode-support-enabled nil - "Support god-mode if non-nil. This is experimental, -so you need to explicitly opt-in for now. Please report any -problems at github.") + "Support god-mode if non-nil.") (defvar which-key--god-mode-key-string nil - "Holds key string to use for god-mode support.") + "String to use for god-mode support.") (defun which-key--god-mode-lookup-command-advice (orig-fun arg1 &rest args) (setq which-key--god-mode-key-string arg1) @@ -873,8 +875,8 @@ disable support." (run-hooks 'which-key-init-buffer-hook)))) (defun which-key--setup-echo-keystrokes () - "Reduce `echo-keystrokes' if necessary (it will interfere if -it's set too high)." + "Reduce `echo-keystrokes' if necessary. +It will interfere if set too high." (when (and echo-keystrokes (> (abs (- echo-keystrokes which-key-echo-keystrokes)) 0.000001)) (if (> which-key-idle-delay which-key-echo-keystrokes) @@ -883,7 +885,8 @@ it's set too high)." echo-keystrokes which-key-echo-keystrokes)))) (defun which-key-remove-default-unicode-chars () - "Use of `which-key-dont-use-unicode' is preferred to this + "Remove default unicode chars from settings. +Use of `which-key-dont-use-unicode' is preferred to this function, but it's included here in case someone cannot set that variable early enough in their configuration, if they are using a starter kit for example." @@ -894,7 +897,7 @@ starter kit for example." ;;;###autoload (defun which-key-setup-side-window-right () - "Apply suggested settings for side-window that opens on right." + "Set up side-window on right." (interactive) (setq which-key-popup-type 'side-window which-key-side-window-location 'right @@ -902,8 +905,8 @@ starter kit for example." ;;;###autoload (defun which-key-setup-side-window-right-bottom () - "Apply suggested settings for side-window that opens on right -if there is space and the bottom otherwise." + "Set up side-window on right if space allows. +Otherwise, use bottom." (interactive) (setq which-key-popup-type 'side-window which-key-side-window-location '(right bottom) @@ -911,7 +914,7 @@ if there is space and the bottom otherwise." ;;;###autoload (defun which-key-setup-side-window-bottom () - "Apply suggested settings for side-window that opens on bottom." + "Set up side-window that opens on bottom." (interactive) (which-key--setup-echo-keystrokes) (setq which-key-popup-type 'side-window @@ -920,7 +923,7 @@ if there is space and the bottom otherwise." ;;;###autoload (defun which-key-setup-minibuffer () - "Apply suggested settings for minibuffer. + "Set up minibuffer display. Do not use this setup if you use the paging commands. Instead use `which-key-setup-side-window-bottom', which is nearly identical but more functional." @@ -1049,7 +1052,7 @@ If AT-ROOT is non-nil the binding is also placed at the root of MAP." ;;; Functions for computing window sizes (defun which-key--text-width-to-total (text-width) - "Convert window text-width to window total-width. + "Convert window TEXT-WIDTH to window total-width. TEXT-WIDTH is the desired text width of the window. The function calculates what total width is required for a window in the selected to have a text-width of TEXT-WIDTH columns. The @@ -1065,7 +1068,7 @@ width as the frame." 3))) (defun which-key--total-width-to-text (total-width) - "Convert window total-width to window text-width. + "Convert window TOTAL-WIDTH to window text-width. TOTAL-WIDTH is the desired total width of the window. The function calculates what text width fits such a window. The calculation considers possible fringes and scroll bars. This function assumes that the desired window has the same @@ -1135,8 +1138,7 @@ total height." (which-key--hide-popup-ignore-command))) (defun which-key--hide-popup-ignore-command () - "Version of `which-key--hide-popup' without the check of -`real-this-command'." + "`which-key--hide-popup' without the check of `real-this-command'." (cl-case which-key-popup-type ;; Not necessary to hide minibuffer ;; (minibuffer (which-key--hide-buffer-minibuffer)) @@ -1288,7 +1290,8 @@ call signature in different emacs versions" ;;; Max dimension of available window functions (defun which-key--popup-max-dimensions () - "Dimesion functions should return the maximum possible (height + "Return maximum dimension available for popup. +Dimesion functions should return the maximum possible (height . width) of the intended popup. SELECTED-WINDOW-WIDTH is the width of currently active window, not the which-key buffer window." @@ -1312,8 +1315,9 @@ Measured in lines and characters respectively." (max 0 (- (frame-text-cols) which-key-unicode-correction)))) (defun which-key--side-window-max-dimensions () - "Return max-dimensions of the side-window popup (height . -width) in lines and characters respectively." + "Return max-dimensions of the side-window popup. +The return value should be (height . width) in lines and +characters respectively." (cons ;; height (if (member which-key-side-window-location '(left right)) @@ -1336,8 +1340,9 @@ width) in lines and characters respectively." which-key-unicode-correction)))) (defun which-key--frame-max-dimensions () - "Return max-dimensions of the frame popup (height . -width) in lines and characters respectively." + "Return max-dimensions of the frame popup. +The return value should be (height . width) in lines and +characters respectively." (cons which-key-frame-max-height which-key-frame-max-width)) ;;; Sorting functions @@ -1363,8 +1368,8 @@ width) in lines and characters respectively." (t (string-lessp a b))))) (defun which-key--key-description< (a b &optional alpha) - "Sorting function used for `which-key-key-order' and -`which-key-key-order-alpha'." + "Key sorting function. +Used for `which-key-key-order' and `which-key-key-order-alpha'." (save-match-data (let* ((a (which-key--extract-key a)) (b (which-key--extract-key b)) @@ -1435,9 +1440,8 @@ Uses `string-lessp' after applying lowercase." (keymapp (intern description)))) (defun which-key-prefix-then-key-order (acons bcons) - "Order first by whether A and/or B is a prefix with no prefix -coming before a prefix. Within these categories order using -`which-key-key-order'." + "Order prefixes before non-prefixes. +Within these categories order using `which-key-key-order'." (let ((apref? (which-key--group-p (cdr acons))) (bpref? (which-key--group-p (cdr bcons)))) (if (not (eq apref? bpref?)) @@ -1445,9 +1449,8 @@ coming before a prefix. Within these categories order using (which-key-key-order acons bcons)))) (defun which-key-prefix-then-key-order-reverse (acons bcons) - "Order first by whether A and/or B is a prefix with prefix -coming before a prefix. Within these categories order using -`which-key-key-order'." + "Order prefixes before non-prefixes. +Within these categories order using `which-key-key-order'." (let ((apref? (which-key--group-p (cdr acons))) (bpref? (which-key--group-p (cdr bcons)))) (if (not (eq apref? bpref?)) @@ -1455,9 +1458,8 @@ coming before a prefix. Within these categories order using (which-key-key-order acons bcons)))) (defun which-key-local-then-key-order (acons bcons) - "Order first by whether A and/or B is a local binding with -local bindings coming first. Within these categories order using -`which-key-key-order'." + "Order local bindings before non-local ones. +Within these categories order using `which-key-key-order'." (let ((aloc? (which-key--local-binding-p acons)) (bloc? (which-key--local-binding-p bcons))) (if (not (eq aloc? bloc?)) @@ -1662,10 +1664,10 @@ cell" el))))) (defun which-key--propertize-description (description group local hl-face &optional original-description) - "Add face to DESCRIPTION where the face chosen depends on -whether the description represents a group or a command. Also -make some minor adjustments to the description string, like -removing a \"group:\" prefix. + "Add face to DESCRIPTION. +The face chosen depends on whether the description represents a +group or a command. Also make some minor adjustments to the +description string, like removing a \"group:\" prefix. ORIGINAL-DESCRIPTION is the description given by `describe-buffer-bindings'." @@ -1736,7 +1738,8 @@ return the docstring." (format "%s %s" current docstring))))) (defun which-key--format-and-replace (unformatted &optional preserve-full-key) - "Take a list of (key . desc) cons cells in UNFORMATTED, add + "Make list of key bindings with separators and descriptions. +Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement alists. Returns a list (key separator description)." (let ((sep-w-face @@ -1774,8 +1777,7 @@ alists. Returns a list (key separator description)." (defun which-key--compute-binding (binding) "Replace BINDING with remapped binding if it exists. - -Requires `which-key-compute-remaps' to be non-nil" +Requires `which-key-compute-remaps' to be non-nil." (let (remap) (if (and which-key-compute-remaps (setq remap (command-remapping binding))) @@ -1909,14 +1911,14 @@ non-nil, then bindings are collected recursively for all prefixes." (mapconcat (lambda (row) (mapconcat #'identity row " ")) rows "\n"))) (defsubst which-key--max-len (keys index &optional initial-value) - "Internal function for finding the max length of the INDEX -element in each list element of KEYS." + "Find the max length of the INDEX element in each of KEYS." (cl-reduce (lambda (x y) (max x (which-key--string-width (nth index y)))) keys :initial-value (if initial-value initial-value 0))) (defun which-key--pad-column (col-keys avl-width) - "Take a column of (key separator description) COL-KEYS, + "Pad cells of COL-KEYS to AVL-WIDTH. +Take a column of (key separator description) COL-KEYS, calculate the max width in the column and pad all cells out to that width." (let* ((col-key-width (+ which-key-add-column-padding @@ -2111,8 +2113,8 @@ max-lines max-width avl-lines avl-width (which-key--pages-height result)) (_ (format " %s" prefix-arg)))))))) (defun which-key--full-prefix (prefix-keys &optional -prefix-arg dont-prop-keys) - "Return a description of the full key sequence up to now, -including prefix arguments." + "Return a description of the full key sequence up to now. +Include prefix arguments." (let* ((left (eq which-key-show-prefix 'left)) (prefix-arg (if -prefix-arg -prefix-arg prefix-arg)) (str (concat @@ -2137,9 +2139,9 @@ including prefix arguments." map))) (defun which-key--process-page (pages-obj) - "Add information to the basic list of key bindings, including -if applicable the current prefix, the name of the current prefix, -and a page count." + "Add information to the basic list of key bindings. +Include, if applicable, the current prefix, the name of the current +prefix, and a page count." (let* ((page (car (which-key--pages-pages pages-obj))) (height (which-key--pages-height pages-obj)) (n-pages (which-key--pages-num-pages pages-obj)) @@ -2285,8 +2287,7 @@ Usually this is `describe-prefix-bindings'." ;;;###autoload (defun which-key-show-next-page-no-cycle () - "Show next page of keys unless on the last page, in which case -call `which-key-show-standard-help'." + "Show next page of keys or `which-key-show-standard-help'." (interactive) (let ((which-key-inhibit t)) (if (which-key--on-last-page) @@ -2295,8 +2296,7 @@ call `which-key-show-standard-help'." ;;;###autoload (defun which-key-show-previous-page-no-cycle () - "Show previous page of keys unless on the first page, in which -case do nothing." + "Show previous page of keys if one exists." (interactive) (let ((which-key-inhibit t)) (unless (which-key--on-first-page) @@ -2304,16 +2304,14 @@ case do nothing." ;;;###autoload (defun which-key-show-next-page-cycle (&optional _) - "Show the next page of keys, cycling from end to beginning -after last page." + "Show the next page of keys, cycling from end to beginning." (interactive) (let ((which-key-inhibit t)) (which-key-turn-page 1))) ;;;###autoload (defun which-key-show-previous-page-cycle (&optional _) - "Show the previous page of keys, cycling from beginning to end -after first page." + "Show the previous page of keys, cycling from beginning to end." (interactive) (let ((which-key-inhibit t)) (which-key-turn-page -1))) @@ -2327,7 +2325,6 @@ after first page." ;;;###autoload (defun which-key-show-major-mode (&optional all) "Show top-level bindings in the map of the current major mode. - This function will also detect evil bindings made using `evil-define-key' in this map. These bindings will depend on the current evil state. " @@ -2344,7 +2341,6 @@ current evil state. " ;;;###autoload (defun which-key-show-full-major-mode () "Show all bindings in the map of the current major mode. - This function will also detect evil bindings made using `evil-define-key' in this map. These bindings will depend on the current evil state. " @@ -2354,7 +2350,6 @@ current evil state. " ;;;###autoload (defun which-key-dump-bindings (prefix buffer-name) "Dump bindings from PREFIX into buffer named BUFFER-NAME. - PREFIX should be a string suitable for `kbd'." (interactive "sPrefix: \nB") (let* ((buffer (get-buffer-create buffer-name)) @@ -2409,9 +2404,9 @@ PREFIX should be a string suitable for `kbd'." ;;;###autoload (defun which-key-C-h-dispatch () - "Dispatch C-h commands by looking up key in -`which-key-C-h-map'. This command is always accessible (from any -prefix) if `which-key-use-C-h-commands' is non nil." + "Dispatch C-h commands by looking up key in `which-key-C-h-map'. +This command is always accessible (from any prefix) if +`which-key-use-C-h-commands' is non nil." (interactive) (cond ((and (not (which-key--popup-showing-p)) which-key-show-early-on-C-h) @@ -2460,7 +2455,6 @@ prefix) if `which-key-use-C-h-commands' is non nil." (defun which-key--try-2-side-windows (bindings prefix-keys prefix-title loc1 loc2 &rest _ignore) "Try to show BINDINGS (PAGE-N) in LOC1 first. - Only if no bindings fit fallback to LOC2." (let (pages1) (let ((which-key-side-window-location loc1) @@ -2655,8 +2649,7 @@ Finally, show the buffer." this-command-keys)) (defun which-key--update () - "Function run by timer to possibly trigger -`which-key--create-buffer-and-show'." + "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." (let ((prefix-keys (which-key--this-command-keys)) delay-time) (cond ((and (> (length prefix-keys) 0) From 5bffdf94d8a760a15e7c9bb8e12136fce127bdac Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Mon, 19 Feb 2024 23:41:28 +0000 Subject: [PATCH 762/816] Add a :version tag to all defcustom's and defface's * which-key.el: add :version tag to all following (which-key-idle-delay): (which-key-idle-secondary-delay): (which-key-echo-keystrokes): (which-key-max-description-length): (which-key-min-column-description-width): (which-key-add-column-padding): (which-key-unicode-correction): (which-key-dont-use-unicode): (which-key-separator): (which-key-ellipsis): (which-key-prefix-prefix): (which-key-compute-remaps): (which-key-replacement-alist): (which-key-allow-multiple-replacements): (which-key-show-docstrings): (which-key-highlighted-command-list): (which-key-special-keys): (which-key-buffer-name): (which-key-show-prefix): (which-key-popup-type): (which-key-min-display-lines): (which-key-max-display-columns): (which-key-side-window-location): (which-key-side-window-slot): (which-key-side-window-max-width): (which-key-side-window-max-height): (which-key-frame-max-width): (which-key-frame-max-height): (which-key-allow-imprecise-window-fit): (which-key-show-remaining-keys): (which-key-sort-order): (which-key-sort-uppercase-first): (which-key-paging-prefixes): (which-key-paging-key): (which-key-use-C-h-commands): (which-key-show-early-on-C-h): (which-key-is-verbose): (which-key-preserve-window-configuration): (which-key-hide-alt-key-translations): (which-key-delay-functions): (which-key-allow-regexps): (which-key-inhibit-regexps): (which-key-show-transient-maps): (which-key-init-buffer-hook): (which-key-key-face): (which-key-separator-face): (which-key-note-face): (which-key-command-description-face): (which-key-local-map-description-face): (which-key-highlighted-command-face): (which-key-group-description-face): (which-key-special-key-face): (which-key-docstring-face): (which-key-custom-popup-max-dimensions-function): (which-key-custom-hide-popup-function): (which-key-custom-show-popup-function): (which-key-lighter): (which-key-allow-evil-operators): (which-key-show-operator-state-maps): --- which-key.el | 177 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 118 insertions(+), 59 deletions(-) diff --git a/which-key.el b/which-key.el index cf0c723f4fe..0e6870aa8b8 100644 --- a/which-key.el +++ b/which-key.el @@ -63,7 +63,8 @@ A value of zero might lead to issues, so a non-zero value is recommended (see https://github.com/justbur/emacs-which-key/issues/134)." :group 'which-key - :type 'float) + :type 'float + :version "1.0") (defcustom which-key-idle-secondary-delay nil "Seconds to wait for which-key to pop up after initial display. @@ -71,7 +72,8 @@ This makes it possible to shorten the delay for subsequent popups in the same key sequence. The default is for this value to be nil, which disables this behavior." :group 'which-key - :type '(choice float (const :tag "Disabled" nil))) + :type '(choice float (const :tag "Disabled" nil)) + :version "1.0") (defcustom which-key-echo-keystrokes (if (and echo-keystrokes (> (+ echo-keystrokes 0.01) @@ -84,7 +86,8 @@ This only applies if `which-key-popup-type' is minibuffer or `which-key-idle-delay' or else the keystroke echo will erase the which-key popup." :group 'which-key - :type 'float) + :type 'float + :version "1.0") (defcustom which-key-max-description-length 27 "Truncate the description of keys to this length. @@ -97,17 +100,20 @@ before. Truncation is done using `which-key-ellipsis'." :type '(choice (const :tag "Disable truncation" nil) (integer :tag "Width in characters") (float :tag "Use fraction of available width") - function)) + function) + :version "1.0") (defcustom which-key-min-column-description-width 0 "Every column should at least have this width." :group 'which-key - :type 'integer) + :type 'integer + :version "1.0") (defcustom which-key-add-column-padding 0 "Additional spaces to add to the left of each key column." :group 'which-key - :type 'integer) + :type 'integer + :version "1.0") (defcustom which-key-unicode-correction 3 "Correction for wide unicode characters. @@ -123,12 +129,14 @@ additional ASCII character in the which-key buffer. Increase this number if you are seeing characters get cutoff on the right side of the which-key popup." :group 'which-key - :type 'integer) + :type 'integer + :version "1.0") (defcustom which-key-dont-use-unicode nil "If non-nil, don't use any unicode characters in default setup." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-separator (if which-key-dont-use-unicode " : " " → ") @@ -136,7 +144,8 @@ of the which-key popup." Default is \" → \", unless `which-key-dont-use-unicode' is non nil, in which case the default is \" : \"." :group 'which-key - :type 'string) + :type 'string + :version "1.0") (defcustom which-key-ellipsis (if which-key-dont-use-unicode ".." "…") @@ -145,20 +154,23 @@ Default is \"…\", unless `which-key-dont-use-unicode' is non nil, in which case the default is \"..\". This can also be the empty string to truncate without using any ellipsis." :group 'which-key - :type 'string) + :type 'string + :version "1.0") (defcustom which-key-prefix-prefix "+" "Prefix string to indicate a key bound to a keymap. Default is \"+\"." :group 'which-key - :type 'string) + :type 'string + :version "1.0") (defcustom which-key-compute-remaps nil "If non-nil, show remapped commands. This applies to commands that have been remapped given the currently active keymaps." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-replacement-alist (delq nil @@ -202,7 +214,8 @@ non-nil value." :type '(alist :key-type (cons (choice regexp (const nil)) (choice regexp (const nil))) :value-type (cons (choice string (const nil)) - (choice string (const nil))))) + (choice string (const nil)))) + :version "1.0") (defcustom which-key-allow-multiple-replacements nil "Allow a key binding to be modified by multiple elements. @@ -211,7 +224,8 @@ patterns in `which-key-replacement-alist'. When nil, only the first match is used to perform replacements from `which-key-replacement-alist'." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-show-docstrings nil "If non-nil, show each command's docstring in the which-key popup. @@ -224,7 +238,8 @@ you use this feature." :type '(radio (const :tag "Do not show docstrings" nil) (const :tag "Add docstring to command names" t) - (const :tag "Replace command name with docstring" docstring-only))) + (const :tag "Replace command name with docstring" docstring-only)) + :version "1.0") (defcustom which-key-highlighted-command-list '() "Rules used to highlight certain commands. @@ -234,7 +249,8 @@ matching command names and use the element is a cons cell, it should take the form (regexp . face to apply)." :group 'which-key - :type '(repeat (choice string (cons regexp face)))) + :type '(repeat (choice string (cons regexp face))) + :version "1.0") (defcustom which-key-special-keys '() "These keys will automatically be truncated to one character. @@ -243,12 +259,14 @@ is disabled by default. An example configuration is \(setq which-key-special-keys \\='(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)" :group 'which-key - :type '(repeat string)) + :type '(repeat string) + :version "1.0") (defcustom which-key-buffer-name " *which-key*" "Name of which-key buffer." :group 'which-key - :type 'string) + :type 'string + :version "1.0") (defcustom which-key-show-prefix 'echo "Whether to and where to display the current prefix sequence. @@ -260,7 +278,8 @@ and nil. Nil turns the feature off." (const :tag "In the last line" bottom) (const :tag "In the echo area" echo) (const :tag "In the mode-line" mode-line) - (const :tag "Hide" nil))) + (const :tag "Hide" nil)) + :version "1.0") (defcustom which-key-popup-type 'side-window "Supported types are minibuffer, side-window, frame, and custom." @@ -268,18 +287,21 @@ and nil. Nil turns the feature off." :type '(radio (const :tag "Show in minibuffer" minibuffer) (const :tag "Show in side window" side-window) (const :tag "Show in popup frame" frame) - (const :tag "Use your custom display functions" custom))) + (const :tag "Use your custom display functions" custom)) + :version "1.0") (defcustom which-key-min-display-lines 1 "Minimum number of horizontal lines to display in the which-key buffer." :group 'which-key - :type 'integer) + :type 'integer + :version "1.0") (defcustom which-key-max-display-columns nil "Maximum number of columns to display in the which-key buffer. A value of nil means don't impose a maximum." :group 'which-key - :type '(choice integer (const :tag "Unbounded" nil))) + :type '(choice integer (const :tag "Unbounded" nil)) + :version "1.0") (defcustom which-key-side-window-location 'bottom "Location of which-key popup when `which-key-popup-type' is side-window. @@ -293,7 +315,8 @@ location is tried." (const left) (const top) (const (right bottom)) - (const (bottom right)))) + (const (bottom right))) + :version "1.0") (defcustom which-key-side-window-slot 0 "The `slot' to use for `display-buffer-in-side-window'. @@ -307,31 +330,36 @@ preceding (that is, above or on the left of) the middle slot. A positive value means use a slot following (that is, below or on the right of) the middle slot. The default is zero." :group 'which-key - :type 'integer) + :type 'integer + :version "1.0") (defcustom which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's width." :group 'which-key - :type 'float) + :type 'float + :version "1.0") (defcustom which-key-side-window-max-height 0.25 "Maximum height of which-key popup when type is side-window. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's height." :group 'which-key - :type 'float) + :type 'float + :version "1.0") (defcustom which-key-frame-max-width 60 "Maximum width of which-key popup when type is frame." :group 'which-key - :type 'integer) + :type 'integer + :version "1.0") (defcustom which-key-frame-max-height 20 "Maximum height of which-key popup when type is frame." :group 'which-key - :type 'integer) + :type 'integer + :version "1.0") (defcustom which-key-allow-imprecise-window-fit (not (display-graphic-p)) "Allow which-key to use a simpler method for resizing the popup. @@ -341,13 +369,15 @@ this on may help. See https://github.com/justbur/emacs-which-key/issues/130 and https://github.com/justbur/emacs-which-key/issues/225." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-show-remaining-keys nil "Show remaining keys in last slot, when keys are hidden." :group 'which-key :type '(radio (const :tag "Yes" t) - (const :tag "No" nil))) + (const :tag "No" nil)) + :version "1.0") (defcustom which-key-sort-order 'which-key-key-order "Order in which the key bindings are sorted. @@ -368,25 +398,29 @@ information." (function-item which-key-key-order-alpha) (function-item which-key-description-order) (function-item which-key-prefix-then-key-order) - (function-item which-key-local-then-key-order))) + (function-item which-key-local-then-key-order)) + :version "1.0") (defcustom which-key-sort-uppercase-first t "If non-nil, uppercase comes before lowercase in sorting. This applies to the function chosen in `which-key-sort-order'. Otherwise, the order is reversed." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-paging-prefixes '() "Enable paging for these prefixes." :group 'which-key - :type '(repeat string)) + :type '(repeat string) + :version "1.0") (defcustom which-key-paging-key "" "Key to use for changing pages. Bound after each of the prefixes in `which-key-paging-prefixes'" :group 'which-key - :type 'string) + :type 'string + :version "1.0") ;; (defcustom which-key-undo-key nil ;; "Key (string) to use for undoing keypresses. Bound recursively @@ -405,7 +439,8 @@ Normally `help-char' after a prefix calls `describe-prefix-bindings'. This changes that command to a which-key paging command when which-key-mode is active." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-show-early-on-C-h nil "Allow C-h (`help-char') to trigger which-key popup before timer. @@ -421,12 +456,14 @@ using C-h. Note that `which-key-idle-delay' should be set before turning on `which-key-mode'." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-is-verbose nil "Whether to warn about potential mistakes in configuration." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-preserve-window-configuration nil "Save and restore window configuration around which-key popup display. @@ -437,7 +474,8 @@ buffers. Only takken into account when popup type is side-window." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defvar which-key-C-h-map-prompt (concat " \\" @@ -505,7 +543,8 @@ of terminals issue META modifier for the Alt key. See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-delay-functions nil "List of functions that may delay the which-key popup. @@ -521,7 +560,8 @@ this list to return a value is the value that is used. The delay time is effectively added to the normal `which-key-idle-delay'." :group 'which-key - :type '(repeat function)) + :type '(repeat function) + :version "1.0") (defcustom which-key-allow-regexps nil "A list of regexp strings to use to filter key sequences. @@ -529,7 +569,8 @@ When non-nil, for a key sequence to trigger the which-key popup it must match one of the regexps in this list. The format of the key sequences is what is produced by `key-description'." :group 'which-key - :type '(repeat regexp)) + :type '(repeat regexp) + :version "1.0") (defcustom which-key-inhibit-regexps nil "A list of regexp strings to use to filter key sequences. @@ -537,7 +578,8 @@ When non-nil, for a key sequence to trigger the which-key popup it cannot match one of the regexps in this list. The format of the key sequences is what is produced by `key-description'." :group 'which-key - :type '(repeat regexp)) + :type '(repeat regexp) + :version "1.0") (defcustom which-key-show-transient-maps nil "Show keymaps created by `set-transient-map' when applicable. @@ -546,7 +588,8 @@ More specifically, detect when `overriding-terminal-local-map' is set (this is the keymap used by `set-transient-map') and display it." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (make-obsolete-variable 'which-key-enable-extended-define-key @@ -557,7 +600,8 @@ it." (defcustom which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized." :group 'which-key - :type 'hook) + :type 'hook + :version "1.0") ;;;; Faces @@ -569,48 +613,57 @@ it." (defface which-key-key-face '((t . (:inherit font-lock-constant-face))) "Face for which-key keys" - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") (defface which-key-separator-face '((t . (:inherit font-lock-comment-face))) "Face for the separator (default separator is an arrow)" - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") (defface which-key-note-face '((t . (:inherit which-key-separator-face))) "Face for notes or hints occasionally provided" - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") (defface which-key-command-description-face '((t . (:inherit font-lock-function-name-face))) "Face for the key description when it is a command" - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") (defface which-key-local-map-description-face '((t . (:inherit which-key-command-description-face))) "Face for the key description when it is found in `current-local-map'" - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") (defface which-key-highlighted-command-face '((t . (:inherit which-key-command-description-face :underline t))) "Default face for the command description when it is a command and it matches a string in `which-key-highlighted-command-list'." - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") (defface which-key-group-description-face '((t . (:inherit font-lock-keyword-face))) "Face for the key description when it is a group or prefix." - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") (defface which-key-special-key-face '((t . (:inherit which-key-key-face :inverse-video t :weight bold))) "Face for special keys (SPC, TAB, RET)" - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") (defface which-key-docstring-face '((t . (:inherit which-key-note-face))) "Face for docstrings." - :group 'which-key-faces) + :group 'which-key-faces + :version "1.0") ;;;; Custom popup @@ -620,13 +673,15 @@ Will be passed the width of the active window and is expected to return the maximum height in lines and width in characters of the which-key popup in the form a cons cell (height . width)." :group 'which-key - :type '(choice function (const nil))) + :type '(choice function (const nil)) + :version "1.0") (defcustom which-key-custom-hide-popup-function nil "Set a custom hide-popup function. It takes no arguments and the return value is ignored." :group 'which-key - :type '(choice function (const nil))) + :type '(choice function (const nil)) + :version "1.0") (defcustom which-key-custom-show-popup-function nil "Set a custom show-popup function. @@ -634,12 +689,14 @@ Will be passed the required dimensions in the form (height . width) in lines and characters respectively. The return value is ignored." :group 'which-key - :type '(choice function (const nil))) + :type '(choice function (const nil)) + :version "1.0") (defcustom which-key-lighter " WK" "Minor mode lighter to use in the mode-line." :group 'which-key - :type 'string) + :type 'string + :version "1.0") (defvar which-key-inhibit nil "Prevent which-key from popping up momentarily. @@ -775,7 +832,8 @@ The popup is normally inhibited in the middle of commands, but setting this to non-nil will override this behavior for evil operators." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") (defcustom which-key-show-operator-state-maps nil "Show the keys following an evil command that reads a motion. @@ -784,7 +842,8 @@ and \"c\" from normal state. This is experimental, because there might be some valid keys missing and it might be showing some invalid keys." :group 'which-key - :type 'boolean) + :type 'boolean + :version "1.0") ;;;; God-mode From 5fd89e57ff66e9eabb082e486d170d741eb6cde2 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 20 Feb 2024 21:21:54 +0000 Subject: [PATCH 763/816] Mention affected settings of which-key-dont-use-unicode * which-key.el (which-key-separator): Improve docstring --- which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 0e6870aa8b8..45301725704 100644 --- a/which-key.el +++ b/which-key.el @@ -133,7 +133,9 @@ of the which-key popup." :version "1.0") (defcustom which-key-dont-use-unicode nil - "If non-nil, don't use any unicode characters in default setup." + "If non-nil, don't use any unicode characters in default setup. +For affected settings, see `which-key-replacement-alist', `which-key-ellipsis' +'which-key-separator'." :group 'which-key :type 'boolean :version "1.0") From bb61e985778fe63fece1a8a3f79ba5f5f190d2b8 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 20 Feb 2024 21:37:10 +0000 Subject: [PATCH 764/816] Simplify test for empty list * which-key.el (which-key--show-keymap): Use (null) --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 45301725704..2e3f6cb7f9c 100644 --- a/which-key.el +++ b/which-key.el @@ -2605,7 +2605,7 @@ KEYMAP is selected interactively by mode in (keymap-name keymap &optional prior-args all no-paging filter) (when prior-args (push prior-args which-key--prior-show-keymap-args)) (let ((bindings (which-key--get-bindings nil keymap filter all))) - (if (= (length bindings) 0) + (if (null bindings) (message "which-key: No bindings found in %s" keymap-name) (cond ((listp which-key-side-window-location) (setq which-key--last-try-2-loc From a192f73f596f91a67da726ad72f831318dc348d7 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 20 Feb 2024 23:09:17 +0000 Subject: [PATCH 765/816] Bump year to 2024 * which-key.el: Bump year --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 2e3f6cb7f9c..88cca1796a3 100644 --- a/which-key.el +++ b/which-key.el @@ -1,6 +1,6 @@ ;;; which-key.el --- Display available keybindings in popup -*- lexical-binding: t; -*- -;; Copyright (C) 2017-2021 Free Software Foundation, Inc. +;; Copyright (C) 2017-2024 Free Software Foundation, Inc. ;; Author: Justin Burkett ;; Maintainer: Justin Burkett From 673ae566ec483c8e2be4f076da9a54f5d905591a Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 20 Feb 2024 20:00:22 -0500 Subject: [PATCH 766/816] Remove "Internal" from docstrings of defvars The internal status is implied by the double hyphen in the name. --- which-key.el | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 88cca1796a3..e4e5aaadde3 100644 --- a/which-key.el +++ b/which-key.el @@ -715,26 +715,24 @@ Used in functions like `which-key-show-keymap'.") ;;; Internal Vars (defvar which-key--buffer nil - "Internal: Holds reference to which-key buffer.") + "Holds reference to which-key buffer.") (defvar which-key--timer nil - "Internal: Holds reference to open window timer.") + "Holds reference to open window timer.") (defvar which-key--secondary-timer-active nil - "Internal: Non-nil if the secondary timer is active.") + "Non-nil if the secondary timer is active.") (defvar which-key--paging-timer nil - "Internal: Holds reference to timer for paging.") + "Holds reference to timer for paging.") (defvar which-key--frame nil - "Internal: Holds reference to which-key frame. + "Holds reference to which-key frame. Used when `which-key-popup-type' is frame.") (defvar which-key--echo-keystrokes-backup nil - "Internal: Backup the initial value of `echo-keystrokes'.") + "Backup the initial value of `echo-keystrokes'.") (defvar which-key--prefix-help-cmd-backup nil - "Internal: Backup the value of `prefix-help-command'.") + "Backup the value of `prefix-help-command'.") (defvar which-key--last-try-2-loc nil - "Internal: Last location of side-window when two locations -used.") + "Last location of side-window when two locations used.") (defvar which-key--automatic-display nil - "Internal: Non-nil if popup was triggered with automatic -update.") + "Non-nil if popup was triggered with automatic update.") (defvar which-key--debug-buffer-name nil "If non-nil, use this buffer for debug messages.") (defvar which-key--multiple-locations nil) From 5fbdf05351e77ee62e3933c7b5f46459693bd04c Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 20 Feb 2024 20:38:30 -0500 Subject: [PATCH 767/816] Disentangle third party libraries (but keep support for now) Add `which-key-inhibit-display-hook' to allow third-party libraries to prevent which-key from displaying in certain circumstances. Add `which-key-this-command-keys-function' as a customizable variable to allow third-party libraries to teach which-key about custom symbols they insert into the key sequence. Add `which-key-evil-this-operator-p', `which-key-god-mode-self-insert-p' and `which-key--god-mode-this-command-keys' to provide support for god-mode and evil using the new mechanisms. --- which-key.el | 96 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 70 insertions(+), 26 deletions(-) diff --git a/which-key.el b/which-key.el index e4e5aaadde3..d07c9f9d62b 100644 --- a/which-key.el +++ b/which-key.el @@ -708,6 +708,15 @@ execution of a command, as in \(let \(\(which-key-inhibit t\)\) ...\)") +(defcustom which-key-inhibit-display-hook nil + "Hook run before display of which-key popup. +Each function in the hook is run before displaying the which-key +popup. If any function returns a non-nil value, the popup will +not display." + :group 'which-key + :type 'hook + :version "1.0") + (defvar which-key-keymap-history nil "History of keymap selections. Used in functions like `which-key-show-keymap'.") @@ -822,6 +831,27 @@ should be formatted as an input for `kbd'." result))))) ;;; Third-party library support + +(defun which-key--this-command-keys () + "Version of `this-single-command-keys' corrected for key-chords." + (let ((this-command-keys (this-single-command-keys))) + (when (and (vectorp this-command-keys) + (> (length this-command-keys) 0) + (eq (aref this-command-keys 0) 'key-chord) + (bound-and-true-p key-chord-mode)) + (setq this-command-keys (this-single-command-raw-keys))) + this-command-keys)) + +(defcustom which-key-this-command-keys-function 'which-key--this-command-keys + "Function used to retrieve current key sequence. +The purpose of allowing this variable to be customized is to +allow which-key to support packages that insert non-standard +'keys' into the key sequence being read by emacs." + :group 'which-key + :type 'function + :version "1.0") + + ;;;; Evil (defvar evil-state nil) @@ -845,6 +875,13 @@ invalid keys." :type 'boolean :version "1.0") +(defun which-key-evil-this-operator-p () + (and which-key-allow-evil-operators + (bound-and-true-p evil-this-operator))) + +(add-hook 'which-key-inhibit-display-hook + 'which-key-evil-this-operator-p) + ;;;; God-mode (defvar which-key--god-mode-support-enabled nil @@ -860,6 +897,21 @@ invalid keys." (when (bound-and-true-p which-key-mode) (which-key--hide-popup)))) +(defun which-key--god-mode-this-command-keys () + "Version of `this-single-command-keys' corrected for god-mode." + (let ((this-command-keys (this-single-command-keys))) + (when (and which-key--god-mode-support-enabled + (bound-and-true-p god-local-mode) + (eq this-command 'god-mode-self-insert)) + (setq this-command-keys (when which-key--god-mode-key-string + (kbd which-key--god-mode-key-string)))) + this-command-keys)) + +(defun which-key-god-mode-self-insert-p () + (and which-key--god-mode-support-enabled + (bound-and-true-p god-local-mode) + (eq this-command 'god-mode-self-insert))) + (defun which-key-enable-god-mode-support (&optional disable) "Enable support for god-mode if non-nil. This is experimental, so you need to explicitly opt-in for @@ -868,10 +920,19 @@ disable support." (interactive "P") (setq which-key--god-mode-support-enabled (null disable)) (if disable - (advice-remove 'god-mode-lookup-command - #'which-key--god-mode-lookup-command-advice) + (progn + (advice-remove 'god-mode-lookup-command + #'which-key--god-mode-lookup-command-advice) + (setq which-key-this-command-keys-function + 'which-key--this-command-keys) + (remove-hook 'which-key-inhibit-display-hook + 'which-key-god-mode-self-insert-p)) (advice-add 'god-mode-lookup-command :around - #'which-key--god-mode-lookup-command-advice))) + #'which-key--god-mode-lookup-command-advice) + (setq which-key-this-command-keys-function + 'which-key--god-mode-this-command-keys) + (add-hook 'which-key-inhibit-display-hook + 'which-key-god-mode-self-insert-p))) ;;; Mode @@ -2471,7 +2532,8 @@ This command is always accessible (from any prefix) if which-key-show-early-on-C-h) (let ((current-prefix (butlast - (listify-key-sequence (which-key--this-command-keys))))) + (listify-key-sequence + (funcall which-key-this-command-keys-function))))) (which-key-reload-key-sequence current-prefix) (if which-key-idle-secondary-delay (which-key--start-timer which-key-idle-secondary-delay t) @@ -2692,24 +2754,9 @@ Finally, show the buffer." "On prefix \"%s\" which-key took %.0f ms." prefix-desc (* 1000 (float-time (time-since start-time)))))) -(defun which-key--this-command-keys () - "Version of `this-single-command-keys' corrected for key-chords and god-mode." - (let ((this-command-keys (this-single-command-keys))) - (when (and (vectorp this-command-keys) - (> (length this-command-keys) 0) - (eq (aref this-command-keys 0) 'key-chord) - (bound-and-true-p key-chord-mode)) - (setq this-command-keys (this-single-command-raw-keys))) - (when (and which-key--god-mode-support-enabled - (bound-and-true-p god-local-mode) - (eq this-command 'god-mode-self-insert)) - (setq this-command-keys (when which-key--god-mode-key-string - (kbd which-key--god-mode-key-string)))) - this-command-keys)) - (defun which-key--update () "Function run by timer to possibly trigger `which-key--create-buffer-and-show'." - (let ((prefix-keys (which-key--this-command-keys)) + (let ((prefix-keys (funcall which-key-this-command-keys-function)) delay-time) (cond ((and (> (length prefix-keys) 0) (or (keymapp (key-binding prefix-keys)) @@ -2729,11 +2776,8 @@ Finally, show the buffer." which-key-inhibit-regexps (key-description prefix-keys)))) ;; Do not display the popup if a command is currently being ;; executed - (or (and which-key-allow-evil-operators - (bound-and-true-p evil-this-operator)) - (and which-key--god-mode-support-enabled - (bound-and-true-p god-local-mode) - (eq this-command 'god-mode-self-insert)) + (or (run-hook-with-args-until-success + 'which-key-inhibit-display-hook) (null this-command)) (let ((max-dim (which-key--popup-max-dimensions))) (> (min (car-safe max-dim) (cdr-safe max-dim)) 0))) @@ -2793,7 +2837,7 @@ Finally, show the buffer." which-key--paging-functions)) (and (< 0 (length (this-single-command-keys))) (not (equal (which-key--current-prefix) - (which-key--this-command-keys))))) + (funcall which-key-this-command-keys-function))))) (cancel-timer which-key--paging-timer) (if which-key-idle-secondary-delay ;; we haven't executed a command yet so the secandary From bc3c0c619f14f054a878c6e311eaf5ee1d39d471 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Sat, 24 Feb 2024 12:38:45 +0000 Subject: [PATCH 768/816] Remove unnecessary eval-when-compile from definition * which-key.el (which-key--ignore-keys-regexp): Remove eval-when-compile. --- which-key.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index d07c9f9d62b..a9087e2afc9 100644 --- a/which-key.el +++ b/which-key.el @@ -756,10 +756,9 @@ Used when `which-key-popup-type' is frame.") (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" "select-window" "switch-frame" "which-key")))) (defvar which-key--ignore-keys-regexp - (eval-when-compile - (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" - "select-window" "switch-frame" "-state" - "which-key")))) + (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" + "select-window" "switch-frame" "-state" + "which-key"))) (defvar which-key--pages-obj nil) (cl-defstruct which-key--pages From d69ef9edaae3fc4ad9715e3ce99aa112253b0cdd Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Sat, 24 Feb 2024 11:58:49 +0000 Subject: [PATCH 769/816] ; Add sharp-quotes to function names Replace quoted list by (list ...) where each element is sharp-quoted so that the byte-compiler can check if the functions exist. * which-key.el (which-key--paging-functions): Add sharp-quotes to function names. --- which-key.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/which-key.el b/which-key.el index a9087e2afc9..600f02f3f89 100644 --- a/which-key.el +++ b/which-key.el @@ -525,15 +525,16 @@ This string is fed into `substitute-command-keys'") map) "Keymap for C-h commands.") -(defvar which-key--paging-functions '(which-key-C-h-dispatch - which-key-manual-update - which-key-turn-page - which-key-show-next-page-cycle - which-key-show-next-page-no-cycle - which-key-show-previous-page-cycle - which-key-show-previous-page-no-cycle - which-key-undo-key - which-key-undo)) +(defvar which-key--paging-functions + (list #'which-key-C-h-dispatch + #'which-key-manual-update + #'which-key-turn-page + #'which-key-show-next-page-cycle + #'which-key-show-next-page-no-cycle + #'which-key-show-previous-page-cycle + #'which-key-show-previous-page-no-cycle + #'which-key-undo-key + #'which-key-undo)) (defvar which-key-persistent-popup nil "Whether or not to disable `which-key--hide-popup'.") From 19ed03715107082ebfd8c1c6be71944331f916d3 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Thu, 29 Feb 2024 00:07:35 +0000 Subject: [PATCH 770/816] Specify more precise customization type, natnum instead of integer * which-key.el (which-key-add-column-padding): Use natnum --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 600f02f3f89..dce9718c5b3 100644 --- a/which-key.el +++ b/which-key.el @@ -106,7 +106,7 @@ before. Truncation is done using `which-key-ellipsis'." (defcustom which-key-min-column-description-width 0 "Every column should at least have this width." :group 'which-key - :type 'integer + :type 'natnum :version "1.0") (defcustom which-key-add-column-padding 0 From 0f5733b3ff72d1612220b0a8cab618992baf6df6 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 27 Feb 2024 22:59:07 +0000 Subject: [PATCH 771/816] Remove github reference in preparation for integration to Emacs core * which-key.el: Remove github reference. --- which-key.el | 1 - 1 file changed, 1 deletion(-) diff --git a/which-key.el b/which-key.el index dce9718c5b3..8fdafbaaaba 100644 --- a/which-key.el +++ b/which-key.el @@ -4,7 +4,6 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett -;; URL: https://github.com/justbur/emacs-which-key ;; Version: 3.6.0 ;; Keywords: ;; Package-Requires: ((emacs "24.4")) From 85f17c0a4df0c94890b9e10af6ea402b24e20a3e Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Thu, 29 Feb 2024 21:47:50 +0000 Subject: [PATCH 772/816] ; Use string-join to simplify and make meaning explicit * which-key.el (which-key--butlast-string): Replace mapconcat by string-join. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 8fdafbaaaba..3eb27be8f10 100644 --- a/which-key.el +++ b/which-key.el @@ -1592,7 +1592,7 @@ Within these categories order using `which-key-key-order'." (if (stringp maybe-string) (string-width maybe-string) 0)) (defsubst which-key--butlast-string (str) - (mapconcat #'identity (butlast (split-string str)) " ")) + (string-join (butlast (split-string str)) " ")) (defun which-key--match-replacement (key-binding replacement) ;; these are mode specific ones to ignore. The mode specific case is From acaf5436576f8ad8fa736c93e6ee618b4b371d55 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Thu, 29 Feb 2024 22:33:48 +0000 Subject: [PATCH 773/816] Use declare form instead of put, for clarity * which-key.el (which-key-add-major-mode-key-based-replacements): Use declare form instead of put. --- which-key.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 3eb27be8f10..c522f59a26b 100644 --- a/which-key.el +++ b/which-key.el @@ -1129,6 +1129,7 @@ replacements are added to `which-key-replacement-alist'." The difference is that MODE specifies the `major-mode' that must be active for KEY-SEQUENCE and REPLACEMENT (MORE contains addition KEY-SEQUENCE REPLACEMENT pairs) to apply." + (declare (indent defun)) ;; TODO: Make interactive (when (not (symbolp mode)) (error "MODE should be a symbol corresponding to a value of major-mode")) @@ -1155,8 +1156,6 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (if (assq mode which-key--prefix-title-alist) (setcdr (assq mode which-key--prefix-title-alist) title-mode-alist) (push (cons mode title-mode-alist) which-key--prefix-title-alist)))) -(put 'which-key-add-major-mode-key-based-replacements - 'lisp-indent-function 'defun) (defun which-key-define-key-recursively (map key def &optional at-root) "Recursively bind KEY in MAP to DEF on every level of MAP except the first. From 9b33ccc293d215b36d375fc735ba5abda3332492 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Fri, 1 Mar 2024 22:46:55 +0000 Subject: [PATCH 774/816] Replace member by memq for clarity * which-key.el (which-key--side-window-max-dimensions): Replace member by memq. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index c522f59a26b..9623c729b92 100644 --- a/which-key.el +++ b/which-key.el @@ -1448,7 +1448,7 @@ characters respectively." which-key-side-window-max-height)) ;; width (max 0 - (- (if (member which-key-side-window-location '(left right)) + (- (if (memq which-key-side-window-location '(left right)) (which-key--total-width-to-text (which-key--width-or-percentage-to-width which-key-side-window-max-width)) From a79a8845a8d3229825077d29776630e7b3ac4e6c Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Mon, 4 Mar 2024 23:38:06 +0000 Subject: [PATCH 775/816] Remove unnecessary :group attributes * which-key.el: Remove :group 'which-key in defcustoms. (which-key-idle-delay): (which-key-idle-secondary-delay): (which-key-echo-keystrokes): (which-key-max-description-length): (which-key-min-column-description-width): (which-key-add-column-padding): (which-key-unicode-correction): (which-key-dont-use-unicode): (which-key-separator): (which-key-ellipsis): (which-key-prefix-prefix): (which-key-compute-remaps): (which-key-replacement-alist): (which-key-allow-multiple-replacements): (which-key-show-docstrings): (which-key-highlighted-command-list): (which-key-special-keys): (which-key-buffer-name): (which-key-show-prefix): (which-key-popup-type): (which-key-min-display-lines): (which-key-max-display-columns): (which-key-side-window-location): (which-key-side-window-slot): (which-key-side-window-max-width): (which-key-side-window-max-height): (which-key-frame-max-width): (which-key-frame-max-height): (which-key-allow-imprecise-window-fit): (which-key-show-remaining-keys): (which-key-sort-order): (which-key-sort-uppercase-first): (which-key-paging-prefixes): (which-key-paging-key): (which-key-use-C-h-commands): (which-key-show-early-on-C-h): (which-key-is-verbose): (which-key-preserve-window-configuration): (which-key-hide-alt-key-translations): (which-key-delay-functions): (which-key-allow-regexps): (which-key-inhibit-regexps): (which-key-show-transient-maps): (which-key-init-buffer-hook): --- which-key.el | 45 --------------------------------------------- 1 file changed, 45 deletions(-) diff --git a/which-key.el b/which-key.el index 9623c729b92..40cb6ba99c1 100644 --- a/which-key.el +++ b/which-key.el @@ -61,7 +61,6 @@ This variable should be set before activating `which-key-mode'. A value of zero might lead to issues, so a non-zero value is recommended (see https://github.com/justbur/emacs-which-key/issues/134)." - :group 'which-key :type 'float :version "1.0") @@ -70,7 +69,6 @@ recommended This makes it possible to shorten the delay for subsequent popups in the same key sequence. The default is for this value to be nil, which disables this behavior." - :group 'which-key :type '(choice float (const :tag "Disabled" nil)) :version "1.0") @@ -84,7 +82,6 @@ This only applies if `which-key-popup-type' is minibuffer or `which-key-show-prefix' is echo. It needs to be less than `which-key-idle-delay' or else the keystroke echo will erase the which-key popup." - :group 'which-key :type 'float :version "1.0") @@ -95,7 +92,6 @@ characters), a float (use that fraction of the available width), or a function, which takes one argument, the available width in characters, and whose return value has one of the types mentioned before. Truncation is done using `which-key-ellipsis'." - :group 'which-key :type '(choice (const :tag "Disable truncation" nil) (integer :tag "Width in characters") (float :tag "Use fraction of available width") @@ -104,13 +100,11 @@ before. Truncation is done using `which-key-ellipsis'." (defcustom which-key-min-column-description-width 0 "Every column should at least have this width." - :group 'which-key :type 'natnum :version "1.0") (defcustom which-key-add-column-padding 0 "Additional spaces to add to the left of each key column." - :group 'which-key :type 'integer :version "1.0") @@ -127,7 +121,6 @@ contributed by any wide unicode characters to be up to one additional ASCII character in the which-key buffer. Increase this number if you are seeing characters get cutoff on the right side of the which-key popup." - :group 'which-key :type 'integer :version "1.0") @@ -135,7 +128,6 @@ of the which-key popup." "If non-nil, don't use any unicode characters in default setup. For affected settings, see `which-key-replacement-alist', `which-key-ellipsis' 'which-key-separator'." - :group 'which-key :type 'boolean :version "1.0") @@ -144,7 +136,6 @@ For affected settings, see `which-key-replacement-alist', `which-key-ellipsis' "Separator to use between key and description. Default is \" → \", unless `which-key-dont-use-unicode' is non nil, in which case the default is \" : \"." - :group 'which-key :type 'string :version "1.0") @@ -154,14 +145,12 @@ nil, in which case the default is \" : \"." Default is \"…\", unless `which-key-dont-use-unicode' is non nil, in which case the default is \"..\". This can also be the empty string to truncate without using any ellipsis." - :group 'which-key :type 'string :version "1.0") (defcustom which-key-prefix-prefix "+" "Prefix string to indicate a key bound to a keymap. Default is \"+\"." - :group 'which-key :type 'string :version "1.0") @@ -169,7 +158,6 @@ Default is \"+\"." "If non-nil, show remapped commands. This applies to commands that have been remapped given the currently active keymaps." - :group 'which-key :type 'boolean :version "1.0") @@ -211,7 +199,6 @@ the key binding is ignored by which-key. Finally, you can multiple replacements to occur for a given key binding by setting `which-key-allow-multiple-replacements' to a non-nil value." - :group 'which-key :type '(alist :key-type (cons (choice regexp (const nil)) (choice regexp (const nil))) :value-type (cons (choice string (const nil)) @@ -224,7 +211,6 @@ When non-nil, this allows a single key binding to match multiple patterns in `which-key-replacement-alist'. When nil, only the first match is used to perform replacements from `which-key-replacement-alist'." - :group 'which-key :type 'boolean :version "1.0") @@ -235,7 +221,6 @@ break. If you set this variable to the symbol docstring-only, then the command's name with be omitted. You probably also want to adjust `which-key-max-description-length' at the same time if you use this feature." - :group 'which-key :type '(radio (const :tag "Do not show docstrings" nil) (const :tag "Add docstring to command names" t) @@ -249,7 +234,6 @@ matching command names and use `which-key-highlighted-command-face' for any matching names. If the element is a cons cell, it should take the form (regexp . face to apply)." - :group 'which-key :type '(repeat (choice string (cons regexp face))) :version "1.0") @@ -259,13 +243,11 @@ They also have `which-key-special-key-face' applied to them. This is disabled by default. An example configuration is \(setq which-key-special-keys \\='(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)" - :group 'which-key :type '(repeat string) :version "1.0") (defcustom which-key-buffer-name " *which-key*" "Name of which-key buffer." - :group 'which-key :type 'string :version "1.0") @@ -273,7 +255,6 @@ is disabled by default. An example configuration is "Whether to and where to display the current prefix sequence. Possible choices are echo for echo area (the default), left, top and nil. Nil turns the feature off." - :group 'which-key :type '(radio (const :tag "Left of the keys" left) (const :tag "In the first line" top) (const :tag "In the last line" bottom) @@ -284,7 +265,6 @@ and nil. Nil turns the feature off." (defcustom which-key-popup-type 'side-window "Supported types are minibuffer, side-window, frame, and custom." - :group 'which-key :type '(radio (const :tag "Show in minibuffer" minibuffer) (const :tag "Show in side window" side-window) (const :tag "Show in popup frame" frame) @@ -293,14 +273,12 @@ and nil. Nil turns the feature off." (defcustom which-key-min-display-lines 1 "Minimum number of horizontal lines to display in the which-key buffer." - :group 'which-key :type 'integer :version "1.0") (defcustom which-key-max-display-columns nil "Maximum number of columns to display in the which-key buffer. A value of nil means don't impose a maximum." - :group 'which-key :type '(choice integer (const :tag "Unbounded" nil)) :version "1.0") @@ -310,7 +288,6 @@ Should be one of top, bottom, left or right. You can also specify a list of two locations, like (right bottom). In this case, the first location is tried. If there is not enough room, the second location is tried." - :group 'which-key :type '(radio (const right) (const bottom) (const left) @@ -330,7 +307,6 @@ specified side. A negative value means use a slot preceding (that is, above or on the left of) the middle slot. A positive value means use a slot following (that is, below or on the right of) the middle slot. The default is zero." - :group 'which-key :type 'integer :version "1.0") @@ -338,7 +314,6 @@ the right of) the middle slot. The default is zero." "Maximum width of which-key popup when type is side-window. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's width." - :group 'which-key :type 'float :version "1.0") @@ -346,19 +321,16 @@ it denotes a percentage out of the frame's width." "Maximum height of which-key popup when type is side-window. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's height." - :group 'which-key :type 'float :version "1.0") (defcustom which-key-frame-max-width 60 "Maximum width of which-key popup when type is frame." - :group 'which-key :type 'integer :version "1.0") (defcustom which-key-frame-max-height 20 "Maximum height of which-key popup when type is frame." - :group 'which-key :type 'integer :version "1.0") @@ -369,13 +341,11 @@ this on may help. See https://github.com/justbur/emacs-which-key/issues/130 and https://github.com/justbur/emacs-which-key/issues/225." - :group 'which-key :type 'boolean :version "1.0") (defcustom which-key-show-remaining-keys nil "Show remaining keys in last slot, when keys are hidden." - :group 'which-key :type '(radio (const :tag "Yes" t) (const :tag "No" nil)) :version "1.0") @@ -394,7 +364,6 @@ are See the README and the docstrings for those functions for more information." - :group 'which-key :type '(choice (function-item which-key-key-order) (function-item which-key-key-order-alpha) (function-item which-key-description-order) @@ -406,20 +375,17 @@ information." "If non-nil, uppercase comes before lowercase in sorting. This applies to the function chosen in `which-key-sort-order'. Otherwise, the order is reversed." - :group 'which-key :type 'boolean :version "1.0") (defcustom which-key-paging-prefixes '() "Enable paging for these prefixes." - :group 'which-key :type '(repeat string) :version "1.0") (defcustom which-key-paging-key "" "Key to use for changing pages. Bound after each of the prefixes in `which-key-paging-prefixes'" - :group 'which-key :type 'string :version "1.0") @@ -439,7 +405,6 @@ Bound after each of the prefixes in `which-key-paging-prefixes'" Normally `help-char' after a prefix calls `describe-prefix-bindings'. This changes that command to a which-key paging command when which-key-mode is active." - :group 'which-key :type 'boolean :version "1.0") @@ -456,13 +421,11 @@ using C-h. Note that `which-key-idle-delay' should be set before turning on `which-key-mode'." - :group 'which-key :type 'boolean :version "1.0") (defcustom which-key-is-verbose nil "Whether to warn about potential mistakes in configuration." - :group 'which-key :type 'boolean :version "1.0") @@ -473,8 +436,6 @@ shown and restore it after which-key buffer is hidden. It prevents which-key from changing window position of visible buffers. Only takken into account when popup type is side-window." - :group - 'which-key :type 'boolean :version "1.0") @@ -544,7 +505,6 @@ These translations are not relevant most of the times since a lot of terminals issue META modifier for the Alt key. See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" - :group 'which-key :type 'boolean :version "1.0") @@ -561,7 +521,6 @@ this list to return a value is the value that is used. The delay time is effectively added to the normal `which-key-idle-delay'." - :group 'which-key :type '(repeat function) :version "1.0") @@ -570,7 +529,6 @@ The delay time is effectively added to the normal When non-nil, for a key sequence to trigger the which-key popup it must match one of the regexps in this list. The format of the key sequences is what is produced by `key-description'." - :group 'which-key :type '(repeat regexp) :version "1.0") @@ -579,7 +537,6 @@ key sequences is what is produced by `key-description'." When non-nil, for a key sequence to trigger the which-key popup it cannot match one of the regexps in this list. The format of the key sequences is what is produced by `key-description'." - :group 'which-key :type '(repeat regexp) :version "1.0") @@ -589,7 +546,6 @@ the key sequences is what is produced by `key-description'." More specifically, detect when `overriding-terminal-local-map' is set (this is the keymap used by `set-transient-map') and display it." - :group 'which-key :type 'boolean :version "1.0") @@ -601,7 +557,6 @@ it." ;; Hooks (defcustom which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized." - :group 'which-key :type 'hook :version "1.0") From 0947af117679a49ee4d0db6c9ca5db3c3a0ff186 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Thu, 7 Mar 2024 12:45:03 -0500 Subject: [PATCH 776/816] Sharp quote which-key-sort-order default. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 40cb6ba99c1..27c4fa3a12c 100644 --- a/which-key.el +++ b/which-key.el @@ -350,7 +350,7 @@ and https://github.com/justbur/emacs-which-key/issues/225." (const :tag "No" nil)) :version "1.0") -(defcustom which-key-sort-order 'which-key-key-order +(defcustom which-key-sort-order #'which-key-key-order "Order in which the key bindings are sorted. If nil, do not resort the output from `describe-buffer-bindings' which groups by mode. Ordering options From b5b431089a11a51742b09471a2f43d229f5a4fb0 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 5 Mar 2024 22:01:58 +0000 Subject: [PATCH 777/816] ; Replace tabs by spaces * which-key.el (which-key--paging-functions): Replace tabs by spaces. --- which-key.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/which-key.el b/which-key.el index 27c4fa3a12c..7927c901fec 100644 --- a/which-key.el +++ b/which-key.el @@ -487,14 +487,14 @@ This string is fed into `substitute-command-keys'") (defvar which-key--paging-functions (list #'which-key-C-h-dispatch - #'which-key-manual-update - #'which-key-turn-page - #'which-key-show-next-page-cycle - #'which-key-show-next-page-no-cycle - #'which-key-show-previous-page-cycle - #'which-key-show-previous-page-no-cycle - #'which-key-undo-key - #'which-key-undo)) + #'which-key-manual-update + #'which-key-turn-page + #'which-key-show-next-page-cycle + #'which-key-show-next-page-no-cycle + #'which-key-show-previous-page-cycle + #'which-key-show-previous-page-no-cycle + #'which-key-undo-key + #'which-key-undo)) (defvar which-key-persistent-popup nil "Whether or not to disable `which-key--hide-popup'.") From bb9fc431ec2123fc71fe297f7fb396222f5be26e Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 5 Mar 2024 22:40:57 +0000 Subject: [PATCH 778/816] Replace internet link by Info node * which-key.el (which-key-hide-alt-key-translations): Replace internet link by Info node. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 7927c901fec..4088032f26e 100644 --- a/which-key.el +++ b/which-key.el @@ -504,7 +504,7 @@ This string is fed into `substitute-command-keys'") These translations are not relevant most of the times since a lot of terminals issue META modifier for the Alt key. -See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html" +See Info node `(emacs)Modifier Keys'." :type 'boolean :version "1.0") From daae57ea192288329af7f82607f3495291637033 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Wed, 6 Mar 2024 22:48:18 +0000 Subject: [PATCH 779/816] Remove unnecessary eval-when-compile * which-key.el (which-key--ignore-non-evil-keys-regexp): Remove unnecessary eval-when-compile in regexp-opt. --- which-key.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 4088032f26e..af4bc6cb337 100644 --- a/which-key.el +++ b/which-key.el @@ -707,9 +707,8 @@ Used when `which-key-popup-type' is frame.") (defvar which-key--evil-keys-regexp (eval-when-compile (regexp-opt '("-state")))) (defvar which-key--ignore-non-evil-keys-regexp - (eval-when-compile - (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" - "select-window" "switch-frame" "which-key")))) + (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" + "select-window" "switch-frame" "which-key"))) (defvar which-key--ignore-keys-regexp (regexp-opt '("mouse-" "wheel-" "remap" "drag-" "scroll-bar" "select-window" "switch-frame" "-state" From 8ade3298d945f9237b872a66988892e14fc55563 Mon Sep 17 00:00:00 2001 From: Jonas Bernoulli Date: Fri, 8 Mar 2024 01:13:09 +0100 Subject: [PATCH 780/816] Remove reference to long gone which-key-manual-update * which-key.el (which-key--paging-functions): Remove reference to which-key-manual-update. This commands was remove in 42a25055163141165aa0269dbca69735e704825c. --- which-key.el | 1 - 1 file changed, 1 deletion(-) diff --git a/which-key.el b/which-key.el index af4bc6cb337..783156f7deb 100644 --- a/which-key.el +++ b/which-key.el @@ -487,7 +487,6 @@ This string is fed into `substitute-command-keys'") (defvar which-key--paging-functions (list #'which-key-C-h-dispatch - #'which-key-manual-update #'which-key-turn-page #'which-key-show-next-page-cycle #'which-key-show-next-page-no-cycle From 6e035b5e2f7c94d39fe4a6765c6c52258bcf14d5 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Fri, 8 Mar 2024 23:20:07 +0000 Subject: [PATCH 781/816] Use declare form instead of put for clarity * which-key.el (which-key-add-keymap-based-replacements): Use declare form instead of put property. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index af4bc6cb337..4a0b8b8e045 100644 --- a/which-key.el +++ b/which-key.el @@ -1023,6 +1023,7 @@ prefix. An example is For backwards compatibility, REPLACEMENT can also be a string, but the above format is preferred, and the option to use a string for REPLACEMENT will eventually be removed." + (declare (indent defun)) (while key (let ((def (cond @@ -1036,7 +1037,6 @@ for REPLACEMENT will eventually be removed." (define-key keymap (kbd key) def)) (setq key (pop more) replacement (pop more)))) -(put 'which-key-add-keymap-based-replacements 'lisp-indent-function 'defun) ;;;###autoload (defun which-key-add-key-based-replacements From 33d6ce3324ce481411c3b66cf37b931e4daa3d8c Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Fri, 8 Mar 2024 23:25:59 +0000 Subject: [PATCH 782/816] Don't quote t * which-key.el (which-key--replace-in-repl-list-many): Don't quote t. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 4a0b8b8e045..a4aec2476d3 100644 --- a/which-key.el +++ b/which-key.el @@ -1588,7 +1588,7 @@ Within these categories order using `which-key-key-order'." (let (found) (dolist (repl repls) (when (which-key--match-replacement key-binding repl) - (setq found 't) + (setq found t) (setq key-binding (which-key--replace-in-binding key-binding repl)))) (when found `(replaced . ,key-binding)))) From 83bb45e16734b26f67122e51dda1ea3671a7928b Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Sat, 9 Mar 2024 21:54:23 +0000 Subject: [PATCH 783/816] Use string-empty-p for readability. * which-key.el (which-key--maybe-get-prefix-title): Use string-empty-p for readability. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index a4aec2476d3..985c419f73b 100644 --- a/which-key.el +++ b/which-key.el @@ -1660,7 +1660,7 @@ no title exists." (alternate (when (and binding (symbolp binding)) (symbol-name binding)))) (cond (title-res title-res) - ((not (string-equal repl-res "")) repl-res) + ((not (string-empty-p repl-res)) repl-res) ((and (eq which-key-show-prefix 'echo) alternate) alternate) ((and (member which-key-show-prefix '(bottom top mode-line)) From 61f6c3ed721017e28ed2e80e1ebebf5d8fc0c3d5 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Sat, 9 Mar 2024 21:59:43 +0000 Subject: [PATCH 784/816] ; * which-key.el (which-key--truncate-description): Untabify. --- which-key.el | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/which-key.el b/which-key.el index 985c419f73b..54ec92d2311 100644 --- a/which-key.el +++ b/which-key.el @@ -1701,20 +1701,20 @@ If KEY contains any \"special keys\" defined in (defsubst which-key--truncate-description (desc avl-width) "Truncate DESC description to `which-key-max-description-length'." (let* ((max which-key-max-description-length) - (max (cl-etypecase max - (null nil) - (integer max) - (float (truncate (* max avl-width))) - (function (let ((val (funcall max avl-width))) - (if (floatp val) (truncate val) val)))))) + (max (cl-etypecase max + (null nil) + (integer max) + (float (truncate (* max avl-width))) + (function (let ((val (funcall max avl-width))) + (if (floatp val) (truncate val) val)))))) (if (and max (> (length desc) max)) (let ((dots (and (not (equal which-key-ellipsis "")) - (which-key--propertize - which-key-ellipsis 'face - (get-text-property (1- (length desc)) 'face desc))))) - (if dots + (which-key--propertize + which-key-ellipsis 'face + (get-text-property (1- (length desc)) 'face desc))))) + (if dots (concat (substring desc 0 (- max (length dots))) dots) - (substring desc 0 max))) + (substring desc 0 max))) desc))) (defun which-key--highlight-face (description) From af8a760ad2d54bd1f1513804e67a59ac03cd1eb5 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Sat, 9 Mar 2024 22:08:57 +0000 Subject: [PATCH 785/816] ; * which-key.el (which-key--get-keymap-bindings-1): Use eql. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 54ec92d2311..dcb5af7ce7d 100644 --- a/which-key.el +++ b/which-key.el @@ -1886,7 +1886,7 @@ Requires `which-key-compute-remaps' to be non-nil." (or all ;; event 27 is escape, so this will pick up meta ;; bindings and hopefully not too much more - (and (numberp ev) (= ev 27)))) + (eql ev 27))) (setq bindings (which-key--get-keymap-bindings-1 keymap bindings key nil all ignore-commands))) From 1f55b85887050b0b2a84466dc001d81471b13343 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Sun, 10 Mar 2024 22:40:47 +0000 Subject: [PATCH 786/816] * which-key.el (which-key--pad-column): Untabify. --- which-key.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/which-key.el b/which-key.el index dcb5af7ce7d..fcdaec4a176 100644 --- a/which-key.el +++ b/which-key.el @@ -1996,17 +1996,17 @@ that width." (let* ((col-key-width (+ which-key-add-column-padding (which-key--max-len col-keys 0))) (col-sep-width (which-key--max-len col-keys 1)) - (avl-width (- avl-width col-key-width col-sep-width)) + (avl-width (- avl-width col-key-width col-sep-width)) (col-desc-width (min avl-width - (which-key--max-len + (which-key--max-len col-keys 2 - which-key-min-column-description-width))) + which-key-min-column-description-width))) (col-width (+ col-key-width col-sep-width col-desc-width)) - (col-format (concat "%" (int-to-string col-key-width) + (col-format (concat "%" (int-to-string col-key-width) "s%s%-" (int-to-string col-desc-width) "s"))) (cons col-width (mapcar (lambda (k) (apply #'format col-format k)) - col-keys)))) + col-keys)))) (defun which-key--partition-list (n list) "Partition LIST into N-sized sublists." From afcea611a872cb76e6af6013ea02722204a97eed Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Sun, 10 Mar 2024 22:45:14 +0000 Subject: [PATCH 787/816] * which-key.el (which-key--create-pages): Untabify. --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index fcdaec4a176..5a3d9386f1d 100644 --- a/which-key.el +++ b/which-key.el @@ -2101,7 +2101,7 @@ is the width of the live window." (avl-width (if prefix (- max-width prefix) max-width)) (vertical (or (and (eq which-key-popup-type 'side-window) (member which-key-side-window-location '(left right))) - (eq which-key-max-display-columns 1))) + (eq which-key-max-display-columns 1))) result) (setq result (which-key--create-pages-1 @@ -2114,7 +2114,7 @@ is the width of the live window." (which-key--maybe-get-prefix-title (key-description prefix-keys)))) (when prefix-top-bottom - ;; Add back the line earlier reserved for the page information. + ;; Add back the line earlier reserved for the page information. (setf (which-key--pages-height result) max-lines)) (when (and (= (which-key--pages-num-pages result) 1) (> which-key-min-display-lines From 5111e377a2ae9881545710a9331f6788a26cdcbd Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 27 Mar 2024 21:43:29 -0400 Subject: [PATCH 788/816] Fix labeling of functions in which-key popup Add a few minor changes. --- which-key.el | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/which-key.el b/which-key.el index a91ff7eb501..29e0b5a277c 100644 --- a/which-key.el +++ b/which-key.el @@ -127,7 +127,7 @@ of the which-key popup." (defcustom which-key-dont-use-unicode nil "If non-nil, don't use any unicode characters in default setup. For affected settings, see `which-key-replacement-alist', `which-key-ellipsis' -'which-key-separator'." +`which-key-separator'." :type 'boolean :version "1.0") @@ -794,11 +794,11 @@ should be formatted as an input for `kbd'." (setq this-command-keys (this-single-command-raw-keys))) this-command-keys)) -(defcustom which-key-this-command-keys-function 'which-key--this-command-keys +(defcustom which-key-this-command-keys-function #'which-key--this-command-keys "Function used to retrieve current key sequence. The purpose of allowing this variable to be customized is to allow which-key to support packages that insert non-standard -'keys' into the key sequence being read by emacs." +`keys' into the key sequence being read by emacs." :group 'which-key :type 'function :version "1.0") @@ -832,7 +832,7 @@ invalid keys." (bound-and-true-p evil-this-operator))) (add-hook 'which-key-inhibit-display-hook - 'which-key-evil-this-operator-p) + #'which-key-evil-this-operator-p) ;;;; God-mode @@ -875,16 +875,16 @@ disable support." (progn (advice-remove 'god-mode-lookup-command #'which-key--god-mode-lookup-command-advice) - (setq which-key-this-command-keys-function - 'which-key--this-command-keys) + (remove-function which-key-this-command-keys-function + #'which-key--god-mode-this-command-keys) (remove-hook 'which-key-inhibit-display-hook - 'which-key-god-mode-self-insert-p)) + #'which-key-god-mode-self-insert-p)) (advice-add 'god-mode-lookup-command :around #'which-key--god-mode-lookup-command-advice) - (setq which-key-this-command-keys-function - 'which-key--god-mode-this-command-keys) + (add-function :override which-key-this-command-keys-function + #'which-key--god-mode-this-command-keys) (add-hook 'which-key-inhibit-display-hook - 'which-key-god-mode-self-insert-p))) + #'which-key-god-mode-self-insert-p))) ;;; Mode @@ -1849,11 +1849,10 @@ alists. Returns a list (key separator description)." (defun which-key--compute-binding (binding) "Replace BINDING with remapped binding if it exists. Requires `which-key-compute-remaps' to be non-nil." - (let (remap) - (if (and which-key-compute-remaps - (setq remap (command-remapping binding))) - (copy-sequence (symbol-name remap)) - (copy-sequence (symbol-name binding))))) + (copy-sequence (symbol-name + (or (and which-key-compute-remaps + (command-remapping binding)) + binding)))) (defun which-key--get-menu-item-binding (def) "Retrieve binding for menu-item" @@ -1898,8 +1897,11 @@ Requires `which-key-compute-remaps' to be non-nil." (cond ((symbolp def) (which-key--compute-binding def)) ((keymapp def) "prefix") - ((eq 'lambda (car-safe def)) "lambda") - ((eq 'closure (car-safe def)) "closure") + ((functionp def) + (cond + ((eq 'lambda (car-safe def)) "lambda") + ((eq 'closure (car-safe def)) "closure") + (t "function"))) ((stringp def) def) ((vectorp def) (key-description def)) ((and (consp def) From 681001bf697be06a4801e6ef1083fbf6d4a1b8ec Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 12 Mar 2024 22:34:03 +0000 Subject: [PATCH 789/816] ; Change defcustom types to natnum * which-key.el (which-key-frame-max-width, which-key-frame-max-height): Change defcustom type integer to natnum. --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 29e0b5a277c..2f2c2804f55 100644 --- a/which-key.el +++ b/which-key.el @@ -326,12 +326,12 @@ a percentage out of the frame's height." (defcustom which-key-frame-max-width 60 "Maximum width of which-key popup when type is frame." - :type 'integer + :type 'natnum :version "1.0") (defcustom which-key-frame-max-height 20 "Maximum height of which-key popup when type is frame." - :type 'integer + :type 'natnum :version "1.0") (defcustom which-key-allow-imprecise-window-fit (not (display-graphic-p)) From bfab035d1b9552c2239203644cb4535c5ef4b45b Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Mon, 18 Mar 2024 23:18:30 +0000 Subject: [PATCH 790/816] Simplify code to use null * which-key.el (which-key--create-buffer-and-show): Use null. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 2f2c2804f55..f2f86269fc1 100644 --- a/which-key.el +++ b/which-key.el @@ -2692,7 +2692,7 @@ Finally, show the buffer." (formatted-keys (which-key--get-bindings prefix-keys from-keymap filter)) (prefix-desc (key-description prefix-keys))) - (cond ((= (length formatted-keys) 0) + (cond ((null formatted-keys) (message "%s- which-key: There are no keys to show" prefix-desc)) ((listp which-key-side-window-location) (setq which-key--last-try-2-loc From bf9ceab0bea07afd9a5a661d9e7a043cb96daf84 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Mon, 1 Apr 2024 16:33:26 +0100 Subject: [PATCH 791/816] ; which-key.el: Display mode in error message * which-key.el (which-key-add-major-mode-key-based-replacements): Display mode in error message --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index f2f86269fc1..781fee9683c 100644 --- a/which-key.el +++ b/which-key.el @@ -1085,7 +1085,7 @@ addition KEY-SEQUENCE REPLACEMENT pairs) to apply." (declare (indent defun)) ;; TODO: Make interactive (when (not (symbolp mode)) - (error "MODE should be a symbol corresponding to a value of major-mode")) + (error "`%S' should be a symbol corresponding to a value of major-mode" mode)) (let ((mode-alist (or (cdr-safe (assq mode which-key-replacement-alist)) (list))) (title-mode-alist From f25457c270fd8890f992e02b8ead8db9a3c9cfe2 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Mon, 1 Apr 2024 16:39:49 +0100 Subject: [PATCH 792/816] Replace wholenump by natnump for context readability * which-key.el (which-key--width-or-percentage-to-width, which-key--height-or-percentage-to-height): Use natnump instead of wholenump. --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 781fee9683c..820875bfdaf 100644 --- a/which-key.el +++ b/which-key.el @@ -1170,7 +1170,7 @@ If WIDTH-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it should be a percentage (a number between 0 and 1) out of the frame's width. More precisely, it should be a percentage out of the frame's root window's total width." - (if (wholenump width-or-percentage) + (if (natnump width-or-percentage) width-or-percentage (round (* width-or-percentage (window-total-width (frame-root-window)))))) @@ -1180,7 +1180,7 @@ If HEIGHT-OR-PERCENTAGE is a whole number, return it unchanged. Otherwise, it should be a percentage (a number between 0 and 1) out of the frame's height. More precisely, it should be a percentage out of the frame's root window's total height." - (if (wholenump height-or-percentage) + (if (natnump height-or-percentage) height-or-percentage (round (* height-or-percentage (window-total-height (frame-root-window)))))) From c9c3eafafadbeab0bf21e0a3d6ab9718d20af877 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 2 Apr 2024 21:54:02 +0100 Subject: [PATCH 793/816] * which-key.el (which-key--popup-max-dimensions): Fix docstring typo --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 820875bfdaf..d4efa3ede75 100644 --- a/which-key.el +++ b/which-key.el @@ -1362,7 +1362,7 @@ call signature in different emacs versions" (defun which-key--popup-max-dimensions () "Return maximum dimension available for popup. -Dimesion functions should return the maximum possible (height +Dimension functions should return the maximum possible (height . width) of the intended popup. SELECTED-WINDOW-WIDTH is the width of currently active window, not the which-key buffer window." From aceafc88e68c178d7387d625297fe4f92b0c13d7 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 2 Apr 2024 21:54:40 +0100 Subject: [PATCH 794/816] Change cl-case to cl-ecase * which-key.el (which-key--popup-max-dimensions): Change cl-case to cl-ecase to signal error if needed. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index d4efa3ede75..bf45386f578 100644 --- a/which-key.el +++ b/which-key.el @@ -1366,7 +1366,7 @@ Dimension functions should return the maximum possible (height . width) of the intended popup. SELECTED-WINDOW-WIDTH is the width of currently active window, not the which-key buffer window." - (cl-case which-key-popup-type + (cl-ecase which-key-popup-type (minibuffer (which-key--minibuffer-max-dimensions)) (side-window (which-key--side-window-max-dimensions)) (frame (which-key--frame-max-dimensions)) From 94a29cda9f75c9901667bf45ff25bd8c892cb416 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Wed, 3 Apr 2024 21:05:09 +0100 Subject: [PATCH 795/816] * which-key.el (which-key--partition-list): Replace cl-subseq by take --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index bf45386f578..decde2d10bd 100644 --- a/which-key.el +++ b/which-key.el @@ -2013,7 +2013,7 @@ that width." "Partition LIST into N-sized sublists." (let (res) (while list - (setq res (cons (cl-subseq list 0 (min n (length list))) res) + (setq res (cons (take (min n (length list)) list) res) list (nthcdr n list))) (nreverse res))) From 62ebafeae751fe130d1ac27c55930385ccce2757 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Wed, 3 Apr 2024 21:13:24 +0100 Subject: [PATCH 796/816] * which-key.el (which-key--create-pages-1): Use cl-decf for clarity --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index decde2d10bd..8837eefd43c 100644 --- a/which-key.el +++ b/which-key.el @@ -2077,7 +2077,7 @@ should be minimized." ;; simple search for a fitting page (while (and (> available-lines min-lines) (not found)) - (setq available-lines (- available-lines 1) + (setq available-lines (cl-decf available-lines) prev-result result result (which-key--list-to-pages keys available-lines available-width) From 54b52f4c3c4fdc663c4f50c94d3b8a6eb0d857e7 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Wed, 3 Apr 2024 21:16:03 +0100 Subject: [PATCH 797/816] * which-key.el (which-key--show-evil-operator-keymap): let not let* --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 8837eefd43c..57825ca0e50 100644 --- a/which-key.el +++ b/which-key.el @@ -2671,7 +2671,7 @@ KEYMAP is selected interactively by mode in formatted-keys nil "evil operator/motion keys")) (which-key--show-page))))) - (let* ((key (read-key))) + (let ((key (read-key))) (when (member key '(?f ?F ?t ?T ?`)) ;; these keys trigger commands that read the next char manually (setq which-key--inhibit-next-operator-popup t)) From 2c9f94162c20e18bee23625047e9192525632811 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Wed, 3 Apr 2024 22:43:19 +0100 Subject: [PATCH 798/816] ; Use `memq' to be just as explicit as necessary * which-key.el (which-key--show-evil-operator-keymap): Use `memq' to be just as explicit as necessary. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 57825ca0e50..8c6d4236b1d 100644 --- a/which-key.el +++ b/which-key.el @@ -2672,7 +2672,7 @@ KEYMAP is selected interactively by mode in nil "evil operator/motion keys")) (which-key--show-page))))) (let ((key (read-key))) - (when (member key '(?f ?F ?t ?T ?`)) + (when (memq key '(?f ?F ?t ?T ?`)) ;; these keys trigger commands that read the next char manually (setq which-key--inhibit-next-operator-popup t)) (cond ((and which-key-use-C-h-commands (numberp key) (= key help-char)) From 8adbc25c390bb6c2b1359e17cca08fd90be6ba3e Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Thu, 4 Apr 2024 11:18:57 +0100 Subject: [PATCH 799/816] Use null for clarity * which-key.el (which-key--show-evil-operator-keymap): Use null for clarity of zero length. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 8c6d4236b1d..0c38a1a1bc8 100644 --- a/which-key.el +++ b/which-key.el @@ -2659,7 +2659,7 @@ KEYMAP is selected interactively by mode in (let ((formatted-keys (which-key--get-bindings nil keymap #'which-key--evil-operator-filter))) - (cond ((= (length formatted-keys) 0) + (cond ((null formatted-keys) (message "which-key: Keymap empty")) ((listp which-key-side-window-location) (setq which-key--last-try-2-loc From 672689aab8e6b68afa7961fbaa3beaded53b8991 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Sun, 7 Apr 2024 19:30:00 +0100 Subject: [PATCH 800/816] ; Simplify internal defun * which-key.el (which-key--rotate): Simplify code slightly. Co-authored-by: Philip Kaludercic --- which-key.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/which-key.el b/which-key.el index 0c38a1a1bc8..660ff228019 100644 --- a/which-key.el +++ b/which-key.el @@ -729,9 +729,8 @@ Used when `which-key-popup-type' is frame.") (defun which-key--rotate (list n) (let* ((len (length list)) - (n (if (< n 0) (+ len n) n)) - (n (mod n len))) - (append (last list (- len n)) (butlast list (- len n))))) + (n (- len (mod n len)))) + (append (last list n) (butlast list n)))) (defun which-key--pages-set-current-page (pages-obj n) (setf (which-key--pages-pages pages-obj) From c606abd083387d85e96dbc9b7ebde52f214407c6 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Mon, 8 Apr 2024 23:11:08 +0100 Subject: [PATCH 801/816] Add explicit binding to nil in let * which-key.el (which-key--match-replacement, which-key--propertize-key): Add explicit binding of case-fold-search to nil. --- which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/which-key.el b/which-key.el index 660ff228019..7d859a90bc6 100644 --- a/which-key.el +++ b/which-key.el @@ -1551,7 +1551,7 @@ Within these categories order using `which-key-key-order'." (when (and (consp key-binding) (not (symbolp (car replacement)))) (let ((key-regexp (caar replacement)) (binding-regexp (cdar replacement)) - case-fold-search) + (case-fold-search nil)) (and (or (null key-regexp) (string-match-p key-regexp (car key-binding))) @@ -1684,7 +1684,7 @@ If KEY contains any \"special keys\" defined in (mapconcat #'identity which-key-special-keys "\\|") "\\)")) - case-fold-search) + (case-fold-search nil)) (save-match-data (if (and which-key-special-keys (string-match regexp key)) From 4e7739cdf879bb5be6ec871527be204c3e5eb063 Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 13 Apr 2024 15:56:34 -0400 Subject: [PATCH 802/816] Add more debugging info to which-key--create-pages --- which-key.el | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/which-key.el b/which-key.el index 7d859a90bc6..beb111211a8 100644 --- a/which-key.el +++ b/which-key.el @@ -2124,11 +2124,36 @@ is the width of the live window." ;; `which-key-allow-imprecise-window-fit' is non-nil. (setf (which-key--pages-height result) which-key-min-display-lines)) (which-key--debug-message "Frame height: %s +Frame pixel width: %s +Frame char width: %s +Frame width: %s +Which-key initial width: %s +Which-key adjusted width: %s Minibuffer height: %s -Max dimensions: (%s,%s) -Available for bindings: (%s,%s) -Actual lines: %s" (frame-height) (window-text-height (minibuffer-window)) -max-lines max-width avl-lines avl-width (which-key--pages-height result)) +Max dimensions: (%s, %s) +Available for bindings: (%s, %s) +Popup type info: (%s, %s, %s) +Computed page widths: %s +Actual lines: %s" + (frame-height) + (frame-pixel-width) + (frame-char-width) + (window-total-width (frame-root-window)) + (which-key--width-or-percentage-to-width + which-key-side-window-max-width) + (which-key--total-width-to-text + (which-key--width-or-percentage-to-width + which-key-side-window-max-width)) + (window-text-height (minibuffer-window)) + max-lines + max-width + avl-lines + avl-width + which-key-popup-type + which-key-side-window-location + which-key-side-window-max-width + (which-key--pages-widths result) + (which-key--pages-height result)) result))) (defun which-key--lighter-status () From e21ee102ed5f2f60bd0bc47382c70aa8fd5b9c5b Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Sat, 13 Apr 2024 16:03:47 -0400 Subject: [PATCH 803/816] Add more debugging information --- which-key.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/which-key.el b/which-key.el index beb111211a8..1ece569e7ed 100644 --- a/which-key.el +++ b/which-key.el @@ -1284,6 +1284,10 @@ call signature in different emacs versions" (window-height . (lambda (w) (fit-window-to-buffer w nil 1))) (side . ,which-key-side-window-location) (slot . ,which-key-side-window-slot))))) + (which-key--debug-message "Allow imprecise fit: %s +Display window alist: %s" + which-key-allow-imprecise-window-fit + alist) ;; Previously used `display-buffer-in-major-side-window' here, but ;; apparently that is meant to be an internal function. See emacs bug #24828 ;; and advice given there. From ba323d6712d54806aa82847d017e94eafcf99d6f Mon Sep 17 00:00:00 2001 From: Justin Burkett Date: Tue, 23 Apr 2024 09:20:28 -0400 Subject: [PATCH 804/816] Revert "* which-key.el (which-key--partition-list): Replace cl-subseq by take" This reverts commit 94a29cda9f75c9901667bf45ff25bd8c892cb416. --- which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/which-key.el b/which-key.el index 1ece569e7ed..0e14c76df95 100644 --- a/which-key.el +++ b/which-key.el @@ -2016,7 +2016,7 @@ that width." "Partition LIST into N-sized sublists." (let (res) (while list - (setq res (cons (take (min n (length list)) list) res) + (setq res (cons (cl-subseq list 0 (min n (length list))) res) list (nthcdr n list))) (nreverse res))) From b3974a28f39f535fae7a4fae14255a34a52569e8 Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Tue, 9 Apr 2024 22:54:39 +0100 Subject: [PATCH 805/816] Remove old backport version of universal-argument--description In preparation for the move to Emacs core, this is no longer needed. Furthermore, the backport was of emacs25 on 2015-12-04 so is unlikely to affect most current installations in the meantime. * which-key.el: Remove old backport of 2025-12-04. (which-key--full-prefix): Use built-in universal-argument--description. --- which-key.el | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/which-key.el b/which-key.el index 0e14c76df95..0d44a61020a 100644 --- a/which-key.el +++ b/which-key.el @@ -2194,32 +2194,13 @@ Actual lines: %s" (which-key--propertize (format "[%s paging/help]" key) 'face 'which-key-note-face)))) -(eval-and-compile - (if (fboundp 'universal-argument--description) - (defalias 'which-key--universal-argument--description - #'universal-argument--description) - (defun which-key--universal-argument--description () - ;; Backport of the definition of universal-argument--description in - ;; emacs25 on 2015-12-04 - (when prefix-arg - (concat "C-u" - (pcase prefix-arg - (`(-) " -") - (`(,(and (pred integerp) n)) - (let ((str "")) - (while (and (> n 4) (= (mod n 4) 0)) - (setq str (concat str " C-u")) - (setq n (/ n 4))) - (if (= n 4) str (format " %s" prefix-arg)))) - (_ (format " %s" prefix-arg)))))))) - (defun which-key--full-prefix (prefix-keys &optional -prefix-arg dont-prop-keys) "Return a description of the full key sequence up to now. Include prefix arguments." (let* ((left (eq which-key-show-prefix 'left)) (prefix-arg (if -prefix-arg -prefix-arg prefix-arg)) (str (concat - (which-key--universal-argument--description) + (universal-argument--description) (when prefix-arg " ") prefix-keys)) (dash (if (and (not (string= prefix-keys "")) From 1e89fa000e9ba9549f15ef57abccd118d5f2fe1a Mon Sep 17 00:00:00 2001 From: Jeremy Bryant Date: Wed, 10 Apr 2024 22:56:27 +0100 Subject: [PATCH 806/816] Remove unnecessary (delq nil...). This is presumed to be an artifacto of an old default. * which-key.el (which-key-replacement-alist): Remove unnecessary (delq nil...). --- which-key.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/which-key.el b/which-key.el index 0d44a61020a..f53226ee969 100644 --- a/which-key.el +++ b/which-key.el @@ -162,12 +162,11 @@ currently active keymaps." :version "1.0") (defcustom which-key-replacement-alist - (delq nil - `(((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg")) - ,@(unless which-key-dont-use-unicode - '((("") . ("←")) - (("") . ("→")))) - (("<\\([[:alnum:]-]+\\)>") . ("\\1")))) + `(((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg")) + ,@(unless which-key-dont-use-unicode + '((("") . ("←")) + (("") . ("→")))) + (("<\\([[:alnum:]-]+\\)>") . ("\\1"))) "ALIST for manipulating display of binding descriptions. Each element of the list is a nested cons cell with the format From 4b2781f16d72985dc8ba5d14cd6821c8f1cd1439 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Sat, 15 Jun 2024 14:48:58 +0200 Subject: [PATCH 807/816] * lisp/which-key.el: Clean up file header --- lisp/which-key.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index f53226ee969..e93ef9184aa 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -5,9 +5,10 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; Version: 3.6.0 -;; Keywords: ;; Package-Requires: ((emacs "24.4")) +;; This file is part of GNU Emacs. + ;; 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 @@ -23,16 +24,15 @@ ;;; Commentary: -;; which-key provides the minor mode which-key-mode for Emacs. The mode displays -;; the key bindings following your currently entered incomplete command (a -;; prefix) in a popup. For example, after enabling the minor mode if you enter -;; C-x and wait for the default of 1 second the minibuffer will expand with all -;; of the available key bindings that follow C-x (or as many as space allows -;; given your settings). This includes prefixes like C-x 8 which are shown in a -;; different face. Screenshots of what the popup will look like along with -;; information about additional features can be found at -;; https://github.com/justbur/emacs-which-key. +;; The `which-key' mode displays the key bindings following your +;; currently entered incomplete command (a prefix) in a popup. For +;; example, after enabling the minor mode if you enter C-x and wait for +;; the default of 1 second the minibuffer will expand with all of the +;; available key bindings that follow C-x (or as many as space allows +;; given your settings). ;; +;; This includes prefixes like C-x 8 which are shown in a different +;; face. ;;; Code: From 847b202c1c15c23239bf07ab619229f103b408a5 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Sat, 15 Jun 2024 14:55:20 +0200 Subject: [PATCH 808/816] * etc/NEWS: Mention the addition of 'which-key' --- etc/NEWS | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 302cd30a135..4916c18e53a 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1982,6 +1982,11 @@ To revert to the previous behavior, set the (also new) variable 'async-shell-command-mode' to 'shell-mode'. Any hooks or mode-specific variables used should be adapted appropriately. +** New package Which-Key +The 'which-key' package from GNU ELPA is now included in Emacs. It +implements the 'which-key-mode' that displays a table of key bindings +upon entering a partial key chord and waiting for a moment. + * Incompatible Lisp Changes in Emacs 30.1 From 1efbc8ff440d52168f22e6256ec8f55e98953570 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sat, 15 Jun 2024 16:29:36 +0200 Subject: [PATCH 809/816] Fix checkdoc warnings in which-key.el * lisp/which-key.el (which-key, which-key-idle-secondary-delay) (which-key-replacement-alist) (which-key-allow-multiple-replacements, which-key-show-docstrings) (which-key-highlighted-command-list, which-key-show-prefix) (which-key-sort-order, which-key-sort-uppercase-first) (which-key-use-C-h-commands, which-key-show-early-on-C-h) (which-key-preserve-window-configuration, which-key-C-h-map) (which-key-delay-functions, which-key-inhibit-regexps) (which-key-faces, which-key-key-face, which-key-separator-face) (which-key-note-face, which-key-command-description-face) (which-key-local-map-description-face, which-key-special-key-face) (which-key-inhibit-display-hook) (which-key-this-command-keys-function, which-key-mode) (which-key--init-buffer, which-key--get-menu-item-binding) (which-key--get-keymap-bindings, which-key-reload-key-sequence) (which-key-show-major-mode, which-key-show-full-major-mode) (which-key-C-h-dispatch): Fix checkdoc warnings. --- lisp/which-key.el | 91 +++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index e93ef9184aa..6d61bfde642 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -50,7 +50,7 @@ ;;; Options (defgroup which-key nil - "Customization options for which-key-mode." + "Customization options for `which-key-mode'." :group 'help :prefix "which-key-") @@ -67,7 +67,7 @@ recommended (defcustom which-key-idle-secondary-delay nil "Seconds to wait for which-key to pop up after initial display. This makes it possible to shorten the delay for subsequent popups -in the same key sequence. The default is for this value to be +in the same key sequence. The default is for this value to be nil, which disables this behavior." :type '(choice float (const :tag "Disabled" nil)) :version "1.0") @@ -173,15 +173,15 @@ Each element of the list is a nested cons cell with the format \(MATCH CONS . REPLACEMENT\). The MATCH CONS determines when a replacement should occur and -REPLACEMENT determines how the replacement should occur. Each may -have the format \(KEY REGEXP . BINDING REGEXP\). For the +REPLACEMENT determines how the replacement should occur. Each may +have the format \(KEY REGEXP . BINDING REGEXP\). For the replacement to apply the key binding must match both the KEY -REGEXP and the BINDING REGEXP. A value of nil in either position -can be used to match every possibility. The replacement is +REGEXP and the BINDING REGEXP. A value of nil in either position +can be used to match every possibility. The replacement is performed by using `replace-regexp-in-string' on the KEY REGEXP from the MATCH CONS and REPLACEMENT when it is a cons cell, and -then similarly for the BINDING REGEXP. A nil value in the BINDING -REGEXP position cancels the replacement. For example, the entry +then similarly for the BINDING REGEXP. A nil value in the BINDING +REGEXP position cancels the replacement. For example, the entry \(\(nil . \"Prefix Command\"\) . \(nil . \"prefix\"\)\) @@ -207,7 +207,7 @@ non-nil value." (defcustom which-key-allow-multiple-replacements nil "Allow a key binding to be modified by multiple elements. When non-nil, this allows a single key binding to match multiple -patterns in `which-key-replacement-alist'. When nil, only the +patterns in `which-key-replacement-alist'. When nil, only the first match is used to perform replacements from `which-key-replacement-alist'." :type 'boolean @@ -216,8 +216,8 @@ first match is used to perform replacements from (defcustom which-key-show-docstrings nil "If non-nil, show each command's docstring in the which-key popup. This will only display the docstring up to the first line -break. If you set this variable to the symbol docstring-only, -then the command's name with be omitted. You probably also want +break. If you set this variable to the symbol docstring-only, +then the command's name with be omitted. You probably also want to adjust `which-key-max-description-length' at the same time if you use this feature." :type '(radio @@ -230,7 +230,7 @@ you use this feature." "Rules used to highlight certain commands. If the element is a string, assume it is a regexp pattern for matching command names and use -`which-key-highlighted-command-face' for any matching names. If +`which-key-highlighted-command-face' for any matching names. If the element is a cons cell, it should take the form (regexp . face to apply)." :type '(repeat (choice string (cons regexp face))) @@ -253,7 +253,7 @@ is disabled by default. An example configuration is (defcustom which-key-show-prefix 'echo "Whether to and where to display the current prefix sequence. Possible choices are echo for echo area (the default), left, top -and nil. Nil turns the feature off." +and nil. nil turns the feature off." :type '(radio (const :tag "Left of the keys" left) (const :tag "In the first line" top) (const :tag "In the last line" bottom) @@ -352,8 +352,7 @@ and https://github.com/justbur/emacs-which-key/issues/225." (defcustom which-key-sort-order #'which-key-key-order "Order in which the key bindings are sorted. If nil, do not resort the output from `describe-buffer-bindings' -which groups by mode. Ordering options -are +which groups by mode. Ordering options are: 1. `which-key-key-order': by key (default) 2. `which-key-key-order-alpha': by key using alphabetical order @@ -373,7 +372,7 @@ information." (defcustom which-key-sort-uppercase-first t "If non-nil, uppercase comes before lowercase in sorting. This applies to the function chosen in -`which-key-sort-order'. Otherwise, the order is reversed." +`which-key-sort-order'. Otherwise, the order is reversed." :type 'boolean :version "1.0") @@ -400,20 +399,20 @@ Bound after each of the prefixes in `which-key-paging-prefixes'" ;; :type '(repeat symbol)) (defcustom which-key-use-C-h-commands t - "Use C-h (`help-char') for paging if non-nil. + "Use \\`C-h' (`help-char') for paging if non-nil. Normally `help-char' after a prefix calls -`describe-prefix-bindings'. This changes that command to a -which-key paging command when which-key-mode is active." +`describe-prefix-bindings'. This changes that command to a +which-key paging command when `which-key-mode' is active." :type 'boolean :version "1.0") (defcustom which-key-show-early-on-C-h nil - "Allow C-h (`help-char') to trigger which-key popup before timer. + "Allow \\`C-h' (`help-char') to trigger which-key popup before timer. Show the which-key buffer if `help-char' is pressed in the middle of a prefix before the which-key buffer would normally be -triggered by the time. If combined with the following settings, +triggered by the time. If combined with the following settings, which-key will effectively only show when triggered \"manually\" -using C-h. +using \\`C-h'. \(setq `which-key-idle-delay' 10000) \(setq `which-key-idle-secondary-delay' 0.05) @@ -431,7 +430,7 @@ Note that `which-key-idle-delay' should be set before turning on (defcustom which-key-preserve-window-configuration nil "Save and restore window configuration around which-key popup display. If non-nil, save window configuration before which-key buffer is -shown and restore it after which-key buffer is hidden. It +shown and restore it after which-key buffer is hidden. It prevents which-key from changing window position of visible buffers. Only takken into account when popup type is side-window." @@ -482,7 +481,7 @@ This string is fed into `substitute-command-keys'") ("9" . which-key-digit-argument))) (define-key map (car bind) (cdr bind))) map) - "Keymap for C-h commands.") + "Keymap for \\`C-h' commands.") (defvar which-key--paging-functions (list #'which-key-C-h-dispatch @@ -510,11 +509,11 @@ See Info node `(emacs)Modifier Keys'." "List of functions that may delay the which-key popup. A list of functions that may decide whether to delay the which-key popup based on the current incomplete key -sequence. Each function in the list is run with two arguments, +sequence. Each function in the list is run with two arguments, the current key sequence as produced by `key-description' and the -length of the key sequence. If the popup should be delayed based +length of the key sequence. If the popup should be delayed based on that key sequence, the function should return the delay time -in seconds. Returning nil means no delay. The first function in +in seconds. Returning nil means no delay. The first function in this list to return a value is the value that is used. The delay time is effectively added to the normal @@ -533,7 +532,7 @@ key sequences is what is produced by `key-description'." (defcustom which-key-inhibit-regexps nil "A list of regexp strings to use to filter key sequences. When non-nil, for a key sequence to trigger the which-key popup -it cannot match one of the regexps in this list. The format of +it cannot match one of the regexps in this list. The format of the key sequences is what is produced by `key-description'." :type '(repeat regexp) :version "1.0") @@ -561,37 +560,37 @@ it." ;;;; Faces (defgroup which-key-faces nil - "Faces for which-key-mode" + "Faces for `which-key-mode'." :group 'which-key :prefix "which-key-") (defface which-key-key-face '((t . (:inherit font-lock-constant-face))) - "Face for which-key keys" + "Face for which-key keys." :group 'which-key-faces :version "1.0") (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-faces :version "1.0") (defface which-key-note-face '((t . (:inherit which-key-separator-face))) - "Face for notes or hints occasionally provided" + "Face for notes or hints occasionally provided." :group 'which-key-faces :version "1.0") (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-faces :version "1.0") (defface which-key-local-map-description-face '((t . (:inherit which-key-command-description-face))) - "Face for the key description when it is found in `current-local-map'" + "Face for the key description when it is found in `current-local-map'." :group 'which-key-faces :version "1.0") @@ -610,7 +609,7 @@ and it matches a string in `which-key-highlighted-command-list'." (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-faces :version "1.0") @@ -664,7 +663,7 @@ execution of a command, as in (defcustom which-key-inhibit-display-hook nil "Hook run before display of which-key popup. Each function in the hook is run before displaying the which-key -popup. If any function returns a non-nil value, the popup will +popup. If any function returns a non-nil value, the popup will not display." :group 'which-key :type 'hook @@ -796,7 +795,7 @@ should be formatted as an input for `kbd'." "Function used to retrieve current key sequence. The purpose of allowing this variable to be customized is to allow which-key to support packages that insert non-standard -`keys' into the key sequence being read by emacs." +`keys' into the key sequence being read by Emacs." :group 'which-key :type 'function :version "1.0") @@ -888,7 +887,7 @@ disable support." ;;;###autoload (define-minor-mode which-key-mode - "Toggle which-key-mode." + "Toggle `which-key-mode'." :global t :group 'which-key :lighter which-key-lighter @@ -928,7 +927,7 @@ disable support." (which-key--stop-timer))) (defun which-key--init-buffer () - "Initialize which-key buffer" + "Initialize which-key buffer." (unless (buffer-live-p which-key--buffer) (setq which-key--buffer (get-buffer-create which-key-buffer-name)) (with-current-buffer which-key--buffer @@ -1857,7 +1856,7 @@ Requires `which-key-compute-remaps' to be non-nil." binding)))) (defun which-key--get-menu-item-binding (def) - "Retrieve binding for menu-item" + "Retrieve binding for menu-item." ;; see `keymap--menu-item-binding' (let* ((binding (nth 2 def)) (plist (nthcdr 3 def)) @@ -1925,7 +1924,7 @@ Requires `which-key-compute-remaps' to be non-nil." "Retrieve top-level bindings from KEYMAP. PREFIX limits bindings to those starting with this key sequence. START is a list of existing bindings to add to. If ALL -is non-nil, recursively retrieve all bindings below PREFIX. If +is non-nil, recursively retrieve all bindings below PREFIX. If EVIL is non-nil, extract active evil bidings." (let ((bindings start) (ignore '(self-insert-command ignore ignore-event company-ignore)) @@ -2329,7 +2328,7 @@ enough space based on your settings and frame size." prefix-keys) "Simulate entering the key sequence KEY-SEQ. KEY-SEQ should be a list of events as produced by `listify-key-sequence'. If nil, KEY-SEQ defaults to -`which-key--current-key-list'. Any prefix arguments that were +`which-key--current-key-list'. Any prefix arguments that were used are reapplied to the new key sequence." (let* ((key-seq (or key-seq (which-key--current-key-list))) (next-event (mapcar (lambda (ev) (cons t ev)) key-seq))) @@ -2408,7 +2407,7 @@ Usually this is `describe-prefix-bindings'." "Show top-level bindings in the map of the current major mode. This function will also detect evil bindings made using `evil-define-key' in this map. These bindings will depend on the -current evil state. " +current evil state." (interactive "P") (let ((map-sym (intern (format "%s-map" major-mode)))) (if (and (boundp map-sym) (keymapp (symbol-value map-sym))) @@ -2423,8 +2422,8 @@ current evil state. " (defun which-key-show-full-major-mode () "Show all bindings in the map of the current major mode. This function will also detect evil bindings made using -`evil-define-key' in this map. These bindings will depend on the -current evil state. " +`evil-define-key' in this map. These bindings will depend on the +current evil state." (interactive) (which-key-show-major-mode t)) @@ -2485,7 +2484,7 @@ PREFIX should be a string suitable for `kbd'." ;;;###autoload (defun which-key-C-h-dispatch () - "Dispatch C-h commands by looking up key in `which-key-C-h-map'. + "Dispatch \\`C-h' commands by looking up key in `which-key-C-h-map'. This command is always accessible (from any prefix) if `which-key-use-C-h-commands' is non nil." (interactive) From f2077bca79ef96cdd8ccb840623a62824d6e15bc Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sat, 15 Jun 2024 16:31:14 +0200 Subject: [PATCH 810/816] Bump `which-key` minimum Emacs version to 25.1 * lisp/which-key.el: Bump minimum required Emacs version to 25.1 since the package depends on `universal-argument--description'. This was detected by package-lint. --- lisp/which-key.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index 6d61bfde642..cac23c88d74 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -5,7 +5,7 @@ ;; Author: Justin Burkett ;; Maintainer: Justin Burkett ;; Version: 3.6.0 -;; Package-Requires: ((emacs "24.4")) +;; Package-Requires: ((emacs "25.1")) ;; This file is part of GNU Emacs. From 43a22401191592c4d367d80af5de2b7c0e7efcad Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Sat, 15 Jun 2024 21:24:46 +0200 Subject: [PATCH 811/816] Fix :version tag for 'which-key' custom data * lisp/which-key.el (which-key-idle-delay) (which-key-idle-secondary-delay, which-key-echo-keystrokes) (which-key-max-description-length) (which-key-min-column-description-width) (which-key-add-column-padding, which-key-unicode-correction) (which-key-dont-use-unicode, which-key-separator) (which-key-ellipsis, which-key-prefix-prefix) (which-key-compute-remaps, which-key-replacement-alist) (which-key-allow-multiple-replacements) (which-key-show-docstrings, which-key-highlighted-command-list) (which-key-special-keys, which-key-buffer-name) (which-key-show-prefix, which-key-popup-type) (which-key-min-display-lines, which-key-max-display-columns) (which-key-side-window-location, which-key-side-window-slot) (which-key-side-window-max-width) (which-key-side-window-max-height, which-key-frame-max-width) (which-key-frame-max-height) (which-key-allow-imprecise-window-fit) (which-key-show-remaining-keys, which-key-sort-order) (which-key-sort-uppercase-first, which-key-paging-prefixes) (which-key-paging-key, which-key-use-C-h-commands) (which-key-show-early-on-C-h, which-key-is-verbose) (which-key-preserve-window-configuration) (which-key-hide-alt-key-translations, which-key-delay-functions) (which-key-allow-regexps, which-key-inhibit-regexps) (which-key-show-transient-maps, which-key-init-buffer-hook) (which-key-key-face, which-key-separator-face) (which-key-note-face, which-key-command-description-face) (which-key-local-map-description-face) (which-key-highlighted-command-face) (which-key-group-description-face, which-key-special-key-face) (which-key-docstring-face) (which-key-custom-popup-max-dimensions-function) (which-key-custom-hide-popup-function) (which-key-custom-show-popup-function, which-key-lighter) (which-key-inhibit-display-hook) (which-key-this-command-keys-function) (which-key-allow-evil-operators) (which-key-show-operator-state-maps): Rename :version to :package-version and add new :version tags indicating that 'which-key' was added with Emacs 30. --- lisp/which-key.el | 122 +++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index cac23c88d74..5ca88a682a5 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -62,7 +62,7 @@ A value of zero might lead to issues, so a non-zero value is recommended (see https://github.com/justbur/emacs-which-key/issues/134)." :type 'float - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-idle-secondary-delay nil "Seconds to wait for which-key to pop up after initial display. @@ -70,7 +70,7 @@ This makes it possible to shorten the delay for subsequent popups in the same key sequence. The default is for this value to be nil, which disables this behavior." :type '(choice float (const :tag "Disabled" nil)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-echo-keystrokes (if (and echo-keystrokes (> (+ echo-keystrokes 0.01) @@ -83,7 +83,7 @@ This only applies if `which-key-popup-type' is minibuffer or `which-key-idle-delay' or else the keystroke echo will erase the which-key popup." :type 'float - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-max-description-length 27 "Truncate the description of keys to this length. @@ -96,17 +96,17 @@ before. Truncation is done using `which-key-ellipsis'." (integer :tag "Width in characters") (float :tag "Use fraction of available width") function) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-min-column-description-width 0 "Every column should at least have this width." :type 'natnum - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-add-column-padding 0 "Additional spaces to add to the left of each key column." :type 'integer - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-unicode-correction 3 "Correction for wide unicode characters. @@ -122,14 +122,14 @@ additional ASCII character in the which-key buffer. Increase this number if you are seeing characters get cutoff on the right side of the which-key popup." :type 'integer - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-dont-use-unicode nil "If non-nil, don't use any unicode characters in default setup. For affected settings, see `which-key-replacement-alist', `which-key-ellipsis' `which-key-separator'." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-separator (if which-key-dont-use-unicode " : " " → ") @@ -137,7 +137,7 @@ For affected settings, see `which-key-replacement-alist', `which-key-ellipsis' Default is \" → \", unless `which-key-dont-use-unicode' is non nil, in which case the default is \" : \"." :type 'string - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-ellipsis (if which-key-dont-use-unicode ".." "…") @@ -146,20 +146,20 @@ Default is \"…\", unless `which-key-dont-use-unicode' is non nil, in which case the default is \"..\". This can also be the empty string to truncate without using any ellipsis." :type 'string - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-prefix-prefix "+" "Prefix string to indicate a key bound to a keymap. Default is \"+\"." :type 'string - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-compute-remaps nil "If non-nil, show remapped commands. This applies to commands that have been remapped given the currently active keymaps." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-replacement-alist `(((nil . "which-key-show-next-page-no-cycle") . (nil . "wk next pg")) @@ -202,7 +202,7 @@ non-nil value." (choice regexp (const nil))) :value-type (cons (choice string (const nil)) (choice string (const nil)))) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-allow-multiple-replacements nil "Allow a key binding to be modified by multiple elements. @@ -211,7 +211,7 @@ patterns in `which-key-replacement-alist'. When nil, only the first match is used to perform replacements from `which-key-replacement-alist'." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-show-docstrings nil "If non-nil, show each command's docstring in the which-key popup. @@ -224,7 +224,7 @@ you use this feature." (const :tag "Do not show docstrings" nil) (const :tag "Add docstring to command names" t) (const :tag "Replace command name with docstring" docstring-only)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-highlighted-command-list '() "Rules used to highlight certain commands. @@ -234,7 +234,7 @@ matching command names and use the element is a cons cell, it should take the form (regexp . face to apply)." :type '(repeat (choice string (cons regexp face))) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-special-keys '() "These keys will automatically be truncated to one character. @@ -243,12 +243,12 @@ is disabled by default. An example configuration is \(setq which-key-special-keys \\='(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)" :type '(repeat string) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-buffer-name " *which-key*" "Name of which-key buffer." :type 'string - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-show-prefix 'echo "Whether to and where to display the current prefix sequence. @@ -260,7 +260,7 @@ and nil. nil turns the feature off." (const :tag "In the echo area" echo) (const :tag "In the mode-line" mode-line) (const :tag "Hide" nil)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-popup-type 'side-window "Supported types are minibuffer, side-window, frame, and custom." @@ -268,18 +268,18 @@ and nil. nil turns the feature off." (const :tag "Show in side window" side-window) (const :tag "Show in popup frame" frame) (const :tag "Use your custom display functions" custom)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-min-display-lines 1 "Minimum number of horizontal lines to display in the which-key buffer." :type 'integer - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-max-display-columns nil "Maximum number of columns to display in the which-key buffer. A value of nil means don't impose a maximum." :type '(choice integer (const :tag "Unbounded" nil)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-side-window-location 'bottom "Location of which-key popup when `which-key-popup-type' is side-window. @@ -293,7 +293,7 @@ location is tried." (const top) (const (right bottom)) (const (bottom right))) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-side-window-slot 0 "The `slot' to use for `display-buffer-in-side-window'. @@ -307,31 +307,31 @@ preceding (that is, above or on the left of) the middle slot. A positive value means use a slot following (that is, below or on the right of) the middle slot. The default is zero." :type 'integer - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-side-window-max-width 0.333 "Maximum width of which-key popup when type is side-window. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's width." :type 'float - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-side-window-max-height 0.25 "Maximum height of which-key popup when type is side-window. This variable can also be a number between 0 and 1. In that case, it denotes a percentage out of the frame's height." :type 'float - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-frame-max-width 60 "Maximum width of which-key popup when type is frame." :type 'natnum - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-frame-max-height 20 "Maximum height of which-key popup when type is frame." :type 'natnum - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-allow-imprecise-window-fit (not (display-graphic-p)) "Allow which-key to use a simpler method for resizing the popup. @@ -341,13 +341,13 @@ this on may help. See https://github.com/justbur/emacs-which-key/issues/130 and https://github.com/justbur/emacs-which-key/issues/225." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-show-remaining-keys nil "Show remaining keys in last slot, when keys are hidden." :type '(radio (const :tag "Yes" t) (const :tag "No" nil)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-sort-order #'which-key-key-order "Order in which the key bindings are sorted. @@ -367,25 +367,25 @@ information." (function-item which-key-description-order) (function-item which-key-prefix-then-key-order) (function-item which-key-local-then-key-order)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-sort-uppercase-first t "If non-nil, uppercase comes before lowercase in sorting. This applies to the function chosen in `which-key-sort-order'. Otherwise, the order is reversed." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-paging-prefixes '() "Enable paging for these prefixes." :type '(repeat string) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-paging-key "" "Key to use for changing pages. Bound after each of the prefixes in `which-key-paging-prefixes'" :type 'string - :version "1.0") + :package-version "1.0" :version "30.1") ;; (defcustom which-key-undo-key nil ;; "Key (string) to use for undoing keypresses. Bound recursively @@ -404,7 +404,7 @@ Normally `help-char' after a prefix calls `describe-prefix-bindings'. This changes that command to a which-key paging command when `which-key-mode' is active." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-show-early-on-C-h nil "Allow \\`C-h' (`help-char') to trigger which-key popup before timer. @@ -420,12 +420,12 @@ using \\`C-h'. Note that `which-key-idle-delay' should be set before turning on `which-key-mode'." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-is-verbose nil "Whether to warn about potential mistakes in configuration." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-preserve-window-configuration nil "Save and restore window configuration around which-key popup display. @@ -435,7 +435,7 @@ prevents which-key from changing window position of visible buffers. Only takken into account when popup type is side-window." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defvar which-key-C-h-map-prompt (concat " \\" @@ -503,7 +503,7 @@ of terminals issue META modifier for the Alt key. See Info node `(emacs)Modifier Keys'." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-delay-functions nil "List of functions that may delay the which-key popup. @@ -519,7 +519,7 @@ this list to return a value is the value that is used. The delay time is effectively added to the normal `which-key-idle-delay'." :type '(repeat function) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-allow-regexps nil "A list of regexp strings to use to filter key sequences. @@ -527,7 +527,7 @@ When non-nil, for a key sequence to trigger the which-key popup it must match one of the regexps in this list. The format of the key sequences is what is produced by `key-description'." :type '(repeat regexp) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-inhibit-regexps nil "A list of regexp strings to use to filter key sequences. @@ -535,7 +535,7 @@ When non-nil, for a key sequence to trigger the which-key popup it cannot match one of the regexps in this list. The format of the key sequences is what is produced by `key-description'." :type '(repeat regexp) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-show-transient-maps nil "Show keymaps created by `set-transient-map' when applicable. @@ -544,7 +544,7 @@ More specifically, detect when `overriding-terminal-local-map' is set (this is the keymap used by `set-transient-map') and display it." :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (make-obsolete-variable 'which-key-enable-extended-define-key @@ -555,7 +555,7 @@ it." (defcustom which-key-init-buffer-hook '() "Hook run when which-key buffer is initialized." :type 'hook - :version "1.0") + :package-version "1.0" :version "30.1") ;;;; Faces @@ -568,56 +568,56 @@ it." '((t . (:inherit font-lock-constant-face))) "Face for which-key keys." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") (defface which-key-separator-face '((t . (:inherit font-lock-comment-face))) "Face for the separator (default separator is an arrow)." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") (defface which-key-note-face '((t . (:inherit which-key-separator-face))) "Face for notes or hints occasionally provided." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") (defface which-key-command-description-face '((t . (:inherit font-lock-function-name-face))) "Face for the key description when it is a command." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") (defface which-key-local-map-description-face '((t . (:inherit which-key-command-description-face))) "Face for the key description when it is found in `current-local-map'." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") (defface which-key-highlighted-command-face '((t . (:inherit which-key-command-description-face :underline t))) "Default face for the command description when it is a command and it matches a string in `which-key-highlighted-command-list'." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") (defface which-key-group-description-face '((t . (:inherit font-lock-keyword-face))) "Face for the key description when it is a group or prefix." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") (defface which-key-special-key-face '((t . (:inherit which-key-key-face :inverse-video t :weight bold))) "Face for special keys (\\`SPC', \\`TAB', \\`RET')." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") (defface which-key-docstring-face '((t . (:inherit which-key-note-face))) "Face for docstrings." :group 'which-key-faces - :version "1.0") + :package-version "1.0" :version "30.1") ;;;; Custom popup @@ -628,14 +628,14 @@ return the maximum height in lines and width in characters of the which-key popup in the form a cons cell (height . width)." :group 'which-key :type '(choice function (const nil)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-custom-hide-popup-function nil "Set a custom hide-popup function. It takes no arguments and the return value is ignored." :group 'which-key :type '(choice function (const nil)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-custom-show-popup-function nil "Set a custom show-popup function. @@ -644,13 +644,13 @@ width) in lines and characters respectively. The return value is ignored." :group 'which-key :type '(choice function (const nil)) - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-lighter " WK" "Minor mode lighter to use in the mode-line." :group 'which-key :type 'string - :version "1.0") + :package-version "1.0" :version "30.1") (defvar which-key-inhibit nil "Prevent which-key from popping up momentarily. @@ -667,7 +667,7 @@ popup. If any function returns a non-nil value, the popup will not display." :group 'which-key :type 'hook - :version "1.0") + :package-version "1.0" :version "30.1") (defvar which-key-keymap-history nil "History of keymap selections. @@ -798,7 +798,7 @@ allow which-key to support packages that insert non-standard `keys' into the key sequence being read by Emacs." :group 'which-key :type 'function - :version "1.0") + :package-version "1.0" :version "30.1") ;;;; Evil @@ -812,7 +812,7 @@ setting this to non-nil will override this behavior for evil operators." :group 'which-key :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defcustom which-key-show-operator-state-maps nil "Show the keys following an evil command that reads a motion. @@ -822,7 +822,7 @@ might be some valid keys missing and it might be showing some invalid keys." :group 'which-key :type 'boolean - :version "1.0") + :package-version "1.0" :version "30.1") (defun which-key-evil-this-operator-p () (and which-key-allow-evil-operators From e0871780ac44336a30e76abb91459cf5d0e5e6e2 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 16 Jun 2024 13:39:26 +0200 Subject: [PATCH 812/816] ; Fix more checkdoc warnings in which-key.el * lisp/which-key.el (which-key-special-keys) (which-key-highlighted-command-face, which-key--safe-lookup-key) (which-key--safe-lookup-key-description) (which-key-add-keymap-based-replacements) (which-key-add-key-based-replacements) (which-key--fit-buffer-to-window-horizontally) (which-key--popup-max-dimensions) (which-key--propertize-description, which-key--format-and-replace) (which-key--get-bindings, which-key--list-to-pages) (which-key--create-pages-1, which-key--create-pages) (which-key--get-popup-map, which-key-show-major-mode): Fix checkdoc warnings. --- lisp/which-key.el | 49 ++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index 5ca88a682a5..a2355527dd3 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -238,8 +238,8 @@ face to apply)." (defcustom which-key-special-keys '() "These keys will automatically be truncated to one character. -They also have `which-key-special-key-face' applied to them. This -is disabled by default. An example configuration is +They also have `which-key-special-key-face' applied to them. This +is disabled by default. An example configuration is \(setq which-key-special-keys \\='(\"SPC\" \"TAB\" \"RET\" \"ESC\" \"DEL\")\)" :type '(repeat string) @@ -596,8 +596,9 @@ it." (defface which-key-highlighted-command-face '((t . (:inherit which-key-command-description-face :underline t))) - "Default face for the command description when it is a command -and it matches a string in `which-key-highlighted-command-list'." + "Default face for command description. +To be highlighted, it must be a command and match a string in +`which-key-highlighted-command-list'." :group 'which-key-faces :package-version "1.0" :version "30.1") @@ -762,8 +763,8 @@ Used when `which-key-popup-type' is frame.") (defsubst which-key--safe-lookup-key (keymap key) "Version of `lookup-key' that allows KEYMAP to be nil. -Also convert numeric results of `lookup-key' to nil. KEY is not -checked." +Also convert numeric results of `lookup-key' to nil. +KEY is not checked." (when (keymapp keymap) (let ((result (lookup-key keymap key))) (when (and result (not (numberp result))) @@ -771,8 +772,8 @@ checked." (defsubst which-key--safe-lookup-key-description (keymap key) "Version of `lookup-key' that allows KEYMAP to be nil. -Also convert numeric results of `lookup-key' to nil. KEY -should be formatted as an input for `kbd'." +Also convert numeric results of `lookup-key' to nil. +KEY should be formatted as an input for `kbd'." (let ((key (ignore-errors (kbd key)))) (when (and key (keymapp keymap)) (let ((result (lookup-key keymap key))) @@ -1006,12 +1007,12 @@ but more functional." ;;;###autoload (defun which-key-add-keymap-based-replacements (keymap key replacement &rest more) "Replace the description of KEY using REPLACEMENT in KEYMAP. -KEY should take a format suitable for use in `kbd'. REPLACEMENT +KEY should take a format suitable for use in `kbd'. REPLACEMENT should be a cons cell of the form \(STRING . COMMAND\) for each REPLACEMENT, where STRING is the replacement string and COMMAND is a symbol corresponding to the intended command to be -replaced. COMMAND can be nil if the binding corresponds to a key -prefix. An example is +replaced. COMMAND can be nil if the binding corresponds to a key +prefix. An example is \(which-key-add-keymap-based-replacements global-map \"C-x w\" \\='\(\"Save as\" . write-file\)\). @@ -1038,8 +1039,8 @@ for REPLACEMENT will eventually be removed." (defun which-key-add-key-based-replacements (key-sequence replacement &rest more) "Replace the description of KEY-SEQUENCE with REPLACEMENT. -KEY-SEQUENCE is a string suitable for use in `kbd'. REPLACEMENT -may either be a string, as in +KEY-SEQUENCE is a string suitable for use in `kbd'. +REPLACEMENT may either be a string, as in \(which-key-add-key-based-replacements \"C-x 1\" \"maximize\"\) @@ -1260,7 +1261,7 @@ is shown, or if there is no need to start the closing timer." (&optional window &rest params) "Slightly modified version of `fit-buffer-to-window'. Use &rest params because `fit-buffer-to-window' has a different -call signature in different emacs versions" +call signature in different Emacs versions" (let ((fit-window-to-buffer-horizontally t) (window-min-height 1)) (apply #'fit-window-to-buffer window params))) @@ -1364,7 +1365,7 @@ Display window alist: %s" (defun which-key--popup-max-dimensions () "Return maximum dimension available for popup. Dimension functions should return the maximum possible (height -. width) of the intended popup. SELECTED-WINDOW-WIDTH is the +. width) of the intended popup. SELECTED-WINDOW-WIDTH is the width of currently active window, not the which-key buffer window." (cl-ecase which-key-popup-type @@ -1738,7 +1739,7 @@ cell" el))))) (description group local hl-face &optional original-description) "Add face to DESCRIPTION. The face chosen depends on whether the description represents a -group or a command. Also make some minor adjustments to the +group or a command. Also make some minor adjustments to the description string, like removing a \"group:\" prefix. ORIGINAL-DESCRIPTION is the description given by @@ -1813,7 +1814,7 @@ return the docstring." "Make list of key bindings with separators and descriptions. Take a list of (key . desc) cons cells in UNFORMATTED, add faces and perform replacements according to the three replacement -alists. Returns a list (key separator description)." +alists. Return a list (key separator description)." (let ((sep-w-face (which-key--propertize which-key-separator 'face 'which-key-separator-face)) @@ -1949,8 +1950,8 @@ EVIL is non-nil, extract active evil bidings." (defun which-key--get-bindings (&optional prefix keymap filter recursive) "Collect key bindings. If KEYMAP is nil, collect from current buffer using the current -key sequence as a prefix. Otherwise, collect from KEYMAP. FILTER -is a function to use to filter the bindings. If RECURSIVE is +key sequence as a prefix. Otherwise, collect from KEYMAP. FILTER +is a function to use to filter the bindings. If RECURSIVE is non-nil, then bindings are collected recursively for all prefixes." (let* ((unformatted (cond ((keymapp keymap) @@ -2020,7 +2021,7 @@ that width." (defun which-key--list-to-pages (keys avl-lines avl-width) "Convert list of KEYS to columns based on dimensions AVL-LINES and AVL-WIDTH. -Returns a `which-key--pages' object that holds the page strings, +Return a `which-key--pages' object that holds the page strings, as well as metadata." (let ((cols-w-widths (mapcar (lambda (c) (which-key--pad-column c avl-width)) (which-key--partition-list avl-lines keys))) @@ -2063,7 +2064,7 @@ as well as metadata." (keys available-lines available-width &optional min-lines vertical) "Create page strings using `which-key--list-to-pages'. Will try to find the best number of rows and columns using the -given dimensions and the length and widths of ITEMS. Use VERTICAL +given dimensions and the length and widths of ITEMS. Use VERTICAL if the ITEMS are laid out vertically and the number of columns should be minimized." (let ((result (which-key--list-to-pages @@ -2088,7 +2089,7 @@ should be minimized." (defun which-key--create-pages (keys &optional prefix-keys prefix-title) "Create page strings using `which-key--list-to-pages'. Will try to find the best number of rows and columns using the -given dimensions and the length and wdiths of KEYS. SEL-WIN-WIDTH +given dimensions and the length and wdiths of KEYS. SEL-WIN-WIDTH is the width of the live window." (let* ((max-dims (which-key--popup-max-dimensions)) (max-lines (car max-dims)) @@ -2209,7 +2210,7 @@ Include prefix arguments." (which-key--propertize dash 'face 'which-key-key-face))))) (defun which-key--get-popup-map () - "Generate transient-map for use in the top level binding display." + "Generate transient map for use in the top level binding display." (unless which-key--automatic-display (let ((map (make-sparse-keymap))) (define-key map (kbd which-key-paging-key) #'which-key-C-h-dispatch) @@ -2406,7 +2407,7 @@ Usually this is `describe-prefix-bindings'." (defun which-key-show-major-mode (&optional all) "Show top-level bindings in the map of the current major mode. This function will also detect evil bindings made using -`evil-define-key' in this map. These bindings will depend on the +`evil-define-key' in this map. These bindings will depend on the current evil state." (interactive "P") (let ((map-sym (intern (format "%s-map" major-mode)))) From e0190c4fb80182e4436f394213d46fafebc03469 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Tue, 18 Jun 2024 10:40:01 +0200 Subject: [PATCH 813/816] Prevent which-key faces from over-extending during formatting * lisp/which-key.el (which-key--pad-column): Instead of injecting the description using a left-aligned format-string (%-[n]s), we manually add the necessary padding so that the text properties don't extend beyond the description. This allows us to use a face with a background without it extending until the end of a column. See also 63a6fb2a7a02ca88835c3fd473894d3b7d39ff15 for a similar issue with Quick Help. --- lisp/which-key.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index a2355527dd3..a4720040f7a 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -2005,10 +2005,12 @@ that width." col-keys 2 which-key-min-column-description-width))) (col-width (+ col-key-width col-sep-width col-desc-width)) - (col-format (concat "%" (int-to-string col-key-width) - "s%s%-" (int-to-string col-desc-width) "s"))) + (col-format (concat "%" (int-to-string col-key-width) "s%s%s"))) (cons col-width - (mapcar (lambda (k) (apply #'format col-format k)) + (mapcar (pcase-lambda (`(,key ,sep ,desc ,_doc)) + (concat + (format col-format key sep desc) + (make-string (- col-desc-width (length desc)) ?\s))) col-keys)))) (defun which-key--partition-list (n list) From b0b7df823b31b8213fb6e755de3105233415bd65 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Tue, 18 Jun 2024 10:41:01 +0200 Subject: [PATCH 814/816] ; * lisp/which-key.el (which-key--process-page): Use ?\s --- lisp/which-key.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index a4720040f7a..51b8ece457f 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -2251,13 +2251,13 @@ prefix, and a page count." (format (concat "%-" (int-to-string first-col-width) "s") page-cnt) - (make-string first-col-width 32))) + (make-string first-col-width ?\s))) lines first-line new-end) (if (= 1 height) (cons (concat prefix page) nil) (setq lines (split-string page "\n") first-line (concat prefix (car lines) "\n" page-cnt) - new-end (concat "\n" (make-string first-col-width 32))) + new-end (concat "\n" (make-string first-col-width ?\s))) (cons (concat first-line (mapconcat #'identity (cdr lines) new-end)) nil)))) From 543ad34ee4d030e0f0f6f900d8606288c4cdba93 Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Tue, 18 Jun 2024 10:42:12 +0200 Subject: [PATCH 815/816] Remove :underline from 'which-key-highlighted-command-face ' * lisp/which-key.el (which-key-highlighted-command-face): To avoid using properties that might not be supported on all displays, we instead inherit from the semantic face 'highlight'. --- lisp/which-key.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index 51b8ece457f..45f8a31364a 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -595,9 +595,9 @@ it." :package-version "1.0" :version "30.1") (defface which-key-highlighted-command-face - '((t . (:inherit which-key-command-description-face :underline t))) - "Default face for command description. -To be highlighted, it must be a command and match a string in + '((t . (:inherit (which-key-command-description-face highlight)))) + "Default face for highlighted command descriptions. +A command is highlighted, when it matches a string in `which-key-highlighted-command-list'." :group 'which-key-faces :package-version "1.0" :version "30.1") From cc0a3a5f65bda4d3a34cfcd8070540aa1b36f84d Mon Sep 17 00:00:00 2001 From: Philip Kaludercic Date: Tue, 18 Jun 2024 10:53:18 +0200 Subject: [PATCH 816/816] Disable usage of unicode for which-key by default * lisp/which-key.el (which-key-dont-use-unicode): Set to t. (which-key-separator, which-key-ellipsis): Ensure that these options are set after 'which-key-dont-use-unicode', as their default value depends on it. --- lisp/which-key.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/which-key.el b/lisp/which-key.el index 45f8a31364a..1de599e5497 100644 --- a/lisp/which-key.el +++ b/lisp/which-key.el @@ -124,7 +124,7 @@ of the which-key popup." :type 'integer :package-version "1.0" :version "30.1") -(defcustom which-key-dont-use-unicode nil +(defcustom which-key-dont-use-unicode t "If non-nil, don't use any unicode characters in default setup. For affected settings, see `which-key-replacement-alist', `which-key-ellipsis' `which-key-separator'." @@ -137,6 +137,7 @@ For affected settings, see `which-key-replacement-alist', `which-key-ellipsis' Default is \" → \", unless `which-key-dont-use-unicode' is non nil, in which case the default is \" : \"." :type 'string + :set-after '(which-key-dont-use-unicode) :package-version "1.0" :version "30.1") (defcustom which-key-ellipsis @@ -146,6 +147,7 @@ Default is \"…\", unless `which-key-dont-use-unicode' is non nil, in which case the default is \"..\". This can also be the empty string to truncate without using any ellipsis." :type 'string + :set-after '(which-key-dont-use-unicode) :package-version "1.0" :version "30.1") (defcustom which-key-prefix-prefix "+"

JUiCqF!oIx9iGWZLkUc)5B+UN683 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