commit 39fe550b3eeb3b01893e0a85493d408120b4d5ea Author: muon Date: Tue Mar 26 11:39:16 2024 +0000 Add dotfiles diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b4719c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bak/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..a85305c --- /dev/null +++ b/flake.lock @@ -0,0 +1,796 @@ +{ + "nodes": { + "base16": { + "inputs": { + "nixpkgs": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1658847131, + "narHash": "sha256-X6Mml7cT0YR3WCD5fkUhpRVV5ZPcwdcDsND8r8xMqTE=", + "owner": "SenchoPens", + "repo": "base16.nix", + "rev": "6b404cda2e04ca3cf5ca7b877af9c469e1386acb", + "type": "github" + }, + "original": { + "owner": "SenchoPens", + "repo": "base16.nix", + "type": "github" + } + }, + "doom-emacs": { + "flake": false, + "locked": { + "lastModified": 1662497747, + "narHash": "sha256-4n7E1fqda7cn5/F2jTkOnKw1juG6XMS/FI9gqODL3aU=", + "owner": "doomemacs", + "repo": "doomemacs", + "rev": "3853dff5e11655e858d0bfae64b70cb12ef685ac", + "type": "github" + }, + "original": { + "owner": "doomemacs", + "repo": "doomemacs", + "rev": "3853dff5e11655e858d0bfae64b70cb12ef685ac", + "type": "github" + } + }, + "doom-snippets": { + "flake": false, + "locked": { + "lastModified": 1676839496, + "narHash": "sha256-1Ay9zi0u1lycmEeFqIxr0RWH+JvH9BnzgRzkPeWEAYY=", + "owner": "doomemacs", + "repo": "snippets", + "rev": "fe4003014ae00b866f117cb193f711fd9d72fd11", + "type": "github" + }, + "original": { + "owner": "doomemacs", + "repo": "snippets", + "type": "github" + } + }, + "emacs-overlay": { + "flake": false, + "locked": { + "lastModified": 1676366521, + "narHash": "sha256-i4UAY8t9Au9SJtsgYppa3NHSVf1YkV6yqnNIQd+Km4g=", + "owner": "nix-community", + "repo": "emacs-overlay", + "rev": "c16be6de78ea878aedd0292aa5d4a1ee0a5da501", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "emacs-overlay", + "rev": "c16be6de78ea878aedd0292aa5d4a1ee0a5da501", + "type": "github" + } + }, + "emacs-so-long": { + "flake": false, + "locked": { + "lastModified": 1575031854, + "narHash": "sha256-xIa5zO0ZaToDrec1OFjBK6l39AbA4l/CE4LInVu2hi0=", + "owner": "hlissner", + "repo": "emacs-so-long", + "rev": "ed666b0716f60e8988c455804de24b55919e71ca", + "type": "github" + }, + "original": { + "owner": "hlissner", + "repo": "emacs-so-long", + "type": "github" + } + }, + "evil-collection": { + "flake": false, + "locked": { + "lastModified": 1686801899, + "narHash": "sha256-wGJWF9t8yaxLyYQRf3hK+5/AIYYAS8qWXPDEvatzBlc=", + "owner": "emacs-evil", + "repo": "evil-collection", + "rev": "4a7d924dbd851ef1b2ccb85778be6e7a6a81ebd4", + "type": "github" + }, + "original": { + "owner": "emacs-evil", + "repo": "evil-collection", + "type": "github" + } + }, + "evil-escape": { + "flake": false, + "locked": { + "lastModified": 1588439096, + "narHash": "sha256-aB2Ge5o/93B18tPf4fN1c+O46CNh/nOqwLJbox4c8Gw=", + "owner": "hlissner", + "repo": "evil-escape", + "rev": "819f1ee1cf3f69a1ae920e6004f2c0baeebbe077", + "type": "github" + }, + "original": { + "owner": "hlissner", + "repo": "evil-escape", + "type": "github" + } + }, + "evil-markdown": { + "flake": false, + "locked": { + "lastModified": 1626852210, + "narHash": "sha256-HBBuZ1VWIn6kwK5CtGIvHM1+9eiNiKPH0GUsyvpUVN8=", + "owner": "Somelauw", + "repo": "evil-markdown", + "rev": "8e6cc68af83914b2fa9fd3a3b8472573dbcef477", + "type": "github" + }, + "original": { + "owner": "Somelauw", + "repo": "evil-markdown", + "type": "github" + } + }, + "evil-org-mode": { + "flake": false, + "locked": { + "lastModified": 1607203864, + "narHash": "sha256-JxwqVYDN6OIJEH15MVI6XOZAPtUWUhJQWHyzcrUvrFg=", + "owner": "hlissner", + "repo": "evil-org-mode", + "rev": "a9706da260c45b98601bcd72b1d2c0a24a017700", + "type": "github" + }, + "original": { + "owner": "hlissner", + "repo": "evil-org-mode", + "type": "github" + } + }, + "evil-quick-diff": { + "flake": false, + "locked": { + "lastModified": 1575189609, + "narHash": "sha256-oGzl1ayW9rIuq0haoiFS7RZsS8NFMdEA7K1BSozgnJU=", + "owner": "rgrinberg", + "repo": "evil-quick-diff", + "rev": "69c883720b30a892c63bc89f49d4f0e8b8028908", + "type": "github" + }, + "original": { + "owner": "rgrinberg", + "repo": "evil-quick-diff", + "type": "github" + } + }, + "explain-pause-mode": { + "flake": false, + "locked": { + "lastModified": 1595842060, + "narHash": "sha256-++znrjiDSx+cy4okFBBXUBkRFdtnE2x+trkmqjB3Njs=", + "owner": "lastquestion", + "repo": "explain-pause-mode", + "rev": "2356c8c3639cbeeb9751744dbe737267849b4b51", + "type": "github" + }, + "original": { + "owner": "lastquestion", + "repo": "explain-pause-mode", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "format-all": { + "flake": false, + "locked": { + "lastModified": 1581716637, + "narHash": "sha256-ul7LCe60W8TIvUmUtZtZRo8489TK9iTPDsLHmzxY57M=", + "owner": "lassik", + "repo": "emacs-format-all-the-code", + "rev": "47d862d40a088ca089c92cd393c6dca4628f87d3", + "type": "github" + }, + "original": { + "owner": "lassik", + "repo": "emacs-format-all-the-code", + "rev": "47d862d40a088ca089c92cd393c6dca4628f87d3", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687969886, + "narHash": "sha256-tC2qFLmuM0PFaw0tMHVcFmzsG/351q09qa1EpuL2n1U=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "a7002d6bfca54742d5fc9b485a1879953b4585b9", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_2": { + "inputs": { + "nixpkgs": [ + "stylix", + "nixpkgs" + ], + "utils": "utils" + }, + "locked": { + "lastModified": 1680000368, + "narHash": "sha256-TlgC4IJ7aotynUdkGRtaAVxquaiddO38Ws89nB7VGY8=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "765e4007b6f9f111469a25d1df6540e8e0ca73a6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "hyprland-protocols": "hyprland-protocols", + "nixpkgs": "nixpkgs", + "wlroots": "wlroots", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1688466862, + "narHash": "sha256-Ll5jaJeju1aW4mvIC/5UIgMfHukUjiVznGV3kJCwBhY=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "07d7962c7f56c9928e494e4401806726d7ac5b05", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1684265364, + "narHash": "sha256-AxNnWbthsuNx73HDQr0eBxrcE3+yfl/WsaXZqUFmkpQ=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "8c279b9fb0f2b031427dc5ef4eab53f2ed835530", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "nix-doom-emacs": { + "inputs": { + "doom-emacs": "doom-emacs", + "doom-snippets": "doom-snippets", + "emacs-overlay": "emacs-overlay", + "emacs-so-long": "emacs-so-long", + "evil-collection": "evil-collection", + "evil-escape": "evil-escape", + "evil-markdown": "evil-markdown", + "evil-org-mode": "evil-org-mode", + "evil-quick-diff": "evil-quick-diff", + "explain-pause-mode": "explain-pause-mode", + "flake-compat": "flake-compat", + "flake-utils": "flake-utils", + "format-all": "format-all", + "nix-straight": "nix-straight", + "nixpkgs": "nixpkgs_2", + "nose": "nose", + "ob-racket": "ob-racket", + "org": "org", + "org-contrib": "org-contrib", + "org-yt": "org-yt", + "php-extras": "php-extras", + "revealjs": "revealjs", + "rotate-text": "rotate-text", + "sln-mode": "sln-mode", + "ts-fold": "ts-fold", + "ws-butler": "ws-butler" + }, + "locked": { + "lastModified": 1686959076, + "narHash": "sha256-tzwHJ8q9CMpIwxcyCM51i88arntNMARi1mFkAppMgqk=", + "owner": "nix-community", + "repo": "nix-doom-emacs", + "rev": "2c4ba0d77fdfa4495929c8aee814936e722715c5", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-doom-emacs", + "type": "github" + } + }, + "nix-straight": { + "flake": false, + "locked": { + "lastModified": 1666982610, + "narHash": "sha256-xjgIrmUsekVTE+MpZb5DMU8DQf9DJ/ZiR0o30L9/XCc=", + "owner": "nix-community", + "repo": "nix-straight.el", + "rev": "ad10364d64f472c904115fd38d194efe1c3f1226", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-straight.el", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1687502512, + "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1682566018, + "narHash": "sha256-HPzPRFiy2o/7k7mtnwfM1E6NVZHiFbPdmYCMoIpkHO4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8e3b64db39f2aaa14b35ee5376bd6a2e707cadc2", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "ref": "nixpkgs-unstable", + "type": "indirect" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1687898314, + "narHash": "sha256-B4BHon3uMXQw8ZdbwxRK1BmxVOGBV4viipKpGaIlGwk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "e18dc963075ed115afb3e312b64643bf8fd4b474", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_4": { + "locked": { + "lastModified": 1679793451, + "narHash": "sha256-JafTtgMDATE8dZOImBhWMA9RCn9AP8FVOpN+9K/tTlg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0cd51a933d91078775b300cf0f29aa3495231aa2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nose": { + "flake": false, + "locked": { + "lastModified": 1400604510, + "narHash": "sha256-daEi8Kta1oGaDEmUUDDQMahTTPOpvNpDKk22rlr7cB0=", + "owner": "emacsattic", + "repo": "nose", + "rev": "f8528297519eba911696c4e68fa88892de9a7b72", + "type": "github" + }, + "original": { + "owner": "emacsattic", + "repo": "nose", + "type": "github" + } + }, + "ob-racket": { + "flake": false, + "locked": { + "lastModified": 1584656173, + "narHash": "sha256-rBUYDDCXb+3D4xTPQo9UocbTPZ32kWV1Uya/1DmZknU=", + "owner": "xchrishawk", + "repo": "ob-racket", + "rev": "83457ec9e1e96a29fd2086ed19432b9d75787673", + "type": "github" + }, + "original": { + "owner": "xchrishawk", + "repo": "ob-racket", + "type": "github" + } + }, + "org": { + "flake": false, + "locked": { + "lastModified": 1683136293, + "narHash": "sha256-PMHNr3Qo62uqO5IUDAfxUoqa4Zvb9y2J76pRYDB/6Y4=", + "owner": "emacs-straight", + "repo": "org-mode", + "rev": "080710797ad25e76c4556d2b03cc0aa5313cd187", + "type": "github" + }, + "original": { + "owner": "emacs-straight", + "repo": "org-mode", + "type": "github" + } + }, + "org-contrib": { + "flake": false, + "locked": { + "lastModified": 1675694242, + "narHash": "sha256-4Fn33CTVTCqh5TyVAggSr8Fm8/hB8Xgl+hkxh3WCrI8=", + "owner": "emacsmirror", + "repo": "org-contrib", + "rev": "fff6c888065588527b1c1d7dd7e41c29ef767e17", + "type": "github" + }, + "original": { + "owner": "emacsmirror", + "repo": "org-contrib", + "type": "github" + } + }, + "org-yt": { + "flake": false, + "locked": { + "lastModified": 1527381913, + "narHash": "sha256-dzQ6B7ryzatHCTLyEnRSbWO0VUiX/FHYnpHTs74aVUs=", + "owner": "TobiasZawada", + "repo": "org-yt", + "rev": "40cc1ac76d741055cbefa13860d9f070a7ade001", + "type": "github" + }, + "original": { + "owner": "TobiasZawada", + "repo": "org-yt", + "type": "github" + } + }, + "php-extras": { + "flake": false, + "locked": { + "lastModified": 1573312690, + "narHash": "sha256-r4WyVbzvT0ra4Z6JywNBOw5RxOEYd6Qe2IpebHXkj1U=", + "owner": "arnested", + "repo": "php-extras", + "rev": "d410c5af663c30c01d461ac476d1cbfbacb49367", + "type": "github" + }, + "original": { + "owner": "arnested", + "repo": "php-extras", + "type": "github" + } + }, + "revealjs": { + "flake": false, + "locked": { + "lastModified": 1681386605, + "narHash": "sha256-9Q7aWgjAV37iJp6oYDz45e8J+RKwKY1Uvgg/BXwf5nQ=", + "owner": "hakimel", + "repo": "reveal.js", + "rev": "0301ce58ab185f7191696e16b1b6389f58df2892", + "type": "github" + }, + "original": { + "owner": "hakimel", + "repo": "reveal.js", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "hyprland": "hyprland", + "nix-doom-emacs": "nix-doom-emacs", + "nixpkgs": "nixpkgs_3", + "rust-overlay": "rust-overlay", + "stylix": "stylix" + } + }, + "rotate-text": { + "flake": false, + "locked": { + "lastModified": 1322962747, + "narHash": "sha256-SOeOgSlcEIsKhUiYDJv0p+mLUb420s9E2BmvZQvZ0wk=", + "owner": "debug-ito", + "repo": "rotate-text.el", + "rev": "48f193697db996855aee1ad2bc99b38c6646fe76", + "type": "github" + }, + "original": { + "owner": "debug-ito", + "repo": "rotate-text.el", + "type": "github" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1688351637, + "narHash": "sha256-CLTufJ29VxNOIZ8UTg0lepsn3X03AmopmaLTTeHDCL4=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "f9b92316727af9e6c7fee4a761242f7f46880329", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "sln-mode": { + "flake": false, + "locked": { + "lastModified": 1423727528, + "narHash": "sha256-XqkqPyEJuTtFslOz1fpTf/Klbd/zA7IGpzpmum/MGao=", + "owner": "sensorflo", + "repo": "sln-mode", + "rev": "0f91d1b957c7d2a7bab9278ec57b54d57f1dbd9c", + "type": "github" + }, + "original": { + "owner": "sensorflo", + "repo": "sln-mode", + "type": "github" + } + }, + "stylix": { + "inputs": { + "base16": "base16", + "flake-compat": "flake-compat_2", + "home-manager": "home-manager_2", + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1688308288, + "narHash": "sha256-dahwZIc0zGgGMKR/j1SJjYhaoGJTHJUse8CzC8DUyV0=", + "owner": "danth", + "repo": "stylix", + "rev": "35cab8eb76c1d3672b2b290a64f357847c30d090", + "type": "github" + }, + "original": { + "owner": "danth", + "repo": "stylix", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "ts-fold": { + "flake": false, + "locked": { + "lastModified": 1681029086, + "narHash": "sha256-z3eVkAPFI6JYZZ+2XM496zBxwnujTp4Y4KNNfqgUC/E=", + "owner": "jcs-elpa", + "repo": "ts-fold", + "rev": "5fd2a5afe2112ac23b58ee1b12730fcf16068df3", + "type": "github" + }, + "original": { + "owner": "jcs-elpa", + "repo": "ts-fold", + "type": "github" + } + }, + "utils": { + "locked": { + "lastModified": 1676283394, + "narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "wlroots": { + "flake": false, + "locked": { + "host": "gitlab.freedesktop.org", + "lastModified": 1686753331, + "narHash": "sha256-KovjVFwcuoUO0eu/UiWrnD3+m/K+SHSAVIz4xF9K1XA=", + "owner": "wlroots", + "repo": "wlroots", + "rev": "7e7633abf09b362d0bad9e3fc650fd692369291d", + "type": "gitlab" + }, + "original": { + "host": "gitlab.freedesktop.org", + "owner": "wlroots", + "repo": "wlroots", + "type": "gitlab" + } + }, + "ws-butler": { + "flake": false, + "locked": { + "lastModified": 1634511126, + "narHash": "sha256-c0y0ZPtxxICPk+eaNbbQf6t+FRCliNY54CCz9QHQ8ZI=", + "owner": "hlissner", + "repo": "ws-butler", + "rev": "572a10c11b6cb88293de48acbb59a059d36f9ba5", + "type": "github" + }, + "original": { + "owner": "hlissner", + "repo": "ws-butler", + "type": "github" + } + }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1685385764, + "narHash": "sha256-r+XMyOoRXq+hlfjayb+fyi9kq2JK48TrwuNIAXqlj7U=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "4d9ff0c17716936e0b5ca577a39e263633901ed1", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..3f33d77 --- /dev/null +++ b/flake.nix @@ -0,0 +1,27 @@ +{ + description = "My NixOS configuration"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + hyprland.url = "github:hyprwm/Hyprland"; + stylix.url = "github:danth/stylix"; + nix-doom-emacs.url = "github:nix-community/nix-doom-emacs"; + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + outputs = {self, ...} @ inputs: let + system = "x86_64-linux"; + pkgs = inputs.nixpkgs.legacyPackages.x86_64-linux; + in { + nixosConfigurations = import ./hosts inputs; + + formatter.${system} = pkgs.alejandra; + }; +} diff --git a/hosts/default.nix b/hosts/default.nix new file mode 100644 index 0000000..32f14b5 --- /dev/null +++ b/hosts/default.nix @@ -0,0 +1,67 @@ +{ + nixpkgs, + self, + ... +}: let + inherit (self) inputs; + bootloader = ../modules/core/bootloader.nix; + core = ../modules/core; + unfree = ../modules/unfree; + prime = ../modules/unfree/prime.nix; + + hmModule = inputs.home-manager.nixosModules.home-manager; + stylix = inputs.stylix; + + home-manager = { + useUserPackages = true; + useGlobalPkgs = true; + extraSpecialArgs = { + inherit inputs; + inherit self; + inherit stylix; + }; + users.muon = ../modules/home; + }; +in { + # desktop + muon = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = + [ + {networking.hostName = "muon";} + ./muon/hardware-configuration.nix + core + bootloader + unfree + hmModule + + {inherit home-manager;} + ]; + specialArgs = { + inherit inputs; + }; + }; + # laptop + muop = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = + [ + {networking.hostName = "muop";} + ./muop/hardware-configuration.nix + core + bootloader + unfree + prime + hmModule + + #inputs.hyprland.nixosModules.default + + # inputs.stylix.nixosModules.stylix + + {inherit home-manager;} + ]; + specialArgs = { + inherit inputs; + }; + }; +} diff --git a/hosts/default.nix~ b/hosts/default.nix~ new file mode 100644 index 0000000..94dcba1 --- /dev/null +++ b/hosts/default.nix~ @@ -0,0 +1,69 @@ +{ + nixpkgs, + self, + ... +}: let + inherit (self) inputs; + bootloader = ../modules/core/bootloader.nix; + core = ../modules/core; + unfree = ../modules/unfree; + + hmModule = inputs.home-manager.nixosModules.home-manager; + stylix = inputs.stylix; + + home-manager = { + useUserPackages = true; + useGlobalPkgs = true; + extraSpecialArgs = { + inherit inputs; + inherit self; + inherit stylix; + }; + users.muon = ../modules/home; + }; +in { + # desktop + muop = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = + [ + {networking.hostName = "muop";} + ./muon/hardware-configuration.nix + core + bootloader + unfree + hmModule + + #inputs.hyprland.nixosModules.default + + # inputs.stylix.nixosModules.stylix + + {inherit home-manager;} + ]; + specialArgs = { + inherit inputs; + }; + }; + # laptop + muop = nixpkgs.lib.nixosSystem { + system = "x86_64-linux"; + modules = + [ + {networking.hostName = "muop";} + ./muop/hardware-configuration.nix + core + bootloader + unfree + hmModule + + #inputs.hyprland.nixosModules.default + + # inputs.stylix.nixosModules.stylix + + {inherit home-manager;} + ]; + specialArgs = { + inherit inputs; + }; + }; +} diff --git a/hosts/muon/hardware-configuration.nix b/hosts/muon/hardware-configuration.nix new file mode 100644 index 0000000..6c19f28 --- /dev/null +++ b/hosts/muon/hardware-configuration.nix @@ -0,0 +1,77 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/03e49688-cc62-49c9-a906-e2ea87a38891"; + fsType = "ext4"; + }; + + boot.initrd.luks.devices."luks-86769693-b61c-4712-852d-e0fba612d260".device = "/dev/disk/by-uuid/86769693-b61c-4712-852d-e0fba612d260"; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/CCCC-449E"; + fsType = "vfat"; + }; + + fileSystems."/mnt/bulk" = + { device = "/dev/disk/by-uuid/11c2c896-d49a-4d9b-a846-b0a550128395"; + fsType = "ext4"; + }; + + # swapDevices = + # [ { device = "/dev/disk/by-uuid/e7cf209d-386d-41db-8a35-6c9fff014722"; } + # ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; + + services.xserver.libinput.mouse.accelProfile = "flat"; + + services.xserver.displayManager.sessionCommands = '' + ${pkgs.xorg.xinput} --set-prop "pointer:Logitech Gaming Mouse G502" "libinput Accel Profile Enabled" 0, 1 + ${pkgs.xorg.xinput} --set-prop "pointer:Logitech Gaming Mouse G502" "libinput Accel Speed" -0.4 + ''; + + services.xserver.displayManager.setupCommands = '' + ${pkgs.xorg.xrandr}/bin/xrandr --output HDMI-1 --mode 1920x1080 --pos 2560x0 --rotate right --output DP-2 --primary --mode 2560x1440 --pos 0x480 --rotate normal + ''; + + services.xserver.xrandrHeads = [ + { + output = "DP-2"; + primary = true; + monitorConfig = '' + Option "PreferredMode" "2560x1440" + Option "Position" "0 480" + ''; + } + { + output = "HDMI-1"; + monitorConfig = '' + Option "PreferredMode" "1920x1080" + Option "Position" "2560 0" + Option "Rotate" "right" + ''; + } + ]; +} diff --git a/hosts/muop/hardware-configuration.nix b/hosts/muop/hardware-configuration.nix new file mode 100644 index 0000000..f2e0b97 --- /dev/null +++ b/hosts/muop/hardware-configuration.nix @@ -0,0 +1,41 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/29b32abb-ea5d-4cca-b506-3485d8df430c"; + fsType = "ext4"; + }; + + boot.initrd.luks.devices."luks-57f71aee-059c-4ae1-8859-89cfcb21a4af".device = "/dev/disk/by-uuid/57f71aee-059c-4ae1-8859-89cfcb21a4af"; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/9094-4224"; + fsType = "vfat"; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces..useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.eno1.useDHCP = lib.mkDefault true; + # networking.interfaces.wlo1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/modules/core/blocker.nix b/modules/core/blocker.nix new file mode 100644 index 0000000..0cb248c --- /dev/null +++ b/modules/core/blocker.nix @@ -0,0 +1,30 @@ +{ + pkgs, + ... +}: +# this should block *most* junk sites +# make sure to ALWAYS lock commit hash to avoid fed honeypots +# three letter agencies go fuck yourself +{ + networking.extraHosts = + builtins.readFile (pkgs.fetchurl { + url = "https://raw.githubusercontent.com/StevenBlack/hosts/e1bb5f08e6f9f4daef93cc327580a95f83959f38/alternates/fakenews-gambling/hosts"; + sha256 = "LZt3/AvsbYuW+TWsnGnRQNXhvGYO0tMc7uHY/A19bUc="; + # blocks fakenews, gambling and coomer sites + }) + + builtins.readFile (pkgs.fetchurl { + url = "https://raw.githubusercontent.com/shreyasminocha/shady-hosts/fc9cc4020e80b3f87024c96178cba0f766b95e7a/hosts"; + sha256 = "jbsEiIcOjoglqLeptHhwWhvL/p0PI3DVMdGCzSXFgNA="; + # blocks some shady fed sites + }) + + builtins.readFile (pkgs.fetchurl { + # blocks crypto phishing scams + url = "https://raw.githubusercontent.com/MetaMask/eth-phishing-detect/3be0b9594f0bc6e3e699ee30cb2e809618539597/src/hosts.txt"; + sha256 = "b3HvaLxnUJZOANUL/p+XPNvu9Aod9YLHYYtCZT5Lan0="; + }) + + builtins.readFile (pkgs.fetchurl { + # generic ads + url = "https://raw.githubusercontent.com/AdAway/adaway.github.io/04f783e1d9f48bd9ac156610791d7f55d0f7d943/hosts.txt"; + sha256 = "mp0ka7T0H53rJ3f7yAep3ExXmY6ftpHpAcwWrRWzWYI="; + }); +} diff --git a/modules/core/bootloader.nix b/modules/core/bootloader.nix new file mode 100644 index 0000000..803addf --- /dev/null +++ b/modules/core/bootloader.nix @@ -0,0 +1,25 @@ +{ + config, + pkgs, + lib, + ... +}: { + boot = { + tmp.cleanOnBoot = true; + bootspec.enable = true; + consoleLogLevel = 0; + + kernelParams = [ + "cgroup_no_v1=all" + "systemd.unified_cgroup_hierarchy=yes" + ]; + initrd.verbose = false; + + loader = { + systemd-boot.enable = true; + systemd-boot.editor = false; + efi.canTouchEfiVariables = true; + timeout = 1; + }; + }; +} diff --git a/modules/core/default.nix b/modules/core/default.nix new file mode 100644 index 0000000..01c40cd --- /dev/null +++ b/modules/core/default.nix @@ -0,0 +1,18 @@ +{ + config, + pkgs, + ... +}: { + imports = [ + ./system.nix + ./nix.nix + ./users.nix + ./xdg.nix + + ./schizo.nix + ./network.nix + ./blocker.nix + + ./display.nix + ]; +} diff --git a/modules/core/display.nix b/modules/core/display.nix new file mode 100644 index 0000000..0f4133b --- /dev/null +++ b/modules/core/display.nix @@ -0,0 +1,111 @@ +{ + config, + pkgs, + lib, + inputs, + ... +}: { + # Display manager + services.xserver.enable = true; + services.xserver.displayManager.sddm.enable = true; + services.xserver.displayManager.autoLogin.enable = true; + services.xserver.displayManager.autoLogin.user = "muon"; + + # Window manager + #services.xserver.windowManager.leftwm.enable = true; + #services.xserver.windowManager.herbstluftwm.enable = true; + + services.xserver.windowManager.xmonad = { + enable = true; + enableContribAndExtras = true; + }; + systemd.user.services.xmobar = { + script = "${lib.getExe pkgs.xmobar}"; + wantedBy = [ "graphical-session.target" ]; + partOf = [ "graphical-session.target" ]; + }; + + # system.activationScripts = { + # screenlayout.text = '' + # ${lib.getExe pkgs.xrandr} --output DVI-D-0 --off --output HDMI-0 --off --output HDMI-1 --mode 1920x1080 --pos 2560x0 --rotate right --output DP-0 --off --output DP-1 --off --output DP-2 --primary --mode 2560x1440 --pos 0x480 --rotate normal --output DP-3 --off + # ''; + # }; + systemd.services.screensetter = { + enable = true; + description = "sets correct screen resolution"; + wantedBy = [ "graphical-session.target"]; + # Add this line in your nixos configuration (E.G. the "configuration.nix" file or a module imported into it) + # this allows you to use `xrandr` inside of scripts called by this service + # https://www.reddit.com/r/NixOS/comments/w4fj6p/comment/ih1oa5e/?utm_source=reddit&utm_medium=web2x&context=3 + path = [ pkgs.xorg.xrandr ]; + + unitConfig = { + type = "simple"; + }; + + serviceConfig = { + # ExecStart = "/home//.screenlayout/nixos-screenlayout.sh"; + ExecStart = "${config.users.users.muon.home}/.screenlayout/main.sh"; + }; + }; + + # systemd.user.services.screenlayout = { + # script = "${config.users.users.muon.home}/.screenlayout/main.sh"; + # wantedBy = [ "graphical-session.target" ]; + # partOf = [ "graphical-session.target" ]; + # }; + + # Wayland + # services.xserver.displayManager.gdm.wayland = true; + # programs.hyprland.package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + # programs.hyprland.enable = true; + + # environment.variables = { + # GDK_SCALE="2"; + # XCURSOR_SIZE="24"; + # }; + + # hardware = { + # opengl = { + # enable = true; + # driSupport = true; + # driSupport32Bit = true; + # extraPackages = with pkgs; [ + # vaapiVdpau + # libvdpau-va-gl + # ]; + # }; + # pulseaudio.support32Bit = true; + # }; + + # xdg.portal = { + # enable = true; + # wlr.enable = false; + # extraPortals = [ + # pkgs.xdg-desktop-portal-gtk + # ]; + # }; + + # sound = { + # enable = true; + # mediaKeys.enable = true; + # }; + + # Hide cursor + services.xbanish.enable = true; + + # Install fonts + fonts = { + fonts = with pkgs; [ + mononoki + openmoji-color + (nerdfonts.override { fonts = [ "Mononoki" ]; }) + ]; + fontconfig = { + hinting.autohint = true; + defaultFonts = { + emoji = [ "OpenMoji Color" ]; + }; + }; + }; +} diff --git a/modules/core/network.nix b/modules/core/network.nix new file mode 100644 index 0000000..73247f4 --- /dev/null +++ b/modules/core/network.nix @@ -0,0 +1,80 @@ +{ + config, + pkgs, + lib, + ... +}: { + networking = { + interfaces.enp0s31f6.mtu = 1200; + networkmanager = { + enable = true; + wifi.macAddress = "random"; + }; + firewall = { + enable = true; + # if your minecraft server is not worky + # this is probably why + # Steam Remote UDP ports 27031 and 27036 and TCP ports 27036 and 27037 + allowedTCPPorts = [443 80 22 7000 8080 5432 27036 27037 9122]; + allowedUDPPorts = [443 80 44857 8080 27031 51820]; + allowPing = true; + logReversePathDrops = true; + }; + # nameservers = ["10.8.0.1"]; + }; + environment.etc = { + "resolv.conf".text = '' + options timeout:1 + nameserver 192.168.1.1 + ''; + }; + + # slows down boot time + systemd.services.NetworkManager-wait-online.enable = false; + + # services.openvpn.servers = { + # remote = { config = ''config ${config.users.users.muon.home}/documents/openvpn/muon.ovpn''; }; + # }; + + # services.openssh = { + # enable = true; + # ports = [9122]; + # }; + + # # Enable WireGuard + # networking.wireguard.interfaces = { + # # "wg0" is the network interface name. You can name the interface arbitrarily. + # wg0 = { + # # Determines the IP address and subnet of the client's end of the tunnel interface. + # ips = [ "10.10.10.2/24" ]; + # listenPort = 51820; # to match firewall allowedUDPPorts (without this wg uses random port numbers) + + # # Path to the private key file. + # # + # # Note: The private key can also be included inline via the privateKey option, + # # but this makes the private key world-readable; thus, using privateKeyFile is + # # recommended. + # privateKeyFile = ''${config.users.users.muon.home}/documents/wireguard/vpn-client-private.key''; + + # peers = [ + # # For a client configuration, one peer entry for the server will suffice. + + # { + # # Public key of the server (not a file path). + # publicKey = "iBuHEKkNftQHXHJbj1wJS2D/PwXHkldvkdQQCPsCRH0="; + + # # Forward all the traffic via VPN. + # allowedIPs = [ "0.0.0.0/0" ]; + # # Or forward only particular subnets + # #allowedIPs = [ "10.100.0.1" "91.108.12.0/22" ]; + + # # Set this to the server IP and port. + # endpoint = "93.95.230.11:51820"; # ToDo: route to endpoint not automatically configured https://wiki.archlinux.org/index.php/WireGuard#Loop_routing https://discourse.nixos.org/t/solved-minimal-firewall-setup-for-wireguard-client/7577 + + # # Send keepalives every 25 seconds. Important to keep NAT tables alive. + # persistentKeepalive = 25; + # } + # ]; + # }; + # }; +} diff --git a/modules/core/nix.nix b/modules/core/nix.nix new file mode 100644 index 0000000..63c966d --- /dev/null +++ b/modules/core/nix.nix @@ -0,0 +1,98 @@ +{ + config, + pkgs, + lib, + inputs, + ... +}: { + environment = { + # set channels (backwards compatibility) + etc = { + "nix/flake-channels/nixpkgs".source = inputs.nixpkgs; + "nix/flake-channels/home-manager".source = inputs.home-manager; + }; + + systemPackages = with pkgs; [git deadnix alejandra statix]; + defaultPackages = []; + }; + + nixpkgs = { + config = { + allowUnfree = false; + allowBroken = true; + }; + }; + + # faster rebuilding + documentation = { + enable = true; + doc.enable = false; + man.enable = true; + dev.enable = false; + }; + + nix = { + gc = { + automatic = true; + dates = "daily"; + options = "--delete-older-than 3d"; + }; + package = pkgs.nixUnstable; + + # Make builds run with low priority so my system stays responsive + daemonCPUSchedPolicy = "idle"; + daemonIOSchedClass = "idle"; + + # pin the registry to avoid downloading and evaling a new nixpkgs version every time + registry = lib.mapAttrs (_: v: {flake = v;}) inputs; + + # This will additionally add your inputs to the system's legacy channels + # Making legacy nix commands consistent as well, awesome! + nixPath = lib.mapAttrsToList (key: value: "${key}=${value.to.path}") config.nix.registry; + + # Free up to 1GiB whenever there is less than 100MiB left. + extraOptions = '' + experimental-features = nix-command flakes + keep-outputs = true + warn-dirty = false + keep-derivations = true + min-free = ${toString (100 * 1024 * 1024)} + max-free = ${toString (1024 * 1024 * 1024)} + use-xdg-base-directories = true + ''; + settings = { + auto-optimise-store = true; + # use binary cache, its not gentoo + builders-use-substitutes = true; + # allow sudo users to mark the following values as trusted + allowed-users = ["@wheel"]; + # only allow sudo users to manage the nix store + trusted-users = ["@wheel"]; + sandbox = true; + max-jobs = "auto"; + # continue building derivations if one fails + keep-going = true; + log-lines = 20; + extra-experimental-features = ["flakes" "nix-command" "recursive-nix" "ca-derivations"]; + + # use binary cache, its not gentoo + substituters = [ + "https://cache.nixos.org" + "https://nix-community.cachix.org" + "https://nixpkgs-unfree.cachix.org" + "https://oxalica.cachix.org" + "https://hyprland.cachix.org" + ]; + + trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + "nixpkgs-unfree.cachix.org-1:hqvoInulhbV4nJ9yJOEr+4wxhDV4xq2d1DK7S6Nj6rs=" + "oxalica.cachix.org-1:h0iRBw6tQD8+51ZvnNEBPbwLR58UD7klauDBWzBdugQ=" + "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" + ]; + }; + }; + system.autoUpgrade.enable = false; + system.stateVersion = "23.05"; # DONT TOUCH THIS +} diff --git a/modules/core/schizo.nix b/modules/core/schizo.nix new file mode 100644 index 0000000..60d5b0b --- /dev/null +++ b/modules/core/schizo.nix @@ -0,0 +1,152 @@ +{ + config, + pkgs, + lib, + ... +}: +{ + services.tor = { + enable = true; + client.enable = true; + torsocks.enable = true; + }; + environment.systemPackages = with pkgs; [ + (writeScriptBin "sudo" ''exec doas "$@"'') + ]; + security = { + protectKernelImage = true; + lockKernelModules = false; + rtkit.enable = true; + apparmor = { + enable = true; + killUnconfinedConfinables = true; + packages = [pkgs.apparmor-profiles]; + }; + pam = { + loginLimits = [ + { + domain = "@wheel"; + item = "nofile"; + type = "soft"; + value = "524288"; + } + { + domain = "@wheel"; + item = "nofile"; + type = "hard"; + value = "1048576"; + } + ]; + services = { + login.enableGnomeKeyring = true; + }; + }; + + + doas = { + enable = true; + extraRules = [ + { + groups = ["wheel"]; + persist = true; + keepEnv = false; + } + { + groups = ["power"]; + noPass = true; + cmd = "${pkgs.systemd}/bin/poweroff"; + } + { + groups = ["power"]; + noPass = true; + cmd = "${pkgs.systemd}/bin/reboot"; + } + { + groups = ["nix"]; + cmd = "nix-collect-garbage"; + noPass = true; + } + { + groups = ["nix"]; + cmd = "nixos-rebuild"; + keepEnv = true; + } + ]; + }; + sudo.enable = false; + }; + + boot.kernel.sysctl = { + "kernel.yama.ptrace_scope" = 2; + "kernel.kptr_restrict" = 2; + "kernel.sysrq" = 0; + "net.core.bpf_jit_enable" = false; + "kernel.ftrace_enabled" = false; + "net.ipv4.conf.all.log_martians" = true; + "net.ipv4.conf.all.rp_filter" = "1"; + "net.ipv4.conf.default.log_martians" = true; + "net.ipv4.conf.default.rp_filter" = "1"; + "net.ipv4.icmp_echo_ignore_broadcasts" = true; + "net.ipv4.conf.all.accept_redirects" = false; + "net.ipv4.conf.all.secure_redirects" = false; + "net.ipv4.conf.default.accept_redirects" = false; + "net.ipv4.conf.default.secure_redirects" = false; + "net.ipv6.conf.all.accept_redirects" = false; + "net.ipv6.conf.default.accept_redirects" = false; + "net.ipv4.conf.all.send_redirects" = false; + "net.ipv4.conf.default.send_redirects" = false; + "net.ipv6.conf.default.accept_ra" = 0; + "net.ipv6.conf.all.accept_ra" = 0; + "net.ipv4.tcp_syncookies" = 1; + "net.ipv4.tcp_timestamps" = 0; + "net.ipv4.tcp_rfc1337" = 1; + "net.ipv4.tcp_fastopen" = 3; + "net.ipv4.tcp_congestion_control" = "bbr"; + "net.core.default_qdisc" = "cake"; + }; + + # Security + boot.blacklistedKernelModules = [ + # Obscure network protocols + "ax25" + "netrom" + "rose" + # Old or rare or insufficiently audited filesystems + "adfs" + "affs" + "bfs" + "befs" + "cramfs" + "efs" + "erofs" + "exofs" + "freevxfs" + "f2fs" + "vivid" + "gfs2" + "ksmbd" + "nfsv4" + "nfsv3" + "cifs" + "nfs" + "cramfs" + "freevxfs" + "jffs2" + "hfs" + "hfsplus" + "squashfs" + "udf" + "bluetooth" + "btusb" + # "uvcvideo" # thats why your webcam not worky + "hpfs" + "jfs" + "minix" + "nilfs2" + "omfs" + # "uvcvideo" + "qnx4" + "qnx6" + "sysv" + ]; +} diff --git a/modules/core/system.nix b/modules/core/system.nix new file mode 100644 index 0000000..edb0f73 --- /dev/null +++ b/modules/core/system.nix @@ -0,0 +1,258 @@ +{ + config, + pkgs, + lib, + inputs, + xdg, + ... +}: { + # compress half of the ram to use as swap + zramSwap = { + enable = true; + algorithm = "zstd"; + }; + + # TODO Move? + environment.variables = { + EDITOR = "nvim"; + BROWSER = "chromium"; + }; + + nixpkgs.overlays = [ inputs.rust-overlay.overlays.default ]; + environment.systemPackages = with pkgs; [ + git + clang + llvmPackages_16.bintools + rust-bin.nightly.latest.default + # support both 32- and 64-bit applications + wineWowPackages.stable + # winetricks (all versions) + winetricks + texlive.combined.scheme-small + ]; + + virtualisation.virtualbox.host.enable = true; + users.extraGroups.vboxusers.members = [ "muon" ]; + + # Set your time zone. + time.timeZone = "Atlantic/Reykjavik"; + + # Select internationalisation properties. + i18n.defaultLocale = "en_US.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "en_DK.UTF-8"; + LC_IDENTIFICATION = "en_DK.UTF-8"; + LC_MEASUREMENT = "en_DK.UTF-8"; + LC_MONETARY = "en_DK.UTF-8"; + LC_NAME = "en_DK.UTF-8"; + LC_NUMERIC = "en_DK.UTF-8"; + LC_PAPER = "en_DK.UTF-8"; + LC_TELEPHONE = "en_DK.UTF-8"; + LC_TIME = "en_DK.UTF-8"; + }; + + # Configure keymap in X11 + services.xserver = { + layout = "us"; + xkbVariant = ""; + xkbOptions = "caps:escape"; + }; + + # Use keymap in console + console.useXkbConfig = true; + + programs.thunar.enable = true; + services.gvfs.enable = true; # Mount, trash, and other functionalities + services.tumbler.enable = true; # Thumbnail support for images + + # Sound + sound = { + enable = true; + }; + + hardware.pulseaudio.enable = true; + security.rtkit.enable = true; + + services.pipewire = { + enable = false; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + + virtualisation.docker.enable = true; + + services.syncthing = with config.users.users.muon; { + enable = true; + user = "muon"; + dataDir = "${config.xdg.userDirs.documents}"; + configDir = "${home}/.config/syncthing"; + + overrideDevices = true; + overrideFolders = true; + + devices = { + "syncthing" = { + id = "SDFDQ4N-UPPGKQH-JWVII4O-FT4XTH3-FT2RPMZ-EQC57PQ-VXL7BBD-4LLPTA4"; + }; + }; + + folders = { + "documents" = { + path = "${home}/documents"; + devices = ["syncthing"]; + }; + "librewolf" = { + path = "${home}/.librewolf"; + devices = ["syncthing"]; + }; + "logseq" = { + path = "${home}/.logseq"; + devices = ["syncthing"]; + }; + "zotero" = { + path = "${home}/Zotero"; + devices = ["syncthing"]; + }; + "zotero-conf" = { + path = "${home}/.zotero"; + devices = ["syncthing"]; + }; + }; + }; + + programs.nix-ld = { + enable = true; + libraries = with pkgs; [ + stdenv.cc.cc + openssl + curl + glib + util-linux + glibc + icu + libunwind + libuuid + zlib + libsecret + # graphical + freetype + libglvnd + libnotify + SDL2 + vulkan-loader + gdk-pixbuf + xorg.libX11 + ]; + }; + + systemd = let + extraConfig = '' + DefaultTimeoutStopSec=15s + ''; + in { + inherit extraConfig; + user = {inherit extraConfig;}; + services."getty@tty1".enable = false; + services."autovt@tty1".enable = false; + services."getty@tty7".enable = false; + services."autovt@tty7".enable = false; + # Systemd OOMd + # Fedora enables these options by default. See the 10-oomd-* files here: + # https://src.fedoraproject.org/rpms/systemd/tree/acb90c49c42276b06375a66c73673ac3510255 + oomd = { + enableRootSlice = true; + enableUserServices = true; + }; + }; + + services.udev.extraRules = '' +# Atmel DFU +### ATmega16U2 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2fef", TAG+="uaccess" +### ATmega32U2 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", TAG+="uaccess" +### ATmega16U4 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff3", TAG+="uaccess" +### ATmega32U4 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff4", TAG+="uaccess" +### AT90USB64 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff9", TAG+="uaccess" +### AT90USB162 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffa", TAG+="uaccess" +### AT90USB128 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ffb", TAG+="uaccess" + +# Input Club +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1c11", ATTRS{idProduct}=="b007", TAG+="uaccess" + +# STM32duino +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0003", TAG+="uaccess" +# STM32 DFU +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", TAG+="uaccess" + +# BootloadHID +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", TAG+="uaccess" + +# USBAspLoader +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", TAG+="uaccess" + +# USBtinyISP +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1782", ATTRS{idProduct}=="0c9f", TAG+="uaccess" + +# ModemManager should ignore the following devices +# Atmel SAM-BA (Massdrop) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="6124", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" + +# Caterina (Pro Micro) +## pid.codes shared PID +### Keyboardio Atreus 2 Bootloader +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="2302", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +## Spark Fun Electronics +### Pro Micro 3V3/8MHz +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9203", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +### Pro Micro 5V/16MHz +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9205", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +### LilyPad 3V3/8MHz (and some Pro Micro clones) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b4f", ATTRS{idProduct}=="9207", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +## Pololu Electronics +### A-Star 32U4 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1ffb", ATTRS{idProduct}=="0101", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +## Arduino SA +### Leonardo +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0036", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +### Micro +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0037", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +## Adafruit Industries LLC +### Feather 32U4 +SUBSYSTEMS=="usb", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="000c", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +### ItsyBitsy 32U4 3V3/8MHz +SUBSYSTEMS=="usb", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="000d", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +### ItsyBitsy 32U4 5V/16MHz +SUBSYSTEMS=="usb", ATTRS{idVendor}=="239a", ATTRS{idProduct}=="000e", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +## dog hunter AG +### Leonardo +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0036", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" +### Micro +SUBSYSTEMS=="usb", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0037", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1" + +# hid_listen +KERNEL=="hidraw*", MODE="0660", GROUP="plugdev", TAG+="uaccess", TAG+="udev-acl" + +# hid bootloaders +## QMK HID +SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2067", TAG+="uaccess" +## PJRC's HalfKay +SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="0478", TAG+="uaccess" + +# APM32 DFU +SUBSYSTEMS=="usb", ATTRS{idVendor}=="314b", ATTRS{idProduct}=="0106", TAG+="uaccess" + +# GD32V DFU +SUBSYSTEMS=="usb", ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", TAG+="uaccess" + +# WB32 DFU +SUBSYSTEMS=="usb", ATTRS{idVendor}=="342d", ATTRS{idProduct}=="dfa0", TAG+="uaccess" + ''; +} diff --git a/modules/core/users.nix b/modules/core/users.nix new file mode 100644 index 0000000..6a6fb4c --- /dev/null +++ b/modules/core/users.nix @@ -0,0 +1,31 @@ +{ + config, + pkgs, + ... +}: { + users.users.root.initialPassword = "changeme"; + programs.zsh.enable = true; + programs.adb.enable = true; + users.users.muon = { + isNormalUser = true; + extraGroups = [ + "wheel" + "systemd-journal" + "vboxusers" + "audio" + "plugdev" + "wireshark" + "video" + "input" + "lp" + "networkmanager" + "power" + "nix" + "docker" + "adbusers" + ]; + uid = 1000; + shell = pkgs.zsh; + initialPassword = "changeme"; + }; +} diff --git a/modules/core/xdg.nix b/modules/core/xdg.nix new file mode 100644 index 0000000..7175152 --- /dev/null +++ b/modules/core/xdg.nix @@ -0,0 +1,17 @@ +{ + config, + pkgs, + lib, + inputs, + ... +}: { + environment.variables = with config.users.users.muon; { + WINIT_X11_SCALE_FACTOR="1"; + + # XDG Base + XDG_CONFIG_HOME="${home}/.config"; + XDG_CACHE_HOME="${home}/.cache"; + XDG_DATA_HOME="${home}/.local/share"; + XDG_STATE_HOME="${home}/.local/state"; + }; +} diff --git a/modules/home/alacritty/default.nix b/modules/home/alacritty/default.nix new file mode 100644 index 0000000..658c670 --- /dev/null +++ b/modules/home/alacritty/default.nix @@ -0,0 +1,48 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + programs.alacritty = { + enable = true; + settings = { + cursor = { + style.shape = "Beam"; + vi_mode_style = "Block"; + unfocused_hollow = true; + }; + window = { + padding.x = 6; + padding.y = 6; + }; + key_bindings = [ + { + key = "U"; + mods = "Control"; + mode = "Vi|~Search"; + action = "ScrollHalfPageUp"; + } + { + key = "D"; + mods = "Control"; + mode = "Vi|~Search"; + action = "ScrollHalfPageDown"; + } + { + key = "U"; + mods = "Control"; + mode = "~Alt"; + action = "ScrollHalfPageUp"; + } + { + key = "D"; + mods = "Control"; + mode = "~Alt"; + action = "ScrollHalfPageDown"; + } + ]; + }; + }; +} diff --git a/modules/home/default.nix b/modules/home/default.nix new file mode 100644 index 0000000..5f057b6 --- /dev/null +++ b/modules/home/default.nix @@ -0,0 +1,36 @@ +{ + inputs, + pkgs, + config, + lib, + self, + stylix, + ... +}: +{ + config.home.stateVersion = "23.05"; + config.home.extraOutputsToInstall = ["doc" "devdoc"]; + + imports = [ + ./packages.nix + + ./git + ./shell + ./alacritty + ./helix + ./tools + ./qutebrowser + + stylix.homeManagerModules.stylix + ./theme + + # ./herbstluftwm + # ./leftwm + ./xmonad + # ./hyprland + # inputs.hyprland.homeManagerModules.default + + inputs.nix-doom-emacs.hmModule + ./doom-emacs + ]; +} diff --git a/modules/home/doom-emacs/default.nix b/modules/home/doom-emacs/default.nix new file mode 100644 index 0000000..7076a53 --- /dev/null +++ b/modules/home/doom-emacs/default.nix @@ -0,0 +1,12 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + programs.doom-emacs = { + enable = true; + doomPrivateDir = ./doom; + }; +} \ No newline at end of file diff --git a/modules/home/doom-emacs/doom/config.el b/modules/home/doom-emacs/doom/config.el new file mode 100644 index 0000000..13c1b93 --- /dev/null +++ b/modules/home/doom-emacs/doom/config.el @@ -0,0 +1,121 @@ +;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- + +;; Place your private configuration here! Remember, you do not need to run 'doom +;; sync' after modifying this file! + + +;; Some functionality uses this to identify you, e.g. GPG configuration, email +;; clients, file templates and snippets. +(setq user-full-name "Muonis" + user-mail-address "user@muon.host") + +;; Doom exposes five (optional) variables for controlling fonts in Doom. Here +;; are the three important ones: +;; +;; + `doom-font' +;; + `doom-variable-pitch-font' +;; + `doom-big-font' -- used for `doom-big-font-mode'; use this for +;; presentations or streaming. +;; +;; They all accept either a font-spec, font string ("Input Mono-12"), or xlfd +;; font string. You generally only need these two: +;; (setq doom-font (font-spec :family "monospace" :size 12 :weight 'semi-light) +;; doom-variable-pitch-font (font-spec :family "sans" :size 13)) +(setq doom-font (font-spec :family "Mononoki Nerd Font" :size 14 :weight 'regular)) + +;; There are two ways to load a theme. Both assume the theme is installed and +;; available. You can either set `doom-theme' or manually load a theme with the +;; `load-theme' function. This is the default: +(setq doom-theme 'doom-gruvbox) + +;; If you use `org' and don't want your org files in the default location below, +;; change `org-directory'. It must be set before org loads! +(setq org-directory "~/documents/org/") + +;; This determines the style of line numbers in effect. If set to `nil', line +;; numbers are disabled. For relative line numbers, set this to `relative'. +; (setq display-line-numbers-type t) +;; (setq display-line-numbers-type relative) +(setq display-line-numbers-type 'relative) +(setq doom-line-numbers-style 'relative) + +;; Company coc mode +(company-tng-configure-default) + +;; Unbind jk bind jj, Dutch :/ +(setq evil-escape-key-sequence "jj") + +;; Here are some additional functions/macros that could help you configure Doom: +;; +;; - `load!' for loading external *.el files relative to this one +;; - `use-package!' for configuring packages +;; - `after!' for running code after a package has loaded +;; - `add-load-path!' for adding directories to the `load-path', relative to +;; this file. Emacs searches the `load-path' when you load packages with +;; `require' or `use-package'. +;; - `map!' for binding new keys +;; +;; To get information about any of these functions/macros, move the cursor over +;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). +;; This will open documentation for it, including demos of how they are used. +;; +;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how +;; they are implemented. + +;; Window nav +(map! :g "C-h" 'evil-window-left) +(map! :g "C-j" 'evil-window-down) +(map! :g "C-k" 'evil-window-up) +(map! :g "C-l" 'evil-window-right) + +;; org-roam +(setq org-roam-directory "~/documents/roam") +(org-roam-db-autosync-enable) +(org-roam-complete-everywhere) + +(map! :leader + "r f" 'org-roam-node-find + "r g" 'org-roam-graph + "r b" 'org-roam-buffer-toggle + "r i" 'org-roam-node-insert + "r c" 'org-roam-capture + ) + +;; vterm +(after! vterm + (set-evil-initial-state! 'vterm-mode +'emacs)) + +;; Autocomplete region buffer +(defun narrow-to-region-indirect (start end) + "Restrict editing in this buffer to the current region, indirectly." + (interactive "r") + (deactivate-mark) + (let ((buf (clone-indirect-buffer nil nil))) + (with-current-buffer buf + (narrow-to-region start end)) + (switch-to-buffer buf))) + +;; EIN +(setq ein:output-area-inlined-images t) +(setq ein:slice-image t) +(setq ein:completion-backend 'ein:use-company-backend) +(setq ein:polymode t) + +;; ORG +(require 'org) +(require 'ox-latex) +(add-to-list 'org-latex-packages-alist '("" "minted")) +(setq org-latex-listings 'minted) + +(setq org-latex-pdf-process + '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" + "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" + "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f")) + +(setq org-src-fontify-natively t) + +(org-babel-do-load-languages + 'org-babel-load-languages + '((R . t) + (latex . t))) diff --git a/modules/home/doom-emacs/doom/custom.el b/modules/home/doom-emacs/doom/custom.el new file mode 100644 index 0000000..77160c3 --- /dev/null +++ b/modules/home/doom-emacs/doom/custom.el @@ -0,0 +1,16 @@ +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(custom-safe-themes + '("7a424478cb77a96af2c0f50cfb4e2a88647b3ccca225f8c650ed45b7f50d9525" "a138ec18a6b926ea9d66e61aac28f5ce99739cf38566876dc31e29ec8757f6e2" "b54376ec363568656d54578d28b95382854f62b74c32077821fdfd604268616a" "2e05569868dc11a52b08926b4c1a27da77580daa9321773d92822f7a639956ce" "5f128efd37c6a87cd4ad8e8b7f2afaba425425524a68133ac0efd87291d05874" "680f62b751481cc5b5b44aeab824e5683cf13792c006aeba1c25ce2d89826426" "4ff1c4d05adad3de88da16bd2e857f8374f26f9063b2d77d38d14686e3868d8d" "8d3ef5ff6273f2a552152c7febc40eabca26bae05bd12bc85062e2dc224cde9a" "944d52450c57b7cbba08f9b3d08095eb7a5541b0ecfb3a0a9ecd4a18f3c28948" "2721b06afaf1769ef63f942bf3e977f208f517b187f2526f0e57c1bd4a000350" "e3daa8f18440301f3e54f2093fe15f4fe951986a8628e98dcd781efbec7a46f2" "afa47084cb0beb684281f480aa84dab7c9170b084423c7f87ba755b15f6776ef" "a44e2d1636a0114c5e407a748841f6723ed442dc3a0ed086542dc71b92a87aee" "60ada0ff6b91687f1a04cc17ad04119e59a7542644c7c59fc135909499400ab8" "467dc6fdebcf92f4d3e2a2016145ba15841987c71fbe675dcfe34ac47ffb9195" "e19ac4ef0f028f503b1ccafa7c337021834ce0d1a2bca03fcebc1ef635776bea" "b5803dfb0e4b6b71f309606587dd88651efe0972a5be16ece6a958b197caeed8" "6c531d6c3dbc344045af7829a3a20a09929e6c41d7a7278963f7d3215139f6a7" "1f1b545575c81b967879a5dddc878783e6ebcca764e4916a270f9474215289e5" "3d47380bf5aa650e7b8e049e7ae54cdada54d0637e7bac39e4cc6afb44e8463b" "6c98bc9f39e8f8fd6da5b9c74a624cbb3782b4be8abae8fd84cbc43053d7c175" "97db542a8a1731ef44b60bc97406c1eb7ed4528b0d7296997cbb53969df852d6" "028c226411a386abc7f7a0fba1a2ebfae5fe69e2a816f54898df41a6a3412bb5" "7a7b1d475b42c1a0b61f3b1d1225dd249ffa1abb1b7f726aec59ac7ca3bf4dae" "da186cce19b5aed3f6a2316845583dbee76aea9255ea0da857d1c058ff003546" "4699e3a86b1863bbc695236036158d175a81f0f3ea504e2b7c71f8f7025e19e3" "234dbb732ef054b109a9e5ee5b499632c63cc24f7c2383a849815dacc1727cb6" "1704976a1797342a1b4ea7a75bdbb3be1569f4619134341bd5a4c1cfb16abad4" "f6665ce2f7f56c5ed5d91ed5e7f6acb66ce44d0ef4acfaa3a42c7cfe9e9a9013" "c4063322b5011829f7fdd7509979b5823e8eea2abf1fe5572ec4b7af1dd78519" default)) + '(package-selected-packages '(jekyll-modes)) + '(warning-suppress-log-types '((lsp-mode) (lsp-mode))) + '(warning-suppress-types '((emacs) (defvaralias) (lsp-mode)))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) diff --git a/modules/home/doom-emacs/doom/init.el b/modules/home/doom-emacs/doom/init.el new file mode 100644 index 0000000..a419080 --- /dev/null +++ b/modules/home/doom-emacs/doom/init.el @@ -0,0 +1,190 @@ +;;; init.el -*- lexical-binding: t; -*- +;; This file controls what Doom modules are enabled and what order they load +;; in. Remember to run 'doom sync' after modifying it! + +;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's +;; documentation. There you'll find a "Module Index" link where you'll find +;; a comprehensive list of Doom's modules and what flags they support. + +;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or +;; 'C-c c k' for non-vim users) to view its documentation. This works on +;; flags as well (those symbols that start with a plus). +;; +;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its +;; directory (for easy access to its source code). + +(doom! :input + ;;chinese + ;;japanese + ;;layout ; auie,ctsrnm is the superior home row + + :completion + company ; the ultimate code completion backend + (helm +fuzzy) ; the *other* search engine for love and life + ;; ido ; the other *other* search engine... + ;; (ivy +fuzzy) ; a search engine for love and life + ;; (vertico +fuzzy) ; the search engine of the future + + :ui + ;;deft ; notational velocity for Emacs + doom ; what makes DOOM look the way it does + doom-dashboard ; a nifty splash screen for Emacs + doom-quit ; DOOM quit-message prompts when you quit Emacs + ;;(emoji +unicode) ; 🙂 + hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + ;;hydra + ;;indent-guides ; highlighted indent columns + (ligatures +hasklig) ; ligatures and symbols to make your code pretty again + ;;minimap ; show a map of the code on the side + modeline ; snazzy, Atom-inspired modeline, plus API + ;;nav-flash ; blink cursor line after big motions + neotree ; a project drawer, like NERDTree for vim + ophints ; highlight the region an operation acts on + (popup +defaults) ; tame sudden yet inevitable temporary windows + ;;tabs ; a tab bar for Emacs + ;;treemacs ; a project drawer, like neotree but cooler + ;;unicode ; extended unicode support for various languages + vc-gutter ; vcs diff in the fringe + vi-tilde-fringe ; fringe tildes to mark beyond EOB + ;;window-select ; visually switch windows + workspaces ; tab emulation, persistence & separate workspaces + ;;zen ; distraction-free coding or writing + + :editor + (evil +everywhere); come to the dark side, we have cookies + file-templates ; auto-snippets for empty files + fold ; (nigh) universal code folding + (format +onsave) ; automated prettiness + ;;god ; run Emacs commands without modifier keys + ;;lispy ; vim for lisp, for people who don't like vim + ;;multiple-cursors ; editing in many places at once + ;;objed ; text object editing for the innocent + ;;parinfer ; turn lisp into python, sort of + ;;rotate-text ; cycle region at point between text candidates + snippets ; my elves. They type so I don't have to + ;;word-wrap ; soft wrapping with language-aware indent + + :emacs + dired ; making dired pretty [functional] + electric ; smarter, keyword-based electric-indent + ;;ibuffer ; interactive buffer management + undo ; persistent, smarter undo for your inevitable mistakes + vc ; version-control and Emacs, sitting in a tree + + :term + ;;eshell ; the elisp shell that works everywhere + ;;shell ; simple shell REPL for Emacs + term ; basic terminal emulator for Emacs + vterm ; the best terminal emulation in Emacs + + :checkers + syntax ; tasing you for every semicolon you forget + ;;(spell +flyspell) ; tasing you for misspelling mispelling + ;;grammar ; tasing grammar mistake every you make + + :tools + ;;ansible + biblio ; Writes a PhD for you (citation needed) + debugger ; FIXME stepping through code, to help you add bugs + ;;direnv + ;;docker + ;;editorconfig ; let someone else argue about tabs vs spaces + ein ; tame Jupyter notebooks with emacs + (eval +overlay) ; run code, run (also, repls) + ;;gist ; interacting with github gists + lookup ; navigate your code and its documentation + lsp ; M-x vscode + magit ; a git porcelain for Emacs + ;;make ; run make tasks from Emacs + ;;pass ; password manager for nerds + pdf ; pdf enhancements + ;;prodigy ; FIXME managing external services & code builders + ;;rgb ; creating color strings + ;;taskrunner ; taskrunner for all your projects + ;;terraform ; infrastructure as code + ;;tmux ; an API for interacting with tmux + ;;upload ; map local to remote projects via ssh/ftp + + :os + (:if IS-MAC macos) ; improve compatibility with macOS + tty ; improve the terminal Emacs experience + + :lang + ;;agda ; types of types of types of types... + ;;beancount ; mind the GAAP + cc ; C > C++ == 1 + ;;clojure ; java with a lisp + ;;common-lisp ; if you've seen one lisp, you've seen them all + ;;coq ; proofs-as-programs + ;;crystal ; ruby at the speed of c + ;;csharp ; unity, .NET, and mono shenanigans + ;;data ; config/data formats + ;;(dart +flutter) ; paint ui and not much else + ;;dhall + ;;elixir ; erlang done right + ;;elm ; care for a cup of TEA? + emacs-lisp ; drown in parentheses + ;;erlang ; an elegant language for a more civilized age + ;;ess ; emacs speaks statistics + ;;factor + ;;faust ; dsp, but you get to keep your soul + ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) + ;;fsharp ; ML stands for Microsoft's Language + ;;fstar ; (dependent) types and (monadic) effects and Z3 + ;;gdscript ; the language you waited for + ;;(go +lsp) ; the hipster dialect + (haskell +lsp) ; a language that's lazier than I am + ;;hy ; readability of scheme w/ speed of python + ;;idris ; a language you can depend on + json ; At least it ain't XML + (java +lsp) ; the poster child for carpal tunnel syndrome + ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) + ;;julia ; a better, faster MATLAB + kotlin ; a better, slicker Java(Script) + latex ; writing papers in Emacs has never been so fun + ;;lean ; for folks with too much to prove + ;;ledger ; be audit you can be + lua ; one-based indices? one-based indices + markdown ; writing docs for people to ignore + ;;nim ; python + lisp at the speed of c + ;;nix ; I hereby declare "nix geht mehr!" + ;;ocaml ; an objective camel + (org +present) ; organize your plain life in plain text + ;;php ; perl's insecure younger brother + ;;plantuml ; diagrams for confusing people more + ;;purescript ; javascript, but functional + python ; beautiful is better than ugly + ;;qt ; the 'cutest' gui framework ever + ;;racket ; a DSL for DSLs + ;;raku ; the artist formerly known as perl6 + ;;rest ; Emacs as a REST client + ;;rst ; ReST in peace + ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} + (rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;;scala ; java, but good + ;;(scheme +guile) ; a fully conniving family of lisps + sh ; she sells {ba,z,fi}sh shells on the C xor + ;;sml + ;;solidity ; do you need a blockchain? No. + ;;swift ; who asked for emoji variables? + ;;terra ; Earth and Moon in alignment for performance. + web ; the tubes + yaml ; JSON, but readable + zig ; C, but simpler + + :email + ;;(mu4e +org +gmail) + ;;notmuch + ;;(wanderlust +gmail) + + :app + ;;calendar + ;;emms + ;;everywhere ; *leave* Emacs!? You must be joking + ;;irc ; how neckbeards socialize + ;;(rss +org) ; emacs as an RSS reader + ;;twitter ; twitter client https://twitter.com/vnought + + :config + ;;literate + (default +bindings +smartparens)) diff --git a/modules/home/doom-emacs/doom/packages.el b/modules/home/doom-emacs/doom/packages.el new file mode 100644 index 0000000..12c0ff8 --- /dev/null +++ b/modules/home/doom-emacs/doom/packages.el @@ -0,0 +1,56 @@ +;; -*- no-byte-compile: t; -*- +;;; $DOOMDIR/packages.el + +;; To install a package with Doom you must declare them here and run 'doom sync' +;; on the command line, then restart Emacs for the changes to take effect -- or +;; use 'M-x doom/reload'. + + +;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: +;(package! some-package) + +;; To install a package directly from a remote git repo, you must specify a +;; `:recipe'. You'll find documentation on what `:recipe' accepts here: +;; https://github.com/raxod502/straight.el#the-recipe-format +;(package! another-package +; :recipe (:host github :repo "username/repo")) + +;; If the package you are trying to install does not contain a PACKAGENAME.el +;; file, or is located in a subdirectory of the repo, you'll need to specify +;; `:files' in the `:recipe': +;(package! this-package +; :recipe (:host github :repo "username/repo" +; :files ("some-file.el" "src/lisp/*.el"))) + +;; If you'd like to disable a package included with Doom, you can do so here +;; with the `:disable' property: +;(package! builtin-package :disable t) + +;; You can override the recipe of a built in package without having to specify +;; all the properties for `:recipe'. These will inherit the rest of its recipe +;; from Doom or MELPA/ELPA/Emacsmirror: +;(package! builtin-package :recipe (:nonrecursive t)) +;(package! builtin-package-2 :recipe (:repo "myfork/package")) + +;; Specify a `:branch' to install a package from a particular branch or tag. +;; This is required for some packages whose default branch isn't 'master' (which +;; our package manager can't deal with; see raxod502/straight.el#279) +;(package! builtin-package :recipe (:branch "develop")) + +;; Use `:pin' to specify a particular commit to install. +;(package! builtin-package :pin "1a2b3c4d5e") + + +;; Doom's packages are pinned to a specific commit and updated from release to +;; release. The `unpin!' macro allows you to unpin single packages... +;(unpin! pinned-package) +;; ...or multiple packages +;(unpin! pinned-package another-pinned-package) +;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) +;(unpin! t) + +(package! evil-tutor) + +(package! org-roam) + +(package! platformio-mode) diff --git a/modules/home/git/default.nix b/modules/home/git/default.nix new file mode 100644 index 0000000..3ad1245 --- /dev/null +++ b/modules/home/git/default.nix @@ -0,0 +1,68 @@ +{ + config, + pkgs, + ... +}: { + home.packages = with pkgs; [zsh-forgit gitflow]; + programs.git = { + enable = true; + userName = "muon"; + userEmail = "admin@muon.host"; + ignores = [ + ".cache/" + ".DS_Store" + ".idea/" + "*.swp" + "*.elc" + "auto-save-list" + ".direnv/" + "node_modules" + "result" + "result-*" + ]; + extraConfig = { + init = {defaultBranch = "main";}; + delta = { + line-numbers = true; + }; + branch.autosetupmerge = "true"; + push.default = "current"; + merge.stat = "true"; + core.whitespace = "fix,-indent-with-non-tab,trailing-space,cr-at-eol"; + repack.usedeltabaseoffset = "true"; + pull.ff = "only"; + rebase = { + autoSquash = true; + autoStash = true; + }; + rerere = { + autoupdate = true; + enabled = true; + }; + }; + lfs.enable = true; + delta.enable = true; + aliases = { + co = "checkout"; + c = "commit -m"; + ca = "commit -am"; + graph = "log --all --decorate --graph --oneline"; + l = "log"; + r = "rebase"; + s = "status --short"; + ss = "status"; + d = "diff"; + ps = "!git push origin $(git rev-parse --abbrev-ref HEAD)"; + pl = "!git pull origin $(git rev-parse --abbrev-ref HEAD)"; + af = "!git add $(git ls-files -m -o --exclude-standard | sk -m)"; + st = "status"; + br = "branch"; + df = "!git hist | peco | awk '{print $2}' | xargs -I {} git diff {}^ {}"; + hist = '' + log --pretty=format:"%Cgreen%h %Creset%cd %Cblue[%cn] %Creset%s%C(yellow)%d%C(reset)" --graph --date=relative --decorate --all''; + llog = '' + log --graph --name-status --pretty=format:"%C(red)%h %C(reset)(%cd) %C(green)%an %Creset%s %C(yellow)%d%Creset" --date=relative''; + edit-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; hx `f`"; + }; + }; +} diff --git a/modules/home/helix/default.nix b/modules/home/helix/default.nix new file mode 100644 index 0000000..47b2668 --- /dev/null +++ b/modules/home/helix/default.nix @@ -0,0 +1,177 @@ +{ + pkgs, + lib, + inputs, + ... +}: { + programs.helix = { + enable = true; + + settings = { + keys.normal = { + "C" = ["collapse_selection" "extend_to_line_end" "change_selection"]; + "D" = ["extend_to_line_end" "delete_selection"]; + "Y" = ["extend_to_line_bounds" "yank_main_selection_to_clipboard" "goto_line_start" "collapse_selection"]; + "V" = ["select_mode" "extend_to_line_bounds"]; + + "{" = "goto_prev_paragraph"; + "}" = "goto_next_paragraph"; + "X" = "extend_line_above"; + "esc" = ["collapse_selection" "keep_primary_selection"]; + space.space = "file_picker"; + space.w = ":w"; + # space.q = ":bc"; + "C-q" = ":xa"; + space.u = { + f = ":format"; # format using LSP formatter + w = ":set whitespace.render all"; + W = ":set whitespace.render none"; + }; + }; + keys.select = { + "%" = "match_brackets"; + }; + editor = { + color-modes = true; + cursorline = true; + mouse = false; + idle-timeout = 1; + line-number = "relative"; + scrolloff = 5; + completion-replace = true; + bufferline = "always"; + true-color = true; + rulers = [80]; + soft-wrap.enable = true; + indent-guides = { + render = true; + }; + lsp = { + display-messages = true; + display-inlay-hints = true; + }; + statusline = { + separator = "|"; + left = ["mode" "selections" "spinner" "file-name" "total-line-numbers"]; + center = []; + right = ["diagnostics" "file-encoding" "file-line-ending" "file-type" "position-percentage" "position"]; + mode = { + normal = "NORMAL"; + insert = "INSERT"; + select = "SELECT"; + }; + }; + + whitespace.characters = { + space = "·"; + nbsp = "⍽"; + tab = "→"; + newline = "⤶"; + }; + + cursor-shape = { + insert = "bar"; + normal = "block"; + select = "block"; + }; + }; + }; + + languages = { + language = [ + { + name = "bash"; + auto-format = true; + formatter = { + command = "${pkgs.shfmt}/bin/shfmt"; + args = ["-i" "2" "-"]; + }; + } + { + name = "html"; + file-types = ["html" "tera"]; + } + { + name = "clojure"; + injection-regex = "(clojure|clj|edn|boot|yuck)"; + file-types = ["clj" "cljs" "cljc" "clje" "cljr" "cljx" "edn" "boot" "yuck"]; + } + { + name = "latex"; + file-types = ["tex"]; + config.texlab = { + build = { + forwardSearchAfter = true; + onSave = true; + }; + chktex = { + onEdit = true; + }; + forwardSearch = { + executable = "zathura"; + args = [ "--synctex-forward" "%l:1:%f" "%p" ]; + }; + }; + } + ]; + + language-server = { + bash-language-server = { + command = "${pkgs.nodePackages.bash-language-server}/bin/bash-language-server"; + args = ["start"]; + }; + + clangd = { + command = "${pkgs.clang-tools}/bin/clangd"; + clangd.fallbackFlags = ["-std=c++2b"]; + }; + + nil = { + command = lib.getExe pkgs.nil; + config.nil.formatting.command = ["${lib.getExe pkgs.alejandra}" "-q"]; + }; + }; + }; + + themes = { + ui.selection = {bg = "white"; modifiers = ["reversed"];}; + ui.primary = {bg = "light-cyan"; modifiers = ["reversed"];}; + }; + + }; + + home.packages = with pkgs; [ + # some other lsp related packages / dev tools + typst + shellcheck + lldb + gopls + clang-tools + nodejs + guile + nim + zig + texlab + zls + jre8 + gcc + uncrustify + black + shellcheck + gawk + haskellPackages.haskell-language-server + java-language-server + kotlin-language-server + nodePackages.vls + nodePackages.jsonlint + nodePackages.yarn + + # Nix + alejandra + nil + + # Rust + cargo + rust-analyzer + ]; +} diff --git a/modules/home/herbstluftwm/autostart b/modules/home/herbstluftwm/autostart new file mode 100755 index 0000000..e97deb2 --- /dev/null +++ b/modules/home/herbstluftwm/autostart @@ -0,0 +1,192 @@ +#!/usr/bin/env bash + +# this is a simple config for herbstluftwm + +hc() { + herbstclient "$@" +} + +hc emit_hook reload + +xsetroot -solid '#5A8E3A' + +# remove all existing keybindings +hc keyunbind --all + +# keybindings +# if you have a super key you will be much happier with Mod set to Mod4 +#Mod=Mod1 # Use alt as the main modifier +Mod=Mod4 # Use the super key as the main modifier + +hc keybind $Mod-Shift-e quit +hc keybind $Mod-Shift-r reload +hc keybind $Mod-Shift-q close +hc keybind $Mod-Return spawn "${TERMINAL:-alacritty}" # use your $TERMINAL with xterm as fallback + +# basic movement in tiling and floating mode +# focusing clients +hc keybind $Mod-Left focus left +hc keybind $Mod-Down focus down +hc keybind $Mod-Up focus up +hc keybind $Mod-Right focus right +hc keybind $Mod-h focus left +hc keybind $Mod-j focus down +hc keybind $Mod-k focus up +hc keybind $Mod-l focus right + +# moving clients in tiling and floating mode +hc keybind $Mod-Shift-Left shift left +hc keybind $Mod-Shift-Down shift down +hc keybind $Mod-Shift-Up shift up +hc keybind $Mod-Shift-Right shift right +hc keybind $Mod-Shift-h shift left +hc keybind $Mod-Shift-j shift down +hc keybind $Mod-Shift-k shift up +hc keybind $Mod-Shift-l shift right + +# splitting frames +# create an empty frame at the specified direction +hc keybind $Mod-u split bottom 0.5 +hc keybind $Mod-o split right 0.5 +# let the current frame explode into subframes +hc keybind $Mod-Control-space split explode + +# resizing frames and floating clients +resizestep=0.02 +hc keybind $Mod-Control-h resize left +$resizestep +hc keybind $Mod-Control-j resize down +$resizestep +hc keybind $Mod-Control-k resize up +$resizestep +hc keybind $Mod-Control-l resize right +$resizestep +hc keybind $Mod-Control-Left resize left +$resizestep +hc keybind $Mod-Control-Down resize down +$resizestep +hc keybind $Mod-Control-Up resize up +$resizestep +hc keybind $Mod-Control-Right resize right +$resizestep + +# tags +tag_names=({1..9}) +tag_keys=({1..9} 0) + +hc rename default "${tag_names[0]}" || true +for i in "${!tag_names[@]}"; do + hc add "${tag_names[$i]}" + key="${tag_keys[$i]}" + if [ -n "$key" ]; then + hc keybind "$Mod-$key" use_index "$i" + hc keybind "$Mod-Shift-$key" move_index "$i" + fi +done + +# cycle through tags +hc keybind $Mod-period use_index +1 --skip-visible +hc keybind $Mod-comma use_index -1 --skip-visible + +# layouting +hc keybind $Mod-r remove +hc keybind $Mod-s floating toggle +hc keybind $Mod-f fullscreen toggle +hc keybind $Mod-Shift-f set_attr clients.focus.floating toggle +hc keybind $Mod-Shift-d set_attr clients.focus.decorated toggle +hc keybind $Mod-Shift-m set_attr clients.focus.minimized true +hc keybind $Mod-Control-m jumpto last-minimized +hc keybind $Mod-p pseudotile toggle +# The following cycles through the available layouts within a frame, but skips +# layouts, if the layout change wouldn't affect the actual window positions. +# I.e. if there are two windows within a frame, the grid layout is skipped. +hc keybind $Mod-space \ + or , and . compare tags.focus.curframe_wcount = 2 \ + . cycle_layout +1 horizontal max vertical grid \ + , cycle_layout +1 + +# mouse +hc mouseunbind --all +hc mousebind $Mod-Button1 move +hc mousebind $Mod-Button2 zoom +hc mousebind $Mod-Button3 resize + +# focus +hc keybind $Mod-BackSpace cycle_monitor +hc keybind $Mod-Tab cycle_all +1 +hc keybind $Mod-Shift-Tab cycle_all -1 +hc keybind $Mod-c cycle +hc keybind $Mod-i jumpto urgent + +# theme +hc attr theme.tiling.reset 1 +hc attr theme.floating.reset 1 +hc set frame_border_active_color '#222222cc' +hc set frame_border_normal_color '#101010cc' +hc set frame_bg_normal_color '#565656aa' +hc set frame_bg_active_color '#345F0Caa' +hc set frame_border_width 1 +hc set show_frame_decorations 'focused_if_multiple' +hc set frame_bg_transparent on +hc set frame_transparent_width 5 +hc set frame_gap 4 + +hc attr theme.title_height 0 +hc attr theme.title_when never +hc attr theme.title_font 'Dejavu Sans:pixelsize=12' # example using Xft +# hc attr theme.title_font '-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*' +hc attr theme.title_depth 3 # space below the title's baseline +hc attr theme.active.color '#345F0Cef' +hc attr theme.title_color '#ffffff' +hc attr theme.normal.color '#323232dd' +hc attr theme.urgent.color '#7811A1dd' +hc attr theme.tab_color '#1F1F1Fdd' +hc attr theme.active.tab_color '#2B4F0Add' +hc attr theme.active.tab_outer_color '#6C8257dd' +hc attr theme.active.tab_title_color '#ababab' +hc attr theme.normal.title_color '#898989' +hc attr theme.inner_width 1 +hc attr theme.inner_color black +hc attr theme.border_width 1 +hc attr theme.floating.border_width 1 +hc attr theme.floating.outer_width 1 +hc attr theme.floating.outer_color black +hc attr theme.active.inner_color '#789161' +hc attr theme.urgent.inner_color '#9A65B0' +hc attr theme.normal.inner_color '#606060' +# copy inner color to outer_color +for state in active urgent normal; do + hc substitute C theme.${state}.inner_color \ + attr theme.${state}.outer_color C +done +hc attr theme.tiling.outer_width 1 +hc attr theme.background_color '#141414' + +hc set window_gap 0 +hc set frame_padding 0 +hc set smart_window_surroundings on +hc set smart_frame_surroundings on +hc set mouse_recenter_gap 0 + +# rules +hc unrule -F +#hc rule class=XTerm tag=3 # move all xterms to tag 3 +hc rule focus=on # normally focus new clients +hc rule floatplacement=smart +#hc rule focus=off # normally do not focus new clients +# give focus to most common terminals +#hc rule class~'(.*[Rr]xvt.*|.*[Tt]erm|Konsole)' focus=on +hc rule windowtype~'_NET_WM_WINDOW_TYPE_(DIALOG|UTILITY|SPLASH)' floating=on +hc rule windowtype='_NET_WM_WINDOW_TYPE_DIALOG' focus=on +hc rule windowtype~'_NET_WM_WINDOW_TYPE_(NOTIFICATION|DOCK|DESKTOP)' manage=off +hc rule fixedsize floating=on + +hc set tree_style '╾│ ├└╼─┐' + +# unlock, just to be sure +hc unlock + +# do multi monitor setup here, e.g.: +# hc set_monitors 1280x1024+0+0 1280x1024+1280+0 +# or simply: +# hc detect_monitors + +# find the panel +#panel=~/.config/herbstluftwm/panel.sh +#[ -x "$panel" ] || panel=/etc/xdg/herbstluftwm/panel.sh +#for monitor in $(hc list_monitors | cut -d: -f1) ; do +# # start it on each monitor +# "$panel" "$monitor" & +#done diff --git a/modules/home/herbstluftwm/default.nix b/modules/home/herbstluftwm/default.nix new file mode 100644 index 0000000..88824c2 --- /dev/null +++ b/modules/home/herbstluftwm/default.nix @@ -0,0 +1,9 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + home.file.".config/herbstluftwm/autostart".source = ./autostart; +} diff --git a/modules/home/hyprland/default.nix b/modules/home/hyprland/default.nix new file mode 100644 index 0000000..f6e5e3b --- /dev/null +++ b/modules/home/hyprland/default.nix @@ -0,0 +1,48 @@ +{ + config, + lib, + pkgs, + inputs, + ... +}: +{ + wayland.windowManager.hyprland = with lib; with pkgs; { + enable = true; + xwayland.enable = true; + nvidiaPatches = true; + recommendedEnvironment = true; + + extraConfig = '' + monitor=,preferred,auto,1 + + input { + kb_layout = us + kb_variant = + kb_model = + kb_options = caps:escape + kb_rules = + + follow_mouse = 1 + + touchpad { + natural_scroll = false + } + + sensitivity = 0 # -1.0 - 1.0 + } + + bind = SUPER, Return, exec, ${getExe alacritty} + bind = SUPER, b, exec, ${getExe chromium} + ''; + }; + + home.pointerCursor = { + name = "Adwaita"; + package = pkgs.gnome.adwaita-icon-theme; + size = 24; + x11 = { + enable = true; + defaultCursor = "Adwaita"; + }; + }; +} diff --git a/modules/home/leftwm/default.nix b/modules/home/leftwm/default.nix new file mode 100644 index 0000000..354d296 --- /dev/null +++ b/modules/home/leftwm/default.nix @@ -0,0 +1,109 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + + xdg.configFile."leftwm/themes/current/theme.toml".source = ./theme.toml; + xdg.configFile."leftwm/themes/current/up".source = ./up; + xdg.configFile."leftwm/themes/current/down".source = ./down; + + xdg.configFile."leftwm/config.ron".text = '' +#![enable(implicit_some)] +( + modkey: "Mod4", + mousekey: "Mod4", + workspaces: [], + tags: [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + ], + max_window_width: None, + layouts: [ + MainAndVertStack, + MainAndHorizontalStack, + MainAndDeck, + GridHorizontal, + EvenHorizontal, + EvenVertical, + Fibonacci, + LeftMain, + CenterMain, + CenterMainBalanced, + CenterMainFluid, + Monocle, + RightWiderLeftStack, + LeftWiderRightStack, + ], + layout_mode: Tag, + insert_behavior: Bottom, + scratchpad: [ + (name: "Alacritty", value: "alacritty", x: 860, y: 390, height: 300, width: 200), + ], + window_rules: [], + disable_current_tag_swap: false, + disable_tile_drag: false, + disable_window_snap: true, + focus_behaviour: Sloppy, + focus_new_windows: true, + single_window_border: true, + sloppy_mouse_follows_focus: true, + auto_derive_workspaces: true, + keybind: [ + (command: Execute, value: "dmenu_run", modifier: ["modkey"], key: "p"), + (command: Execute, value: "alacritty", modifier: ["modkey"], key: "Return"), + (command: CloseWindow, value: "", modifier: ["modkey", "Shift"], key: "q"), + (command: SoftReload, value: "", modifier: ["modkey", "Shift"], key: "r"), + (command: Execute, value: "loginctl kill-session $XDG_SESSION_ID", modifier: ["modkey", "Shift"], key: "x"), + (command: Execute, value: "slock", modifier: ["modkey", "Control"], key: "l"), + (command: MoveToLastWorkspace, value: "", modifier: ["modkey", "Shift"], key: "w"), + (command: SwapTags, value: "", modifier: ["modkey"], key: "w"), + (command: MoveWindowUp, value: "", modifier: ["modkey", "Shift"], key: "k"), + (command: MoveWindowDown, value: "", modifier: ["modkey", "Shift"], key: "j"), + (command: MoveWindowTop, value: "", modifier: ["modkey", "Shift"], key: "Return"), + (command: FocusWindowUp, value: "", modifier: ["modkey"], key: "k"), + (command: FocusWindowDown, value: "", modifier: ["modkey"], key: "j"), + (command: NextLayout, value: "", modifier: ["modkey", "Control"], key: "k"), + (command: PreviousLayout, value: "", modifier: ["modkey", "Control"], key: "j"), + (command: FocusWorkspaceNext, value: "", modifier: ["modkey"], key: "l"), + (command: FocusWorkspacePrevious, value: "", modifier: ["modkey"], key: "h"), + (command: MoveWindowUp, value: "", modifier: ["modkey", "Shift"], key: "Up"), + (command: MoveWindowDown, value: "", modifier: ["modkey", "Shift"], key: "Down"), + (command: FocusWindowUp, value: "", modifier: ["modkey"], key: "Up"), + (command: FocusWindowDown, value: "", modifier: ["modkey"], key: "Down"), + (command: NextLayout, value: "", modifier: ["modkey", "Control"], key: "Up"), + (command: PreviousLayout, value: "", modifier: ["modkey", "Control"], key: "Down"), + (command: FocusWorkspaceNext, value: "", modifier: ["modkey"], key: "Right"), + (command: FocusWorkspacePrevious, value: "", modifier: ["modkey"], key: "Left"), + (command: GotoTag, value: "1", modifier: ["modkey"], key: "1"), + (command: GotoTag, value: "2", modifier: ["modkey"], key: "2"), + (command: GotoTag, value: "3", modifier: ["modkey"], key: "3"), + (command: GotoTag, value: "4", modifier: ["modkey"], key: "4"), + (command: GotoTag, value: "5", modifier: ["modkey"], key: "5"), + (command: GotoTag, value: "6", modifier: ["modkey"], key: "6"), + (command: GotoTag, value: "7", modifier: ["modkey"], key: "7"), + (command: GotoTag, value: "8", modifier: ["modkey"], key: "8"), + (command: GotoTag, value: "9", modifier: ["modkey"], key: "9"), + (command: MoveToTag, value: "1", modifier: ["modkey", "Shift"], key: "1"), + (command: MoveToTag, value: "2", modifier: ["modkey", "Shift"], key: "2"), + (command: MoveToTag, value: "3", modifier: ["modkey", "Shift"], key: "3"), + (command: MoveToTag, value: "4", modifier: ["modkey", "Shift"], key: "4"), + (command: MoveToTag, value: "5", modifier: ["modkey", "Shift"], key: "5"), + (command: MoveToTag, value: "6", modifier: ["modkey", "Shift"], key: "6"), + (command: MoveToTag, value: "7", modifier: ["modkey", "Shift"], key: "7"), + (command: MoveToTag, value: "8", modifier: ["modkey", "Shift"], key: "8"), + (command: MoveToTag, value: "9", modifier: ["modkey", "Shift"], key: "9"), + ], + state_path: None, +) + ''; +} diff --git a/modules/home/leftwm/down b/modules/home/leftwm/down new file mode 100755 index 0000000..32071f7 --- /dev/null +++ b/modules/home/leftwm/down @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +SCRIPTPATH="$HOME/config/leftwm/themes/current" + +leftwm-command "UnloadTheme" + diff --git a/modules/home/leftwm/theme.toml b/modules/home/leftwm/theme.toml new file mode 100644 index 0000000..55faf8b --- /dev/null +++ b/modules/home/leftwm/theme.toml @@ -0,0 +1,3 @@ +border_width = 1 +margin = 4 +focused_border_color = "#2cb8b5" diff --git a/modules/home/leftwm/up b/modules/home/leftwm/up new file mode 100755 index 0000000..c68625f --- /dev/null +++ b/modules/home/leftwm/up @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +export SCRIPTPATH="$HOME/.config/leftwm/themes/current" + +#down the last running theme +if [ -f "/tmp/leftwm-theme-down" ]; then + /tmp/leftwm-theme-down + rm /tmp/leftwm-theme-down +fi +ln -s $SCRIPTPATH/down /tmp/leftwm-theme-down + +#set the theme.toml config +leftwm-command "LoadTheme $SCRIPTPATH/theme.toml" + diff --git a/modules/home/packages.nix b/modules/home/packages.nix new file mode 100644 index 0000000..7921797 --- /dev/null +++ b/modules/home/packages.nix @@ -0,0 +1,91 @@ +{ + inputs, + pkgs, + self, + config, + ... +}: { + + nixpkgs.config.allowUnfree = false; + home.packages = with pkgs; [ + # system + wget + unzip + neovim + python3 + dconf + libnotify + i3lock-fancy-rapid + pkg-config + alsa-utils + + # cli + zellij + fd + glow + trash-cli + thefuck + xclip + fend + broot + unar + bottom + + # gui + feh + rofi + dunst + yq + imagemagick + ungoogled-chromium + librewolf + mullvad-browser + tor-browser-bundle-bin + gimp + logseq + zotero + armcord + freetube + texstudio + texlive.combined.scheme-full + mpv + inkscape + dolphin + qgis + obs-studio + mumble + onionshare-gui + freetube + kotatogram-desktop + signal-desktop + + # dev + psmisc + qmk + python311Packages.pip + cmake + texlab + + # gaming + gamemode + gamehub + lutris + prismlauncher + airshipper + bottles + minigalaxy + cemu + mindustry + + # media + ffmpeg + pulseaudio + playerctl + pavucontrol + pulsemixer + pamixer + alsa-utils + alsa-tools + cava + ]; +} diff --git a/modules/home/qutebrowser/default.nix b/modules/home/qutebrowser/default.nix new file mode 100644 index 0000000..986c341 --- /dev/null +++ b/modules/home/qutebrowser/default.nix @@ -0,0 +1,41 @@ + +{ + pkgs, + lib, + inputs, + ... +}: { + programs.qutebrowser = { + enable = true; + + settings = { + content.cookies.accept = "no-3rdparty"; + url = { + default_page = "https://searx.be/"; + start_pages = "https://searx.be/"; + }; + }; + + searchEngines = { + DEFAULT = "https://searx.be/?q={}"; + }; + + extraConfig = '' + host = c.content.blocking.hosts.lists.append + host("https://www.github.developerdan.com/hosts/lists/facebook-extended.txt") + + abp = c.content.blocking.adblock.lists.append + abp("https://fanboy.co.nz/r/fanboy-ultimate.txt") + abp("https://fanboy.co.nz/fanboy-antifacebook.txt") + abp("https://fanboy.co.nz/fanboy-annoyance.txt") + abp("https://fanboy.co.nz/fanboy-cookiemonster.txt") + abp("https://easylist-downloads.adblockplus.org/antiadblockfilters.txt") + abp("https://easylist-downloads.adblockplus.org/abp-filters-anti-cv.txt") + + abp("https://github.com/DandelionSprout/adfilt/raw/master/LegitimateURLShortener.txt") + abp("https://github.com/DandelionSprout/adfilt/raw/master/AnnoyancesList") + abp("https://github.com/DandelionSprout/adfilt/raw/master/SocialShareList.txt") + abp("https://github.com/DandelionSprout/adfilt/raw/master/ExtremelyCondensedList.txt") + ''; + }; +} diff --git a/modules/home/shell/default.nix b/modules/home/shell/default.nix new file mode 100644 index 0000000..2850031 --- /dev/null +++ b/modules/home/shell/default.nix @@ -0,0 +1,137 @@ +{ + config, + lib, + pkgs, + ... +}: +{ + home.packages = with pkgs; [comma ripgrep]; + home.sessionVariables.STARSHIP_CACHE = "${config.xdg.cacheHome}/starship"; + programs = { + nix-index.enable = false; + + exa.enable = true; + + zoxide = { + enable = true; + enableZshIntegration = true; + }; + + dircolors = { + enable = true; + enableZshIntegration = true; + }; + + skim = { + enable = true; + enableZshIntegration = true; + defaultCommand = "rg --files --hidden"; + changeDirWidgetOptions = [ + "--preview 'exa --icons --git --color always -T -L 3 {} | head -200'" + "--exact" + ]; + }; + + starship = { + enable = true; + settings = { + add_newline = true; + scan_timeout = 1; + #character = { + #error_symbol = "[󰊠](bold red)"; + #success_symbol = "[󰊠](bold green)"; + #vicmd_symbol = "[󰊠](bold yellow)"; + #format = "$symbol [|](bold bright-black) "; + #}; + git_commit = {commit_hash_length = 4;}; + line_break.disabled = false; + lua.symbol = "[](blue) "; + python.symbol = "[](blue) "; + hostname = { + ssh_only = true; + format = "[$hostname](bold blue) "; + disabled = false; + }; + }; + }; + + zsh = { + enable = true; + + dotDir = ".config/zsh"; + + enableCompletion = true; + enableAutosuggestions = true; + syntaxHighlighting.enable = true; + + initExtra = '' + autoload -U compinit + setopt no_auto_remove_slash + + fuck () { + TF_PYTHONIOENCODING=$PYTHONIOENCODING; + export TF_SHELL=zsh; + export TF_ALIAS=fuck; + TF_SHELL_ALIASES=$(alias); + export TF_SHELL_ALIASES; + TF_HISTORY="$(fc -ln -10)"; + export TF_HISTORY; + export PYTHONIOENCODING=utf-8; + TF_CMD=$( + thefuck THEFUCK_ARGUMENT_PLACEHOLDER $@ + ) && eval $TF_CMD; + unset TF_HISTORY; + export PYTHONIOENCODING=$TF_PYTHONIOENCODING; + test -n "$TF_CMD" && print -s $TF_CMD + } + ''; + + history = { + save = 2000000; + size = 2000000; + expireDuplicatesFirst = true; + ignoreDups = true; + ignoreSpace = true; + path = "$HOME/.local/state/zsh/history"; + }; + + shellAliases = with pkgs; with lib; { + rebuild = "doas nix-store --verify; pushd ~/.config/dotfiles && doas nixos-rebuild switch --flake .# && notify-send \"Done\" && bat cache --build; popd"; + update = "doas nix-store --verify; pushd ~/.config/dotfiles && doas nixos-rebuild switch --upgrade-all --flake .# && notify-send \"Done\" && bat cache --build; popd"; + cleanup = "doas nix-collect-garbage --delete-older-than 7d"; + bloat = "nix path-info -Sh /run/current-system"; + cat = "${getExe bat} --style=plain"; + vpn = getExe mullvad; + grep = getExe ripgrep; + fzf = getExe skim; + MANPAGER = "sh -c 'col -bx | bat -l man -p'"; + du = getExe du-dust; + ps = getExe procs; + m = "mkdir -p"; + fcd = "cd $(find -type d | fzf)"; + l = "ls -lF --time-style=long-iso --icons"; + sc = "sudo systemctl"; + scu = "systemctl --user "; + la = "${getExe exa} -lah"; + ls = "${getExe exa} -h --git --icons --color=auto --group-directories-first -s extension"; + tree = "${getExe exa} --tree --icons --tree"; + burn = "pkill -9"; + diff = "diff --color=auto"; + ".." = "cd .."; + "..." = "cd ../../"; + "...." = "cd ../../../"; + "....." = "cd ../../../../"; + "......" = "cd ../../../../../"; + v = "${getExe neovim}"; + vim = "${getExe neovim}"; + }; + plugins = with pkgs; [ + { + name = "zsh-vi-mode"; + src = zsh-vi-mode; + file = "share/zsh-vi-mode/zsh-vi-mode.plugin.zsh"; + } + ]; + }; + }; +} diff --git a/modules/home/theme/default.nix b/modules/home/theme/default.nix new file mode 100644 index 0000000..3f8d316 --- /dev/null +++ b/modules/home/theme/default.nix @@ -0,0 +1,47 @@ +{ + config, + lib, + pkgs, + inputs, + stylix, + ... +}: +let + theme-name = "mocha"; + theme = "${pkgs.base16-schemes}/share/themes/${theme-name}.yaml"; + wallpaper = pkgs.runCommand "image.png" {} '' + COLOR=$(${pkgs.yq}/bin/yq -r .base00 ${theme}) + COLOR="#"$COLOR + ${pkgs.imagemagick}/bin/magick convert -size 1920x1080 xc:$COLOR $out + ''; +in { + stylix = { + image = wallpaper; + # polarity = "light"; + # base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml"; + base16Scheme = theme; + + fonts = { + monospace = { + package = pkgs.mononoki; + name = "Mononoki Nerd Font"; + }; + emoji = { + package = pkgs.noto-fonts-emoji; + name = "Noto Color Emoji"; + }; + serif = config.stylix.fonts.monospace; + sansSerif = config.stylix.fonts.monospace; + }; + }; + + services.random-background = { + enable = true; + imageDirectory = "${wallpaper}"; + }; + + programs.zellij.enable = true; + programs.rofi.enable = true; + + # config.services.xserver.desktopManager.wallpaper = ./wallpaper.jpg; +} diff --git a/modules/home/theme/wallpaper.jpg b/modules/home/theme/wallpaper.jpg new file mode 100644 index 0000000..59a525d Binary files /dev/null and b/modules/home/theme/wallpaper.jpg differ diff --git a/modules/home/tools/default.nix b/modules/home/tools/default.nix new file mode 100644 index 0000000..08c2b54 --- /dev/null +++ b/modules/home/tools/default.nix @@ -0,0 +1,93 @@ +{ + pkgs, + lib, + config, + ... +}: let + browser = ["chromium.desktop"]; + + associations = { + "text/html" = browser; + "x-scheme-handler/http" = browser; + "x-scheme-handler/https" = browser; + "x-scheme-handler/ftp" = browser; + "x-scheme-handler/about" = browser; + "x-scheme-handler/unknown" = browser; + "application/x-extension-htm" = browser; + "application/x-extension-html" = browser; + "application/x-extension-shtml" = browser; + "application/xhtml+xml" = browser; + "application/x-extension-xhtml" = browser; + "application/x-extension-xht" = browser; + + "audio/*" = ["mpv.desktop"]; + "video/*" = ["mpv.dekstop"]; + "image/*" = ["imv.desktop"]; + "application/json" = browser; + #"application/pdf" = ["org.pwmt.zathura.desktop.desktop"]; + #"x-scheme-handler/tg" = ["telegramdesktop.desktop"]; + #"x-scheme-handler/spotify" = ["spotify.desktop"]; + #"x-scheme-handler/discord" = ["WebCord.desktop"]; + }; + + texlive = pkgs.texlive.combine { + inherit + (pkgs.texlive) + scheme-small + noto + mweights + cm-super + cmbright + fontaxes + beamer + ; + }; + +in { + # home.packages = [texlive]; + services = { + gpg-agent = { + enable = true; + pinentryFlavor = "gnome3"; + enableSshSupport = true; + enableZshIntegration = true; + }; + }; + programs = { + gpg.enable = true; + man.enable = true; + direnv = { + enable = true; + nix-direnv.enable = true; + }; + tealdeer = { + enable = true; + settings = { + display = { + compact = false; + use_pager = true; + }; + updates = { + auto_update = true; + }; + }; + }; + bat.enable = true; + }; + xdg = { + userDirs = { + enable = true; + documents = "$HOME/documents"; + download = "$HOME/downloads"; + videos = "$HOME/misc/videos"; + music = "$HOME/misc/music"; + pictures = "$HOME/misc/pictures"; + desktop = "$HOME/misc/desktop"; + publicShare = "$HOME/misc/public"; + templates = "$HOME/misc/templates"; + }; + mimeApps.enable = true; + mimeApps.associations.added = associations; + mimeApps.defaultApplications = associations; + }; +} diff --git a/modules/home/xmonad/default.nix b/modules/home/xmonad/default.nix new file mode 100644 index 0000000..2c014cb --- /dev/null +++ b/modules/home/xmonad/default.nix @@ -0,0 +1,165 @@ +{ + config, + lib, + pkgs, + ... +}: +with config.lib.stylix.colors; { + xsession.windowManager.xmonad = { + enable = true; + enableContribAndExtras = true; + }; + + xsession.windowManager.xmonad.config = + pkgs.writeText "xmonad.hs" '' + import XMonad + + import XMonad.Config.Desktop + + import XMonad.Layout.ResizableTile + import XMonad.Layout.NoBorders + import XMonad.Layout.Gaps + import XMonad.Layout.Spacing + import XMonad.Layout.PerScreen + + import XMonad.Util.EZConfig + import XMonad.Util.Ungrab + import XMonad.Util.Loggers + + import XMonad.Hooks.EwmhDesktops + import XMonad.Hooks.DynamicLog + import XMonad.Hooks.ManageDocks + import XMonad.Hooks.ManageHelpers + import XMonad.Hooks.StatusBar + import XMonad.Hooks.StatusBar.PP + + import System.Exit + + import qualified XMonad.StackSet as W + + mobarStart = "xmobar ~/.config/xmobar/xmobarrc" + + main :: IO() + main = xmonad + . ewmhFullscreen + . ewmh + . docks + . withEasySB mySB defToggleStrutsKey + $ myConfig + where + mySB = statusBarProp mobarStart (pure myXmobarPP) + + myConfig = def + { modMask = mod4Mask + , terminal = "alacritty" + + -- Border + , borderWidth = 1 + , normalBorderColor = "#${base03}" + , focusedBorderColor = "#${base0B}" + + -- Hooks + , manageHook = myHook + -- , layoutHook = desktopLayoutModifiers $ smartBorders myLayout + , layoutHook = myLayout + -- , startupHook = myStartup + } + `additionalKeysP` + [ ("M-b", spawn "chromium") + , ("M-", spawn "alacritty") + , ("M-d", spawn "rofi -show drun") + + -- Windows + , ("M-S-", windows W.swapMaster) + , ("M-S-q", kill) + , ("M-S-x", io (exitWith ExitSuccess)) + + -- Media keys + , ("", spawn "pamixer -t") + , ("", spawn "pamixer -d2") + , ("", spawn "pamixer -i2") + ] + + myLayout = avoidStruts $ lessBorders Screen $ smartBorders $ tall ||| Full + where + addSpaces = spacingRaw True (Border 2 2 2 2) True (Border 2 2 2 2) True + -- addGaps = gaps [(U,10),(R,10),(L,10),(D,10)] + -- tall = ResizableTall 2 (1/10) 1 [] + tall = ifWider 1280 (tiled) (Mirror tiled) + tiled = Tall nmaster delta ratio + nmaster = 1 + ratio = 1/2 + delta = 3/100 + + myHook :: ManageHook + myHook = composeAll + [ isDialog --> doFloat + , isFullscreen --> (doF W.focusDown <+> doFullFloat) + ] + + -- myStartup :: X () + -- myStartup = do + -- spawn mobarStart + + myXmobarPP :: PP + myXmobarPP = def + { ppSep = magenta " • " + , ppTitleSanitize = xmobarStrip + , ppCurrent = wrap " " "" . xmobarBorder "Top" "#${base0C}" 2 + , ppHidden = white . wrap " " "" + , ppHiddenNoWindows = lowWhite . wrap " " "" + , ppUrgent = red . wrap (yellow "!") (yellow "!") + , ppOrder = \[ws, l, _, wins] -> [ws, l, wins] + , ppExtras = [logTitles formatFocused formatUnfocused] + } + where + formatFocused = wrap (white "[") (white "]") . magenta . ppWindow + formatUnfocused = wrap (lowWhite "[") (lowWhite "]") . blue . ppWindow + + -- | Windows should have *some* title, which should not not exceed a + -- sane length. + ppWindow :: String -> String + ppWindow = xmobarRaw . (\w -> if null w then "untitled" else w) . shorten 30 + + blue, lowWhite, magenta, red, white, yellow :: String -> String + magenta = xmobarColor "#${base0E}" "" + blue = xmobarColor "#${base0D}" "" + white = xmobarColor "#${base05}" "" + yellow = xmobarColor "#${base0A}" "" + red = xmobarColor "#${base08}" "" + lowWhite = xmobarColor "#${base04}" "" + ''; + + programs.xmobar.enable = true; + programs.xmobar.extraConfig = '' + Config + { overrideRedirect = False + , font = "Mononoki" + , bgColor = "#${base00}" + , fgColor = "#${base05}" + , position = BottomH 20 + , lowerOnStart = True + , commands = + [ Run Cpu + [ "-L", "3" + , "-H", "50" + , "--high" , "red" + , "--normal", "green" + ] 10 + , Run Alsa "default" "Master" + [ "--template", "Vol: " + , "--suffix" , "True" + , "--" + , "--on", "" + ] + , Run Memory ["--template", "Mem: %"] 10 + , Run Swap [] 10 + , Run Date "%Y-%m-%d %a %H:%M:%S" "date" 1 + , Run XMonadLog + ] + , sepChar = "%" + , alignSep = "}{" + , template = "%XMonadLog% }{ %cpu% | %memory% | %swap% | %date% " + } + ''; +} diff --git a/modules/unfree/default.nix b/modules/unfree/default.nix new file mode 100644 index 0000000..8d80204 --- /dev/null +++ b/modules/unfree/default.nix @@ -0,0 +1,10 @@ +{ + config, + pkgs, + ... +}: { + imports = [ + ./nvidia.nix + ./flatpak.nix + ]; +} diff --git a/modules/unfree/flatpak.nix b/modules/unfree/flatpak.nix new file mode 100644 index 0000000..d7ea069 --- /dev/null +++ b/modules/unfree/flatpak.nix @@ -0,0 +1,12 @@ +{ + config, + pkgs, + lib, + ... +}: { + # Don't like flatpak, even though it's free + # Only used to contain unfree packages + xdg.portal.enable = true; + xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; + services.flatpak.enable = true; +} diff --git a/modules/unfree/nvidia.nix b/modules/unfree/nvidia.nix new file mode 100644 index 0000000..f200030 --- /dev/null +++ b/modules/unfree/nvidia.nix @@ -0,0 +1,71 @@ +{ + config, + pkgs, + lib, + ... +}: { + # Unfree