branch: externals/ilist commit 4fb5695fe1cb6fb75901fbf542d26e0b2614bca9 Author: JSDurand <mmem...@gmail.com> Commit: JSDurand <mmem...@gmail.com>
Add manuals and update README Add Info and PDF manuals. Also update the README.org a bit. --- README.org | 19 +- ilist.info | 734 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ilist.pdf | Bin 0 -> 166367 bytes ilist.texinfo | 244 +++++++++++++++++++ 4 files changed, 990 insertions(+), 7 deletions(-) diff --git a/README.org b/README.org index cb060d07f0..bb9c2de9d5 100644 --- a/README.org +++ b/README.org @@ -15,12 +15,18 @@ The one main function this package provides is =ilist-string=. It is called as follows. #+begin_src emacs-lisp :eval no :exports code -(ilist-string LIST COLUMNS GROUPS DISCARD-EMPTY-P) + (ilist-string LIST COLUMNS GROUPS DISCARD-EMPTY-P + SORTER NO-TRAILING-SPACE) #+end_src -Here the LIST is the list that the user wants to display. - -And DISCARD-EMPTY-P determines whether to display empty groups or not. +- LIST is the list that the user wants to display +- COLUMNS and GROUPS are described in the following sections +- DISCARD-EMPTY-P determines whether to display empty groups or not +- SORTER is either nil, or a function with two arguments which returns + non-nil if and only if the first argument should be sorted before + the second argument +- NO-TRAILING-SPACE is non-nil if the function should not produce + trailing whitespaces ** Columns @@ -31,8 +37,7 @@ comprises the following specifications: - FUN: A function that will be given the elements of the list (one at a time) that should return a string as the representation of that element in this column. -- MIN: The minimal number of width this column takes. -- MAX +- MIN, MAX: The minimal (resp. maximal) width this column takes. - ALIGN: Either :left, :right, or :center. How the contents of the column are aligned. - ELIDE: If the content of an element takes more space than the MAX, @@ -40,7 +45,7 @@ comprises the following specifications: fixed "eliding string". If this ELIDE is not a string, then it means not to elide, but to truncate the contents. -** GROUPS +** Groups *** Fixed groups diff --git a/ilist.info b/ilist.info new file mode 100644 index 0000000000..4ce216e8fb --- /dev/null +++ b/ilist.info @@ -0,0 +1,734 @@ +This is ilist.info, produced by makeinfo version 6.8 from ilist.texinfo. + +Display a list in an Ibuffer way. + + Copyright (C) 2021 Durand + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". + + A copy of the license is also available from the Free Software + Foundation Web site at <https://www.gnu.org/licenses/fdl.html>. + + The document was typeset with GNU Texinfo +(https://www.gnu.org/software/texinfo/). + + +File: ilist.info, Node: Top, Next: About, Prev: (dir), Up: (dir) + +IList +***** + +Display a list in an Ibuffer way. + + Copyright (C) 2021 Durand + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.3 or any later version published by the Free Software + Foundation; with no Invariant Sections, no Front-Cover Texts, and + no Back-Cover Texts. A copy of the license is included in the + section entitled "GNU Free Documentation License". + + A copy of the license is also available from the Free Software + Foundation Web site at <https://www.gnu.org/licenses/fdl.html>. + + The document was typeset with GNU Texinfo +(https://www.gnu.org/software/texinfo/). + +* Menu: + +* About:: +* Entry point:: +* Mapping over lines:: +* Moving:: +* Copying This Manual:: +* Index:: + + +File: ilist.info, Node: About, Next: Entry point, Prev: Top, Up: Top + +1 About +******* + +This is a little library package that can _display a list in an Ibuffer +fashion_. The core functionality it provides is a function that can +accept a list, and produce a string showing the contents of the list +according to the specifications of columns, groups, and sorters. + + +File: ilist.info, Node: Entry point, Next: Mapping over lines, Prev: About, Up: Top + +2 Entry point +************* + +The one main function this package provides is 'ilist-string'. It is +called as follows. + + (ilist-string LIST COLUMNS GROUPS DISCARD-EMPTY-P) + +'LIST' + This denotes the list that the user wants to display. +'COLUMNS' +'GROUPS' + They are described in the following sections. +'DISCARD-EMPTY-P' + This determines whether to display empty groups or not. +'SORTER' + This is either nil, or a function with two arguments which returns + non-nil if and only if the first argument should be sorted before + the second argument. +'NO-TRAILING-SPACE' + This is non-nil if the function should not produce trailing + whitespaces. + +* Menu: + +* Columns:: +* Groups:: + + +File: ilist.info, Node: Columns, Next: Groups, Prev: Entry point, Up: Entry point + +2.1 Columns +=========== + +Like in Ibuffer, the user can specify columns to display. Each column +comprises the following specifications: + +'NAME' + The name to display in the header. +'FUN' + A function that will be given the elements of the list (one at a + time) that should return a string as the representation of that + element in this column. +'MIN' +'MAX' + The minimal (resp. maximal) width this column takes. +'ALIGN' + Either :left, :right, or :center. How the contents of the column + are aligned. +'ELIDE' + If the content of an element takes more space than the MAX, whether + to substitute the last few characters of that content by a fixed + _eliding string_. If this ELIDE is not a string, then it means not + to elide, but to truncate the contents. + + +File: ilist.info, Node: Groups, Prev: Columns, Up: Entry point + +2.2 Groups +========== + +The first subsection of this section describes the specifications of +groups. And the second describes a planned feature that is not yet +implemented. + +* Menu: + +* Fixed groups:: +* Automatic groups (planned):: + + +File: ilist.info, Node: Fixed groups, Next: Automatic groups (planned), Prev: Groups, Up: Groups + +2.2.1 Fixed groups +------------------ + +Like in Ibuffer, we can group elements together in the display. One +difference with Ibuffer is that elements that are not in any group are +ignored. If one wants a "default" group, specify that explicitly. The +specifications of GROUPS are as follows. + +'NAME' + The name of the group. This will be enclosed in square brackets + and displayed on a separate line. +'FUN' + A function with one argument. If the function returns non-nil, + then that element is considered to pertain to the group. + + So a default group just uses a function that always returns 't', and +is put at the end of the list 'GROUPS'. + + Empty groups might or might not be displayed, depending on the value +of 'DISCARD-EMPTY-P'. + + +File: ilist.info, Node: Automatic groups (planned), Prev: Fixed groups, Up: Groups + +2.2.2 Automatic groups (planned) +-------------------------------- + +I plan to add support for automatic groups. This means that, instead of +providing a list of groups, one provides a function with one argument. +That argument will be fed the list of elements. Then the function is +supposed to return a list of the following form: + + (list + (NAME + (INDEX1 . ELEMENT1) + (INDEX2 . ELEMENT2) + ...) + ...) + + That is, it should return cons cells of indices and elements, where +the indices mean the indices of the corresponding element, in the +original list. + + Then the user can provide functions to automatically group elements +based on the criteria that fit the domain of application. + + +File: ilist.info, Node: Mapping over lines, Next: Moving, Prev: Entry point, Up: Top + +3 Mapping over lines +******************** + +For the convenience of package-users, this package also provides some +auxiliary functions to operate on the displayed list. One is +'ilist-map-lines'. It is called as follows. + + (ilist-map-lines FUN PREDICATE START END) + +'FUN' + The function to execute on each matching line. +'PREDICATE' + This should be a function with no arguments. It will be executed + on each line. If it returns non-nil, that line is considered to be + matched. +'START' +'END' + They limit the range of the mapping. + + +File: ilist.info, Node: Moving, Next: Copying This Manual, Prev: Mapping over lines, Up: Top + +4 Moving +******** + +It might be desired to move between the displayed list items in a +_cyclic_ manner, that is, assuming the top of the buffer is identified +with the bottom of the buffer. So the package provides four functions +for moving. + +'ilist-backward-line' +'ilist-forward-line' + Move between lines. One can control whether to skip group headers + or to move cyclicly, through the function parameters. +'ilist-backward-group-header' +'ilist-forward-group-header' + Move between group headers. + + +File: ilist.info, Node: Copying This Manual, Next: Index, Prev: Moving, Up: Top + +Appendix A Copying This Manual +****************************** + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + <https://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled "History" in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version's + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + 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, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation 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. See + <https://www.gnu.org/licenses/>. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: ilist.info, Node: Index, Prev: Copying This Manual, Up: Top + +Index +***** + + + +Tag Table: +Node: Top764 +Node: About1643 +Node: Entry point2012 +Node: Columns2809 +Node: Groups3694 +Node: Fixed groups3995 +Node: Automatic groups (planned)4854 +Node: Mapping over lines5658 +Node: Moving6304 +Node: Copying This Manual6911 +Node: Index32019 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/ilist.pdf b/ilist.pdf new file mode 100644 index 0000000000..ca2df0b8d7 Binary files /dev/null and b/ilist.pdf differ diff --git a/ilist.texinfo b/ilist.texinfo new file mode 100644 index 0000000000..141b7b78ac --- /dev/null +++ b/ilist.texinfo @@ -0,0 +1,244 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename ilist.info +@settitle IList +@c %**end of header +@copying +Display a list in an Ibuffer way. + +Copyright @copyright{} 2021 Durand + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 +or any later version published by the Free Software Foundation; +with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +A copy of the license is included in the section entitled ``GNU +Free Documentation License''. + +A copy of the license is also available from the Free Software +Foundation Web site at @url{https://www.gnu.org/licenses/fdl.html}. + +@end quotation + +The document was typeset with +@uref{https://www.gnu.org/software/texinfo/, GNU Texinfo}. + +@end copying + +@titlepage +@title IList +@subtitle Display a list in an Ibuffer way. +@author Durand <mmemmew@@gmail.com> +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@c Output the table of the contents at the beginning. +@contents + +@ifnottex +@node Top, About, (dir), (dir) +@top IList + +@insertcopying +@end ifnottex + +@c Generate the nodes for this menu with `C-c C-u C-m'. +@menu +* About:: +* Entry point:: +* Mapping over lines:: +* Moving:: +* Copying This Manual:: +* Index:: +@end menu + +@c Update all node entries with `C-c C-u C-n'. +@c Insert new nodes with `C-c C-c n'. +@node About, Entry point, Top, Top +@chapter About + +This is a little library package that can @emph{display a list in an +Ibuffer fashion}. The core functionality it provides is a function that +can accept a list, and produce a string showing the contents of the list +according to the specifications of columns, groups, and sorters. + +@node Entry point, Mapping over lines, About, Top +@comment node-name, next, previous, up +@chapter Entry point + +The one main function this package provides is @code{ilist-string}. +It is called as follows. + +@lisp +(ilist-string LIST COLUMNS GROUPS DISCARD-EMPTY-P) +@end lisp + +@table @code +@item LIST +This denotes the list that the user wants to display. +@item COLUMNS +@itemx GROUPS +They are described in the following sections. +@item DISCARD-EMPTY-P +This determines whether to display empty groups or not. +@item SORTER +This is either nil, or a function with two arguments which returns +non-nil if and only if the first argument should be sorted before the +second argument. +@item NO-TRAILING-SPACE +This is non-nil if the function should not produce trailing +whitespaces. +@end table + +@menu +* Columns:: +* Groups:: +@end menu + +@node Columns, Groups, Entry point, Entry point +@comment node-name, next, previous, up +@section Columns + +Like in Ibuffer, the user can specify columns to display. Each column +comprises the following specifications: + +@table @code +@item NAME +The name to display in the header. +@item FUN +A function that will be given the elements of the list (one at a time) +that should return a string as the representation of that element in +this column. +@item MIN +@itemx MAX +The minimal (resp. maximal) width this column takes. +@item ALIGN +Either :left, :right, or :center. How the contents of the column are +aligned. +@item ELIDE +If the content of an element takes more space than the MAX, whether to +substitute the last few characters of that content by a fixed +@emph{eliding string}. If this ELIDE is not a string, then it means +not to elide, but to truncate the contents. +@end table + +@node Groups, , Columns, Entry point +@comment node-name, next, previous, up +@section Groups + +The first subsection of this section describes the specifications of +groups. And the second describes a planned feature that is not yet +implemented. + +@menu +* Fixed groups:: +* Automatic groups (planned):: +@end menu + +@node Fixed groups, Automatic groups (planned), Groups, Groups +@comment node-name, next, previous, up +@subsection Fixed groups + +Like in Ibuffer, we can group elements together in the display. One +difference with Ibuffer is that elements that are not in any group are +ignored. If one wants a "default" group, specify that explicitly. +The specifications of GROUPS are as follows. + +@table @code +@item NAME +The name of the group. This will be enclosed in square brackets and +displayed on a separate line. +@item FUN +A function with one argument. If the function returns non-nil, then +that element is considered to pertain to the group. +@end table + +So a default group just uses a function that always returns @code{t}, +and is put at the end of the list @code{GROUPS}. + +Empty groups might or might not be displayed, depending on the value +of @code{DISCARD-EMPTY-P}. + +@node Automatic groups (planned), , Fixed groups, Groups +@comment node-name, next, previous, up +@subsection Automatic groups (planned) + +I plan to add support for automatic groups. This means that, instead +of providing a list of groups, one provides a function with one +argument. That argument will be fed the list of elements. Then the +function is supposed to return a list of the following form: + +@lisp +(list + (NAME + (INDEX1 . ELEMENT1) + (INDEX2 . ELEMENT2) + ...) + ...) +@end lisp + +That is, it should return cons cells of indices and elements, where +the indices mean the indices of the corresponding element, in the +original list. + +Then the user can provide functions to automatically group elements +based on the criteria that fit the domain of application. + +@node Mapping over lines, Moving, Entry point, Top +@comment node-name, next, previous, up +@chapter Mapping over lines + +For the convenience of package-users, this package also provides some +auxiliary functions to operate on the displayed list. One is +@code{ilist-map-lines}. It is called as follows. + +@lisp +(ilist-map-lines FUN PREDICATE START END) +@end lisp + +@table @code +@item FUN +The function to execute on each matching line. +@item PREDICATE +This should be a function with no arguments. It will be executed on +each line. If it returns non-nil, that line is considered to be +matched. +@item START +@itemx END +They limit the range of the mapping. +@end table + +@node Moving, Copying This Manual, Mapping over lines, Top +@comment node-name, next, previous, up +@chapter Moving + +It might be desired to move between the displayed list items in a +@emph{cyclic} manner, that is, assuming the top of the buffer is +identified with the bottom of the buffer. So the package provides +four functions for moving. + +@table @code +@item ilist-backward-line +@itemx ilist-forward-line +Move between lines. One can control whether to skip group headers or +to move cyclicly, through the function parameters. +@item ilist-backward-group-header +@itemx ilist-forward-group-header +Move between group headers. +@end table + +@node Copying This Manual, Index, Moving, Top +@appendix Copying This Manual + +@c Get fdl.texi from https://www.gnu.org/licenses/fdl.html +@include fdl-1.3.texi + +@node Index, , Copying This Manual, Top +@unnumbered Index + +@printindex cp + +@bye