commit 1597cb420b6a6a78b3d55fcf90bfbf3a2e94b0a1 Author: Ian Griffin Date: Tue Feb 28 01:43:19 2023 +0800 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c7a5cf --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# personal info +personal.* + +# gpg files +elpa/* + +# swap and undo files +*~ +*.d/*~ + +*\#* +*.d/*\#* + +.* +*.d/.* + +# generated elisp files +*.org.d/*.el + +# etc +auto-save-list* + +# don't ignore .gitignore +!.gitignore diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/README.org b/README.org new file mode 100644 index 0000000..ceadc91 --- /dev/null +++ b/README.org @@ -0,0 +1,29 @@ +#+TITLE: ReadMe: Emacs Config +* What is this? +This is the writer's personal configuration for Emacs. + +* How to use this config? +This configuration works best on a GNU/Linux Platform, other platforms are untested. +** Dependencies +Obviously, a full Emacs distribution needs to be installed. +Other external dependencies is (usually) specified in their configuration. + +** Installation +First, download this configuration +#+begin_src sh + mkdir -p $HOME/.config + git clone "https://gitlab.com/telosama/emacs-config.git" $HOME/.config/emacs +#+end_src + +Then, run Emacs. +And done! + +* Philosophy +- keep it simple +- prefer built-in packages and programs than external ones +- These are not rules, they are more of a suggestions/guidelines. + +* Support/Contribution +Improvement into this config is very welcomed, as many things still needs improvement + + diff --git a/gnus.el b/gnus.el new file mode 100644 index 0000000..051344a --- /dev/null +++ b/gnus.el @@ -0,0 +1,55 @@ + ;;;;;;;;;;;;;;;;;;;;;;;; + ;; ;; + ;; Gnus Configuration ;; + ;; ;; + ;;;;;;;;;;;;;;;;;;;;;;;; + +(require 'gnus) +(require 'gnus-registry) + +;; +;; Misc. +;; +(setq gnus-read-newsrc-file nil + gnus-use-dribble-file nil + gnus-message-archive-group "nnimap+disroot:Sent") + +;; +;; set select method +;; + +;; set IMAP as main "news" source, +;; as the writer has no access to actual news servers, +;; and so gnus is used as a mail reader instead of UUCP news +(require 'imap) +(setq gnus-select-method ` + (nnimap ,(cdr (assoc 'name main-mail-server)) + (nnimap-address ,(cdr (assoc 'imap-url main-mail-server))) + (nnimap-server-port ,(cdr (assoc 'imap-port main-mail-server))) + (nnimap-stream ,(cdr (assoc 'imap-stream main-mail-server))) + (nnimap-inbox "INBOX")) + gnus-secondary-select-methods + `((nnmaildir "local" + (directory + ,(concat (safe-getenv "HOME" user-home-dir-path) + "/.local/mails/disroot/"))))) + +;; +;; Demon +;; +(require 'gnus-demon) + +;; let gnus download mail in the background +(setq gnus-use-demon t) +(gnus-demon-add-handler 'gnus-group-get-new-news 5 t) +(gnus-demon-init) +(gnus-demon-add-rescan) + +;; +;; Display +;; +(setq gnus-summary-line-format "%d %([%-20,20n] %B %-40,40s%) <%A> :%-3L\n" + gnus-thread-sort-functions '(gnus-thread-sort-by-number + gnus-thread-sort-by-author + gnus-thread-sort-by-subject + gnus-thread-sort-by-most-recent-date)) diff --git a/init.el b/init.el new file mode 100644 index 0000000..35c4001 --- /dev/null +++ b/init.el @@ -0,0 +1,22 @@ +;; +;; init.el +;; + +;; where all the magic starts ;-) + +;; this init file will only load org config files in the directory. +;; this is done with because of several reasons, that is: +;; - using org files to configure emacs makes documentation better, +;; - separating config files by topic makes better organization. + +;; set main config dir to location of this file. +(defvar user-emacs-config-directory + (file-name-directory (or (buffer-file-name) load-file-name)) + "global var storing Emacs' configuration directory path") + +;; Load config org files in init.org.d in the config directory +(let ((config-file-pattern "\\.org$")) + (mapc #'org-babel-load-file + (directory-files + (concat user-emacs-config-directory "/init.org.d") + t config-file-pattern))) diff --git a/init.org.d/10-misc.org b/init.org.d/10-misc.org new file mode 100644 index 0000000..bef9302 --- /dev/null +++ b/init.org.d/10-misc.org @@ -0,0 +1,36 @@ +#+TITLE: Misc. Settings (Head) +Settings here can't be categorized or too small to be it's own topic/file, but has to be set before other settings. + +* Tools +Functions needed at the start of the configuration +#+begin_src emacs-lisp + (defun safe-getenv (env-name sub-env) + "like getenv, but uses subEnv var as a value substitute if envName isn't found/empty" + (if (string= nil (getenv env-name)) sub-env (getenv env-name))) +#+end_src + +* User Emacs Directories +set the directory for emacs and it's apps to put stuff. +#+begin_src emacs-lisp + (setq user-emacs-directory + (concat (safe-getenv "XDG_DATA_HOME" "~/.local/share") "/emacs")) +#+end_src + +* Custom File +This emacs feature is currently not used since a way to integrate this feature into this kind of configuration. +#+begin_src emacs-lisp + (setq custom-file (concat user-emacs-directory "/custom.el")) +#+end_src + +* Personal File +This file stores variables containing personal information, and is not distributed. +A sample of this file though is included in this config to be used +#+begin_src emacs-lisp + (let ((personal-file-path (concat user-emacs-config-directory "/personal.org")) + (sample-personal-file-path (concat user-emacs-config-directory "/personal-sample.org"))) + + ;; load main personal file if it exists + (if (file-exists-p personal-file-path) + (org-babel-load-file personal-file-path) + (org-babel-load-file sample-personal-file-path))) +#+end_src diff --git a/init.org.d/20-packages.org b/init.org.d/20-packages.org new file mode 100644 index 0000000..bfe0b3f --- /dev/null +++ b/init.org.d/20-packages.org @@ -0,0 +1,30 @@ +#+TITLE: Packages + +* Configuration +#+begin_src emacs-lisp + (require 'package) +#+end_src + +** disable startup +this speeds up emacs startup +#+begin_src emacs-lisp + (setq package-enable-at-startup nil) +#+end_src + +** Set Package Directory +#+begin_src emacs-lisp + (setq package-user-dir (concat (safe-getenv "XDG_DATA_HOME" "~/.local/share") "/emacs/packages")) +#+end_src + +** Add package sources +#+begin_src emacs-lisp + (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/")) + + (add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/")) + (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/")) +#+end_src + +** Initialize +#+begin_src emacs-lisp + (package-initialize) +#+end_src diff --git a/init.org.d/25-use-package.org b/init.org.d/25-use-package.org new file mode 100644 index 0000000..1c7060e --- /dev/null +++ b/init.org.d/25-use-package.org @@ -0,0 +1,32 @@ +#+TITLE: Use-package + +* Config +** Installation +Install use-package if it's not installed, other than that, ignore +#+begin_src emacs-lisp + (unless (package-installed-p 'use-package) + (package-refresh-contents) + (package-install 'use-package)) +#+end_src + +** Load +#+begin_src emacs-lisp + (eval-when-compile + (require 'use-package)) +#+end_src + +** Misc. +*** Ensure +tell use-package to check and install packages that are configured with use-package +#+begin_src emacs-lisp + (require 'use-package-ensure) + (setq use-package-always-ensure t) +#+end_src + +*** Diminish +diminish, a package for hiding minor modes from the modeline, with the help of use-package +#+begin_src emacs-lisp + (use-package diminish + :commands diminish) +#+end_src + diff --git a/init.org.d/30-org.org b/init.org.d/30-org.org new file mode 100644 index 0000000..55794b9 --- /dev/null +++ b/init.org.d/30-org.org @@ -0,0 +1,74 @@ +#+TITLE: Org Mode +This the Mode with multitude of useful features like this configuration being a literate document, +scheduling, and loads of other stuff + +* General Settings +#+begin_src emacs-lisp + (defun org-config-setup () + (variable-pitch-mode) + (visual-line-mode) ;; wrap line + (org-indent-mode) ;; fake indentations + (setq org-hide-leading-stars nil) + (display-line-numbers-mode -1) + (display-fill-column-indicator-mode -1)) +#+end_src + +* Font Setup +Set different types of fonts for differents elements of Org-mode files, like variable pitch for regular text, and fixed pitch for code blocks +#+begin_src emacs-lisp + (defun org-config-font-setup () + "set org mode element fonts" + (custom-set-faces + '(org-block ((t (:inherit fixed-pitch)))) + ;; '(org-block-begin-line ((t (:inherit fixed-pitch)))) + ;; '(org-block-end-line ((t (:inherit fixed-pitch)))) + '(org-checkbox ((t (:inherit fixed-pitch)))) + '(org-code ((t (:inherit (shadow fixed-pitch))))) + '(org-document-info ((t (:foreground "dark orange")))) + '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch))))) + '(org-indent ((t (:inherit (org-hide fixed-pitch))))) + '(org-link ((t (:foreground "royal blue" :underline t)))) + '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch))))) + '(org-property-value ((t (:inherit fixed-pitch))) t) + '(org-special-keyword ((t (:inherit (font-lock-comment-face fixed-pitch))))) + '(org-table ((t (:inherit fixed-pitch :foreground "#83a598")))) + '(org-tag ((t (:inherit (shadow fixed-pitch) :weight bold :height 0.8)))) + '(org-verbatim ((t (:inherit (shadow fixed-pitch))))))) +#+end_src + +** Header Font Setup +Make header and document title fonts bigger for better visibility. +#+begin_src emacs-lisp + (defun org-config-level-font-setup () + "set header/level and document title fonts" + (custom-set-faces + '(org-document-title ((t + (:inherit (bold modus-themes-variable-pitch) + :foreground "#093060" + :height 2.2)))) + '(org-level-1 ((t (:inherit outline-1 :weight bold + :height 1.5)))) + '(org-level-2 ((t (:inherit outline-2 :weight bold + :height 1.4)))) + '(org-level-3 ((t (:inherit outline-3 :weight bold + :height 1.3)))) + '(org-level-4 ((t (:inherit variable-pitch :weight bold + :height 1.2)))) + '(org-level-5 ((t (:inherit variable-pitch :weight bold + :height 1.1)))))) +#+end_src + +* Load Package +#+begin_src emacs-lisp + (use-package org + :custom + (org-hide-emphasis-markers nil) + + :config + ;; font setup + (org-config-font-setup) + (org-config-level-font-setup) + + ;;other settings + :hook (org-mode . org-config-setup)) +#+end_src diff --git a/init.org.d/50-fonts.org b/init.org.d/50-fonts.org new file mode 100644 index 0000000..f4939a7 --- /dev/null +++ b/init.org.d/50-fonts.org @@ -0,0 +1,27 @@ +#+TITLE: Font Configuration +This config uses Mozilla's Fira Set of fonts and the related Fira Code fonts with added Nerd fonts. +So for this to run, Fira Sans and FiraCode Nerd Font needs to be installed in the system. + +* Configuration +** default fonts +#+begin_src emacs-lisp + (custom-set-faces + ;; set default font + '(default ((t (:inherit nil :extend nil :stipple nil + :inverse-video nil :box nil + :strike-through nil :overline nil :underline nil + :slant normal :weight normal + :height 100 :width normal + :foundry "CTDB" :family "FiraCode Nerd Font Mono")))) + '(fixed-pitch ((t (:family "FiraCode Nerd Font Mono")))) + '(fixed-pitch-serif ((t (:family "FiraCode Nerd Font Mono")))) + '(variable-pitch ((t (:inherit default :family "Fira Sans"))))) +#+end_src + +** Chinese Font +#+begin_src emacs-lisp + ;; (dolist (charset '(kana han symbol cjk-misc bopomofo)) + ;; (set-fontset-font (frame-parameter nil 'font) + ;; charset (font-spec :family "Noto Sans Mono CJK TC Regular" + ;; :size 10))) +#+end_src diff --git a/init.org.d/50-ui.org b/init.org.d/50-ui.org new file mode 100644 index 0000000..8856940 --- /dev/null +++ b/init.org.d/50-ui.org @@ -0,0 +1,148 @@ +#+TITLE: UI Configurations + +* Intro +nn this file/section configures the UI settings + +* Toolbar and Scrollbar + removing this stuff makes emacs looks more cleaner + + #+BEGIN_SRC emacs-lisp + + (tool-bar-mode -1) + (menu-bar-mode 1) + (scroll-bar-mode 1) + + #+END_SRC + +* Maximize + Start emacs as a maximized window at start + + #+BEGIN_SRC emacs-lisp + + ;; (add-hook 'window-setup-hook 'toggle-frame-maximized t) + + #+END_SRC + +* Fringes + Fringes are the small gap at the side of emacs. + +#+BEGIN_SRC emacs-lisp + (fringe-mode '(12 . 6)) +#+END_SRC + +* 80 Column Line with fill-column-indicator + +#+begin_src emacs-lisp + (add-hook 'text-mode-hook #'display-fill-column-indicator-mode) + (add-hook 'prog-mode-hook #'display-fill-column-indicator-mode) +#+end_src + +* Cursor Shape + The most visible type of cursor shape + +#+begin_src emacs-lisp + (setq-default cursor-type 'box) +#+end_src + +* Tab Size +sets the tab size 5 spaces + +#+begin_src emacs-lisp + (defvar default-custom-tab-size 5 "set the main tab size for all configs") + + (setq-default default-tab-width default-custom-tab-size + tab-width default-custom-tab-size + c-basic-offset default-custom-tab-size) +#+end_src + +* Line numbers + Turn on line numbers in text mode/code modes. + ~this part is not fully working~ + + #+BEGIN_SRC emacs-lisp + + (add-hook 'term-mode-hook (lambda () (display-line-numbers-mode -1))) + (add-hook 'text-mode-hook 'display-line-numbers-mode) + (add-hook 'emacs-lisp-mode-hook 'display-line-numbers-mode) + (add-hook 'prog-mode-hook 'display-line-numbers-mode) + + #+END_SRC + +* Line Highlight + Highlights the current line + + #+begin_src emacs-lisp + + (global-hl-line-mode 1) + + #+end_src + +* Matching Pairs + +** Highlight + highlight matching pairs of parenthesis, and other characters + + #+BEGIN_SRC emacs-lisp + + (show-paren-mode 1) + + #+END_SRC + +** Electric-pair-mode + Automatically pair parentheses, and other characters, built in on emacs + #+BEGIN_SRC emacs-lisp + + (electric-pair-mode 1) + + #+END_SRC + +* Clock/Time in Modeline + currently unused + + #+BEGIN_SRC emacs-lisp + ;; (display-time-mode) + #+END_SRC + +* Ligatures +#+begin_src emacs-lisp + + (use-package ligature + :config + ;; Enable the "www" ligature in every possible major mode + (ligature-set-ligatures 't '("www")) + ;; Enable traditional ligature support in eww-mode, if the + ;; `variable-pitch' face supports it + (ligature-set-ligatures 'eww-mode '("ff" "fi" "ffi")) + ;; Enable all Cascadia Code ligatures in programming modes + (ligature-set-ligatures 'prog-mode '("|||>" "<|||" "<==>" "" "---" "-<<" + "<~~" "<~>" "<*>" "<||" "<|>" "<$>" "<==" "<=>" "<=<" "<->" + "<--" "<-<" "<<=" "<<-" "<<<" "<+>" "" "###" "#_(" "..<" + "..." "+++" "/==" "///" "_|_" "www" "&&" "^=" "~~" "~@" "~=" + "~>" "~-" "**" "*>" "*/" "||" "|}" "|]" "|=" "|>" "|-" "{|" + "[|" "]#" "::" ":=" ":>" ":<" "$>" "==" "=>" "!=" "!!" ">:" + ">=" ">>" ">-" "-~" "-|" "->" "--" "-<" "<~" "<*" "<|" "<:" + "<$" "<=" "<>" "<-" "<<" "<+" "" "++" "?:" + "?=" "?." "??" ";;" "/*" "/=" "/>" "//" "__" "~~" "(*" "*)" + "\\\\" "://")) + ;; Enables ligature checks globally in all buffers. You can also do it + ;; per mode with `ligature-mode'. + (global-ligature-mode t)) + +#+end_src + +* Theme +Load theme (that is built-in) + +#+begin_src emacs-lisp + (load-theme 'modus-operandi t) +#+end_src + +* Welcome Screen + Having a blank screen at the start is much more simpler and better +#+begin_src emacs-lisp + (setq inhibit-startup-screen t) +#+end_src + diff --git a/init.org.d/60-ide.org b/init.org.d/60-ide.org new file mode 100644 index 0000000..d0b7459 --- /dev/null +++ b/init.org.d/60-ide.org @@ -0,0 +1,87 @@ +#+TITLE: IDE Configuration + +* Intro +Packages/configurations that makes emacs more IDE-like, such as: +- like popup completions with LSP +- error checking on-the-fly +- tree-view file explorer +- git Integration +- tree-sitter based syntax highlighting + +* Tree Sitter +Tree sitter highlighting in emacs.[[https://tree-sitter.github.io/tree-sitter/syntax-highlighting][ +Tree-sitter Syntax Highlighting website]] + +#+begin_src emacs-lisp + (use-package tree-sitter + :diminish + :config + (global-tree-sitter-mode)) + + (use-package tree-sitter-langs + :after tree-sitter) +#+end_src + +* Neotree +Tree-based explorer for Emacs + +#+begin_src emacs-lisp + (use-package neotree + :hook (neotree-mode . (lambda () + (setq mode-line-format nil) + (redraw-display))) + :config + (setq neo-theme 'arrows) + (setq neo-window-fixed-size nil) + (setq neo-smart-open t) + + :bind + ("M-0" . neotree-toggle)) +#+end_src + +* Magit +[[https://magit.vc][Git Interface for Emacs]] + +#+begin_src emacs-lisp + (use-package magit + :bind + ("C-x g" . magit-status) + ("C-x M-g" . magit-dispatch)) +#+end_src + +* Company Mode +This package provides Popup autocompletion + +#+begin_src emacs-lisp + (use-package company + :diminish + :bind + (:map company-active-map + ("" . company-select-next)) + :custom + (company-minimum-prefix-length 1) + (company-idle-delay 0.0)) +#+end_src + +* Eglot + A simple package for LSP support + +#+begin_src emacs-lisp + (use-package eglot + :config + (diminish 'eldoc)) +#+end_src + +* Paredit +A (very) recommended package for lisp code editing. + +#+begin_src emacs-lisp + (use-package paredit + :hook + (emacs-lisp-mode . enable-paredit-mode) + (eval-expression-minibuffer-setup . enable-paredit-mode) + (ielm-mode . enable-paredit-mode) + (lisp-mode . enable-paredit-mode) + (lisp-interaction-mode . enable-paredit-mode) + (scheme-mode . enable-paredit-mode)) +#+end_src diff --git a/init.org.d/60-mail.org b/init.org.d/60-mail.org new file mode 100644 index 0000000..613fcd7 --- /dev/null +++ b/init.org.d/60-mail.org @@ -0,0 +1,60 @@ +#+TITLE: Mail Configuration + +* Intro +*Gnus* is one of the builtin mail cients in Emacs. +Gnus is chosen because it is built-in into Emacs, and has all the features for modern electronic mail like IMAP and SMTP support built-in. +Gnus has it's own configuration file, that is ~gnus.el~, in the root of this config folder, so this file only sets the things before gnus.el is read + +* Personal Informations +Most informations for the Email setup is not set here, but in the ~personal.el~ in the root of the Emacs config directory. +If the ~personal.el~ file doesn't exist, copy the personal-sample.el file and fill in your credential and Email informations, as well other personal informations in the file. +This is done so that the writer of this config doesn't have to put their personal info online. + +** Passwords +passwords are stored in the ~.authinfo~ / ~.authinfo.gpg~ (please don't put file containing passwords in a plain text file, encrypt them). +the ~.authinfo~ contents should look like this + +#+begin_src authinfo +machine example login jamie@example.com password verysecurepass port imaps +machine smtp.example.com login jamie@example.com password verysecurepass port 587 +#+end_src + +* Gnus Config +Tell gnus to read ~gnus.el~ from the config dir. +#+begin_src emacs-lisp + (setq gnus-init-file (concat user-emacs-config-directory "/gnus.el")) +#+end_src + +other configuration on gnus is on the ~gnus.el~ file. + +* RMail Config +Even though Gnus is used as the main E-Mail reader, Rmail is also setup as a backup mail reader incase gnus became unused + +** Dependencies +Since RMail is only a Mail Reader, E-Mails needs to be fetched using external programs. +And those external programs are; +- ~isync~ / ~mbsync~ to fetch mail into ~maildirs~ +- Mailutils' ~movemail~ to move them to RMail's format + +** Configuration +#+begin_src emacs-lisp + (setq rmail-primary-inbox-list + `( ,(concat "maildir://" (concat (safe-getenv "HOME" user-home-path) "/.local/mails/disroot/INBOX")) + "/var/spool/mail/iang") + rmail-preserve-inbox 1 + rmail-mime-prefer-html nil + rmail-file-name (concat user-emacs-directory "/mails/inbox")) +#+end_src + +* SMTP Mail Config +** Set Emacs' built in SMTP mail sender method +#+begin_src emacs-lisp + (setq send-mail-function 'smtpmail-send-it) +#+end_src + +** Configure the SMTP sender +#+begin_src emacs-lisp + (setq smtpmail-smtp-server (cdr (assoc 'smtp-url main-mail-server)) + smtpmail-stream-type (cdr (assoc 'smtp-stream main-mail-server)) + smtpmail-smtp-service (cdr (assoc 'smtp-port main-mail-server))) +#+end_src diff --git a/init.org.d/60-pdftools.org b/init.org.d/60-pdftools.org new file mode 100644 index 0000000..4f43de5 --- /dev/null +++ b/init.org.d/60-pdftools.org @@ -0,0 +1,16 @@ +#+TITLE: PDF-Tools Configuration + +* Intro +*PDF-Tools* is a emacs package that provides better PDF support to emacs. +It is faster, and less resource intensive compared to Emacs' PDFView mode + +#+begin_src emacs-lisp + (use-package pdf-tools + ;; :hook "\\.pdf\\'" + :config + (pdf-loader-install) + :hook + (pdf-major-mode . (lambda () (fringe-mode 0))) + (pdf-outline-buffer-mode . (lambda () + (display-line-numbers-mode -1)))) +#+end_src diff --git a/init.org.d/70-emms.org b/init.org.d/70-emms.org new file mode 100644 index 0000000..d3347d9 --- /dev/null +++ b/init.org.d/70-emms.org @@ -0,0 +1,31 @@ +#+TITLE: EMMS Configuration + +* Intro +Using emacs as a music player + +* Dependencies +- mpv, or other media player supported by EMMS + +#+begin_src emacs-lisp + (use-package emms + :config + (emms-all) + (emms-default-players) + (emms-mode-line 0) + :custom + (emms-source-file-default-directory "~/music" + "location of music files") + :bind + ("s-m ." . emms-next) + ("s-m ," . emms-previous) + ("s-m /" . emms-pause) + :commands + emms-play-directory + emms-add-directory + emms-add-dired + emms-playlist-mode + emms-browse + emms-shuffle + emms-playlist-mode-go) +#+end_src + diff --git a/init.org.d/70-lang.org b/init.org.d/70-lang.org new file mode 100644 index 0000000..f1e99e3 --- /dev/null +++ b/init.org.d/70-lang.org @@ -0,0 +1,69 @@ +#+TITLE: Languages + +* Intro + This is where Programming Language modes are configured. + +* Default Settings + +#+begin_src emacs-lisp + (defun lang-default-settings () + "default setting for a language" + (display-line-numbers-mode) + (eglot-ensure) + (company-mode)) +#+end_src + + +* Built-in Modes + + +** hook default settings to configured language modes +#+begin_src emacs-lisp + (let ((langs '("sh" "c++" "mhtml" "java" "js" "python" "latex"))) + (dolist (lang langs) + (add-hook (intern (concat lang "-mode-hook")) (lambda () (lang-default-settings))))) +#+end_src + +** add LSP server program names to eglot's configuration +#+begin_src emacs-lisp + (let ((server-programs '((c++-mode . ("clangd")) + (mhtml-mode . ("html-language-server")) + (java-mode . ("jdtls")) + (js-mode . ("typescript-language-server")) + (python-mode . ("pyright")) + (latex-mode . ("texlab"))))) + (setq eglot-server-programs (append server-programs eglot-server-programs))) +#+end_src + +* Installed Modes +** Go +#+begin_src emacs-lisp + (use-package go-mode + :mode "\\.go\\'" + :hook + (go-mode . (lambda () (lang-default-settings))) + :config + (setq go-tab-width default-custom-tab-size)) + +#+end_src + +** TypeScript +#+begin_src emacs-lisp + (use-package typescript-mode + :mode "\\.ts\\'" + :init + (add-to-list 'eglot-server-programs `(typescript-mode . ("typescript-language-server"))) + :hook + (typescript-mode . (lambda () (lang-default-settings)))) +#+end_src + +** Markdown + +#+begin_src emacs-lisp + (use-package markdown-mode + :commands (markdown-mode gfm-mode) + :mode (("\\.md\\'". markdown-mode) + ("\\.markdown\\'" . markdown-mode)) + :init + (setq markdown-command "multimarkdown")) +#+end_src diff --git a/init.org.d/70-pulseaudio.org b/init.org.d/70-pulseaudio.org new file mode 100644 index 0000000..90b8837 --- /dev/null +++ b/init.org.d/70-pulseaudio.org @@ -0,0 +1,20 @@ +#+TITLE: Pulseaudio Control Configuration + + Controlling volume right in Emacs is very convenient. + + #+BEGIN_SRC emacs-lisp + + (use-package pulseaudio-control + :config + (setq pulseaudio-control-volume-step "5%") + :commands + pulseaudio-control-display-volume + pulseaudio-control-set-volume + pulseaudio-control-select-sink-by-name + pulseaudio-control-toggle-sink-mute-by-name + :bind + ("s-a =" . pulseaudio-control-increase-volume) + ("s-a -" . pulseaudio-control-decrease-volume) + ("s-a 0" . pulseaudio-control-toggle-current-sink-mute)) + + #+END_SRC diff --git a/init.org.d/80-functions.org b/init.org.d/80-functions.org new file mode 100644 index 0000000..e133e36 --- /dev/null +++ b/init.org.d/80-functions.org @@ -0,0 +1,19 @@ +#+TITLE: Personally Defined Functions + +These are the functions defined here by myself, for myself + +* ModeLine Toggle + as the name suggests, this function toggles the modelinexxk + + #+BEGIN_SRC emacs-lisp + + (defun toggle-mode-line () "toggles the modeline on and off" + (interactive) + (setq mode-line-format + (if (equal mode-line-format nil) + (default-value 'mode-line-format)) ) + (redraw-display))t + + (global-set-key (kbd "s-w t") 'toggle-mode-line) + + #+END_SRC diff --git a/init.org.d/80-misc-end.org b/init.org.d/80-misc-end.org new file mode 100644 index 0000000..c5e4681 --- /dev/null +++ b/init.org.d/80-misc-end.org @@ -0,0 +1,137 @@ +#+TITLE: Other Configurations/Packages + +* Intro + This is where other packages are configured, that are very short, not worthy of their own file + +* Ido +Ido is a autocomplete package for emacs' commands + +#+begin_src emacs-lisp + (use-package ido + :config + (setq ido-everywhere t + ido-virtual-buffers t + ido-use-faces t) + (ido-mode 1)) +#+end_src + +* EWW +*Emacs Web WOWSER!* +This config just sets the download directory + +#+begin_src emacs-lisp + (use-package eww + :custom + (eww-download-directory "~/dls" "location to put downloaded files") + :config + (setq eww-download-directory "~/dls")) +#+end_src + +* Fancy Battery +This shows the battery level on the emacs modeline + +#+begin_src emacs-lisp + (use-package fancy-battery + :commands + fancy-battery-mode + :bind + ("s-b b" . fancy-battery-mode)) +#+end_src + +* Rainbow Delimiter +color delimiters (parentheses, brackets, braces, etc) according to their level/depth. + +#+begin_src emacs-lisp + (use-package rainbow-delimiters + :hook (emacs-lisp-mode . rainbow-delimiters-mode)) +#+end_src + +* Org Tree Slide +do presentations in Org mode + +#+begin_src emacs-lisp + (use-package org-tree-slide + :after org + :commands + org-tree-slide-mode + :config + (define-key org-tree-slide-mode-map (kbd "") 'org-tree-slide-mode-next-tree) + (define-key org-tree-slide-mode-map (kbd "") 'org-tree-slide-move-next-tree)) +#+end_src + +* Emacs Shell +This sets the prompt to a lambda, for aesthetic reasons + +#+begin_src emacs-lisp + (setq eshell-prompt-function (lambda nil + (if (= (user-uid) 0) " #λ " " λ "))) + (setq eshell-highlight-prompt nil) +#+end_src + + +* Undo Tree +a visualizer for Emacs' cool but confusing undo/history system + +#+begin_src emacs-lisp + (use-package undo-tree + :diminish + :config + (global-undo-tree-mode)) +#+end_src + +* Elgrep +a built in grep command in emacs + +#+begin_src emacs-lisp + (use-package elgrep + :commands elgrep) +#+end_src + +* Abbrev +Abbrev is helpful for typing long commands, but I don't need to know it in the modeline +#+begin_src emacs-lisp + (diminish 'abbrev) +#+end_src + +* Pinentry + use emacs' internal pinentry + +#+begin_src emacs-lisp + (use-package pinentry + :config + ;; let's get encryption established + (setenv "GPG_AGENT_INFO" nil) ;; use emacs pinentry + (setq auth-source-debug t) + + (setq epg-gpg-program "gpg2") ;; not necessary + (require 'epa-file) + (epa-file-enable) + (setq epa-pinentry-mode 'loopback) + (pinentry-start) + + (require 'org-crypt) + (org-crypt-use-before-save-magic)) +#+end_src + +* Elfeed Web +Elfeed is a emacs package for reading RSS Web News. + +#+begin_src emacs-lisp + (use-package elfeed + :commands + elfeed + elfeed-update + :custom + (elfeed-db-directory (concat user-emacs-directory "/elfeed") + "location for elfeed to put it's database") + (elfeed-feeds '(("https://feeds.bbci.co.uk/news/technology/rss.xml" bbc technology) + ("https://feeds.feedburner.com/rsscna/engnews" taiwan central focustaiwan) + ("https://hnrss.org/frontpage.atom" hacker) + ("https://www.kernel.org/feeds/kdist.xml" linux kernel) + ("https:/hund.tty1.se/feed.xml" hund blog) + ("https://opensource.com/feed" opensource) + ("https://rss.slashdot.org/Slashdot/slashdot" slashdot technology) + ("https://www.cnet.com/rss/news/" cnet technology)) + "links to the news sources and keywords associated to them")) +#+end_src + diff --git a/init.org.d/90-server.org b/init.org.d/90-server.org new file mode 100644 index 0000000..876b6bf --- /dev/null +++ b/init.org.d/90-server.org @@ -0,0 +1,10 @@ +#+TITLE: Server Configuration + +run Emacs as a server + +#+begin_src emacs-lisp + + (setq server-name "x_emacs") + (server-start) + +#+end_src diff --git a/personal-sample.org b/personal-sample.org new file mode 100644 index 0000000..481bc1a --- /dev/null +++ b/personal-sample.org @@ -0,0 +1,31 @@ +#+TITLE: Personal Information (Sample) +All variables and settings that are personal information about the user is put here, for privacy reasons. +This is the sample configuration, so the Name of the user in this is sample is /Jamie Doe/, with user name ~jamie~, with their email in the ~example.com~ server. + +* Home Dir +#+begin_src emacs-lisp + (defvar user-home-path "/home/jamie" + "default fallback home dir path") +#+end_src + +* Email +not putting email information feels safer... + +** Email credentials +#+begin_src emacs-lisp + (setq user-mail-address "jamie@example.com" + user-full-name "Jamie Doe") +#+end_src + +** Email Servers +Email server properties inside an alist +#+begin_src emacs-lisp + (defvar main-mail-server '((name . "example") + (imap-url . "imap.example.com") + (imap-port . "imaps") + (imap-stream . ssl) + (smtp-url . "smtp.example.com") + (smtp-port . 587) + (smtp-stream . ssl)) + "main mail server properties") +#+end_src diff --git a/todo.org b/todo.org new file mode 100644 index 0000000..f282b19 --- /dev/null +++ b/todo.org @@ -0,0 +1,8 @@ +* Things to Improve in this configuration +** To Fix +- [X] stop using custom file +- [X] separate font config +- [X] add optimizations ==> dolist +- [X] org-mode indentation +** Add +- [ ] use gnus diff --git a/unused/10-ligatures.org b/unused/10-ligatures.org new file mode 100644 index 0000000..4413b12 --- /dev/null +++ b/unused/10-ligatures.org @@ -0,0 +1,42 @@ +#+TITLE: Ligatures +Ligatures in programming fonts can help reading code. +this Config uses the composition table technique. + + #+begin_src emacs-lisp + + (when (window-system) + (set-frame-font "Fira Code")) + (let ((alist '( + (33 . ".\\(?:\\(?:==\\|!!\\)\\|[!=]\\)") + (35 . ".\\(?:###\\|##\\|_(\\|[#(?[_{]\\)") + (36 . ".\\(?:>\\)") + (37 . ".\\(?:\\(?:%%\\)\\|%\\)") + (38 . ".\\(?:\\(?:&&\\)\\|&\\)") + (42 . ".\\(?:\\(?:\\*\\*/\\)\\|\\(?:\\*[*/]\\)\\|[*/>]\\)") + (43 . ".\\(?:\\(?:\\+\\+\\)\\|[+>]\\)") + ;; (45 . ".\\(?:\\(?:-[>-]\\|<<\\|>>\\)\\|[<>}~-]\\)") + ;; (46 . ".\\(?:\\(?:\\.[.<]\\)\\|[.=-]\\)") + (47 . ".\\(?:\\(?:\\*\\*\\|//\\|==\\)\\|[*/=>]\\)") + (48 . ".\\(?:x[a-zA-Z]\\)") + (58 . ".\\(?:::\\|[:=]\\)") + (59 . ".\\(?:;;\\|;\\)") + (60 . ".\\(?:\\(?:!--\\)\\|\\(?:~~\\|->\\|\\$>\\|\\*>\\|\\+>\\|--\\|<[<=-]\\|=[<=>]\\||>\\)\\|[*$+~/<=>|-]\\)") + (61 . ".\\(?:\\(?:/=\\|:=\\|<<\\|=[=>]\\|>>\\)\\|[<=>~]\\)") + (62 . ".\\(?:\\(?:=>\\|>[=>-]\\)\\|[=>-]\\)") + (63 . ".\\(?:\\(\\?\\?\\)\\|[:=?]\\)") + (91 . ".\\(?:]\\)") + (92 . ".\\(?:\\(?:\\\\\\\\\\)\\|\\\\\\)") + (94 . ".\\(?:=\\)") + (119 . ".\\(?:ww\\)") + (123 . ".\\(?:-\\)") + (124 . ".\\(?:\\(?:|[=|]\\)\\|[=>|]\\)") + (126 . ".\\(?:~>\\|~~\\|[>=@~-]\\)") + ) + )) + (dolist (char-regexp alist) + (set-char-table-range composition-function-table (car char-regexp) + `([,(cdr char-regexp) 0 font-shape-gstring])))) + + (add-hook 'eshell-mode-hook (lambda () (setq auto-composition-mode nil))) + + #+end_src diff --git a/unused/20-completion-help.org b/unused/20-completion-help.org new file mode 100644 index 0000000..358d392 --- /dev/null +++ b/unused/20-completion-help.org @@ -0,0 +1,45 @@ +#+TITLE: Completions and Keybinding Help + +* Which Key + + #+begin_src emacs-lisp + (use-package which-key + :init (which-key-mode) + :diminish which-key-mode + :config + (setq which-key-idle-delay 1)) + #+end_src + +* Ivy and Counsel + + #+begin_src emacs-lisp + (use-package ivy + :diminish + :bind (("C-s" . swiper) + :map ivy-minibuffer-map + ("TAB" . ivy-alt-done) + ("C-l" . ivy-alt-done) + ("C-n" . ivy-next-line) + ("C-p" . ivy-previous-line) + :map ivy-switch-buffer-map + ("C-p" . ivy-previous-line) + ("C-l" . ivy-done) + ("C-k" . ivy-switch-buffer-kill) + :map ivy-reverse-i-search-map + ("C-p" . ivy-previous-line) + ("C-d" . ivy-reverse-i-search-kill)) + :config + (setq ivy-re-builders-alist '((t . ivy--regex-fuzzy))) + (ivy-mode 1)) + + (use-package ivy-rich + :init + (ivy-rich-mode 1)) + + (use-package counsel + :bind (("C-M-j" . 'counsel-switch-buffer) + :map minibuffer-local-map + ("C-r" . 'counsel-minibuffer-history)) + :config + (counsel-mode 1)) + #+end_src diff --git a/unused/20-eaf.org b/unused/20-eaf.org new file mode 100644 index 0000000..52a9c1f --- /dev/null +++ b/unused/20-eaf.org @@ -0,0 +1,32 @@ +#+TITLE:Emacs Application Framework + +Graphical Applications that integrates and extends emacs, so that I don't need to live in emacs + +* Load EAF + + #+begin_src emacs-lisp + + (use-package eaf + :load-path "~/.local/eaf" + :custom + ; See https://github.com/emacs-eaf/emacs-application-framework/wiki/Customization + (eaf-browser-continue-where-left-off nil) + (eaf-browser-enable-adblocker t) + (browse-url-browser-function 'eaf-open-browser) + (eaf-browser-download-path "~/dls") + (eaf-browser-default-search-engine "duckduckgo") + :config + (defalias 'browse-web #'eaf-open-browser)) + ;; (eaf-bind-key nil "M-q" eaf-browser-keybinding)) ;; unbind, see more in the Wiki + + #+end_src + +* Load Applications + + #+begin_src emacs-lisp + + (require 'eaf-browser) + (require 'eaf-mindmap) + (require 'eaf-terminal) + + #+end_src diff --git a/unused/20-ide.org b/unused/20-ide.org new file mode 100644 index 0000000..a342430 --- /dev/null +++ b/unused/20-ide.org @@ -0,0 +1,192 @@ +#+TITLE: IDE Configuration + +* Intro + Packages/configurations that makes emacs more IDE-like, such as: +- like popup completions with LSP +- error checking on-the-fly +- tree-view file explorer +- git Integration +- tree-sitter based syntax highlighting + +* Tree Sitter + Tree sitter highlighting in emacs.[[https://tree-sitter.github.io/tree-sitter/syntax-highlighting][ + Tree-sitter Syntax Highlighting website]] + + #+begin_src emacs-lisp + + (use-package tree-sitter + :config + (global-tree-sitter-mode)) + (use-package tree-sitter-langs + :after tree-sitter) + + #+end_src + +* Magit + [[https://magit.vc][Git Interface for Emacs]] + + #+begin_src emacs-lisp + + (use-package magit + :bind + ("C-x g" . magit-status) + ("C-x M-g" . magit-dispatch)) + + #+end_src + +* Treemacs + + #+begin_src emacs-lisp + + (use-package treemacs + :defer t + :init + (with-eval-after-load 'winum + (define-key winum-keymap (kbd "M-0") #'treemacs-select-window)) + :config + (add-hook 'treemacs-mode-hook (lambda () + (setq mode-line-format nil) + (redraw-display))) + (progn + (setq treemacs-collapse-dirs (if treemacs-python-executable 3 0) + treemacs-deferred-git-apply-delay 0.5 + treemacs-directory-name-transformer #'identity + treemacs-display-in-side-window t + treemacs-eldoc-display t + treemacs-file-event-delay 5000 + treemacs-file-extension-regex treemacs-last-period-regex-value + treemacs-file-follow-delay 0.2 + treemacs-file-name-transformer #'identity + treemacs-follow-after-init t + treemacs-expand-after-init t + treemacs-git-command-pipe "" + treemacs-goto-tag-strategy 'refetch-index + treemacs-indentation 2 + treemacs-indentation-string " " + treemacs-indent-guide-style 'line + treemacs-is-never-other-window nil + treemacs-max-git-entries 5000 + treemacs-missing-project-action 'ask + treemacs-move-forward-on-expand nil + treemacs-no-png-images nil + treemacs-no-delete-other-windows t + treemacs-project-follow-cleanup nil + treemacs-persist-file (expand-file-name ".cache/treemacs-persist" user-emacs-directory) + treemacs-position 'left + treemacs-read-string-input 'from-child-frame + treemacs-recenter-distance 0.1 + treemacs-recenter-after-file-follow nil + treemacs-recenter-after-tag-follow nil + treemacs-recenter-after-project-jump 'always + treemacs-recenter-after-project-expand 'on-distance + treemacs-litter-directories '("/node_modules" "/.venv" "/.cask") + treemacs-show-cursor nil + treemacs-show-hidden-files t + treemacs-silent-filewatch nil + treemacs-silent-refresh nil + treemacs-sorting 'alphabetic-asc + treemacs-select-when-already-in-treemacs 'move-back + treemacs-space-between-root-nodes t + treemacs-tag-follow-cleanup t + treemacs-tag-follow-delay 1.5 + treemacs-text-scale nil + treemacs-user-mode-line-format nil + treemacs-user-header-line-format nil + treemacs-width-is-initially-locked nil + treemacs-width 25 + treemacs-workspace-switch-cleanup nil) + + ;; The default width and height of the icons is 22 pixels. If you are + ;; using a Hi-DPI display, uncomment this to double the icon size. + (treemacs-resize-icons 16) + + (treemacs-follow-mode t) + (treemacs-filewatch-mode t) + (treemacs-fringe-indicator-mode 'always) + + (pcase (cons (not (null (executable-find "git"))) + (not (null treemacs-python-executable))) + (`(t . t) + (treemacs-git-mode 'deferred)) + (`(t . _) + (treemacs-git-mode 'simple))) + + (treemacs-hide-gitignored-files-mode nil)) + :bind + (:map global-map + ("M-0" . treemacs-select-window) + ("C-x t 1" . treemacs-delete-other-windows) + ("C-x t t" . treemacs) + ("C-x t B" . treemacs-bookmark) + ("C-x t C-t" . treemacs-find-file) + ("C-x t M-t" . treemacs-find-tag))) + + (use-package treemacs-icons-dired + :config (treemacs-icons-dired-mode)) + + (use-package treemacs-magit + :after (treemacs magit) + :ensure t) + + #+end_src + +* Flycheck + + #+begin_src emacs-lisp + + (use-package flycheck + :init + (global-flycheck-mode)) + + #+end_src + +* LSP Mode + This package provides a LSP interface for emacs, for autocompletion + + #+begin_src emacs-lisp + + (use-package lsp-mode + :init + (setq lsp-keymap-prefix "C-l") + :hook + (lsp-mode . lsp-enable-which-key-integration) + (lsp-mode . lsp-completion-mode) + :custom + (lsp-eldoc-render-all t) + :commands (lsp lsp-mode lsp-deferred)) + + + (use-package lsp-ui + :commands lsp-ui-mode + :custom + (lsp-ui-peek-always-show t) + (lsp-ui-sideline-show-hover t) + (lsp-ui-doc-position 'bottom)) + + (use-package lsp-treemacs + :after lsp-mode + :hook (lsp-mode . lsp-treemacs-symbols)) + + #+end_src + +* Company Mode + + #+begin_src emacs-lisp + + (use-package company + :after lsp-mode + :hook (lsp-mode . company-mode) + :bind + (:map company-active-map + ("" . company-complete-selection)) + (:map lsp-mode-map + ("" . company-indent-or-complete-common)) + :custom + (company-minimum-prefix-length 1) + (company-idle-delay 0.0)) + + (use-package company-box + :after company + :hook (company-mode . company-box-mode)) + + #+end_src diff --git a/unused/30-other.org b/unused/30-other.org new file mode 100644 index 0000000..ca23725 --- /dev/null +++ b/unused/30-other.org @@ -0,0 +1,29 @@ +#+TITLE: Unused Other Configurations + +* Unused Miscellanous Configs + Where config files go unused, but not forgotten. + For may that one day come, where they will be useful again + +** Fcitx + + #+BEGIN_SRC emacs-lisp + + fcitx + (use-package fcitx + :config + (fcitx-aggressive-setup) + (setq fcitx-use-dbus t)) + + #+END_SRC + +** EIN + IPython notebook support mode for emacs + + #+begin_src emacs-lisp + + (use-package ein + :config + (org-babel-do-load-languages + 'org-babel-load-languages '((emacs-lisp . nil) (ein . t)))) + + #+end_src diff --git a/unused/50-fonts.el b/unused/50-fonts.el new file mode 100644 index 0000000..72d2096 --- /dev/null +++ b/unused/50-fonts.el @@ -0,0 +1,34 @@ +;; +;; Fonts/Faces +;; + +;; This is where the Emacs fonts, or faces in Emacs' terminology, are configured. + +;; org fonts are also configured here + +;; this config is based from the Custom setting in Emacs +(custom-set-faces + '(default ((t (:inherit nil :extend nil :stipple nil :background "#ffffc8" :foreground "#282828" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :wenight normal :height 90 :width normal :family "FiraCode Nerd Font")))) + '(fixed-pitch ((t (:family "FiraCode Nerd Font")))) + '(fixed-pitch-serif ((t (:family "FiraCode Nerd Font")))) + '(variable-pitch ((t (:family "Fira Sans" :weight normal)))). + `(org-level-8 ((t (:weight bold)))) + `(org-level-7 ((t (:weight bold)))) + `(org-level-6 ((t (:weight bold)))) + `(org-level-5 ((t (:weight bold)))) + `(org-level-4 ((t (:weight bold :height 1.1)))) + `(org-level-3 ((t (:weight bold :height 1.25)))) + `(org-level-2 ((t (:weight bold :height 1.5)))) + `(org-level-1 ((t (:weight bold :height 1.75)))) + `(org-document-title ((t (:weight bold :height 2.0 :underline nil)))) + '(org-block ((t (:inherit fixed-pitch)))) + '(org-code ((t (:inherit (shadow fixed-pitch))))) + '(org-document-info-keyword ((t (:inherit (shadow fixed-pitch))))) + '(org-indent ((t (:inherit (org-hide fixed-pitch))))) + '(org-link ((t (:underline t)))) + '(org-meta-line ((t (:inherit (font-lock-comment-face fixed-pitch))))) + '(org-property-value ((t (:inherit fixed-pitch))) t) + '(org-special-keyword ((t (:inherit (font-lock-comment-face fixed-pitch))))) + '(org-table ((t (:inherit fixed-pitch)))) + '(org-tag ((t (:inherit (shadow fixed-pitch) :weight bold :height 0.8)))) + '(org-verbatim ((t (:inherit (shadow fixed-pitch)))))) diff --git a/unused/50-lang.org b/unused/50-lang.org new file mode 100644 index 0000000..da0fd64 --- /dev/null +++ b/unused/50-lang.org @@ -0,0 +1,91 @@ +#+TITLE: Languages + +* Intro + This is where Programming Language modes are configured. + +* Built-in Modes + +** C++ + + #+begin_src emacs-lisp + (add-hook 'c++-mode-hook #'display-line-numbers-mode) + (add-hook 'c++-mode-hook #'lsp-deferred) + #+end_src + +** Bash + + #+begin_src emacs-lisp + (add-hook 'sh-mode-hook #'display-line-numbers-mode) + (add-hook 'sh-mode-hook #'lsp-deferred) + #+end_src + +** HTML + + #+begin_src emacs-lisp + (add-hook 'mhtml-mode-hook #'display-line-numbers-mode) + (add-hook 'mhtml-mode-hook #'lsp-deferred) + #+end_src + + +** TeX/LaTeX + + #+begin_src emacs-lisp + (add-hook 'latex-mode-hook #'display-line-numbers-mode) + (add-hook 'latex-mode-hook #'lsp-deferred) + #+end_src + +** JavaScript + + #+begin_src emacs-lisp + (add-hook 'js-mode-hook #'display-line-numbers-mode) + (add-hook 'js-mode-hook #'lsp-deferred) + #+end_src + +* Installed Modes + +** Go + + #+begin_src emacs-lisp + + (use-package go-mode + :hook + go-mode + (go-mode . lsp-deferred) + (before-save . lsp-format-buffer) + (before-save . lsp-organize-imports) + :config + (add-hook 'go-mode-hook #'display-line-numbers-mode)) + + #+end_src + +** TypeScript + + #+begin_src emacs-lisp + (use-package typescript-mode + :mode "\\.ts\\'" + :hook + (typescript-mode . lsp-deferred) + (typescript-mode . display-line-numbers-mode)) + #+end_src + +* LSP ELPA Packages + +** Python + + #+begin_src emacs-lisp + (use-package lsp-pyright + :hook (python-mode . (lambda () + (require 'lsp-pyright) + (lsp-deferred) + (display-line-numbers-mode)))) ; or lsp + + #+end_src + +** Java + + #+begin_src emacs-lisp + (use-package lsp-java + :hook + (java-mode-hook . display-line-numbers-mode) + (java-mode-hook . lsp-deferred)) + #+end_src diff --git a/unused/99-exwm.org b/unused/99-exwm.org new file mode 100644 index 0000000..248e682 --- /dev/null +++ b/unused/99-exwm.org @@ -0,0 +1,152 @@ +#+TITLE: EXWM Configuration +Using Emacs as a window manager. + +* Config Functions + This Config is not actually mine, so I don't fully understand it either + + #+begin_src emacs-lisp + + (defun exwm-config--fix/ido-buffer-window-other-frame () + "Fix `ido-buffer-window-other-frame'." + (defalias 'exwm-config-ido-buffer-window-other-frame + (symbol-function #'ido-buffer-window-other-frame)) + (defun ido-buffer-window-other-frame (buffer) + "This is a version redefined by EXWM. + + You can find the original one at `exwm-config-ido-buffer-window-other-frame'." + (with-current-buffer (window-buffer (selected-window)) + (if (and (derived-mode-p 'exwm-mode) + exwm--floating-frame) + ;; Switch from a floating frame. + (with-current-buffer buffer + (if (and (derived-mode-p 'exwm-mode) + exwm--floating-frame + (eq exwm--frame exwm-workspace--current)) + ;; Switch to another floating frame. + (frame-root-window exwm--floating-frame) + ;; Do not switch if the buffer is not on the current workspace. + (or (get-buffer-window buffer exwm-workspace--current) + (selected-window)))) + (with-current-buffer buffer + (when (derived-mode-p 'exwm-mode) + (if (eq exwm--frame exwm-workspace--current) + (when exwm--floating-frame + ;; Switch to a floating frame on the current workspace. + (frame-selected-window exwm--floating-frame)) + ;; Do not switch to exwm-mode buffers on other workspace (which + ;; won't work unless `exwm-layout-show-all-buffers' is set) + (unless exwm-layout-show-all-buffers + (selected-window))))))))) + + #+end_src + +* Start EXWM + + #+begin_src emacs-lisp + + (use-package exwm + :config + ;; Set the default number of workspaces + (setq exwm-workspace-number 10) + + ;; When window "class" updates, use it to set the buffer name + (add-hook 'exwm-update-class-hook + (lambda () + (exwm-workspace-rename-buffer exwm-class-name))) + + + ;; Set the screen resolution (update this to be the correct resolution for your screen!) + (require 'exwm-randr) + + ;; (setq exwm-randr-workspace-output-plist + ;; '(0 "HDMI1" 1 "eDP1" 2 "HDMI1" 3 "eDP1" 4 "HDMI1" 5 "eDP1" 6 "HDMI1" 7 "eDP1" 8 "HDMI1" 9 "eDP1")) + + ;; (add-hook 'exwm-randr-screen-change-hook + ;; (lambda () + ;; (start-process-shell-command + ;; "xrandr" nil "xrandr --output HDMI1 --primary --mode 1920x1080 --output eDP1 --left-of HDMI1 --mode 1366x768 --rotate left"))) + + (exwm-randr-enable) + + ;; Load the system tray before exwm-init + (require 'exwm-systemtray) + (exwm-systemtray-enable) + + ;; make emacs input method available to other programs + (require 'exwm-xim) + (exwm-xim-enable) + + (require 'org-crypt) + (org-crypt-use-before-save-magic) + + ;; as the name suggests + ;; (exwm-enable-ido-workaround) + + ;; These keys should always pass through to Emacs + (setq exwm-input-prefix-keys + '(?\C-x + ?\C-u + ?\C-h + ?\M-x + ?\M-` + ?\M-& + ?\M-: + ?\C-\\ ;; backslash + ?\C-\M-j ;; Buffer list + ?\C-\ ;; ctrl-space + ?\s-a ;; audio binding + ?\s-m )) ;; music binding + + ;; Set up global key bindippngs. These always work, no matter the input state! + ;; Keep in mind that changing this list after EXWM initializes has no effect. + (setq exwm-input-global-keys + `( + ;; Reset to line-mode (C-c C-k switches to char-mode via exwm-input-release-keyboard)p + ([?\s-w ?\C-r] . exwm-reset) + + ;; Move between windows + ([?\s-w ?\s-b] . windmove-left) + ([?\s-w ?\s-f] . windmove-right) + ([?\s-w ?\s-p] . windmove-up) + ([?\s-w ?\s-n] . windmove-down) + + ;; Launch applications via shell command + ([?\s-&] . (lambda (command) + (interactive (list (read-shell-command "$ "))) + (start-process-shell-command command nil command))) + + ;; toggle modeline + ([?\s-w ?\t] . exwm-layout-toggle-mode-line) + + ;; Switch workspace + ([?\s-w ?\w] . exwm-workspace-switch) + ([?\s-w ?\m] . exwm-workspace-move-window))) + ;; 's-N': Switch to certain workspace with Super (Win) plus a number key (0 - 9) + ;; ,@(mapcar (lambda (i) + ;; `(,(kbd (format "s-w %d" i)) . + ;; (lambda () + ;; (interactive) + ;; (exwm-workspace-switch-create ,i)))) + ;; (number-sequence 0 9)))) + + (setq exwm-input-simulation-keys + '(([?\C-b] . [left]) + ([?\C-f] . [right]) + ([?\C-p] . [up]) + ([?\C-n] . [down]) + ([?\C-a] . [home]) + ([?\C-e] . [end]) + ([?\C-\ ] . [?\C-a]) + ([?\M-v] . [prior]) + ([?\C-v] . [next]) + ([?\C-d] . [delete]) + ([?\C-k] . [S-end delete]) + ([?\C-s] . [?\C-f]) + ([?\C-x ?\h] . [?\C-h]) + ([?\C-y] . [?\C-v]) + ([?\C-g] . [escape]))) + + ;; (exwm-enable) + (add-hook 'exwm-init-hook #'exwm-config--fix/ido-buffer-window-other-frame)) + + #+end_src