diff --git a/.gitattributes b/.gitattributes
index d07910b..45b454e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,6 @@
# $DOTFILES/.gitattributes
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
skhdrc linguist-language=Shell
yabairc linguist-language=Shell
sketchybarrc linguist-language=Shell
diff --git a/.gitignore b/.gitignore
index 1658eab..e5cd05f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,5 @@ common/fzfrc
.venv/
platforms/win/komorebi/applications.json
+
+gitconfig
diff --git a/.vscode/dotfiles.code-snippets b/.vscode/dotfiles.code-snippets
index 5a49f9e..2e11759 100644
--- a/.vscode/dotfiles.code-snippets
+++ b/.vscode/dotfiles.code-snippets
@@ -15,15 +15,14 @@
// ],
// "description": "Log output to console"
// }
- "Dotfiles": {
- "scope": "",
- "prefix": "init",
- "body": [
- "$LINE_COMMENT \\$DOTFILES/$RELATIVE_FILEPATH",
- "$LINE_COMMENT Date: $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE",
- "$LINE_COMMENT Author: contact@js0ny.net",
- "$LINE_COMMENT $0",
- ]
-
- }
-}
+ "Dotfiles": {
+ "scope": "",
+ "prefix": "init",
+ "body": [
+ "$LINE_COMMENT \\$DOTFILES/$RELATIVE_FILEPATH",
+ "$LINE_COMMENT Date: $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE",
+ "$LINE_COMMENT Author: js0ny",
+ "$LINE_COMMENT $0",
+ ]
+ }
+}
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..6b98a69
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,14 @@
+{
+ "recommendations": [
+ "xadillax.viml",
+ "mark-wiemer.vscode-autohotkey-plus-plus",
+ "edwinkofler.vscode-assorted-languages",
+ "tamasfe.even-better-toml",
+ "kdl-org.kdl",
+ "sumneko.lua",
+ "ms-vscode.powershell",
+ "thenuprojectcontributors.vscode-nushell-lang",
+ "redhat.vscode-yaml",
+ "redhat.vscode-xml"
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 7972763..a719ff3 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -11,6 +11,7 @@
"pip.conf": "python-misc",
"*.kdl": "json",
"gitconfig": "git",
+ "gitconfig.example": "git",
"nvim/init.lua": "vim",
"markdownlint.json": "markdownlint",
"wslconfig": "settings",
@@ -27,5 +28,6 @@
"files.associations": {
"ideavimrc": "Vimscript",
".wslconfig": "properties",
+ "WindowsTerminal.json": "jsonc",
},
-}
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 1978a49..e064b30 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,675 +1,44 @@
Copyright (c) 2024-2024 js0ny
- 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.
+This dotfiles repository uses multiple licenses for different tools' configuration files:
- Preamble
+1. **MIT License**
+ Unless otherwise specified, all files and directories in this repository are licensed
+ under the MIT License.
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
+ See the full text of the MIT License below.
- 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.
+2. **GNU General Public License v3 (GPLv3)**
+ Files under the following directory are licensed under the GNU GPLv3:
+ - `./platforms/mac/sketchybar/`
+ These files are based on or intended for use with `FelixKratz/SketchyBar`
+ See the `LICENSE` file within the directory for the full text of the GNU GPLv3 license.
- 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.
+Refer to individual directories or files for detailed license information
- 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.
+Full text of MIT License is below.
- 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.
+MIT License
- 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.
+Copyright (c) 2024 js0ny
- 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.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The precise terms and conditions for copying, distribution and
-modification follow.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- 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
-.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/bootstrap/macOS.zsh b/bootstrap/macOS.zsh
index ef55894..d88c98b 100644
--- a/bootstrap/macOS.zsh
+++ b/bootstrap/macOS.zsh
@@ -220,7 +220,7 @@ mas install 836500024 # WeChat
mas install 451108668 # QQ
# plum (Rime IME)
-curl -fsSL https://raw.githubusercontent.com/rime/plum/master/rime-install | bash
+curl -fsSL https://raw.githubusercontent.com/rime/plum/master/rime-install -o $HOME | bash
# Set default apps (duti)
# The id of the app can be found by running
diff --git a/bootstrap/set_path.ps1 b/bootstrap/set_path.ps1
new file mode 100644
index 0000000..08d1a40
--- /dev/null
+++ b/bootstrap/set_path.ps1
@@ -0,0 +1,5 @@
+[System.Environment]::SetEnvironmentVariable("Path_EXT_0", "D:\bin", "User")
+[System.Environment]::SetEnvironmentVariable("Path_EXT_0", "$Env:LocalAppData\Cargo\bin", "User")
+[System.Environment]::SetEnvironmentVariable("Path_EXT_1", "$Env:LocalAppData\Go\bin", "User")
+[System.Environment]::SetEnvironmentVariable("Path_EXT_2", "$Env:LocalAppData\Cargo\bin", "User")
+[System.Environment]::SetEnvironmentVariable("Path_EXT_2", "", "User")
diff --git a/bootstrap/set_symlink_unix.bash b/bootstrap/set_symlink_unix.bash
index 9191e28..f693c70 100644
--- a/bootstrap/set_symlink_unix.bash
+++ b/bootstrap/set_symlink_unix.bash
@@ -1,7 +1,7 @@
#! /bin/bash
# $DOTFILES/bootstrap/set_symblink_unix.bash
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# Set symbolic links for Unix-like systems
mkdir -p $XDG_CONFIG_HOME/conda $XDG_CONFIG_HOME/git $XDG_CONFIG_HOME/ideavim $XDG_CONFIG_HOME/markdownlint $XDG_CONFIG_HOME/pip $XDG_CONFIG_HOME/neovide $XDG_CONFIG_HOME/powershell $XDG_CONFIG_HOME/vscode $XDG_CONFIG_HOME/NuGet $XDG_CONFIG_HOME/vim $XDG_CONFIG_HOME/tmux $XDG_CONFIG_HOME/npm $XDG_CONFIG_HOME/readline $XDG_CONFIG_HOME/ipython
# Not support XDG_CONFIG_HOME but same directory
@@ -11,11 +11,11 @@ mkdir -p ~/.config/zellij ~/.config/yazi ~/.config/glow
mkdir -p $HOME/Obsidian
# $DOTFILES/common
ln -sf $DOTFILES/common/condarc.yaml $XDG_CONFIG_HOME/conda/.condarc
-ln -sf $DOTFILES/common/gitconfig $XDG_CONFIG_HOME/git/config
+# ln -sf $DOTFILES/common/gitconfig $XDG_CONFIG_HOME/git/config
+cp $DOTFILES/common/gitconfig.example $XDG_CONFIG_HOME/git/config
ln -sf $DOTFILES/common/glow.yaml ~/.config/glow/config.yml
ln -sf $DOTFILES/common/haskeline ~/.haskeline
ln -sf $DOTFILES/common/ideavimrc $XDG_CONFIG_HOME/ideavim/ideavimrc
-ln -sf $DOTFILES/common/inputrc $XDG_CONFIG_HOME/readline/inputrc
ln -sf $DOTFILES/common/lesskey $XDG_CONFIG_HOME/lesskey
ln -sf $DOTFILES/common/npmrc $NPM_CONFIG_USERCONFIG
ln -sf $DOTFILES/common/NuGet.Config $XDG_CONFIG_HOME/NuGet/NuGet.Config
@@ -29,6 +29,7 @@ ln -sf $DOTFILES/tools/ipython $XDG_CONFIG_HOME/ipython
ln -sf $DOTFILES/tools/nvim $XDG_CONFIG_HOME/nvim
ln -sf $DOTFILES/tools/yazi/config/keymap.toml ~/.config/yazi/keymap.toml
ln -sf $DOTFILES/tools/yazi/config/yazi.toml ~/.config/yazi/yazi.toml
+ln -sf $DOTFILES/tools/fish ~/.config
if [ $(uname) = "Darwin"]; then
@@ -37,4 +38,6 @@ if [ $(uname) = "Darwin"]; then
ln -sf $DOTFILES/platforms/mac/skhdrc $XDG_CONFIG_HOME/skhd/skhdrc
ln -sf $DOTFILES/platforms/mac/sketchybarrc $XDG_CONFIG_HOME/sketchybar/sketchybarrc
ln -sf $DOTFILES/platforms/mac/yabairc $XDG_CONFIG_HOME/yabai/yabairc
+else
+ ln -sf $DOTFILES/common/inputrc $XDG_CONFIG_HOME/readline/inputrc
fi
diff --git a/bootstrap/set_symlink_win.ps1 b/bootstrap/set_symlink_win.ps1
index e709cb0..cc19bde 100644
--- a/bootstrap/set_symlink_win.ps1
+++ b/bootstrap/set_symlink_win.ps1
@@ -1,31 +1,31 @@
# $DOTFILES\bootstrap\set_symlink_win.ps1
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# Set symlinks for dotfiles on Windows
-# 在 Windows 上设置 dotfiles 的符号链接
+# 在 Windows 上设置 配置文件的符号链接
-$DOTFILES = Join-Path $env:UserProfile ".dotfiles"
+$DOTFILES = Join-Path $Env:UserProfile ".dotfiles"
$BASE_COMMON = Join-Path $DOTFILES "common"
$BASE_TOOLS = Join-Path $DOTFILES "tools"
$BASE_WIN = Join-Path $DOTFILES "platforms" "win"
$linkDots = @{
- "$BASE_WIN\wslconfig" = "$env:UserProfile\.wslconfig"
+ "$BASE_WIN\wslconfig" = "$Env:UserProfile\.wslconfig"
"$BASE_WIN\neovide.toml" = "$Env:AppData\neovide\config.toml"
"$BASE_WIN\vsvimrc" = "$Env:Vim\.vsvimrc"
- "$BASE_WIN\komorebi" = "$env:KOMOREBI_CONFIG_HOME"
- "$BASE_COMMON\condarc.yaml" = "$env:XDG_CONFIG_HOME\conda\.condarc"
- "$BASE_COMMON\gitconfig" = "$env:UserProfile\.gitconfig"
- "$BASE_COMMON\glow.yaml" = "$env:AppData\glow\glow.yml"
- "$BASE_COMMON\haskeline" = "$env:UserProfile\.haskeline"
- "$BASE_COMMON\ideavimrc" = "$env:XDG_CONFIG_HOME\ideavim\ideavimrc"
- "$BASE_COMMON\lesskey" = "$env:LessKeyIn"
- "$BASE_COMMON\npmrc" = "$env:NPM_CONFIG_USERCONFIG"
- "$BASE_COMMON\NuGet.Config" = "$env:AppData\NuGet\NuGet.Config"
- "$BASE_COMMON\obsidian.vimrc" = "$env:UserProfile\Obsidian\.obsidian.vimrc"
- "$BASE_COMMON\pip.conf" = "$env:AppData\pip\pip.ini"
- "$BASE_COMMON\vim.noxdg.vimrc" = "$env:Vim\_vimrc"
- "$BASE_TOOLS\ipython" = "$env:IPYTHONDIR"
- "$BASE_TOOLS\nvim" = "$env:XDG_CONFIG_HOME\nvim"
+ "$BASE_WIN\komorebi" = "$Env:KOMOREBI_CONFIG_HOME"
+ "$BASE_COMMON\condarc.yaml" = "$Env:XDG_CONFIG_HOME\conda\.condarc"
+ "$BASE_COMMON\gitconfig" = "$Env:UserProfile\.gitconfig"
+ "$BASE_COMMON\glow.yaml" = "$Env:AppData\glow\glow.yml"
+ "$BASE_COMMON\haskeline" = "$Env:UserProfile\.haskeline"
+ "$BASE_COMMON\ideavimrc" = "$Env:XDG_CONFIG_HOME\ideavim\ideavimrc"
+ "$BASE_COMMON\lesskey" = "$Env:LessKeyIn"
+ "$BASE_COMMON\npmrc" = "$Env:NPM_CONFIG_USERCONFIG"
+ "$BASE_COMMON\NuGet.Config" = "$Env:AppData\NuGet\NuGet.Config"
+ "$BASE_COMMON\obsidian.vimrc" = "$Env:UserProfile\Obsidian\.obsidian.vimrc"
+ "$BASE_COMMON\pip.conf" = "$Env:AppData\pip\pip.ini"
+ "$BASE_COMMON\vimrc" = "$Env:Vim\_vimrc"
+ "$BASE_TOOLS\ipython" = "$Env:IPYTHONDIR"
+ "$BASE_TOOLS\nvim" = "$Env:XDG_CONFIG_HOME\nvim"
}
# TODO: Auto create directories
@@ -35,4 +35,4 @@ foreach ($target in $linkDots.Keys) {
New-Item -ItemType SymbolicLink -Target $target -Path $path -Force
}
-New-Item -ItemType SymbolicLink -Target "$BASE_WIN\Microsoft.PowerShell_profile.ps1" -Path "$env:UserProfile\Documents\PowerShell\Microsoft.PowerShell_profile.ps1" -Force
+New-Item -ItemType SymbolicLink -Target "$BASE_WIN\Microsoft.PowerShell_profile.ps1" -Path "$Env:UserProfile\Documents\PowerShell\Microsoft.PowerShell_profile.ps1" -Force
diff --git a/bootstrap/tmp.zsh b/bootstrap/tmp.zsh
new file mode 100644
index 0000000..71e32c8
--- /dev/null
+++ b/bootstrap/tmp.zsh
@@ -0,0 +1,19 @@
+export DOTFILES=~/.dotfiles
+export ZDOTDIR=~/.config/zsh
+
+mkdir -p $ZDOTDIR
+mkdir -p $DOTFILES
+
+git clone https://github.com/js0ny/dotfiles $DOTFILES
+
+sudo cp $DOTFILES/tools/zsh/global.zshenv /etc/zsh/zshenv
+
+export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
+export XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
+export XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
+export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}"
+export XDG_RUNTIME_DIR="/run/user/$(id -u)"
+
+
+mkdir -p $XDG_CONFIG_HOME $XDG_DATA_HOME $XDG_STATE_HOME $XDG_CACHE_HOME
+
diff --git a/common/NuGet.Config b/common/NuGet.Config
old mode 100644
new mode 100755
diff --git a/common/gitconfig b/common/gitconfig.example
similarity index 90%
rename from common/gitconfig
rename to common/gitconfig.example
index 6b98b60..b161479 100644
--- a/common/gitconfig
+++ b/common/gitconfig.example
@@ -3,8 +3,8 @@
# ln -sf $DOTFILES/.config/git/.gitconfig $XDG_CONFIG_HOME/git/config
# New-Item -ItemType SymbolicLink -Path "$Env:XDG_CONFIG_HOME\git\config" -Target "$DOTFILES\.config\git\.gitconfig"
[user]
- name = js0ny
- email = json.y@outlook.com
+ name = whoami
+ email = whoami@example.com
[core]
editor = nvim
pager = delta
diff --git a/common/ideavimrc b/common/ideavimrc
index e61739b..789945b 100644
--- a/common/ideavimrc
+++ b/common/ideavimrc
@@ -1,6 +1,6 @@
"$XDG_CONFIG_HOME/ideavim/ideavimrc
" New-Item -ItemType SymbolicLink -Path ~\.ideavimrc -Target $DOTFILES\.config\ideavim\ideavimrc.vimrc
-" ln -sf $DOTFILES/.config/ideavim/ideavimrc.vimrc $XDG_CONFIG_HOME/ideavim/ideavimrc
+" ln -sf $DOTFILES/.config/ideavim/ideavimrc.vimrc $XDG_CONFIG_HOME/ideavim/ideavimrc
""" Basic Configs """
let mapleader = " " " set to
@@ -15,7 +15,7 @@ noremap L I
" ne[k]st
noremap k n
noremap K N
-" [j]ump
+" [j]ump
noremap j e
noremap J E
@@ -146,6 +146,7 @@ nnoremap rG :action Generate
""" Handling Ctrls """
+sethandler i:ide
sethandler n-v:vim i:ide
sethandler a:ide
-sethandler > a:ide
\ No newline at end of file
+sethandler > a:ide
diff --git a/common/obsidian.vimrc b/common/obsidian.vimrc
deleted file mode 100644
index 09c7427..0000000
--- a/common/obsidian.vimrc
+++ /dev/null
@@ -1,59 +0,0 @@
-" Put this in OBSIDIAN_VAULT/.obsidian.vimrc
-set clipboard=unnamed " Sync with System Clipboard
-
-" Word wrap
-noremap n gj
-noremap e gk
-noremap i l
-
-" Similar position to i
-noremap l i
-noremap L I
-" ne[k]st
-noremap k n
-noremap K N
-" [j]ump
-noremap j e
-noremap J E
-
-" Y to yank to end of line
-noremap Y y$
-
-""" Visual mode surrounding
-exmap addbold obcommand editor:toogle-bold
-exmap additalic obcommand editor:toogle-italic
-exmap addhighlight obcommand editor:toogle-highlight
-exmap addcode obcommand editor:toogle-code
-exmap adddel obcommand editor:toogle-strikethrough
-vnoremap ~ :adddel " Add delete to selection
-vnoremap ` c`"` " editor:toogle-code is buggy
-vnoremap * :addbold " Add bold to selection
-vnoremap _ :additalic " Add italic to selection
-vnoremap = :addhighlight " Add highlight to selection
-
-exmap prevtab obcommand workspace:previous-tab
-exmap nexttab obcommand workspace:next-tab
-nnoremap H :prevtab
-nnoremap I :nexttab
-
-exmap reload :source .obsidian.vimrc
-
-unmap
-exmap vsplit obcommand workspace:split-vertical
-exmap hsplit obcommand workspace:split-horizontal
-map | :vsplit
-map - :hsplit
-" map bd
-
-exmap chat obcommand obsidian-custom-frames:open-custom-frames-chatgpt
-map ai :chat
-
-exmap omnisearch obcommand omnisearch:show-modal
-map :omnisearch
-
-exmap command-palette obcommand command-palette:open
-map : :command-palette
-
-""" g-commands
-exmap tsource obcommand editor:toggle-source
-nnoremap gs :tsource
diff --git a/platforms/linux/zshrc b/platforms/linux/zshrc
new file mode 100644
index 0000000..4f81dbe
--- /dev/null
+++ b/platforms/linux/zshrc
@@ -0,0 +1,15 @@
+# Use powerline
+USE_POWERLINE="true"
+# Has weird character width
+# Example:
+# is not a diamond
+HAS_WIDECHARS="false"
+alias open=dolphin
+# Source manjaro-zsh-configuration
+if [[ -e /usr/share/zsh/manjaro-zsh-config ]]; then
+ source /usr/share/zsh/manjaro-zsh-config
+fi
+# Use manjaro zsh prompt
+# if [[ -e /usr/share/zsh/manjaro-zsh-prompt ]]; then
+# source /usr/share/zsh/manjaro-zsh-prompt
+# fi
diff --git a/platforms/mac/DefaultKeyBinding.dict b/platforms/mac/DefaultKeyBinding.dict
new file mode 100644
index 0000000..eceab87
--- /dev/null
+++ b/platforms/mac/DefaultKeyBinding.dict
@@ -0,0 +1,11 @@
+// ~/Library/Keybindings/DefaultKeyBinding.dict
+{
+ // Colemak Vim Style Arrows
+ "^h" = "moveBackward:";
+ "^n" = "moveDown:";
+ "^e" = "moveUp:";
+ "^i" = "moveForward:";
+ // Colemak Vim Style Home/End, Insert & Append
+ "^l" = "moveToBeginningOfLine:";
+ "^a" = "moveToEndOfLine:";
+}
diff --git a/platforms/mac/sketchybar/plugins/battery.sh b/platforms/mac/sketchybar/plugins/battery.sh
new file mode 100755
index 0000000..9dd9627
--- /dev/null
+++ b/platforms/mac/sketchybar/plugins/battery.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+PERCENTAGE="$(pmset -g batt | grep -Eo "\d+%" | cut -d% -f1)"
+CHARGING="$(pmset -g batt | grep 'AC Power')"
+
+if [ "$PERCENTAGE" = "" ]; then
+ exit 0
+fi
+
+case "${PERCENTAGE}" in
+ 9[0-9]|100) ICON=""
+ ;;
+ [6-8][0-9]) ICON=""
+ ;;
+ [3-5][0-9]) ICON=""
+ ;;
+ [1-2][0-9]) ICON=""
+ ;;
+ *) ICON=""
+esac
+
+if [[ "$CHARGING" != "" ]]; then
+ ICON=""
+fi
+
+# The item invoking this script (name $NAME) will get its icon and label
+# updated with the current battery status
+sketchybar --set "$NAME" icon="$ICON" label="${PERCENTAGE}%"
diff --git a/platforms/mac/sketchybar/plugins/clock.sh b/platforms/mac/sketchybar/plugins/clock.sh
new file mode 100755
index 0000000..d7e25bb
--- /dev/null
+++ b/platforms/mac/sketchybar/plugins/clock.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# The $NAME variable is passed from sketchybar and holds the name of
+# the item invoking this script:
+# https://felixkratz.github.io/SketchyBar/config/events#events-and-scripting
+
+sketchybar --set "$NAME" label="$(date '+%d日周%u %H:%M')"
+
diff --git a/platforms/mac/sketchybar/plugins/front_app.sh b/platforms/mac/sketchybar/plugins/front_app.sh
new file mode 100755
index 0000000..fb6d0b3
--- /dev/null
+++ b/platforms/mac/sketchybar/plugins/front_app.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+# Some events send additional information specific to the event in the $INFO
+# variable. E.g. the front_app_switched event sends the name of the newly
+# focused application in the $INFO variable:
+# https://felixkratz.github.io/SketchyBar/config/events#events-and-scripting
+
+if [ "$SENDER" = "front_app_switched" ]; then
+ sketchybar --set "$NAME" label="$INFO"
+fi
diff --git a/platforms/mac/sketchybar/plugins/music.sh b/platforms/mac/sketchybar/plugins/music.sh
new file mode 100755
index 0000000..d32161c
--- /dev/null
+++ b/platforms/mac/sketchybar/plugins/music.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+music_info=$(curlie GET http://localhost:10767/api/v1/playback/now-playing | jq -r '"\(.info.name) - \(.info.artistName)"')
+
+
+ICON=""
+
+sketchybar --set $NAME label="$music_info" icon="$ICON"
diff --git a/platforms/mac/sketchybar/plugins/space.sh b/platforms/mac/sketchybar/plugins/space.sh
new file mode 100755
index 0000000..b8602b5
--- /dev/null
+++ b/platforms/mac/sketchybar/plugins/space.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# The $SELECTED variable is available for space components and indicates if
+# the space invoking this script (with name: $NAME) is currently selected:
+# https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item
+
+sketchybar --set "$NAME" background.drawing="$SELECTED"
diff --git a/platforms/mac/sketchybar/plugins/volume.sh b/platforms/mac/sketchybar/plugins/volume.sh
new file mode 100755
index 0000000..6e69a5d
--- /dev/null
+++ b/platforms/mac/sketchybar/plugins/volume.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# The volume_change event supplies a $INFO variable in which the current volume
+# percentage is passed to the script.
+
+if [ "$SENDER" = "volume_change" ]; then
+ VOLUME="$INFO"
+
+ case "$VOLUME" in
+ [6-9][0-9]|100) ICON=""
+ ;;
+ [3-5][0-9]) ICON=""
+ ;;
+ [1-9]|[1-2][0-9]) ICON=""
+ ;;
+ *) ICON=""
+ esac
+
+ sketchybar --set "$NAME" icon="$ICON" label="$VOLUME%"
+fi
diff --git a/platforms/mac/sketchybarrc b/platforms/mac/sketchybar/sketchybarrc
similarity index 96%
rename from platforms/mac/sketchybarrc
rename to platforms/mac/sketchybar/sketchybarrc
index 7486611..beb6fcf 100755
--- a/platforms/mac/sketchybarrc
+++ b/platforms/mac/sketchybar/sketchybarrc
@@ -1,6 +1,6 @@
# $DOTFILES/platforms/mac/sketchybarrc
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# TODO: Reorganize this file
# This is a demo config to showcase some of the most important commands.
# It is meant to be changed and configured, as it is intentionally kept sparse.
@@ -41,7 +41,7 @@ sketchybar --default "${default[@]}"
# https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item
# to indicate active and available mission control spaces.
-SPACE_ICONS=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10")
+SPACE_ICONS=("" "" "" "" "" "" "7" "8" "9" "10")
for i in "${!SPACE_ICONS[@]}"
do
sid="$(($i+1))"
@@ -89,7 +89,7 @@ sketchybar --add item clock center \
--add item battery right \
--set battery update_freq=120 script="$PLUGIN_DIR/battery.sh" \
--subscribe battery system_woke power_source_change \
- --add item apple_music right
+ --add item apple_music right
sketchybar --add item music right
sketchybar --set music \
diff --git a/platforms/mac/skhdrc b/platforms/mac/skhdrc
index 2dc756f..b3ac4d0 100644
--- a/platforms/mac/skhdrc
+++ b/platforms/mac/skhdrc
@@ -1,36 +1,174 @@
# $DOTFILES/platforms/mac/skhdrc
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
-# Location: $XDG_CONFIG_HOME/skhd/skhdrc
-# Linking:
-# ln -sf $DOTFILES/platforms/mac/skhdrc $XDG_CONFIG_HOME/skhd/skhdrc
+# # Location: $XDG_CONFIG_HOME/skhd/skhdrc
+# # Linking:
+# # ln -sf $DOTFILES/platforms/mac/skhdrc $XDG_CONFIG_HOME/skhd/skhdrc
-# Navigation
-cmd - h : yabai -m window --focus west
-cmd - n : yabai -m window --focus south
-cmd - e : yabai -m window --focus north
-cmd - i : yabai -m window --focus east
+# # Navigation
+# alt - h : yabai -m window --focus west
+# alt - n : yabai -m window --focus south
+# alt - e : yabai -m window --focus north
+# alt - i : yabai -m window --focus east
-# Moving windows
+# # Moving windows
+# shift + alt - h : yabai -m window --warp west
+# shift + alt - n : yabai -m window --warp south
+# shift + alt - e : yabai -m window --warp north
+# shift + alt - i : yabai -m window --warp east
+
+# ctrl - 1 : yabai -m space --focus 1
+# ctrl - 2 : yabai -m space --focus 2
+# ctrl - 3 : yabai -m space --focus 3
+# ctrl - 4 : yabai -m space --focus 4
+# ctrl - 5 : yabai -m space --focus 5
+# ctrl - 6 : yabai -m space --focus 6
+# ctrl - 7 : yabai -m space --focus 7
+# ctrl - 8 : yabai -m space --focus 8
+# ctrl - 9 : yabai -m space --focus 9
+# ctrl - 0 : yabai -m space --focus 10
+
+# # minimize window
+# alt - m : yabai -m window --minimize
+
+# # float / unfloat window and center on screen
+# alt - f : yabai -m window --toggle float
+
+# # toggle window native fullscreen
+# shift + alt - f : yabai -m window --toggle native-fullscreen
+
+# # send window to a space
+# shift + ctrl - 1 : yabai -m window --space 1
+# shift + ctrl - 2 : yabai -m window --space 2
+# shift + ctrl - 3 : yabai -m window --space 3
+# shift + ctrl - 4 : yabai -m window --space 4
+# shift + ctrl - 5 : yabai -m window --space 5
+# shift + ctrl - 6 : yabai -m window --space 6
+# shift + ctrl - 7 : yabai -m window --space 7
+# shift + ctrl - 8 : yabai -m window --space 8
+# shift + ctrl - 9 : yabai -m window --space 9
+# shift + ctrl - 0 : yabai -m window --space 10
+
+# open terminal
+ctrl - r : open -n -a "Kitty"
+
+# moves focus between windows in the current focused display
+alt - h : yabai -m window --focus west
+alt - n : yabai -m window --focus south
+alt - e : yabai -m window --focus north
+alt - i : yabai -m window --focus east
+
+# moves focus between spaces
+alt - 1 : yabai -m space --focus 1
+alt - 2 : yabai -m space --focus 2
+alt - 3 : yabai -m space --focus 3
+alt - 4 : yabai -m space --focus 4
+alt - 5 : yabai -m space --focus 5
+alt - 6 : yabai -m space --focus 6
+alt - 7 : yabai -m space --focus 7
+alt - 8 : yabai -m space --focus 8
+alt - 9 : yabai -m space --focus 9
+alt - 0 : yabai -m space --focus 10
+
+# delete focused space
+alt - q : yabai -m space --destroy
+
+# toggle window split type
+alt - e : yabai -m window --toggle split
+
+# close window
+alt - x : yabai -m window --close
+
+# minimize window
+alt - m : yabai -m window --minimize
+
+# rotate tree
+alt - r : yabai -m space --rotate 90
+
+# mirror tree y-axis
+alt - y : yabai -m space --mirror y-axis
+
+# toggle desktop offset
+alt - a : yabai -m space --toggle padding; yabai -m space --toggle gap
+
+# toggle window parent zoom
+alt - d : yabai -m window --focus mouse && \
+ yabai -m window --toggle zoom-parent
+
+# float / unfloat window and center on screen
+alt - t : yabai -m window --toggle float;\
+ yabai -m window --grid 4:4:1:1:2:2
+
+# toggle window fullscreen zoom
+alt - f : yabai -m window --focus mouse && \
+ yabai -m window --toggle zoom-fullscreen
+
+# toggle window native fullscreen
+shift + alt - f : yabai -m window --toggle native-fullscreen
+
+# increase gap in focused space
+alt - g : yabai -m space --gap rel:10
+
+# decrease gap in focused space
+shift + alt - g : yabai -m space --gap rel:-10
+
+# create a new space and follow focus
+alt - n : yabai -m space --create && \
+ index="$(yabai -m query --displays --display | jq '.spaces[-1]')" && \
+ yabai -m space --focus "${index}"
+
+# create a new space, move window and follow focus
+shift + alt - n : yabai -m space --create && \
+ index="$(yabai -m query --displays --display | jq '.spaces[-1]')" && \
+ yabai -m window --space "${index}" && \
+ yabai -m space --focus "${index}"
+
+# balance size of windows
+shift + alt - 0 : yabai -m space --balance
+
+# swap window
+shift + alt - h : yabai -m window --swap west
+shift + alt - n : yabai -m window --swap south
+shift + alt - e : yabai -m window --swap north
+shift + alt - i : yabai -m window --swap east
+
+# move window
shift + cmd - h : yabai -m window --warp west
shift + cmd - n : yabai -m window --warp south
shift + cmd - e : yabai -m window --warp north
shift + cmd - i : yabai -m window --warp east
-shift + alt - h : \
- yabai -m window --resize left:-20:0 ; \
- yabai -m window --resize right:-20:0
+# send window to a space
+shift + alt - 1 : yabai -m window --space 1
+shift + alt - 2 : yabai -m window --space 2
+shift + alt - 3 : yabai -m window --space 3
+shift + alt - 4 : yabai -m window --space 4
+shift + alt - 5 : yabai -m window --space 5
+shift + alt - 6 : yabai -m window --space 6
+shift + alt - 7 : yabai -m window --space 7
+shift + alt - 8 : yabai -m window --space 8
+shift + alt - 9 : yabai -m window --space 9
+shift + alt - 0 : yabai -m window --space 10
-shift + alt - n : \
- yabai -m window --resize bottom:0:20 ; \
- yabai -m window --resize top:0:20
+# change layout of desktop
+ctrl + alt - a : yabai -m space --layout bsp
+ctrl + alt - d : yabai -m space --layout float
-shift + alt - e : \
- yabai -m window --resize top:0:-20 ; \
- yabai -m window --resize bottom:0:-20
+# increase window size
+ctrl + alt - h : yabai -m window --resize left:-40:0
+ctrl + alt - n : yabai -m window --resize bottom:0:40
+ctrl + alt - e : yabai -m window --resize top:0:-40
+ctrl + alt - i : yabai -m window --resize right:40:0
-shift + alt - i : \
- yabai -m window --resize right:20:0 ; \
- yabai -m window --resize left:20:0
+# decrease window size
+ctrl + alt + cmd - h : yabai -m window --resize left:40:0
+ctrl + alt + cmd - n : yabai -m window --resize bottom:0:-40
+ctrl + alt + cmd - e : yabai -m window --resize top:0:40
+ctrl + alt + cmd - i : yabai -m window --resize right:-40:0
+# restart yabai
+ctrl + alt + cmd - r : launchctl kickstart -k "gui/${UID}/homebrew.mxcl.yabai"
+
+ctrl + alt + cmd - o : node ~/Projects/Personal/philips-hue-experiments/commands/turn-on.js --all
+ctrl + alt + cmd - f : node ~/Projects/Personal/philips-hue-experiments/commands/turn-off.js --all
diff --git a/platforms/mac/yabairc b/platforms/mac/yabairc
index a9d6b8d..5638ce4 100644
--- a/platforms/mac/yabairc
+++ b/platforms/mac/yabairc
@@ -1,7 +1,7 @@
#!/usr/bin/env sh
# $DOTFILES/platforms/mac/yabairc
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# TODO: Reorganize this file
#
diff --git a/platforms/mac/zshrc b/platforms/mac/zshrc
index bf3d429..43661fd 100644
--- a/platforms/mac/zshrc
+++ b/platforms/mac/zshrc
@@ -1,6 +1,6 @@
# $DOTFILES/platforms/mac/zshrc
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by user's zshrc if is macOS 在用户的 zshrc 中被引用,macOS 特定配置
# Entry point in $DOTFILES/tools/zsh/common.zshrc (入口点)
@@ -25,3 +25,4 @@ fi
unset __conda_setup
# <<< conda initialize <<<
+alias start-twm="source $DOTFILES/scripts/__twm_osx_start.zsh"
diff --git a/platforms/win/Microsoft.PowerShell_profile.ps1 b/platforms/win/Microsoft.PowerShell_profile.ps1
index 08a6cff..05b468a 100644
--- a/platforms/win/Microsoft.PowerShell_profile.ps1
+++ b/platforms/win/Microsoft.PowerShell_profile.ps1
@@ -1,6 +1,6 @@
# $DOTFILES/platforms\win\Microsoft.PowerShell_profile.ps1
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# PowerShell profile for Windows
### Load Configs ###
@@ -72,3 +72,5 @@ ${function:wini} = { winget install $args }
${function:winr} = { winget uninstall $args }
${function:wins} = { winget search $args }
${function:winu} = { winget upgrade $args }
+
+${function:killp} = {ps | ? ProcessName -like $args | kill -Force}
diff --git a/platforms/win/SumatraPDF-shortcuts.txt b/platforms/win/SumatraPDF-shortcuts.txt
new file mode 100644
index 0000000..e2b2a95
--- /dev/null
+++ b/platforms/win/SumatraPDF-shortcuts.txt
@@ -0,0 +1,90 @@
+Shortcuts [
+ [
+ Cmd = CmdToggleBookmark
+ Key = Ctrl + \\
+ ]
+ [
+ Cmd = CmdRenameFile
+ Key = R
+ ]
+ [
+ Cmd = CmdFindNext
+ Key = k
+ ]
+ [
+ Cmd = CmdFindPrev
+ Key = K
+ ]
+ [
+ Cmd = CmdScrollUp
+ Key = e
+ ]
+ [
+ Cmd = CmdScrollDown
+ Key = n
+ ]
+ [
+ Cmd = CmdScrollUpHalfPage
+ Key = E
+ ]
+ [
+ Cmd = CmdScrollDownHalfPage
+ Key = N
+ ]
+ [
+ Cmd = CmdScrollRight
+ Key = i
+ ]
+ [
+ Cmd = CmdInvertColors
+ Key = l
+ ]
+ [
+ Cmd = CmdPrevTab
+ Key = Shift+H
+ ]
+ [
+ Cmd = CmdNextTab
+ Key = Shift+I
+ ]
+ [
+ Cmd = CmdGoToFirstPage
+ Key = g
+ ]
+ [
+ Cmd = CmdGoToLastPage
+ Key = G
+ ]
+ [
+ Cmd = CmdGoToPage
+ Key = :
+ ]
+ [
+ Cmd = CmdRotateLeft
+ Key = {
+ ]
+ [
+ Cmd = CmdRotateRight
+ Key = }
+ ]
+ [
+ Cmd = CmdNavigateBack
+ Key = [
+ ]
+ [
+ Cmd = CmdNavigateForward
+ Key = ]
+ ]
+ [
+ Cmd = CmdNavigateBack
+ Key = b
+ ]
+ [
+ Cmd = CmdNavigateForward
+ Key = f
+ ]
+ [
+ Cmd = CmdHelpOpenKeyboardShortcuts
+ Key = ?
+ ]
+]
diff --git a/platforms/win/ahk/main.ahk b/platforms/win/ahk/main.ahk
index 519a77d..f02aa26 100644
--- a/platforms/win/ahk/main.ahk
+++ b/platforms/win/ahk/main.ahk
@@ -1,33 +1,142 @@
#Requires AutoHotkey v2.0
-; #b::
-; Run '"C:\Program Files\Zotero\zotero.exe"'
-; return
-
-; #f::
-; Run '"C:\Program Files\GPSoftware\Directory Opus\dopus.exe"'
-; return
-
-; #q::
-; Send '!{F4}'
-; return
-
-; #r::
-; Run '"C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.21.3231.0_x64__8wekyb3d8bbwe\wt.exe"'
-; return
-
#h::
-Send '{Left}'
-return
+{
+ Send("{Left}")
+}
#n::
-Send '{Down}'
-return
+{
+ Send("{Down}")
+}
#e::
-Send '{Up}'
-return
+{
+ Send("{Up}")
+}
#i::
-Send '{Right}'
-return
+{
+ Send("{Right}")
+}
+
+{
+ Send("{Home}")
+}
+#a:: ; Vim-like navigation: Append
+{
+ Send("{End}")
+}
+
+#q:: ; Simulate cmd+q in macOS
+{
+ Send("!{F4}")
+}
+
+; 定义一个全局状态变量,标记是否触发了组合键
+global CapsLockState := false
+
+; 当 CapsLock 作为修饰键与其他键一起使用时
+CapsLock & s:: {
+ global CapsLockState
+ CapsLockState := true
+ Run("ShareX.exe -RectangleRegion")
+}
+
+; 单独按下 CapsLock 时,发送 Esc
+CapsLock:: {
+ global CapsLockState
+ ; 如果之前未使用组合键,则发送 Esc
+ if not CapsLockState {
+ Send("{Esc}")
+ }
+ CapsLockState := false ; 重置状态
+}
+
+; 释放 CapsLock 时重置状态
+*CapsLock Up:: {
+ global CapsLockState
+ CapsLockState := false
+}
+
+#HotIf WinActive('ahk_exe' 'QQ.exe')
+^n::
+{
+ Send("^{Down}")
+}
+^h::
+{
+ Send("^{Left}")
+}
+^i::
+{
+ Send("^{Enter}")
+}
+^e::
+{
+ Send("^{Up}")
+}
+#HotIf WinActive('ahk_exe' 'Weixin.exe')
+^n::
+{
+ Send("{Down}")
+}
+^e::
+{
+ Send("{Up}")
+}
+#HotIf WinActive('ahk_exe' 'Discord.exe')
+^n::
+{
+ Send("^!{Down}")
+}
+^e::
+{
+ Send("^!{Up}")
+}
+
+#HotIf WinActive('ahk_exe' 'olk.exe')
+^n::
+{
+ Send("{Down}")
+}
+^+n::
+{
+ Send("^.")
+}
+^+e::
+{
+ Send("^,")
+}
+^e::
+{
+ Send("{Up}")
+}
+#HotIf WinActive('ahk_exe' 'SumatraPDF.exe')
+^\::
+{
+ Send("{F12}")
+}
+#HotIf WinActive('ahk_exe' 'Flow.Launcher.exe')
+^a::
+{
+ Send("{End}")
+}
+^+a::
+{
+ Send("^a")
+}
+^l::
+{
+ Send("{Home}")
+}
+^+BackSpace::
+{
+ Send("^a{Backspace}")
+}
+#HotIf WinActive('ahk_exe' 'Obsidian.exe')
+^e::
+{
+ Send("^p")
+}
+#HotIf
\ No newline at end of file
diff --git a/platforms/win/cmd/dark-mode.bat b/platforms/win/cmd/dark-mode.bat
index a8948ae..33acaff 100644
--- a/platforms/win/cmd/dark-mode.bat
+++ b/platforms/win/cmd/dark-mode.bat
@@ -6,8 +6,6 @@ for /f "usebackq tokens=2*" %%a in (`reg query %regPath% /v AppsUseLightTheme ^|
if "%currentMode%"=="0x1" (
reg add %regPath% /v AppsUseLightTheme /t REG_DWORD /d 0 /f >nul
- echo ���л�����ɫģʽ
) else (
reg add %regPath% /v AppsUseLightTheme /t REG_DWORD /d 1 /f >nul
- echo ���л���dzɫģʽ
)
diff --git a/platforms/win/wslconfig b/platforms/win/wslconfig
index bd68ee5..198fa62 100644
--- a/platforms/win/wslconfig
+++ b/platforms/win/wslconfig
@@ -1,6 +1,6 @@
# $DOTFILES\platforms\win\wslconfig
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# Config Files (mainly for networking) for WSL2 (Windows Subsystem for Linux 2)
# 适用于 Windows 的 Linux 子系统 2 的配置文件(主要用于网络)
@@ -12,6 +12,7 @@
# dnsTunneling=true
# firewall=true
# autoProxy=true
+guiApplications=true
[experimental]
# requires dnsTunneling but are also OPTIONAL
diff --git a/platforms/wsl/zshrc b/platforms/wsl/zshrc
index fdc7691..d052dd6 100644
--- a/platforms/wsl/zshrc
+++ b/platforms/wsl/zshrc
@@ -1,6 +1,6 @@
# $DOTFILES/platforms/wsl/zshrc
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by user's zshrc if is WSL 在用户的 zshrc 中被引用,WSL 特定配置
# Entry point in $DOTFILES/tools/zsh/common.zshrc (入口点)
diff --git a/readme.md b/readme.md
index ca9a7d6..a71c2e8 100644
--- a/readme.md
+++ b/readme.md
@@ -1,3 +1,17 @@
-# .dotfiles
+# dotfiles
-Moving to _Colemak_
+This repository contains dotfiles for multiple platforms, with _colemak_ as the default keyboard layout.
+
+## Structure
+
+```shell
+ .
+├── .editorconfig # Editor configuration, for LF/CRLF correction
+├── .gitattributes # Git attributes, for LF/CRLF correction
+├── bootstrap # Setup scripts for new machines
+├── common # Single-file configurations (lesskey, vimrc etc`)
+├── platforms # Platform-specific configurations
+├── readme.md # This file
+├── scripts # Scripts for various tasks
+└── tools # Multi-file configurations (shell, neovim etc)
+```
diff --git a/scripts/__twm_osx_start.zsh b/scripts/__twm_osx_start.zsh
new file mode 100644
index 0000000..d6a18e3
--- /dev/null
+++ b/scripts/__twm_osx_start.zsh
@@ -0,0 +1,3 @@
+yabai --start-service
+skhd --start-service
+brew services start sketchybar
diff --git a/scripts/__twm_osx_stop.zsh b/scripts/__twm_osx_stop.zsh
new file mode 100644
index 0000000..e0666d1
--- /dev/null
+++ b/scripts/__twm_osx_stop.zsh
@@ -0,0 +1,3 @@
+yabai --stop-service
+skhd --stop-service
+brew services stop sketchybar
diff --git a/scripts/update.zsh b/scripts/update.zsh
index b110e81..025ee96 100644
--- a/scripts/update.zsh
+++ b/scripts/update.zsh
@@ -39,3 +39,8 @@ fi
if command -v winget.exe > /dev/null; then
winget.exe upgrade
fi
+
+# macOS - Rime
+if [ $(uname) = "Darwin"]; then
+ bash ~/plum/rime-install
+fi
diff --git a/themes/alacritty-catppuccin-frappe.toml b/themes/alacritty-catppuccin-frappe.toml
new file mode 100644
index 0000000..3e6fac1
--- /dev/null
+++ b/themes/alacritty-catppuccin-frappe.toml
@@ -0,0 +1,65 @@
+[colors.primary]
+background = "#303446"
+foreground = "#c6d0f5"
+dim_foreground = "#838ba7"
+bright_foreground = "#c6d0f5"
+
+[colors.cursor]
+text = "#303446"
+cursor = "#f2d5cf"
+
+[colors.vi_mode_cursor]
+text = "#303446"
+cursor = "#babbf1"
+
+[colors.search.matches]
+foreground = "#303446"
+background = "#a5adce"
+
+[colors.search.focused_match]
+foreground = "#303446"
+background = "#a6d189"
+
+[colors.footer_bar]
+foreground = "#303446"
+background = "#a5adce"
+
+[colors.hints.start]
+foreground = "#303446"
+background = "#e5c890"
+
+[colors.hints.end]
+foreground = "#303446"
+background = "#a5adce"
+
+[colors.selection]
+text = "#303446"
+background = "#f2d5cf"
+
+[colors.normal]
+black = "#51576d"
+red = "#e78284"
+green = "#a6d189"
+yellow = "#e5c890"
+blue = "#8caaee"
+magenta = "#f4b8e4"
+cyan = "#81c8be"
+white = "#b5bfe2"
+
+[colors.bright]
+black = "#626880"
+red = "#e78284"
+green = "#a6d189"
+yellow = "#e5c890"
+blue = "#8caaee"
+magenta = "#f4b8e4"
+cyan = "#81c8be"
+white = "#a5adce"
+
+[[colors.indexed_colors]]
+index = 16
+color = "#ef9f76"
+
+[[colors.indexed_colors]]
+index = 17
+color = "#f2d5cf"
diff --git a/themes/flowlauncher-catppuccin-frappe.xaml b/themes/flowlauncher-catppuccin-frappe.xaml
new file mode 100644
index 0000000..392cc86
--- /dev/null
+++ b/themes/flowlauncher-catppuccin-frappe.xaml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #414559
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/browser/surfingkeys.js b/tools/browser/surfingkeys.js
index e3ec806..d778b0a 100644
--- a/tools/browser/surfingkeys.js
+++ b/tools/browser/surfingkeys.js
@@ -1,7 +1,9 @@
// Paste this into surfingkeys advanced settings
// or use:
-// Load settings from: https://raw.githubusercontent.com/js0ny/dotfiles/refs/heads/master/browser/surfingkeys.js
+// Load settings from: https://raw.githubusercontent.com/js0ny/dotfiles/refs/heads/master/tools/browser/surfingkeys.js
+// TODO: Visual Mode
+// #region Example
/** Examples
// an example to create a new mapping `ctrl-y`
@@ -17,81 +19,110 @@ api.map('gt', 'T');
api.unmap('');
*/
+// #endregion
// Settings
-settings.language = "zh-CN" ;
+settings.language = "zh-CN";
settings.showModeStatus = false;
// Keymap, reference https://github.com/texiwustion/colemak_config_for_surfingkeys/tree/main
+// #region Helper
const forward = {
- add: function (key) { // 转发即将被 unmap 的键
- return api.map(`for${key}`, key)
- },
- cancel: function (key) { // 删除转发生成的键
- api.unmap(`for${key}`)
- api.unmap(key)
- },
- use: function (key) {
- return `for${key}`
- }
+ add: function (key) { // 转发即将被 unmap 的键
+ return api.map(`for${key}`, key)
+ },
+ cancel: function (key) { // 删除转发生成的键
+ api.unmap(`for${key}`)
+ api.unmap(key)
+ },
+ use: function (key) {
+ return `for${key}`
+ }
}
const colemak = {
- forward: function (key) { // 转发即将被 unmap 的键
- api.map(key, `col${key}`)
- api.unmap(`col${key}`)
-
- },
- use: function (key) {
- return `col${key}`
- },
- map: function (a, b) {
- api.map(colemak.use(a), forward.use(b))
- }
+ forward: function (key) { // 转发即将被 unmap 的键
+ api.map(key, `col${key}`)
+ api.unmap(`col${key}`)
+
+ },
+ use: function (key) {
+ return `col${key}`
+ },
+ map: function (a, b) {
+ api.map(colemak.use(a), forward.use(b))
+ }
}
const forwardFactory = {
- push: function (mapLists) { // forward original keys
- for (let key in mapLists) {
- forward.add(mapLists[key])
- }
- },
- map: function (mapLists) {
- for (let key in mapLists) {
- colemak.map(key, mapLists[key])
+ push: function (mapLists) { // forward original keys
+ for (let key in mapLists) {
+ forward.add(mapLists[key])
}
- },
- pull: function (mapLists) {
- for (let key in mapLists) {
- forward.cancel(mapLists[key])
- }
- for (let key in mapLists) {
- colemak.forward(key)
- }
+ },
+ map: function (mapLists) {
+ for (let key in mapLists) {
+ colemak.map(key, mapLists[key])
}
+ },
+ pull: function (mapLists) {
+ for (let key in mapLists) {
+ forward.cancel(mapLists[key])
+ }
+ for (let key in mapLists) {
+ colemak.forward(key)
+ }
+ }
+}
+// #endregion
+// #region Keymap
+const mapLists = {
+ /// scroll page
+ // Arrow
+ 'n': 'j',
+ 'e': 'k',
+ 'i': 'l',
+ // l <-> i
+ 'l': 'i',
+ 'L': 'I',
+ // k <-> n
+ 'k': 'n',
+ 'K': 'N',
+ // j <-> e
+ 'j': 'e',
+ // PrevTab < H - I > NextTab
+ 'H': 'E',
+ 'I': 'R',
+ // E,N -> Up/Down HalfPage
+ 'N': 'd',
+ 'E': 'e',
+ // F -> Open Link in New Tab
+ 'F': 'af',
+ // oH -> Tab History
+ 'oH': 'H',
+ // gh/gi -> Prev/Next History
+ 'gh': 'S',
+ 'gi': 'D',
+ // t -> Open Link in New Tab
+ 't': 'gf',
+ // 缩放
+ 'zu': 'zi',
+ 'zo': 'ze',
+ 'zz': 'zr',
}
-const mapLists = {
- /// scroll page
- // Arrow
- 'n': 'j',
- 'e': 'k',
- 'i': 'l',
- // l <-> i
- 'l': 'i',
- 'L': 'I',
- // k <-> n
- 'k': 'n',
- 'K': 'N',
- // j <-> e
- 'j': 'e',
- 'J': 'E',
- // 缩放
- 'zu': 'zi',
- 'zo': 'ze',
- 'zz': 'zr',
+const vmapLists = {
+ 'n': 'j',
+ 'N': 'J',
+ 'e': 'k',
+ 'E': 'K',
+ 'i': 'l',
+ 'I': 'L',
+ 'j': 'e',
+ 'J': 'E',
+ 'k': 'n',
+ 'K': 'N',
}
forwardFactory.push(mapLists)
-api.unmap('t')
forwardFactory.map(mapLists)
// 鼠标点击
api.unmap('gi')
@@ -101,260 +132,297 @@ api.unmap(';m')
api.unmap(';fs')
api.unmap('O')
api.unmap('C')
+api.map('g/', 'gU') // Goto Root Domain
forwardFactory.pull(mapLists)
+// #endregion
-// Search Alias
-api.addSearchAlias('f', 'Felo', 'https://felo.ai/search?q=', 's', 'https://duckduckgo.com/ac/?q=', function(response) {
- var res = JSON.parse(response.text);
- return res.map(function(r){
- return r.phrase;
- });
+// #region Search Alias
+api.addSearchAlias('f', 'Felo', 'https://felo.ai/search?q=', 's', 'https://duckduckgo.com/ac/?q=', function (response) {
+ var res = JSON.parse(response.text);
+ return res.map(function (r) {
+ return r.phrase;
+ });
});
-api.addSearchAlias('p', 'Perplexity', 'https://www.perplexity.ai/?q=', 's', 'https://duckduckgo.com/ac/?q=', function(response) {
- var res = JSON.parse(response.text);
- return res.map(function(r){
- return r.phrase;
- });
+api.addSearchAlias('p', 'Perplexity', 'https://www.perplexity.ai/?q=', 's', 'https://duckduckgo.com/ac/?q=', function (response) {
+ var res = JSON.parse(response.text);
+ return res.map(function (r) {
+ return r.phrase;
+ });
});
-api.addSearchAlias('r', 'Raindrop', 'https://app.raindrop.io/my/0/', 's', 'https://duckduckgo.com/ac/?q=', function(response) {
- var res = JSON.parse(response.text);
- return res.map(function(r){
- return r.phrase;
- });
+api.addSearchAlias('r', 'Raindrop', 'https://app.raindrop.io/my/0/', 's', 'https://duckduckgo.com/ac/?q=', function (response) {
+ var res = JSON.parse(response.text);
+ return res.map(function (r) {
+ return r.phrase;
+ });
});
+api.addSearchAlias('c', 'ChatGPT', 'https://chatgpt.com/?q=', 's', 'https://duckduckgo.com/ac/?q=', function (response) {
+ var res = JSON.parse(response.text);
+ return res.map(function (r) {
+ return r.phrase;
+ });
+});
+// #endregion
+// #region Site-specific
-// Theme, reference to https://github.com/Foldex/surfingkeys-config
-api.Hints.style('border: solid 2px #4C566A; color:#A3BE8C; background: initial; background-color: #3B4252;');
-api.Hints.style("border: solid 2px #4C566A !important; padding: 1px !important; color: #E5E9F0 !important; background: #3B4252 !important;", "text");
-api.Visual.style('marks', 'background-color: #A3BE8C99;');
-api.Visual.style('cursor', 'background-color: #88C0D0;');
-settings.theme = `
-fg: #E5E9F0;
-bg: #3B4252;
-bg-dark: #2E3440;
-border: #4C566A;
-main-fg: #88C0D0;
-accent-fg: #A3BE8C;
-info-fg: #5E81AC;
-select: #4C566A;
-/* ---------- Generic ---------- */
-.sk_theme {
-background: var(--bg);
-color: var(--fg);
- background-color: var(--bg);
- border-color: var(--border);
- font-family: var(--font);
- font-size: var(--font-size);
- font-weight: var(--font-weight);
-}
+// chatgpt.com
+api.unmap('t', /chatgpt.com/);
+api.mapkey('tn', 'New Chat', function () {
+ var btn = document.querySelector('div.no-draggable:nth-child(3) > span:nth-child(1) > button:nth-child(1)')
+ btn.click();
+}, { domain: /chatgpt.com/ });
+api.mapkey('ts', 'Start/Stop Generating', function () {
+ var btn = document.querySelector('button.h-8:nth-child(2)');
+ btn.click();
+}, { domain: /chatgpt.com/ });
+api.mapkey('ts', 'Start/Stop Generating', function () {
+ var btn = document.querySelector('button.h-8:nth-child(2)');
+ btn.click();
+}, { domain: /chatgpt.com/ });
+api.mapkey('S', 'Start/Stop Generating', function () {
+ var btn = document.querySelector('button.h-8:nth-child(2)');
+ btn.click();
+}, { domain: /chatgpt.com/ });
+//api.mapkey('tm', 'Toggle Model', function () {
+// var btn = document.querySelector('#radix -\: r2i\:');
+// btn.click();
+//}, { domain: /chatgpt.com/ });
-input {
- font-family: var(--font);
- font-weight: var(--font-weight);
-}
+// #endregion
-.sk_theme tbody {
- color: var(--fg);
-}
+// #region Theme
+// reference to https://github.com/Foldex/surfingkeys-config
+// api.Hints.style('border: solid 2px #4C566A; color:#A3BE8C; background: initial; background-color: #3B4252;');
+// api.Hints.style("border: solid 2px #4C566A !important; padding: 1px !important; color: #E5E9F0 !important; background: #3B4252 !important;", "text");
+// api.Visual.style('marks', 'background-color: #A3BE8C99;');
+// api.Visual.style('cursor', 'background-color: #88C0D0;');
+// settings.theme = `
+// fg: #E5E9F0;
+// bg: #3B4252;
+// bg-dark: #2E3440;
+// border: #4C566A;
+// main-fg: #88C0D0;
+// accent-fg: #A3BE8C;
+// info-fg: #5E81AC;
+// select: #4C566A;
+// /* ---------- Generic ---------- */
+// .sk_theme {
+// background: var(--bg);
+// color: var(--fg);
+// background-color: var(--bg);
+// border-color: var(--border);
+// font-family: var(--font);
+// font-size: var(--font-size);
+// font-weight: var(--font-weight);
+// }
-.sk_theme input {
- color: var(--fg);
-}
+// input {
+// font-family: var(--font);
+// font-weight: var(--font-weight);
+// }
-/* Hints */
-#sk_hints .begin {
- color: var(--accent-fg) !important;
-}
+// .sk_theme tbody {
+// color: var(--fg);
+// }
-#sk_tabs .sk_tab {
- background: var(--bg-dark);
- border: 1px solid var(--border);
-}
+// .sk_theme input {
+// color: var(--fg);
+// }
-#sk_tabs .sk_tab_title {
- color: var(--fg);
-}
+// /* Hints */
+// #sk_hints .begin {
+// color: var(--accent-fg) !important;
+// }
-#sk_tabs .sk_tab_url {
- color: var(--main-fg);
-}
+// #sk_tabs .sk_tab {
+// background: var(--bg-dark);
+// border: 1px solid var(--border);
+// }
-#sk_tabs .sk_tab_hint {
- background: var(--bg);
- border: 1px solid var(--border);
- color: var(--accent-fg);
-}
+// #sk_tabs .sk_tab_title {
+// color: var(--fg);
+// }
-.sk_theme #sk_frame {
- background: var(--bg);
- opacity: 0.2;
- color: var(--accent-fg);
-}
+// #sk_tabs .sk_tab_url {
+// color: var(--main-fg);
+// }
-/* ---------- Omnibar ---------- */
-/* Uncomment this and use settings.omnibarPosition = 'bottom' for Pentadactyl/Tridactyl style bottom bar */
-/* .sk_theme#sk_omnibar {
- width: 100%;
- left: 0;
-} */
+// #sk_tabs .sk_tab_hint {
+// background: var(--bg);
+// border: 1px solid var(--border);
+// color: var(--accent-fg);
+// }
-.sk_theme .title {
- color: var(--accent-fg);
-}
+// .sk_theme #sk_frame {
+// background: var(--bg);
+// opacity: 0.2;
+// color: var(--accent-fg);
+// }
-.sk_theme .url {
- color: var(--main-fg);
-}
+// /* ---------- Omnibar ---------- */
+// /* Uncomment this and use settings.omnibarPosition = 'bottom' for Pentadactyl/Tridactyl style bottom bar */
+// /* .sk_theme#sk_omnibar {
+// width: 100%;
+// left: 0;
+// } */
-.sk_theme .annotation {
- color: var(--accent-fg);
-}
+// .sk_theme .title {
+// color: var(--accent-fg);
+// }
-.sk_theme .omnibar_highlight {
- color: var(--accent-fg);
-}
+// .sk_theme .url {
+// color: var(--main-fg);
+// }
-.sk_theme .omnibar_timestamp {
- color: var(--info-fg);
-}
+// .sk_theme .annotation {
+// color: var(--accent-fg);
+// }
-.sk_theme .omnibar_visitcount {
- color: var(--accent-fg);
-}
+// .sk_theme .omnibar_highlight {
+// color: var(--accent-fg);
+// }
-.sk_theme #sk_omnibarSearchResult ul li:nth-child(odd) {
- background: var(--bg-dark);
-}
+// .sk_theme .omnibar_timestamp {
+// color: var(--info-fg);
+// }
-.sk_theme #sk_omnibarSearchResult ul li.focused {
- background: var(--border);
-}
+// .sk_theme .omnibar_visitcount {
+// color: var(--accent-fg);
+// }
-.sk_theme #sk_omnibarSearchArea {
- border-top-color: var(--border);
- border-bottom-color: var(--border);
-}
+// .sk_theme #sk_omnibarSearchResult ul li:nth-child(odd) {
+// background: var(--bg-dark);
+// }
-.sk_theme #sk_omnibarSearchArea input,
-.sk_theme #sk_omnibarSearchArea span {
- font-size: var(--font-size);
-}
+// .sk_theme #sk_omnibarSearchResult ul li.focused {
+// background: var(--border);
+// }
-.sk_theme .separator {
- color: var(--accent-fg);
-}
+// .sk_theme #sk_omnibarSearchArea {
+// border-top-color: var(--border);
+// border-bottom-color: var(--border);
+// }
-/* ---------- Popup Notification Banner ---------- */
-#sk_banner {
- font-family: var(--font);
- font-size: var(--font-size);
- font-weight: var(--font-weight);
- background: var(--bg);
- border-color: var(--border);
- color: var(--fg);
- opacity: 0.9;
-}
+// .sk_theme #sk_omnibarSearchArea input,
+// .sk_theme #sk_omnibarSearchArea span {
+// font-size: var(--font-size);
+// }
-/* ---------- Popup Keys ---------- */
-#sk_keystroke {
- background-color: var(--bg);
-}
+// .sk_theme .separator {
+// color: var(--accent-fg);
+// }
-.sk_theme kbd .candidates {
- color: var(--info-fg);
-}
+// /* ---------- Popup Notification Banner ---------- */
+// #sk_banner {
+// font-family: var(--font);
+// font-size: var(--font-size);
+// font-weight: var(--font-weight);
+// background: var(--bg);
+// border-color: var(--border);
+// color: var(--fg);
+// opacity: 0.9;
+// }
-.sk_theme span.annotation {
- color: var(--accent-fg);
-}
+// /* ---------- Popup Keys ---------- */
+// #sk_keystroke {
+// background-color: var(--bg);
+// }
-/* ---------- Popup Translation Bubble ---------- */
-#sk_bubble {
- background-color: var(--bg) !important;
- color: var(--fg) !important;
- border-color: var(--border) !important;
-}
+// .sk_theme kbd .candidates {
+// color: var(--info-fg);
+// }
-#sk_bubble * {
- color: var(--fg) !important;
-}
+// .sk_theme span.annotation {
+// color: var(--accent-fg);
+// }
-#sk_bubble div.sk_arrow div:nth-of-type(1) {
- border-top-color: var(--border) !important;
- border-bottom-color: var(--border) !important;
-}
+// /* ---------- Popup Translation Bubble ---------- */
+// #sk_bubble {
+// background-color: var(--bg) !important;
+// color: var(--fg) !important;
+// border-color: var(--border) !important;
+// }
-#sk_bubble div.sk_arrow div:nth-of-type(2) {
- border-top-color: var(--bg) !important;
- border-bottom-color: var(--bg) !important;
-}
+// #sk_bubble * {
+// color: var(--fg) !important;
+// }
-/* ---------- Search ---------- */
-#sk_status,
-#sk_find {
- font-size: var(--font-size);
- border-color: var(--border);
-}
+// #sk_bubble div.sk_arrow div:nth-of-type(1) {
+// border-top-color: var(--border) !important;
+// border-bottom-color: var(--border) !important;
+// }
-.sk_theme kbd {
- background: var(--bg-dark);
- border-color: var(--border);
- box-shadow: none;
- color: var(--fg);
-}
+// #sk_bubble div.sk_arrow div:nth-of-type(2) {
+// border-top-color: var(--bg) !important;
+// border-bottom-color: var(--bg) !important;
+// }
-.sk_theme .feature_name span {
- color: var(--main-fg);
-}
+// /* ---------- Search ---------- */
+// #sk_status,
+// #sk_find {
+// font-size: var(--font-size);
+// border-color: var(--border);
+// }
-/* ---------- ACE Editor ---------- */
-#sk_editor {
- background: var(--bg-dark) !important;
- height: 50% !important;
- /* Remove this to restore the default editor size */
-}
+// .sk_theme kbd {
+// background: var(--bg-dark);
+// border-color: var(--border);
+// box-shadow: none;
+// color: var(--fg);
+// }
-.ace_dialog-bottom {
- border-top: 1px solid var(--bg) !important;
-}
+// .sk_theme .feature_name span {
+// color: var(--main-fg);
+// }
-.ace-chrome .ace_print-margin,
-.ace_gutter,
-.ace_gutter-cell,
-.ace_dialog {
- background: var(--bg) !important;
-}
+// /* ---------- ACE Editor ---------- */
+// #sk_editor {
+// background: var(--bg-dark) !important;
+// height: 50% !important;
+// /* Remove this to restore the default editor size */
+// }
-.ace-chrome {
- color: var(--fg) !important;
-}
+// .ace_dialog-bottom {
+// border-top: 1px solid var(--bg) !important;
+// }
-.ace_gutter,
-.ace_dialog {
- color: var(--fg) !important;
-}
+// .ace-chrome .ace_print-margin,
+// .ace_gutter,
+// .ace_gutter-cell,
+// .ace_dialog {
+// background: var(--bg) !important;
+// }
-.ace_cursor {
- color: var(--fg) !important;
-}
+// .ace-chrome {
+// color: var(--fg) !important;
+// }
-.normal-mode .ace_cursor {
- background-color: var(--fg) !important;
- border: var(--fg) !important;
- opacity: 0.7 !important;
-}
+// .ace_gutter,
+// .ace_dialog {
+// color: var(--fg) !important;
+// }
-.ace_marker-layer .ace_selection {
- background: var(--select) !important;
-}
+// .ace_cursor {
+// color: var(--fg) !important;
+// }
-.ace_editor,
-.ace_dialog span,
-.ace_dialog input {
- font-family: var(--font);
- font-size: var(--font-size);
- font-weight: var(--font-weight);
-}`;
-// click `Save` button to make above settings to take effect.
\ No newline at end of file
+// .normal-mode .ace_cursor {
+// background-color: var(--fg) !important;
+// border: var(--fg) !important;
+// opacity: 0.7 !important;
+// }
+
+// .ace_marker-layer .ace_selection {
+// background: var(--select) !important;
+// }
+
+// .ace_editor,
+// .ace_dialog span,
+// .ace_dialog input {
+// font-family: var(--font);
+// font-size: var(--font-size);
+// font-weight: var(--font-weight);
+// }`;
+// click `Save` button to make above settings to take effect.
+// #endregion
diff --git a/tools/fish/.gitignore b/tools/fish/.gitignore
new file mode 100644
index 0000000..6da387b
--- /dev/null
+++ b/tools/fish/.gitignore
@@ -0,0 +1,2 @@
+fish_variables
+completions
diff --git a/tools/fish/conf.d/0init.fish b/tools/fish/conf.d/0init.fish
new file mode 100644
index 0000000..23f2e3f
--- /dev/null
+++ b/tools/fish/conf.d/0init.fish
@@ -0,0 +1,137 @@
+# $DOTFILES/tools/fish/conf.d/0init.fish
+# Date: 2024-12-19
+# Author: js0ny
+# By dictionary order, this file is sourced first in fish shell
+# Define user-specific environment variables for fish
+
+# Location:
+# ~/.config/fish/conf.d/0init.fish (default location)
+# Linking: Link the whole directory for submodules
+# ln -sf $DOTFILES/tools/fish ~/.config/fish
+
+
+set -gx DOTFILES $HOME/.dotfiles
+# XDG Base Directory Specification
+set -gx XDG_CONFIG_HOME (set -q XDG_CONFIG_HOME; and echo $XDG_CONFIG_HOME; or echo $HOME/.config)
+set -gx XDG_DATA_HOME (set -q XDG_DATA_HOME; and echo $XDG_DATA_HOME; or echo $HOME/.local/share)
+set -gx XDG_STATE_HOME (set -q XDG_STATE_HOME; and echo $XDG_STATE_HOME; or echo $HOME/.local/state)
+set -gx XDG_CACHE_HOME (set -q XDG_CACHE_HOME; and echo $XDG_CACHE_HOME; or echo $HOME/.cache)
+set -gx XDG_RUNTIME_DIR /run/user/(id -u)
+
+set -gx PAGER "less -R"
+set -gx EDITOR nvim
+set -gx VISUAL nvim
+
+# Minimal PATH for early commands
+set -gx PATH /usr/local/bin /usr/bin /bin /usr/sbin /sbin ~/.local/bin $PATH
+
+if test -d /opt/homebrew/bin # macOS
+ set -gx PATH /opt/homebrew/bin $PATH
+else if test -d /home/linuxbrew/.linuxbrew/bin # Linux
+ set -gx PATH /home/linuxbrew/.linuxbrew/bin $PATH
+end
+
+
+# Azure CLI
+if command -v az > /dev/null
+ set -gx AZURE_CONFIG_DIR $XDG_DATA_HOME/azure
+end
+# Bun JS
+if command -v bun > /dev/null
+ set -gx BUN_INSTALL "$XDG_DATA_HOME/bun"
+ set -gx PATH $BUN_INSTALL/bin $PATH
+end
+# Rust Cargo
+if command -v cargo > /dev/null
+ set -gx CARGO_HOME $XDG_DATA_HOME/cargo
+ set -gx PATH $CARGO_HOME/bin $PATH
+end
+# CGDB
+if command -v cgdb > /dev/null
+ set -gx CGDB_DIR $XDG_CONFIG_HOME/cgdb
+end
+# .NET
+if command -v dotnet > /dev/null
+ set -gx DOTNET_CLI_HOME $XDG_DATA_HOME/dotnet
+ set -gx PATH $DOTNET_CLI_HOME/.dotnet/tools $PATH
+end
+# Docker
+if command -v docker > /dev/null
+ set -gx DOCKER_CONFIG $XDG_CONFIG_HOME/docker
+end
+# GnuPG
+if command -v gpg > /dev/null
+ set -gx GNUPGHOME $XDG_DATA_HOME/gnupg
+end
+# Go
+if command -v go > /dev/null
+ set -gx GOPATH $XDG_DATA_HOME/go
+ set PATH $GOPATH/bin $PATH
+end
+# Julia
+if command -v julia > /dev/null
+ set -gx JULIA_DEPOT_PATH $XDG_DATA_HOME/julia
+end
+# Node.js
+if command -v node > /dev/null
+ set -gx NODE_REPL_HISTORY $XDG_STATE_HOME/node/repl_history
+ set -gx TS_NODE_REPL_HISTORY $XDG_STATE_HOME/node/ts_repl_history
+ set -gx NPM_CONFIG_USERCONFIG $XDG_CONFIG_HOME/npm/npmrc
+ set -gx NPM_CONFIG_INIT_MODULE $XDG_CONFIG_HOME/npm/config/npm-init.js
+ set -gx NPM_CONFIG_CACHE $XDG_CACHE_HOME/npm
+ set -gx NPM_CONFIG_TMP $XDG_RUNTIME_DIR/npm
+end
+# Parallel
+if command -v parallel > /dev/null
+ set -gx PARALLEL_CONFIG $XDG_CONFIG_HOME/parallel
+end
+# Python
+# Works only with Python 3.13.0a3 and later
+if command -v python3 > /dev/null
+ set -gx PYTHON_HISTORY $XDG_DATA_HOME/python/history
+end
+# GNU Screen
+if command -v screen > /dev/null
+ set -gx SCREENRC $XDG_CONFIG_HOME/screen/screenrc
+ set -gx SCREENDIR $XDG_RUNTIME_DIR/screen
+end
+# Ruby Gem
+if command -v gem > /dev/null
+ for dir in $HOME/.local/share/gem/ruby/*/bin
+ if test -d $dir
+ set -gx PATH $dir $PATH
+ end
+ end
+end
+# Spacemacs
+if command -v emacs > /dev/null
+ set -gx SPACEMACSDIR $XDG_CONFIG_HOME/spacemacs
+end
+# tldr
+if command -v tldr > /dev/null
+ set -gx TLDR_CACHE_DIR $XDG_CACHE_HOME/tldr
+end
+# W3M
+if command -v w3m > /dev/null
+ set -gx W3M_DIR $XDG_DATA_HOME/w3m
+end
+# Wakatime
+if command -v wakatime > /dev/null
+ set -gx WAKATIME_HOME $XDG_CONFIG_HOME/wakatime
+end
+# Wget
+if command -v wget > /dev/null
+ alias wget="wget --hsts-file=$XDG_CACHE_HOME/wget-hsts"
+end
+# z
+if command -v z > /dev/null
+ set -gx _Z_DATA $XDG_DATA_HOME/z
+end
+if command -v tldr > /dev/null
+ set -gx TLDR_CACHE_DIR $XDG_CACHE_HOME/tldr
+end
+if status is-interactive
+ if command -v ipython > /dev/null
+ set IPYTHONDIR $XDG_CONFIG_HOME/ipython
+ end
+end
diff --git a/tools/fish/conf.d/alias.fish b/tools/fish/conf.d/alias.fish
new file mode 100644
index 0000000..47c417a
--- /dev/null
+++ b/tools/fish/conf.d/alias.fish
@@ -0,0 +1,55 @@
+
+
+# Powershell equivalent
+abbr --add ni touch
+abbr --add cls clear
+abbr --add ii open
+
+# Editors #
+abbr --add v nvim
+abbr --add c code
+alias sv="sudo vim -u ~/.config/vim/vimrc"
+alias sn="sudo nvim -u ~/.config/nvim/init.lua"
+
+# Dev #
+abbr --add py python3
+abbr --add ipy ipython
+abbr --add reload "source $__fish_config_dir/config.fish"
+abbr --add pulldots "cd $DOTFILES && git pull"
+
+# lsd - modern ls
+if command -v lsd > /dev/null
+ alias ls='lsd -A -I .DS_Store -I .git -I .gitkeep'
+ abbr --add l 'lsd -lah'
+ abbr --add ll 'lsd -l'
+ abbr --add tree 'ls --tree'
+else
+ abbr --add l 'ls -lah'
+ abbr --add ll 'ls -l'
+end
+
+# Functions #
+function mkcd
+ mkdir -p $argv[1] && cd $argv[1]
+end
+function cdls
+ cd $argv[1] && ls
+end
+function tc
+ touch $argv[1] && code $argv[1]
+end
+function tv
+ touch $argv[1] && nvim $argv[1]
+end
+
+# Use neovide as gVim
+if command -v neovide > /dev/null
+ abbr --add gvi "neovide"
+end
+
+if command -v brew > /dev/null
+ abbr --add brewi "brew install"
+ abbr --add brewu "brew upgrade && brew update"
+ abbr --add brewr "brew remove"
+ abbr --add brewc "brew cleanup"
+end
diff --git a/tools/fish/conf.d/keymap.fish b/tools/fish/conf.d/keymap.fish
new file mode 100644
index 0000000..a6526cb
--- /dev/null
+++ b/tools/fish/conf.d/keymap.fish
@@ -0,0 +1,16 @@
+fish_vi_key_bindings
+
+# Colemak hnei
+# ^
+# n
+# < h i >
+# e
+# v
+# bind -M default 'h' backward-char
+bind -M default 'n' down-or-search
+bind -M default 'e' up-or-search
+bind -M default 'i' forward-char
+
+# Similar position to [i] in QWERTY
+bind -M default -m insert l repaint-mode
+bind -M default -m insert L beginning-of-line repaint-mode
diff --git a/tools/fish/conf.d/navi.fish b/tools/fish/conf.d/navi.fish
new file mode 100644
index 0000000..2f8f6b1
--- /dev/null
+++ b/tools/fish/conf.d/navi.fish
@@ -0,0 +1,13 @@
+
+
+alias ..="cd .."
+alias ...="cd ../.."
+alias ....="cd ../../.."
+alias .....="cd ../../../.."
+alias ......="cd ../../../../.."
+
+abbr --add \- 'cd -'
+
+if command -v zoxide > /dev/null
+ zoxide init fish | source
+end
diff --git a/tools/fish/conf.d/prompt.fish b/tools/fish/conf.d/prompt.fish
new file mode 100644
index 0000000..bde5d56
--- /dev/null
+++ b/tools/fish/conf.d/prompt.fish
@@ -0,0 +1,5 @@
+
+if command -v starship > /dev/null
+ set -gx STARSHIP_CONFIG $DOTFILES/tools/starship/starship_fish.toml
+ starship init fish | source
+end
diff --git a/tools/fish/config.fish b/tools/fish/config.fish
new file mode 100644
index 0000000..f6ecdf0
--- /dev/null
+++ b/tools/fish/config.fish
@@ -0,0 +1,23 @@
+# $DOTFILES/tools/fish/config.fish
+# Date: 2024-12-15
+# Author: js0ny
+# Define interactive shell configurations for fish
+
+# Location:
+# ~/.config/fish/config.fish (default location)
+# Linking: Link the whole directory for submodules
+# ln -sf $DOTFILES/tools/fish ~/.config/fish
+
+if status is-interactive
+ # Commands to run in interactive sessions can go here
+ switch (uname)
+ case "Darwin"
+ # macOS Specific
+ abbr --add clip pbcopy
+ abbr --add paste pbpaste
+ case "Linux"
+ # Linux Specific
+ case '*'
+ # Default / Fallback case
+ end
+end
diff --git a/tools/fish/readme.md b/tools/fish/readme.md
new file mode 100644
index 0000000..515bdd8
--- /dev/null
+++ b/tools/fish/readme.md
@@ -0,0 +1,29 @@
+
+
+
+
+## `type -q` vs `command -v`
+
+```shell
+ > time for i in (seq 1 10000)
+ type -q vim
+ end
+
+ time for i in (seq 1 10000)
+ command -v vim >/dev/null
+ end
+
+
+________________________________________________________
+Executed in 545.79 millis fish external
+ usr time 177.62 millis 174.28 millis 3.34 millis
+ sys time 367.72 millis 366.16 millis 1.56 millis
+
+
+________________________________________________________
+Executed in 292.97 millis fish external
+ usr time 71.23 millis 69.31 millis 1.93 millis
+ sys time 215.22 millis 214.78 millis 0.44 millis
+```
+
+`command -v` is faster
diff --git a/tools/kitty/kitty.conf b/tools/kitty/kitty.conf
new file mode 100644
index 0000000..bb2578e
--- /dev/null
+++ b/tools/kitty/kitty.conf
@@ -0,0 +1,2705 @@
+# vim:fileencoding=utf-8:foldmethod=marker
+
+#: Fonts {{{
+
+# BEGIN_KITTY_FONTS
+font_family family="CaskaydiaCove Nerd Font Mono"
+bold_font auto
+italic_font auto
+bold_italic_font auto
+# END_KITTY_FONTS
+
+#: kitty does not support BIDI (bidirectional text), however, for RTL
+#: scripts, words are automatically displayed in RTL. That is to say,
+#: in an RTL script, the words "HELLO WORLD" display in kitty as
+#: "WORLD HELLO", and if you try to select a substring of an RTL-
+#: shaped string, you will get the character that would be there had
+#: the string been LTR. For example, assuming the Hebrew word ירושלים,
+#: selecting the character that on the screen appears to be ם actually
+#: writes into the selection buffer the character י. kitty's default
+#: behavior is useful in conjunction with a filter to reverse the word
+#: order, however, if you wish to manipulate RTL glyphs, it can be
+#: very challenging to work with, so this option is provided to turn
+#: it off. Furthermore, this option can be used with the command line
+#: program GNU FriBidi
+#: to get BIDI support, because it will force kitty to always treat
+#: the text as LTR, which FriBidi expects for terminals.
+
+# symbol_map
+
+#: E.g. symbol_map U+E0A0-U+E0A3,U+E0C0-U+E0C7 PowerlineSymbols
+
+#: Map the specified Unicode codepoints to a particular font. Useful
+#: if you need special rendering for some symbols, such as for
+#: Powerline. Avoids the need for patched fonts. Each Unicode code
+#: point is specified in the form `U+`. You
+#: can specify multiple code points, separated by commas and ranges
+#: separated by hyphens. This option can be specified multiple times.
+#: The syntax is::
+
+#: symbol_map codepoints Font Family Name
+
+# narrow_symbols
+
+#: E.g. narrow_symbols U+E0A0-U+E0A3,U+E0C0-U+E0C7 1
+
+#: Usually, for Private Use Unicode characters and some symbol/dingbat
+#: characters, if the character is followed by one or more spaces,
+#: kitty will use those extra cells to render the character larger, if
+#: the character in the font has a wide aspect ratio. Using this
+#: option you can force kitty to restrict the specified code points to
+#: render in the specified number of cells (defaulting to one cell).
+#: This option can be specified multiple times. The syntax is::
+
+#: narrow_symbols codepoints [optionally the number of cells]
+
+disable_ligatures never
+
+#: Choose how you want to handle multi-character ligatures. The
+#: default is to always render them. You can tell kitty to not render
+#: them when the cursor is over them by using cursor to make editing
+#: easier, or have kitty never render them at all by using always, if
+#: you don't like them. The ligature strategy can be set per-window
+#: either using the kitty remote control facility or by defining
+#: shortcuts for it in kitty.conf, for example::
+
+#: map alt+1 disable_ligatures_in active always
+#: map alt+2 disable_ligatures_in all never
+#: map alt+3 disable_ligatures_in tab cursor
+
+#: Note that this refers to programming ligatures, typically
+#: implemented using the calt OpenType feature. For disabling general
+#: ligatures, use the font_features option.
+
+# font_features
+
+#: E.g. font_features none
+
+#: Choose exactly which OpenType features to enable or disable. Note
+#: that for the main fonts, features can be specified when selecting
+#: the font using the choose-fonts kitten. This setting is useful for
+#: fallback fonts.
+
+#: Some fonts might have features worthwhile in a terminal. For
+#: example, Fira Code includes a discretionary feature, zero, which in
+#: that font changes the appearance of the zero (0), to make it more
+#: easily distinguishable from Ø. Fira Code also includes other
+#: discretionary features known as Stylistic Sets which have the tags
+#: ss01 through ss20.
+
+#: For the exact syntax to use for individual features, see the
+#: HarfBuzz documentation .
+
+#: Note that this code is indexed by PostScript name, and not the font
+#: family. This allows you to define very precise feature settings;
+#: e.g. you can disable a feature in the italic font but not in the
+#: regular font.
+
+#: On Linux, font features are first read from the FontConfig database
+#: and then this option is applied, so they can be configured in a
+#: single, central place.
+
+#: To get the PostScript name for a font, use the `fc-scan file.ttf`
+#: command on Linux or the `Font Book tool on macOS
+#: `__.
+
+#: Enable alternate zero and oldstyle numerals::
+
+#: font_features FiraCode-Retina +zero +onum
+
+#: Enable only alternate zero in the bold font::
+
+#: font_features FiraCode-Bold +zero
+
+#: Disable the normal ligatures, but keep the calt feature which (in
+#: this font) breaks up monotony::
+
+#: font_features TT2020StyleB-Regular -liga +calt
+
+#: In conjunction with force_ltr, you may want to disable Arabic
+#: shaping entirely, and only look at their isolated forms if they
+#: show up in a document. You can do this with e.g.::
+
+#: font_features UnifontMedium +isol -medi -fina -init
+
+# modify_font
+
+#: Modify font characteristics such as the position or thickness of
+#: the underline and strikethrough. The modifications can have the
+#: suffix px for pixels or % for percentage of original value. No
+#: suffix means use pts. For example::
+
+#: modify_font underline_position -2
+#: modify_font underline_thickness 150%
+#: modify_font strikethrough_position 2px
+
+#: Additionally, you can modify the size of the cell in which each
+#: font glyph is rendered and the baseline at which the glyph is
+#: placed in the cell. For example::
+
+#: modify_font cell_width 80%
+#: modify_font cell_height -2px
+#: modify_font baseline 3
+
+#: Note that modifying the baseline will automatically adjust the
+#: underline and strikethrough positions by the same amount.
+#: Increasing the baseline raises glyphs inside the cell and
+#: decreasing it lowers them. Decreasing the cell size might cause
+#: rendering artifacts, so use with care.
+
+# box_drawing_scale 0.001, 1, 1.5, 2
+
+#: The sizes of the lines used for the box drawing Unicode characters.
+#: These values are in pts. They will be scaled by the monitor DPI to
+#: arrive at a pixel value. There must be four values corresponding to
+#: thin, normal, thick, and very thick lines.
+
+# undercurl_style thin-sparse
+
+#: The style with which undercurls are rendered. This option takes the
+#: form (thin|thick)-(sparse|dense). Thin and thick control the
+#: thickness of the undercurl. Sparse and dense control how often the
+#: curl oscillates. With sparse the curl will peak once per character,
+#: with dense twice.
+
+# text_composition_strategy platform
+
+#: Control how kitty composites text glyphs onto the background color.
+#: The default value of platform tries for text rendering as close to
+#: "native" for the platform kitty is running on as possible.
+
+#: A value of legacy uses the old (pre kitty 0.28) strategy for how
+#: glyphs are composited. This will make dark text on light
+#: backgrounds look thicker and light text on dark backgrounds
+#: thinner. It might also make some text appear like the strokes are
+#: uneven.
+
+#: You can fine tune the actual contrast curve used for glyph
+#: composition by specifying up to two space-separated numbers for
+#: this setting.
+
+#: The first number is the gamma adjustment, which controls the
+#: thickness of dark text on light backgrounds. Increasing the value
+#: will make text appear thicker. The default value for this is 1.0 on
+#: Linux and 1.7 on macOS. Valid values are 0.01 and above. The result
+#: is scaled based on the luminance difference between the background
+#: and the foreground. Dark text on light backgrounds receives the
+#: full impact of the curve while light text on dark backgrounds is
+#: affected very little.
+
+#: The second number is an additional multiplicative contrast. It is
+#: percentage ranging from 0 to 100. The default value is 0 on Linux
+#: and 30 on macOS.
+
+#: If you wish to achieve similar looking thickness in light and dark
+#: themes, a good way to experiment is start by setting the value to
+#: 1.0 0 and use a dark theme. Then adjust the second parameter until
+#: it looks good. Then switch to a light theme and adjust the first
+#: parameter until the perceived thickness matches the dark theme.
+
+# text_fg_override_threshold 0
+
+#: The minimum accepted difference in luminance between the foreground
+#: and background color, below which kitty will override the
+#: foreground color. It is percentage ranging from 0 to 100. If the
+#: difference in luminance of the foreground and background is below
+#: this threshold, the foreground color will be set to white if the
+#: background is dark or black if the background is light. The default
+#: value is 0, which means no overriding is performed. Useful when
+#: working with applications that use colors that do not contrast well
+#: with your preferred color scheme.
+
+#: WARNING: Some programs use characters (such as block characters)
+#: for graphics display and may expect to be able to set the
+#: foreground and background to the same color (or similar colors).
+#: If you see unexpected stripes, dots, lines, incorrect color, no
+#: color where you expect color, or any kind of graphic display
+#: problem try setting text_fg_override_threshold to 0 to see if this
+#: is the cause of the problem.
+
+#: }}}
+
+#: Text cursor customization {{{
+
+# cursor #cccccc
+
+#: Default text cursor color. If set to the special value none the
+#: cursor will be rendered with a "reverse video" effect. Its color
+#: will be the color of the text in the cell it is over and the text
+#: will be rendered with the background color of the cell. Note that
+#: if the program running in the terminal sets a cursor color, this
+#: takes precedence. Also, the cursor colors are modified if the cell
+#: background and foreground colors have very low contrast. Note that
+#: some themes set this value, so if you want to override it, place
+#: your value after the lines where the theme file is included.
+
+# cursor_text_color #111111
+
+#: The color of text under the cursor. If you want it rendered with
+#: the background color of the cell underneath instead, use the
+#: special keyword: `background`. Note that if cursor is set to none
+#: then this option is ignored. Note that some themes set this value,
+#: so if you want to override it, place your value after the lines
+#: where the theme file is included.
+
+# cursor_shape block
+
+#: The cursor shape can be one of block, beam, underline. Note that
+#: when reloading the config this will be changed only if the cursor
+#: shape has not been set by the program running in the terminal. This
+#: sets the default cursor shape, applications running in the terminal
+#: can override it. In particular, shell integration
+#: in kitty sets
+#: the cursor shape to beam at shell prompts. You can avoid this by
+#: setting shell_integration to no-cursor.
+
+# cursor_shape_unfocused hollow
+
+#: Defines the text cursor shape when the OS window is not focused.
+#: The unfocused cursor shape can be one of block, beam, underline,
+#: hollow and unchanged (leave the cursor shape as it is).
+
+# cursor_beam_thickness 1.5
+
+#: The thickness of the beam cursor (in pts).
+
+# cursor_underline_thickness 2.0
+
+#: The thickness of the underline cursor (in pts).
+
+# cursor_blink_interval -1
+
+#: The interval to blink the cursor (in seconds). Set to zero to
+#: disable blinking. Negative values mean use system default. Note
+#: that the minimum interval will be limited to repaint_delay. You can
+#: also animate the cursor blink by specifying an easing function. For
+#: example, setting this to option to 0.5 ease-in-out will cause the
+#: cursor blink to be animated over a second, in the first half of the
+#: second it will go from opaque to transparent and then back again
+#: over the next half. You can specify different easing functions for
+#: the two halves, for example: -1 linear ease-out. kitty supports all
+#: the CSS easing functions . Note that turning on animations
+#: uses extra power as it means the screen is redrawn multiple times
+#: per blink interval. See also, cursor_stop_blinking_after.
+
+# cursor_stop_blinking_after 15.0
+
+#: Stop blinking cursor after the specified number of seconds of
+#: keyboard inactivity. Set to zero to never stop blinking.
+
+# cursor_trail 0
+
+#: Set this to a value larger than zero to enable a "cursor trail"
+#: animation. This is an animation that shows a "trail" following the
+#: movement of the text cursor. It makes it easy to follow large
+#: cursor jumps and makes for a cool visual effect of the cursor
+#: zooming around the screen. The actual value of this option controls
+#: when the animation is trigerred. It is a number of milliseconds.
+#: The trail animation only follows cursors that have stayed in their
+#: position for longer than the specified number of milliseconds. This
+#: prevents trails from appearing for cursors that rapidly change
+#: their positions during UI updates in complex applications. See
+#: cursor_trail_decay to control the animation speed and
+#: cursor_trail_start_threshold to control when a cursor trail is
+#: started.
+
+# cursor_trail_decay 0.1 0.4
+
+#: Controls the decay times for the cursor trail effect when the
+#: cursor_trail is enabled. This option accepts two positive float
+#: values specifying the fastest and slowest decay times in seconds.
+#: The first value corresponds to the fastest decay time (minimum),
+#: and the second value corresponds to the slowest decay time
+#: (maximum). The second value must be equal to or greater than the
+#: first value. Smaller values result in a faster decay of the cursor
+#: trail. Adjust these values to control how quickly the cursor trail
+#: fades away.
+
+# cursor_trail_start_threshold 2
+
+#: Set the distance threshold for starting the cursor trail. This
+#: option accepts a positive integer value that represents the minimum
+#: number of cells the cursor must move before the trail is started.
+#: When the cursor moves less than this threshold, the trail is
+#: skipped, reducing unnecessary cursor trail animation.
+
+#: }}}
+
+#: Scrollback {{{
+
+# scrollback_lines 2000
+
+#: Number of lines of history to keep in memory for scrolling back.
+#: Memory is allocated on demand. Negative numbers are (effectively)
+#: infinite scrollback. Note that using very large scrollback is not
+#: recommended as it can slow down performance of the terminal and
+#: also use large amounts of RAM. Instead, consider using
+#: scrollback_pager_history_size. Note that on config reload if this
+#: is changed it will only affect newly created windows, not existing
+#: ones.
+
+# scrollback_indicator_opacity 1.0
+
+#: The opacity of the scrollback indicator which is a small colored
+#: rectangle that moves along the right hand side of the window as you
+#: scroll, indicating what fraction you have scrolled. The default is
+#: one which means fully opaque, aka visible. Set to a value between
+#: zero and one to make the indicator less visible.
+
+# scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER
+
+#: Program with which to view scrollback in a new window. The
+#: scrollback buffer is passed as STDIN to this program. If you change
+#: it, make sure the program you use can handle ANSI escape sequences
+#: for colors and text formatting. INPUT_LINE_NUMBER in the command
+#: line above will be replaced by an integer representing which line
+#: should be at the top of the screen. Similarly CURSOR_LINE and
+#: CURSOR_COLUMN will be replaced by the current cursor position or
+#: set to 0 if there is no cursor, for example, when showing the last
+#: command output.
+
+# scrollback_pager_history_size 0
+
+#: Separate scrollback history size (in MB), used only for browsing
+#: the scrollback buffer with pager. This separate buffer is not
+#: available for interactive scrolling but will be piped to the pager
+#: program when viewing scrollback buffer in a separate window. The
+#: current implementation stores the data in UTF-8, so approximately
+#: 10000 lines per megabyte at 100 chars per line, for pure ASCII,
+#: unformatted text. A value of zero or less disables this feature.
+#: The maximum allowed size is 4GB. Note that on config reload if this
+#: is changed it will only affect newly created windows, not existing
+#: ones.
+
+# scrollback_fill_enlarged_window no
+
+#: Fill new space with lines from the scrollback buffer after
+#: enlarging a window.
+
+# wheel_scroll_multiplier 5.0
+
+#: Multiplier for the number of lines scrolled by the mouse wheel.
+#: Note that this is only used for low precision scrolling devices,
+#: not for high precision scrolling devices on platforms such as macOS
+#: and Wayland. Use negative numbers to change scroll direction. See
+#: also wheel_scroll_min_lines.
+
+# wheel_scroll_min_lines 1
+
+#: The minimum number of lines scrolled by the mouse wheel. The scroll
+#: multiplier wheel_scroll_multiplier only takes effect after it
+#: reaches this number. Note that this is only used for low precision
+#: scrolling devices like wheel mice that scroll by very small amounts
+#: when using the wheel. With a negative number, the minimum number of
+#: lines will always be added.
+
+# touch_scroll_multiplier 1.0
+
+#: Multiplier for the number of lines scrolled by a touchpad. Note
+#: that this is only used for high precision scrolling devices on
+#: platforms such as macOS and Wayland. Use negative numbers to change
+#: scroll direction.
+
+#: }}}
+
+#: Mouse {{{
+
+# mouse_hide_wait 3.0
+
+#: Hide mouse cursor after the specified number of seconds of the
+#: mouse not being used. Set to zero to disable mouse cursor hiding.
+#: Set to a negative value to hide the mouse cursor immediately when
+#: typing text. Disabled by default on macOS as getting it to work
+#: robustly with the ever-changing sea of bugs that is Cocoa is too
+#: much effort.
+
+# url_color #0087bd
+# url_style curly
+
+#: The color and style for highlighting URLs on mouse-over. url_style
+#: can be one of: none, straight, double, curly, dotted, dashed.
+
+# open_url_with default
+
+#: The program to open clicked URLs. The special value default will
+#: first look for any URL handlers defined via the open_actions
+#: facility and if non
+#: are found, it will use the Operating System's default URL handler
+#: (open on macOS and xdg-open on Linux).
+
+# url_prefixes file ftp ftps gemini git gopher http https irc ircs kitty mailto news sftp ssh
+
+#: The set of URL prefixes to look for when detecting a URL under the
+#: mouse cursor.
+
+# detect_urls yes
+
+#: Detect URLs under the mouse. Detected URLs are highlighted with an
+#: underline and the mouse cursor becomes a hand over them. Even if
+#: this option is disabled, URLs are still clickable. See also the
+#: underline_hyperlinks option to control how hyperlinks (as opposed
+#: to plain text URLs) are displayed.
+
+# url_excluded_characters
+
+#: Additional characters to be disallowed from URLs, when detecting
+#: URLs under the mouse cursor. By default, all characters that are
+#: legal in URLs are allowed. Additionally, newlines are allowed (but
+#: stripped). This is to accommodate programs such as mutt that add
+#: hard line breaks even for continued lines. \n can be added to this
+#: option to disable this behavior. Special characters can be
+#: specified using backslash escapes, to specify a backslash use a
+#: double backslash.
+
+# show_hyperlink_targets no
+
+#: When the mouse hovers over a terminal hyperlink, show the actual
+#: URL that will be activated when the hyperlink is clicked.
+
+# underline_hyperlinks hover
+
+#: Control how hyperlinks are underlined. They can either be
+#: underlined on mouse hover, always (i.e. permanently underlined) or
+#: never which means that kitty will not apply any underline styling
+#: to hyperlinks. Note that the value of always only applies to real
+#: (OSC 8) hyperlinks not text that is detected to be a URL on mouse
+#: hover. Uses the url_style and url_color settings for the underline
+#: style. Note that reloading the config and changing this value
+#: to/from always will only affect text subsequently received by
+#: kitty.
+
+# copy_on_select no
+
+#: Copy to clipboard or a private buffer on select. With this set to
+#: clipboard, selecting text with the mouse will cause the text to be
+#: copied to clipboard. Useful on platforms such as macOS that do not
+#: have the concept of primary selection. You can instead specify a
+#: name such as a1 to copy to a private kitty buffer. Map a shortcut
+#: with the paste_from_buffer action to paste from this private
+#: buffer. For example::
+
+#: copy_on_select a1
+#: map shift+cmd+v paste_from_buffer a1
+
+#: Note that copying to the clipboard is a security risk, as all
+#: programs, including websites open in your browser can read the
+#: contents of the system clipboard.
+
+# paste_actions quote-urls-at-prompt,confirm
+
+#: A comma separated list of actions to take when pasting text into
+#: the terminal. The supported paste actions are:
+
+#: quote-urls-at-prompt:
+#: If the text being pasted is a URL and the cursor is at a shell prompt,
+#: automatically quote the URL (needs shell_integration).
+#: replace-dangerous-control-codes
+#: Replace dangerous control codes from pasted text, without confirmation.
+#: replace-newline
+#: Replace the newline character from pasted text, without confirmation.
+#: confirm:
+#: Confirm the paste if the text to be pasted contains any terminal control codes
+#: as this can be dangerous, leading to code execution if the shell/program running
+#: in the terminal does not properly handle these.
+#: confirm-if-large
+#: Confirm the paste if it is very large (larger than 16KB) as pasting
+#: large amounts of text into shells can be very slow.
+#: filter:
+#: Run the filter_paste() function from the file paste-actions.py in
+#: the kitty config directory on the pasted text. The text returned by the
+#: function will be actually pasted.
+#: no-op:
+#: Has no effect.
+
+# strip_trailing_spaces never
+
+#: Remove spaces at the end of lines when copying to clipboard. A
+#: value of smart will do it when using normal selections, but not
+#: rectangle selections. A value of always will always do it.
+
+# select_by_word_characters @-./_~?&=%+#
+
+#: Characters considered part of a word when double clicking. In
+#: addition to these characters any character that is marked as an
+#: alphanumeric character in the Unicode database will be matched.
+
+# select_by_word_characters_forward
+
+#: Characters considered part of a word when extending the selection
+#: forward on double clicking. In addition to these characters any
+#: character that is marked as an alphanumeric character in the
+#: Unicode database will be matched.
+
+#: If empty (default) select_by_word_characters will be used for both
+#: directions.
+
+# click_interval -1.0
+
+#: The interval between successive clicks to detect double/triple
+#: clicks (in seconds). Negative numbers will use the system default
+#: instead, if available, or fallback to 0.5.
+
+# focus_follows_mouse no
+
+#: Set the active window to the window under the mouse when moving the
+#: mouse around. On macOS, this will also cause the OS Window under
+#: the mouse to be focused automatically when the mouse enters it.
+
+# pointer_shape_when_grabbed arrow
+
+#: The shape of the mouse pointer when the program running in the
+#: terminal grabs the mouse.
+
+# default_pointer_shape beam
+
+#: The default shape of the mouse pointer.
+
+# pointer_shape_when_dragging beam
+
+#: The default shape of the mouse pointer when dragging across text.
+
+#: Mouse actions {{{
+
+#: Mouse buttons can be mapped to perform arbitrary actions. The
+#: syntax is:
+
+#: .. code-block:: none
+
+#: mouse_map button-name event-type modes action
+
+#: Where button-name is one of left, middle, right, b1 ... b8 with
+#: added keyboard modifiers. For example: ctrl+shift+left refers to
+#: holding the Ctrl+Shift keys while clicking with the left mouse
+#: button. The value b1 ... b8 can be used to refer to up to eight
+#: buttons on a mouse.
+
+#: event-type is one of press, release, doublepress, triplepress,
+#: click, doubleclick. modes indicates whether the action is performed
+#: when the mouse is grabbed by the program running in the terminal,
+#: or not. The values are grabbed or ungrabbed or a comma separated
+#: combination of them. grabbed refers to when the program running in
+#: the terminal has requested mouse events. Note that the click and
+#: double click events have a delay of click_interval to disambiguate
+#: from double and triple presses.
+
+#: You can run kitty with the kitty --debug-input command line option
+#: to see mouse events. See the builtin actions below to get a sense
+#: of what is possible.
+
+#: If you want to unmap a button, map it to nothing. For example, to
+#: disable opening of URLs with a plain click::
+
+#: mouse_map left click ungrabbed
+
+#: See all the mappable actions including mouse actions here
+#: .
+
+#: .. note::
+#: Once a selection is started, releasing the button that started it will
+#: automatically end it and no release event will be dispatched.
+
+# clear_all_mouse_actions no
+
+#: Remove all mouse action definitions up to this point. Useful, for
+#: instance, to remove the default mouse actions.
+
+#: Click the link under the mouse or move the cursor
+
+# mouse_map left click ungrabbed mouse_handle_click selection link prompt
+
+#:: First check for a selection and if one exists do nothing. Then
+#:: check for a link under the mouse cursor and if one exists, click
+#:: it. Finally check if the click happened at the current shell
+#:: prompt and if so, move the cursor to the click location. Note
+#:: that this requires shell integration
+#:: to work.
+
+#: Click the link under the mouse or move the cursor even when grabbed
+
+# mouse_map shift+left click grabbed,ungrabbed mouse_handle_click selection link prompt
+
+#:: Same as above, except that the action is performed even when the
+#:: mouse is grabbed by the program running in the terminal.
+
+#: Click the link under the mouse cursor
+
+# mouse_map ctrl+shift+left release grabbed,ungrabbed mouse_handle_click link
+
+#:: Variant with Ctrl+Shift is present because the simple click based
+#:: version has an unavoidable delay of click_interval, to
+#:: disambiguate clicks from double clicks.
+
+#: Discard press event for link click
+
+# mouse_map ctrl+shift+left press grabbed discard_event
+
+#:: Prevent this press event from being sent to the program that has
+#:: grabbed the mouse, as the corresponding release event is used to
+#:: open a URL.
+
+#: Paste from the primary selection
+
+# mouse_map middle release ungrabbed paste_from_selection
+
+#: Start selecting text
+
+# mouse_map left press ungrabbed mouse_selection normal
+
+#: Start selecting text in a rectangle
+
+# mouse_map ctrl+alt+left press ungrabbed mouse_selection rectangle
+
+#: Select a word
+
+# mouse_map left doublepress ungrabbed mouse_selection word
+
+#: Select a line
+
+# mouse_map left triplepress ungrabbed mouse_selection line
+
+#: Select line from point
+
+# mouse_map ctrl+alt+left triplepress ungrabbed mouse_selection line_from_point
+
+#:: Select from the clicked point to the end of the line. If you
+#:: would like to select the word at the point and then extend to the
+#:: rest of the line, change `line_from_point` to
+#:: `word_and_line_from_point`.
+
+#: Extend the current selection
+
+# mouse_map right press ungrabbed mouse_selection extend
+
+#:: If you want only the end of the selection to be moved instead of
+#:: the nearest boundary, use move-end instead of extend.
+
+#: Paste from the primary selection even when grabbed
+
+# mouse_map shift+middle release ungrabbed,grabbed paste_selection
+# mouse_map shift+middle press grabbed discard_event
+
+#: Start selecting text even when grabbed
+
+# mouse_map shift+left press ungrabbed,grabbed mouse_selection normal
+
+#: Start selecting text in a rectangle even when grabbed
+
+# mouse_map ctrl+shift+alt+left press ungrabbed,grabbed mouse_selection rectangle
+
+#: Select a word even when grabbed
+
+# mouse_map shift+left doublepress ungrabbed,grabbed mouse_selection word
+
+#: Select a line even when grabbed
+
+# mouse_map shift+left triplepress ungrabbed,grabbed mouse_selection line
+
+#: Select line from point even when grabbed
+
+# mouse_map ctrl+shift+alt+left triplepress ungrabbed,grabbed mouse_selection line_from_point
+
+#:: Select from the clicked point to the end of the line even when
+#:: grabbed. If you would like to select the word at the point and
+#:: then extend to the rest of the line, change `line_from_point` to
+#:: `word_and_line_from_point`.
+
+#: Extend the current selection even when grabbed
+
+# mouse_map shift+right press ungrabbed,grabbed mouse_selection extend
+
+#: Show clicked command output in pager
+
+# mouse_map ctrl+shift+right press ungrabbed mouse_show_command_output
+
+#:: Requires shell integration
+#:: to work.
+
+#: }}}
+
+#: }}}
+
+#: Performance tuning {{{
+
+# repaint_delay 10
+
+#: Delay between screen updates (in milliseconds). Decreasing it,
+#: increases frames-per-second (FPS) at the cost of more CPU usage.
+#: The default value yields ~100 FPS which is more than sufficient for
+#: most uses. Note that to actually achieve 100 FPS, you have to
+#: either set sync_to_monitor to no or use a monitor with a high
+#: refresh rate. Also, to minimize latency when there is pending input
+#: to be processed, this option is ignored.
+
+# input_delay 3
+
+#: Delay before input from the program running in the terminal is
+#: processed (in milliseconds). Note that decreasing it will increase
+#: responsiveness, but also increase CPU usage and might cause flicker
+#: in full screen programs that redraw the entire screen on each loop,
+#: because kitty is so fast that partial screen updates will be drawn.
+#: This setting is ignored when the input buffer is almost full.
+
+# sync_to_monitor yes
+
+#: Sync screen updates to the refresh rate of the monitor. This
+#: prevents screen tearing
+#: when scrolling.
+#: However, it limits the rendering speed to the refresh rate of your
+#: monitor. With a very high speed mouse/high keyboard repeat rate,
+#: you may notice some slight input latency. If so, set this to no.
+
+#: }}}
+
+#: Terminal bell {{{
+
+# enable_audio_bell yes
+
+#: The audio bell. Useful to disable it in environments that require
+#: silence.
+
+# visual_bell_duration 0.0
+
+#: The visual bell duration (in seconds). Flash the screen when a bell
+#: occurs for the specified number of seconds. Set to zero to disable.
+#: The flash is animated, fading in and out over the specified
+#: duration. The easing function used for the fading can be
+#: controlled. For example, 2.0 linear will casuse the flash to fade
+#: in and out linearly. The default if unspecified is to use ease-in-
+#: out which fades slowly at the start, middle and end. You can
+#: specify different easing functions for the fade-in and fade-out
+#: parts, like this: 2.0 ease-in linear. kitty supports all the CSS
+#: easing functions .
+
+# visual_bell_color none
+
+#: The color used by visual bell. Set to none will fall back to
+#: selection background color. If you feel that the visual bell is too
+#: bright, you can set it to a darker color.
+
+# window_alert_on_bell yes
+
+#: Request window attention on bell. Makes the dock icon bounce on
+#: macOS or the taskbar flash on Linux.
+
+# bell_on_tab "🔔 "
+
+#: Some text or a Unicode symbol to show on the tab if a window in the
+#: tab that does not have focus has a bell. If you want to use leading
+#: or trailing spaces, surround the text with quotes. See
+#: tab_title_template for how this is rendered.
+
+#: For backwards compatibility, values of yes, y and true are
+#: converted to the default bell symbol and no, n, false and none are
+#: converted to the empty string.
+
+# command_on_bell none
+
+#: Program to run when a bell occurs. The environment variable
+#: KITTY_CHILD_CMDLINE can be used to get the program running in the
+#: window in which the bell occurred.
+
+# bell_path none
+
+#: Path to a sound file to play as the bell sound. If set to none, the
+#: system default bell sound is used. Must be in a format supported by
+#: the operating systems sound API, such as WAV or OGA on Linux
+#: (libcanberra) or AIFF, MP3 or WAV on macOS (NSSound).
+
+# linux_bell_theme __custom
+
+#: The XDG Sound Theme kitty will use to play the bell sound. Defaults
+#: to the custom theme name specified in the XDG Sound theme
+#: specification , falling back to the default
+#: freedesktop theme if it does not exist. To change your sound theme
+#: desktop wide, create
+#: :file:~/.local/share/sounds/__custom/index.theme` with the
+#: contents:
+
+#: [Sound Theme]
+
+#: Inherits=name-of-the-sound-theme-you-want-to-use
+
+#: Replace name-of-the-sound-theme-you-want-to-use with the actual
+#: theme name. Now all compliant applications should use sounds from
+#: this theme.
+
+#: }}}
+
+#: Window layout {{{
+
+# remember_window_size yes
+# initial_window_width 640
+# initial_window_height 400
+
+#: If enabled, the OS Window size will be remembered so that new
+#: instances of kitty will have the same size as the previous
+#: instance. If disabled, the OS Window will initially have size
+#: configured by initial_window_width/height, in pixels. You can use a
+#: suffix of "c" on the width/height values to have them interpreted
+#: as number of cells instead of pixels.
+
+# enabled_layouts *
+
+#: The enabled window layouts. A comma separated list of layout names.
+#: The special value all means all layouts. The first listed layout
+#: will be used as the startup layout. Default configuration is all
+#: layouts in alphabetical order. For a list of available layouts, see
+#: the layouts .
+
+# window_resize_step_cells 2
+# window_resize_step_lines 2
+
+#: The step size (in units of cell width/cell height) to use when
+#: resizing kitty windows in a layout with the shortcut
+#: start_resizing_window. The cells value is used for horizontal
+#: resizing, and the lines value is used for vertical resizing.
+
+# window_border_width 0.5pt
+
+#: The width of window borders. Can be either in pixels (px) or pts
+#: (pt). Values in pts will be rounded to the nearest number of pixels
+#: based on screen resolution. If not specified, the unit is assumed
+#: to be pts. Note that borders are displayed only when more than one
+#: window is visible. They are meant to separate multiple windows.
+
+# draw_minimal_borders yes
+
+#: Draw only the minimum borders needed. This means that only the
+#: borders that separate the window from a neighbor are drawn. Note
+#: that setting a non-zero window_margin_width overrides this and
+#: causes all borders to be drawn.
+
+# window_margin_width 0
+
+#: The window margin (in pts) (blank area outside the border). A
+#: single value sets all four sides. Two values set the vertical and
+#: horizontal sides. Three values set top, horizontal and bottom. Four
+#: values set top, right, bottom and left.
+
+# single_window_margin_width -1
+
+#: The window margin to use when only a single window is visible (in
+#: pts). Negative values will cause the value of window_margin_width
+#: to be used instead. A single value sets all four sides. Two values
+#: set the vertical and horizontal sides. Three values set top,
+#: horizontal and bottom. Four values set top, right, bottom and left.
+
+# window_padding_width 0
+
+#: The window padding (in pts) (blank area between the text and the
+#: window border). A single value sets all four sides. Two values set
+#: the vertical and horizontal sides. Three values set top, horizontal
+#: and bottom. Four values set top, right, bottom and left.
+
+# single_window_padding_width -1
+
+#: The window padding to use when only a single window is visible (in
+#: pts). Negative values will cause the value of window_padding_width
+#: to be used instead. A single value sets all four sides. Two values
+#: set the vertical and horizontal sides. Three values set top,
+#: horizontal and bottom. Four values set top, right, bottom and left.
+
+# placement_strategy center
+
+#: When the window size is not an exact multiple of the cell size, the
+#: cell area of the terminal window will have some extra padding on
+#: the sides. You can control how that padding is distributed with
+#: this option. Using a value of center means the cell area will be
+#: placed centrally. A value of top-left means the padding will be
+#: only at the bottom and right edges. The value can be one of: top-
+#: left, top, top-right, left, center, right, bottom-left, bottom,
+#: bottom-right.
+
+# active_border_color #00ff00
+
+#: The color for the border of the active window. Set this to none to
+#: not draw borders around the active window.
+
+# inactive_border_color #cccccc
+
+#: The color for the border of inactive windows.
+
+# bell_border_color #ff5a00
+
+#: The color for the border of inactive windows in which a bell has
+#: occurred.
+
+# inactive_text_alpha 1.0
+
+#: Fade the text in inactive windows by the specified amount (a number
+#: between zero and one, with zero being fully faded).
+
+# hide_window_decorations no
+
+#: Hide the window decorations (title-bar and window borders) with
+#: yes. On macOS, titlebar-only and titlebar-and-corners can be used
+#: to only hide the titlebar and the rounded corners. Whether this
+#: works and exactly what effect it has depends on the window
+#: manager/operating system. Note that the effects of changing this
+#: option when reloading config are undefined. When using titlebar-
+#: only, it is useful to also set window_margin_width and
+#: placement_strategy to prevent the rounded corners from clipping
+#: text. Or use titlebar-and-corners.
+
+# window_logo_path none
+
+#: Path to a logo image. Must be in PNG/JPEG/WEBP/GIF/TIFF/BMP format.
+#: Relative paths are interpreted relative to the kitty config
+#: directory. The logo is displayed in a corner of every kitty window.
+#: The position is controlled by window_logo_position. Individual
+#: windows can be configured to have different logos either using the
+#: launch action or the remote control
+#: facility.
+
+# window_logo_position bottom-right
+
+#: Where to position the window logo in the window. The value can be
+#: one of: top-left, top, top-right, left, center, right, bottom-left,
+#: bottom, bottom-right.
+
+# window_logo_alpha 0.5
+
+#: The amount the logo should be faded into the background. With zero
+#: being fully faded and one being fully opaque.
+
+# window_logo_scale 0
+
+#: The percentage (0-100] of the window size to which the logo should
+#: scale. Using a single number means the logo is scaled to that
+#: percentage of the shortest window dimension, while preseving aspect
+#: ratio of the logo image.
+
+#: Using two numbers means the width and height of the logo are scaled
+#: to the respective percentage of the window's width and height.
+
+#: Using zero as the percentage disables scaling in that dimension. A
+#: single zero (the default) disables all scaling of the window logo.
+
+# resize_debounce_time 0.1 0.5
+
+#: The time to wait (in seconds) before asking the program running in
+#: kitty to resize and redraw the screen during a live resize of the
+#: OS window, when no new resize events have been received, i.e. when
+#: resizing is either paused or finished. On platforms such as macOS,
+#: where the operating system sends events corresponding to the start
+#: and end of a live resize, the second number is used for redraw-
+#: after-pause since kitty can distinguish between a pause and end of
+#: resizing. On such systems the first number is ignored and redraw is
+#: immediate after end of resize. On other systems only the first
+#: number is used so that kitty is "ready" quickly after the end of
+#: resizing, while not also continuously redrawing, to save energy.
+
+# resize_in_steps no
+
+#: Resize the OS window in steps as large as the cells, instead of
+#: with the usual pixel accuracy. Combined with initial_window_width
+#: and initial_window_height in number of cells, this option can be
+#: used to keep the margins as small as possible when resizing the OS
+#: window. Note that this does not currently work on Wayland.
+
+# visual_window_select_characters 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
+
+#: The list of characters for visual window selection. For example,
+#: for selecting a window to focus on with focus_visible_window. The
+#: value should be a series of unique numbers or alphabets, case
+#: insensitive, from the set 0-9A-Z\-=[];',./\\`. Specify your
+#: preference as a string of characters.
+
+# confirm_os_window_close -1
+
+#: Ask for confirmation when closing an OS window or a tab with at
+#: least this number of kitty windows in it by window manager (e.g.
+#: clicking the window close button or pressing the operating system
+#: shortcut to close windows) or by the close_tab action. A value of
+#: zero disables confirmation. This confirmation also applies to
+#: requests to quit the entire application (all OS windows, via the
+#: quit action). Negative values are converted to positive ones,
+#: however, with shell_integration enabled, using negative values
+#: means windows sitting at a shell prompt are not counted, only
+#: windows where some command is currently running. Note that if you
+#: want confirmation when closing individual windows, you can map the
+#: close_window_with_confirmation action.
+
+#: }}}
+
+#: Tab bar {{{
+
+# tab_bar_edge bottom
+
+#: The edge to show the tab bar on, top or bottom.
+
+# tab_bar_margin_width 0.0
+
+#: The margin to the left and right of the tab bar (in pts).
+
+# tab_bar_margin_height 0.0 0.0
+
+#: The margin above and below the tab bar (in pts). The first number
+#: is the margin between the edge of the OS Window and the tab bar.
+#: The second number is the margin between the tab bar and the
+#: contents of the current tab.
+
+# tab_bar_style fade
+
+#: The tab bar style, can be one of:
+
+#: fade
+#: Each tab's edges fade into the background color. (See also tab_fade)
+#: slant
+#: Tabs look like the tabs in a physical file.
+#: separator
+#: Tabs are separated by a configurable separator. (See also
+#: tab_separator)
+#: powerline
+#: Tabs are shown as a continuous line with "fancy" separators.
+#: (See also tab_powerline_style)
+#: custom
+#: A user-supplied Python function called draw_tab is loaded from the file
+#: tab_bar.py in the kitty config directory. For examples of how to
+#: write such a function, see the functions named draw_tab_with_* in
+#: kitty's source code: kitty/tab_bar.py. See also
+#: this discussion
+#: for examples from kitty users.
+#: hidden
+#: The tab bar is hidden. If you use this, you might want to create
+#: a mapping for the select_tab action which presents you with a list of
+#: tabs and allows for easy switching to a tab.
+
+# tab_bar_align left
+
+#: The horizontal alignment of the tab bar, can be one of: left,
+#: center, right.
+
+# tab_bar_min_tabs 2
+
+#: The minimum number of tabs that must exist before the tab bar is
+#: shown.
+
+# tab_switch_strategy previous
+
+#: The algorithm to use when switching to a tab when the current tab
+#: is closed. The default of previous will switch to the last used
+#: tab. A value of left will switch to the tab to the left of the
+#: closed tab. A value of right will switch to the tab to the right of
+#: the closed tab. A value of last will switch to the right-most tab.
+
+# tab_fade 0.25 0.5 0.75 1
+
+#: Control how each tab fades into the background when using fade for
+#: the tab_bar_style. Each number is an alpha (between zero and one)
+#: that controls how much the corresponding cell fades into the
+#: background, with zero being no fade and one being full fade. You
+#: can change the number of cells used by adding/removing entries to
+#: this list.
+
+# tab_separator " ┇"
+
+#: The separator between tabs in the tab bar when using separator as
+#: the tab_bar_style.
+
+# tab_powerline_style angled
+
+#: The powerline separator style between tabs in the tab bar when
+#: using powerline as the tab_bar_style, can be one of: angled,
+#: slanted, round.
+
+# tab_activity_symbol none
+
+#: Some text or a Unicode symbol to show on the tab if a window in the
+#: tab that does not have focus has some activity. If you want to use
+#: leading or trailing spaces, surround the text with quotes. See
+#: tab_title_template for how this is rendered.
+
+# tab_title_max_length 0
+
+#: The maximum number of cells that can be used to render the text in
+#: a tab. A value of zero means that no limit is applied.
+
+# tab_title_template "{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}"
+
+#: A template to render the tab title. The default just renders the
+#: title with optional symbols for bell and activity. If you wish to
+#: include the tab-index as well, use something like: {index}:{title}.
+#: Useful if you have shortcuts mapped for goto_tab N. If you prefer
+#: to see the index as a superscript, use {sup.index}. All data
+#: available is:
+
+#: title
+#: The current tab title.
+#: index
+#: The tab index usable with goto_tab N goto_tab shortcuts.
+#: layout_name
+#: The current layout name.
+#: num_windows
+#: The number of windows in the tab.
+#: num_window_groups
+#: The number of window groups (a window group is a window and all of its overlay windows) in the tab.
+#: tab.active_wd
+#: The working directory of the currently active window in the tab
+#: (expensive, requires syscall). Use active_oldest_wd to get
+#: the directory of the oldest foreground process rather than the newest.
+#: tab.active_exe
+#: The name of the executable running in the foreground of the currently
+#: active window in the tab (expensive, requires syscall). Use
+#: active_oldest_exe for the oldest foreground process.
+#: max_title_length
+#: The maximum title length available.
+#: keyboard_mode
+#: The name of the current keyboard mode or the empty string if no keyboard mode is active.
+
+#: Note that formatting is done by Python's string formatting
+#: machinery, so you can use, for instance, {layout_name[:2].upper()}
+#: to show only the first two letters of the layout name, upper-cased.
+#: If you want to style the text, you can use styling directives, for
+#: example:
+#: `{fmt.fg.red}red{fmt.fg.tab}normal{fmt.bg._00FF00}greenbg{fmt.bg.tab}`.
+#: Similarly, for bold and italic:
+#: `{fmt.bold}bold{fmt.nobold}normal{fmt.italic}italic{fmt.noitalic}`.
+#: The 256 eight terminal colors can be used as `fmt.fg.color0`
+#: through `fmt.fg.color255`. Note that for backward compatibility, if
+#: {bell_symbol} or {activity_symbol} are not present in the template,
+#: they are prepended to it.
+
+# active_tab_title_template none
+
+#: Template to use for active tabs. If not specified falls back to
+#: tab_title_template.
+
+# active_tab_foreground #000
+# active_tab_background #eee
+# active_tab_font_style bold-italic
+# inactive_tab_foreground #444
+# inactive_tab_background #999
+# inactive_tab_font_style normal
+
+#: Tab bar colors and styles.
+
+# tab_bar_background none
+
+#: Background color for the tab bar. Defaults to using the terminal
+#: background color.
+
+# tab_bar_margin_color none
+
+#: Color for the tab bar margin area. Defaults to using the terminal
+#: background color for margins above and below the tab bar. For side
+#: margins the default color is chosen to match the background color
+#: of the neighboring tab.
+
+#: }}}
+
+#: Color scheme {{{
+
+# foreground #dddddd
+# background #000000
+
+#: The foreground and background colors.
+
+# background_opacity 1.0
+
+#: The opacity of the background. A number between zero and one, where
+#: one is opaque and zero is fully transparent. This will only work if
+#: supported by the OS (for instance, when using a compositor under
+#: X11). Note that it only sets the background color's opacity in
+#: cells that have the same background color as the default terminal
+#: background, so that things like the status bar in vim, powerline
+#: prompts, etc. still look good. But it means that if you use a color
+#: theme with a background color in your editor, it will not be
+#: rendered as transparent. Instead you should change the default
+#: background color in your kitty config and not use a background
+#: color in the editor color scheme. Or use the escape codes to set
+#: the terminals default colors in a shell script to launch your
+#: editor. See also transparent_background_colors. Be aware that using
+#: a value less than 1.0 is a (possibly significant) performance hit.
+#: When using a low value for this setting, it is desirable that you
+#: set the background color to a color the matches the general color
+#: of the desktop background, for best text rendering. If you want to
+#: dynamically change transparency of windows, set
+#: dynamic_background_opacity to yes (this is off by default as it has
+#: a performance cost). Changing this option when reloading the config
+#: will only work if dynamic_background_opacity was enabled in the
+#: original config.
+
+# background_blur 0
+
+#: Set to a positive value to enable background blur (blurring of the
+#: visuals behind a transparent window) on platforms that support it.
+#: Only takes effect when background_opacity is less than one. On
+#: macOS, this will also control the blur radius (amount of blurring).
+#: Setting it to too high a value will cause severe performance issues
+#: and/or rendering artifacts. Usually, values up to 64 work well.
+#: Note that this might cause performance issues, depending on how the
+#: platform implements it, so use with care. Currently supported on
+#: macOS and KDE.
+
+# background_image none
+
+#: Path to a background image. Must be in PNG/JPEG/WEBP/TIFF/GIF/BMP
+#: format.
+
+# background_image_layout tiled
+
+#: Whether to tile, scale or clamp the background image. The value can
+#: be one of tiled, mirror-tiled, scaled, clamped, centered or
+#: cscaled. The scaled and cscaled values scale the image to the
+#: window size, with cscaled preserving the image aspect ratio.
+
+# background_image_linear no
+
+#: When background image is scaled, whether linear interpolation
+#: should be used.
+
+# transparent_background_colors
+
+#: A space separated list of upto 7 colors, with opacity. When the
+#: background color of a cell matches one of these colors, it is
+#: rendered semi-transparent using the specified opacity.
+
+#: Useful in more complex UIs like editors where you could want more
+#: than a single background color to be rendered as transparent, for
+#: instance, for a cursor highlight line background or a highlighted
+#: block. Terminal applications can set this color using The kitty
+#: color control escape code.
+
+#: The syntax for specifiying colors is: color@opacity, where the
+#: @opacity part is optional. When unspecified, the value of
+#: background_opacity is used. For example::
+
+#: transparent_background_colors red@0.5 #00ff00@0.3
+
+# dynamic_background_opacity no
+
+#: Allow changing of the background_opacity dynamically, using either
+#: keyboard shortcuts (increase_background_opacity and
+#: decrease_background_opacity) or the remote control facility.
+#: Changing this option by reloading the config is not supported.
+
+# background_tint 0.0
+
+#: How much to tint the background image by the background color. This
+#: option makes it easier to read the text. Tinting is done using the
+#: current background color for each window. This option applies only
+#: if background_opacity is set and transparent windows are supported
+#: or background_image is set.
+
+# background_tint_gaps 1.0
+
+#: How much to tint the background image at the window gaps by the
+#: background color, after applying background_tint. Since this is
+#: multiplicative with background_tint, it can be used to lighten the
+#: tint over the window gaps for a *separated* look.
+
+# dim_opacity 0.4
+
+#: How much to dim text that has the DIM/FAINT attribute set. One
+#: means no dimming and zero means fully dimmed (i.e. invisible).
+
+# selection_foreground #000000
+# selection_background #fffacd
+
+#: The foreground and background colors for text selected with the
+#: mouse. Setting both of these to none will cause a "reverse video"
+#: effect for selections, where the selection will be the cell text
+#: color and the text will become the cell background color. Setting
+#: only selection_foreground to none will cause the foreground color
+#: to be used unchanged. Note that these colors can be overridden by
+#: the program running in the terminal.
+
+#: The color table {{{
+
+#: The 256 terminal colors. There are 8 basic colors, each color has a
+#: dull and bright version, for the first 16 colors. You can set the
+#: remaining 240 colors as color16 to color255.
+
+# color0 #000000
+# color8 #767676
+
+#: black
+
+# color1 #cc0403
+# color9 #f2201f
+
+#: red
+
+# color2 #19cb00
+# color10 #23fd00
+
+#: green
+
+# color3 #cecb00
+# color11 #fffd00
+
+#: yellow
+
+# color4 #0d73cc
+# color12 #1a8fff
+
+#: blue
+
+# color5 #cb1ed1
+# color13 #fd28ff
+
+#: magenta
+
+# color6 #0dcdcd
+# color14 #14ffff
+
+#: cyan
+
+# color7 #dddddd
+# color15 #ffffff
+
+#: white
+
+# mark1_foreground black
+
+#: Color for marks of type 1
+
+# mark1_background #98d3cb
+
+#: Color for marks of type 1 (light steel blue)
+
+# mark2_foreground black
+
+#: Color for marks of type 2
+
+# mark2_background #f2dcd3
+
+#: Color for marks of type 1 (beige)
+
+# mark3_foreground black
+
+#: Color for marks of type 3
+
+# mark3_background #f274bc
+
+#: Color for marks of type 3 (violet)
+
+#: }}}
+
+#: }}}
+
+#: Advanced {{{
+
+shell /opt/homebrew/bin/fish --interactive --login
+
+#: The shell program to execute. The default value of . means to use
+#: the value of of the SHELL environment variable or if unset,
+#: whatever shell is set as the default shell for the current user.
+#: Note that on macOS if you change this, you might need to add
+#: --login and --interactive to ensure that the shell starts in
+#: interactive mode and reads its startup rc files. Environment
+#: variables are expanded in this setting.
+
+# editor .
+
+#: The terminal based text editor (such as vim or nano) to use when
+#: editing the kitty config file or similar tasks.
+
+#: The default value of . means to use the environment variables
+#: VISUAL and EDITOR in that order. If these variables aren't set,
+#: kitty will run your shell ($SHELL -l -i -c env) to see if your
+#: shell startup rc files set VISUAL or EDITOR. If that doesn't work,
+#: kitty will cycle through various known editors (vim, emacs, etc.)
+#: and take the first one that exists on your system.
+
+# close_on_child_death no
+
+#: Close the window when the child process (usually the shell) exits.
+#: With the default value no, the terminal will remain open when the
+#: child exits as long as there are still other processes outputting
+#: to the terminal (for example disowned or backgrounded processes).
+#: When enabled with yes, the window will close as soon as the child
+#: process exits. Note that setting it to yes means that any
+#: background processes still using the terminal can fail silently
+#: because their stdout/stderr/stdin no longer work.
+
+# remote_control_password
+
+#: Allow other programs to control kitty using passwords. This option
+#: can be specified multiple times to add multiple passwords. If no
+#: passwords are present kitty will ask the user for permission if a
+#: program tries to use remote control with a password. A password can
+#: also *optionally* be associated with a set of allowed remote
+#: control actions. For example::
+
+#: remote_control_password "my passphrase" get-colors set-colors focus-window focus-tab
+
+#: Only the specified actions will be allowed when using this
+#: password. Glob patterns can be used too, for example::
+
+#: remote_control_password "my passphrase" set-tab-* resize-*
+
+#: To get a list of available actions, run::
+
+#: kitten @ --help
+
+#: A set of actions to be allowed when no password is sent can be
+#: specified by using an empty password. For example::
+
+#: remote_control_password "" *-colors
+
+#: Finally, the path to a python module can be specified that provides
+#: a function is_cmd_allowed that is used to check every remote
+#: control command. For example::
+
+#: remote_control_password "my passphrase" my_rc_command_checker.py
+
+#: Relative paths are resolved from the kitty configuration directory.
+#: See rc_custom_auth for details.
+
+# allow_remote_control no
+
+#: Allow other programs to control kitty. If you turn this on, other
+#: programs can control all aspects of kitty, including sending text
+#: to kitty windows, opening new windows, closing windows, reading the
+#: content of windows, etc. Note that this even works over SSH
+#: connections. The default setting of no prevents any form of remote
+#: control. The meaning of the various values are:
+
+#: password
+#: Remote control requests received over both the TTY device and the socket
+#: are confirmed based on passwords, see remote_control_password.
+
+#: socket-only
+#: Remote control requests received over a socket are accepted
+#: unconditionally. Requests received over the TTY are denied.
+#: See listen_on.
+
+#: socket
+#: Remote control requests received over a socket are accepted
+#: unconditionally. Requests received over the TTY are confirmed based on
+#: password.
+
+#: no
+#: Remote control is completely disabled.
+
+#: yes
+#: Remote control requests are always accepted.
+
+# listen_on none
+
+#: Listen to the specified socket for remote control connections. Note
+#: that this will apply to all kitty instances. It can be overridden
+#: by the kitty --listen-on command line option. For UNIX sockets,
+#: such as unix:${TEMP}/mykitty or unix:@mykitty (on Linux).
+#: Environment variables are expanded and relative paths are resolved
+#: with respect to the temporary directory. If {kitty_pid} is present,
+#: then it is replaced by the PID of the kitty process, otherwise the
+#: PID of the kitty process is appended to the value, with a hyphen.
+#: For TCP sockets such as tcp:localhost:0 a random port is always
+#: used even if a non-zero port number is specified. See the help for
+#: kitty --listen-on for more details. Note that this will be ignored
+#: unless allow_remote_control is set to either: yes, socket or
+#: socket-only. Changing this option by reloading the config is not
+#: supported.
+
+# env
+
+#: Specify the environment variables to be set in all child processes.
+#: Using the name with an equal sign (e.g. env VAR=) will set it to
+#: the empty string. Specifying only the name (e.g. env VAR) will
+#: remove the variable from the child process' environment. Note that
+#: environment variables are expanded recursively, for example::
+
+#: env VAR1=a
+#: env VAR2=${HOME}/${VAR1}/b
+
+#: The value of VAR2 will be /a/b.
+
+# filter_notification
+
+#: Specify rules to filter out notifications sent by applications
+#: running in kitty. Can be specified multiple times to create
+#: multiple filter rules. A rule specification is of the form
+#: field:regexp. A filter rule can match on any of the fields: title,
+#: body, app, type. The special value of all filters out all
+#: notifications. Rules can be combined using Boolean operators. Some
+#: examples::
+
+#: filter_notification title:hello or body:"abc.*def"
+#: # filter out notification from vim except for ones about updates, (?i)
+#: # makes matching case insesitive.
+#: filter_notification app:"[ng]?vim" and not body:"(?i)update"
+#: # filter out all notifications
+#: filter_notification all
+
+#: The field app is the name of the application sending the
+#: notification and type is the type of the notification. Not all
+#: applications will send these fields, so you can also match on the
+#: title and body of the notification text. More sophisticated
+#: programmatic filtering and custom actions on notifications can be
+#: done by creating a notifications.py file in the kitty config
+#: directory (~/.config/kitty). An annotated sample is available
+#: .
+
+# watcher
+
+#: Path to python file which will be loaded for watchers
+#: . Can be
+#: specified more than once to load multiple watchers. The watchers
+#: will be added to every kitty window. Relative paths are resolved
+#: relative to the kitty config directory. Note that reloading the
+#: config will only affect windows created after the reload.
+
+# exe_search_path
+
+#: Control where kitty finds the programs to run. The default search
+#: order is: First search the system wide PATH, then ~/.local/bin and
+#: ~/bin. If still not found, the PATH defined in the login shell
+#: after sourcing all its startup files is tried. Finally, if present,
+#: the PATH specified by the env option is tried.
+
+#: This option allows you to prepend, append, or remove paths from
+#: this search order. It can be specified multiple times for multiple
+#: paths. A simple path will be prepended to the search order. A path
+#: that starts with the + sign will be append to the search order,
+#: after ~/bin above. A path that starts with the - sign will be
+#: removed from the entire search order. For example::
+
+#: exe_search_path /some/prepended/path
+#: exe_search_path +/some/appended/path
+#: exe_search_path -/some/excluded/path
+
+# update_check_interval 24
+
+#: The interval to periodically check if an update to kitty is
+#: available (in hours). If an update is found, a system notification
+#: is displayed informing you of the available update. The default is
+#: to check every 24 hours, set to zero to disable. Update checking is
+#: only done by the official binary builds. Distro packages or source
+#: builds do not do update checking. Changing this option by reloading
+#: the config is not supported.
+
+# startup_session none
+
+#: Path to a session file to use for all kitty instances. Can be
+#: overridden by using the kitty --session =none command line option
+#: for individual instances. See sessions
+#: in the kitty
+#: documentation for details. Note that relative paths are interpreted
+#: with respect to the kitty config directory. Environment variables
+#: in the path are expanded. Changing this option by reloading the
+#: config is not supported. Note that if kitty is invoked with command
+#: line arguments specifying a command to run, this option is ignored.
+
+# clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask
+
+#: Allow programs running in kitty to read and write from the
+#: clipboard. You can control exactly which actions are allowed. The
+#: possible actions are: write-clipboard, read-clipboard, write-
+#: primary, read-primary, read-clipboard-ask, read-primary-ask. The
+#: default is to allow writing to the clipboard and primary selection
+#: and to ask for permission when a program tries to read from the
+#: clipboard. Note that disabling the read confirmation is a security
+#: risk as it means that any program, even the ones running on a
+#: remote server via SSH can read your clipboard. See also
+#: clipboard_max_size.
+
+# clipboard_max_size 512
+
+#: The maximum size (in MB) of data from programs running in kitty
+#: that will be stored for writing to the system clipboard. A value of
+#: zero means no size limit is applied. See also clipboard_control.
+
+# file_transfer_confirmation_bypass
+
+#: The password that can be supplied to the file transfer kitten
+#: to skip the
+#: transfer confirmation prompt. This should only be used when
+#: initiating transfers from trusted computers, over trusted networks
+#: or encrypted transports, as it allows any programs running on the
+#: remote machine to read/write to the local filesystem, without
+#: permission.
+
+# allow_hyperlinks yes
+
+#: Process hyperlink escape sequences (OSC 8). If disabled OSC 8
+#: escape sequences are ignored. Otherwise they become clickable
+#: links, that you can click with the mouse or by using the hints
+#: kitten . The
+#: special value of ask means that kitty will ask before opening the
+#: link when clicked.
+
+# shell_integration enabled
+
+#: Enable shell integration on supported shells. This enables features
+#: such as jumping to previous prompts, browsing the output of the
+#: previous command in a pager, etc. on supported shells. Set to
+#: disabled to turn off shell integration, completely. It is also
+#: possible to disable individual features, set to a space separated
+#: list of these values: no-rc, no-cursor, no-title, no-cwd, no-
+#: prompt-mark, no-complete, no-sudo. See Shell integration
+#: for details.
+
+# allow_cloning ask
+
+#: Control whether programs running in the terminal can request new
+#: windows to be created. The canonical example is clone-in-kitty
+#: .
+#: By default, kitty will ask for permission for each clone request.
+#: Allowing cloning unconditionally gives programs running in the
+#: terminal (including over SSH) permission to execute arbitrary code,
+#: as the user who is running the terminal, on the computer that the
+#: terminal is running on.
+
+# clone_source_strategies venv,conda,env_var,path
+
+#: Control what shell code is sourced when running clone-in-kitty in
+#: the newly cloned window. The supported strategies are:
+
+#: venv
+#: Source the file $VIRTUAL_ENV/bin/activate. This is used by the
+#: Python stdlib venv module and allows cloning venvs automatically.
+#: conda
+#: Run conda activate $CONDA_DEFAULT_ENV. This supports the virtual
+#: environments created by conda.
+#: env_var
+#: Execute the contents of the environment variable
+#: KITTY_CLONE_SOURCE_CODE with eval.
+#: path
+#: Source the file pointed to by the environment variable
+#: KITTY_CLONE_SOURCE_PATH.
+
+#: This option must be a comma separated list of the above values.
+#: Only the first valid match, in the order specified, is sourced.
+
+# notify_on_cmd_finish never
+
+#: Show a desktop notification when a long-running command finishes
+#: (needs shell_integration). The possible values are:
+
+#: never
+#: Never send a notification.
+
+#: unfocused
+#: Only send a notification when the window does not have keyboard focus.
+
+#: invisible
+#: Only send a notification when the window both is unfocused and not visible
+#: to the user, for example, because it is in an inactive tab or its OS window
+#: is not currently active.
+
+#: always
+#: Always send a notification, regardless of window state.
+
+#: There are two optional arguments:
+
+#: First, the minimum duration for what is considered a long running
+#: command. The default is 5 seconds. Specify a second argument to set
+#: the duration. For example: invisible 15. Do not set the value too
+#: small, otherwise a command that launches a new OS Window and exits
+#: will spam a notification.
+
+#: Second, the action to perform. The default is notify. The possible
+#: values are:
+
+#: notify
+#: Send a desktop notification.
+
+#: bell
+#: Ring the terminal bell.
+
+#: command
+#: Run a custom command. All subsequent arguments are the cmdline to run.
+
+#: Some more examples::
+
+#: # Send a notification when a command takes more than 5 seconds in an unfocused window
+#: notify_on_cmd_finish unfocused
+#: # Send a notification when a command takes more than 10 seconds in a invisible window
+#: notify_on_cmd_finish invisible 10.0
+#: # Ring a bell when a command takes more than 10 seconds in a invisible window
+#: notify_on_cmd_finish invisible 10.0 bell
+#: # Run 'notify-send' when a command takes more than 10 seconds in a invisible window
+#: # Here %c is replaced by the current command line and %s by the job exit code
+#: notify_on_cmd_finish invisible 10.0 command notify-send "job finished with status: %s" %c
+
+# term xterm-kitty
+
+#: The value of the TERM environment variable to set. Changing this
+#: can break many terminal programs, only change it if you know what
+#: you are doing, not because you read some advice on "Stack Overflow"
+#: to change it. The TERM variable is used by various programs to get
+#: information about the capabilities and behavior of the terminal. If
+#: you change it, depending on what programs you run, and how
+#: different the terminal you are changing it to is, various things
+#: from key-presses, to colors, to various advanced features may not
+#: work. Changing this option by reloading the config will only affect
+#: newly created windows.
+
+# terminfo_type path
+
+#: The value of the TERMINFO environment variable to set. This
+#: variable is used by programs running in the terminal to search for
+#: terminfo databases. The default value of path causes kitty to set
+#: it to a filesystem location containing the kitty terminfo database.
+#: A value of direct means put the entire database into the env var
+#: directly. This can be useful when connecting to containers, for
+#: example. But, note that not all software supports this. A value of
+#: none means do not touch the variable.
+
+# forward_stdio no
+
+#: Forward STDOUT and STDERR of the kitty process to child processes.
+#: This is useful for debugging as it allows child processes to print
+#: to kitty's STDOUT directly. For example, echo hello world
+#: >&$KITTY_STDIO_FORWARDED in a shell will print to the parent
+#: kitty's STDOUT. Sets the KITTY_STDIO_FORWARDED=fdnum environment
+#: variable so child processes know about the forwarding. Note that on
+#: macOS this prevents the shell from being run via the login utility
+#: so getlogin() will not work in programs run in this session.
+
+# menu_map
+
+#: Specify entries for various menus in kitty. Currently only the
+#: global menubar on macOS is supported. For example::
+
+#: menu_map global "Actions::Launch something special" launch --hold --type=os-window sh -c "echo hello world"
+
+#: This will create a menu entry named "Launch something special" in
+#: an "Actions" menu in the macOS global menubar. Sub-menus can be
+#: created by adding more levels separated by the :: characters.
+
+#: }}}
+
+#: OS specific tweaks {{{
+
+# wayland_titlebar_color system
+
+#: The color of the kitty window's titlebar on Wayland systems with
+#: client side window decorations such as GNOME. A value of system
+#: means to use the default system colors, a value of background means
+#: to use the background color of the currently active kitty window
+#: and finally you can use an arbitrary color, such as #12af59 or red.
+
+# macos_titlebar_color system
+
+#: The color of the kitty window's titlebar on macOS. A value of
+#: system means to use the default system color, light or dark can
+#: also be used to set it explicitly. A value of background means to
+#: use the background color of the currently active window and finally
+#: you can use an arbitrary color, such as #12af59 or red. WARNING:
+#: This option works by using a hack when arbitrary color (or
+#: background) is configured, as there is no proper Cocoa API for it.
+#: It sets the background color of the entire window and makes the
+#: titlebar transparent. As such it is incompatible with
+#: background_opacity. If you want to use both, you are probably
+#: better off just hiding the titlebar with hide_window_decorations.
+
+# macos_option_as_alt no
+
+#: Use the Option key as an Alt key on macOS. With this set to no,
+#: kitty will use the macOS native Option+Key to enter Unicode
+#: character behavior. This will break any Alt+Key keyboard shortcuts
+#: in your terminal programs, but you can use the macOS Unicode input
+#: technique. You can use the values: left, right or both to use only
+#: the left, right or both Option keys as Alt, instead. Note that
+#: kitty itself always treats Option the same as Alt. This means you
+#: cannot use this option to configure different kitty shortcuts for
+#: Option+Key vs. Alt+Key. Also, any kitty shortcuts using
+#: Option/Alt+Key will take priority, so that any such key presses
+#: will not be passed to terminal programs running inside kitty.
+#: Changing this option by reloading the config is not supported.
+
+# macos_hide_from_tasks no
+
+#: Hide the kitty window from running tasks on macOS (⌘+Tab and the
+#: Dock). Changing this option by reloading the config is not
+#: supported.
+
+# macos_quit_when_last_window_closed no
+
+#: Have kitty quit when all the top-level windows are closed on macOS.
+#: By default, kitty will stay running, even with no open windows, as
+#: is the expected behavior on macOS.
+
+# macos_window_resizable yes
+
+#: Disable this if you want kitty top-level OS windows to not be
+#: resizable on macOS.
+
+# macos_thicken_font 0
+
+#: Draw an extra border around the font with the given width, to
+#: increase legibility at small font sizes on macOS. For example, a
+#: value of 0.75 will result in rendering that looks similar to sub-
+#: pixel antialiasing at common font sizes. Note that in modern kitty,
+#: this option is obsolete (although still supported). Consider using
+#: text_composition_strategy instead.
+
+# macos_traditional_fullscreen no
+
+#: Use the macOS traditional full-screen transition, that is faster,
+#: but less pretty.
+
+# macos_show_window_title_in all
+
+#: Control where the window title is displayed on macOS. A value of
+#: window will show the title of the currently active window at the
+#: top of the macOS window. A value of menubar will show the title of
+#: the currently active window in the macOS global menu bar, making
+#: use of otherwise wasted space. A value of all will show the title
+#: in both places, and none hides the title. See
+#: macos_menubar_title_max_length for how to control the length of the
+#: title in the menu bar.
+
+# macos_menubar_title_max_length 0
+
+#: The maximum number of characters from the window title to show in
+#: the macOS global menu bar. Values less than one means that there is
+#: no maximum limit.
+
+# macos_custom_beam_cursor no
+
+#: Use a custom mouse cursor for macOS that is easier to see on both
+#: light and dark backgrounds. Nowadays, the default macOS cursor
+#: already comes with a white border. WARNING: this might make your
+#: mouse cursor invisible on dual GPU machines. Changing this option
+#: by reloading the config is not supported.
+
+# macos_colorspace srgb
+
+#: The colorspace in which to interpret terminal colors. The default
+#: of srgb will cause colors to match those seen in web browsers. The
+#: value of default will use whatever the native colorspace of the
+#: display is. The value of displayp3 will use Apple's special
+#: snowflake display P3 color space, which will result in over
+#: saturated (brighter) colors with some color shift. Reloading
+#: configuration will change this value only for newly created OS
+#: windows.
+
+# linux_display_server auto
+
+#: Choose between Wayland and X11 backends. By default, an appropriate
+#: backend based on the system state is chosen automatically. Set it
+#: to x11 or wayland to force the choice. Changing this option by
+#: reloading the config is not supported.
+
+# wayland_enable_ime yes
+
+#: Enable Input Method Extension on Wayland. This is typically used
+#: for inputting text in East Asian languages. However, its
+#: implementation in Wayland is often buggy and introduces latency
+#: into the input loop, so disable this if you know you dont need it.
+#: Changing this option by reloading the config is not supported, it
+#: will not have any effect.
+
+#: }}}
+
+#: Keyboard shortcuts {{{
+
+#: Keys are identified simply by their lowercase Unicode characters.
+#: For example: a for the A key, [ for the left square bracket key,
+#: etc. For functional keys, such as Enter or Escape, the names are
+#: present at Functional key definitions
+#: .
+#: For modifier keys, the names are ctrl (control, ⌃), shift (⇧), alt
+#: (opt, option, ⌥), super (cmd, command, ⌘).
+
+#: Simple shortcut mapping is done with the map directive. For full
+#: details on advanced mapping including modal and per application
+#: maps, see mapping . Some
+#: quick examples to illustrate common tasks::
+
+#: # unmap a keyboard shortcut, passing it to the program running in kitty
+#: map kitty_mod+space
+#: # completely ignore a keyboard event
+#: map ctrl+alt+f1 discard_event
+#: # combine multiple actions
+#: map kitty_mod+e combine : new_window : next_layout
+#: # multi-key shortcuts
+#: map ctrl+x>ctrl+y>z action
+
+#: The full list of actions that can be mapped to key presses is
+#: available here .
+
+kitty_mod cmd
+
+#: Special modifier key alias for default shortcuts. You can change
+#: the value of this option to alter all default shortcuts that use
+#: kitty_mod.
+
+# clear_all_shortcuts no
+
+#: Remove all shortcut definitions up to this point. Useful, for
+#: instance, to remove the default shortcuts.
+
+# action_alias
+
+#: E.g. action_alias launch_tab launch --type=tab --cwd=current
+
+#: Define action aliases to avoid repeating the same options in
+#: multiple mappings. Aliases can be defined for any action and will
+#: be expanded recursively. For example, the above alias allows you to
+#: create mappings to launch a new tab in the current working
+#: directory without duplication::
+
+#: map f1 launch_tab vim
+#: map f2 launch_tab emacs
+
+#: Similarly, to alias kitten invocation::
+
+#: action_alias hints kitten hints --hints-offset=0
+
+# kitten_alias
+
+#: E.g. kitten_alias hints hints --hints-offset=0
+
+#: Like action_alias above, but specifically for kittens. Generally,
+#: prefer to use action_alias. This option is a legacy version,
+#: present for backwards compatibility. It causes all invocations of
+#: the aliased kitten to be substituted. So the example above will
+#: cause all invocations of the hints kitten to have the --hints-
+#: offset=0 option applied.
+
+#: Clipboard {{{
+
+#: Copy to clipboard
+
+# map kitty_mod+c copy_to_clipboard
+# map cmd+c copy_to_clipboard
+
+#:: There is also a copy_or_interrupt action that can be optionally
+#:: mapped to Ctrl+C. It will copy only if there is a selection and
+#:: send an interrupt otherwise. Similarly,
+#:: copy_and_clear_or_interrupt will copy and clear the selection or
+#:: send an interrupt if there is no selection.
+
+#: Paste from clipboard
+
+# map kitty_mod+v paste_from_clipboard
+# map cmd+v paste_from_clipboard
+
+#: Paste from selection
+
+# map kitty_mod+s paste_from_selection
+# map shift+insert paste_from_selection
+
+#: Pass selection to program
+
+# map kitty_mod+o pass_selection_to_program
+
+#:: You can also pass the contents of the current selection to any
+#:: program with pass_selection_to_program. By default, the system's
+#:: open program is used, but you can specify your own, the selection
+#:: will be passed as a command line argument to the program. For
+#:: example::
+
+#:: map kitty_mod+o pass_selection_to_program firefox
+
+#:: You can pass the current selection to a terminal program running
+#:: in a new kitty window, by using the @selection placeholder::
+
+#:: map kitty_mod+y new_window less @selection
+
+#: }}}
+
+#: Scrolling {{{
+
+#: Scroll line up
+
+# map kitty_mod+up scroll_line_up
+# map kitty_mod+k scroll_line_up
+# map opt+cmd+page_up scroll_line_up
+# map cmd+up scroll_line_up
+
+#: Scroll line down
+
+# map kitty_mod+down scroll_line_down
+# map kitty_mod+j scroll_line_down
+# map opt+cmd+page_down scroll_line_down
+# map cmd+down scroll_line_down
+
+#: Scroll page up
+
+# map kitty_mod+page_up scroll_page_up
+# map cmd+page_up scroll_page_up
+
+#: Scroll page down
+
+# map kitty_mod+page_down scroll_page_down
+# map cmd+page_down scroll_page_down
+
+#: Scroll to top
+
+# map kitty_mod+home scroll_home
+# map cmd+home scroll_home
+
+#: Scroll to bottom
+
+# map kitty_mod+end scroll_end
+# map cmd+end scroll_end
+
+#: Scroll to previous shell prompt
+
+# map kitty_mod+z scroll_to_prompt -1
+
+#:: Use a parameter of 0 for scroll_to_prompt to scroll to the last
+#:: jumped to or the last clicked position. Requires shell
+#:: integration
+#:: to work.
+
+#: Scroll to next shell prompt
+
+# map kitty_mod+x scroll_to_prompt 1
+
+#: Browse scrollback buffer in pager
+
+# map kitty_mod+h show_scrollback
+
+#:: You can pipe the contents of the current screen and history
+#:: buffer as STDIN to an arbitrary program using launch --stdin-
+#:: source. For example, the following opens the scrollback buffer in
+#:: less in an overlay window::
+
+#:: map f1 launch --stdin-source=@screen_scrollback --stdin-add-formatting --type=overlay less +G -R
+
+#:: For more details on piping screen and buffer contents to external
+#:: programs, see launch .
+
+#: Browse output of the last shell command in pager
+
+# map kitty_mod+g show_last_command_output
+
+#:: You can also define additional shortcuts to get the command
+#:: output. For example, to get the first command output on screen::
+
+#:: map f1 show_first_command_output_on_screen
+
+#:: To get the command output that was last accessed by a keyboard
+#:: action or mouse action::
+
+#:: map f1 show_last_visited_command_output
+
+#:: You can pipe the output of the last command run in the shell
+#:: using the launch action. For example, the following opens the
+#:: output in less in an overlay window::
+
+#:: map f1 launch --stdin-source=@last_cmd_output --stdin-add-formatting --type=overlay less +G -R
+
+#:: To get the output of the first command on the screen, use
+#:: @first_cmd_output_on_screen. To get the output of the last jumped
+#:: to command, use @last_visited_cmd_output.
+
+#:: Requires shell integration
+#:: to work.
+
+#: }}}
+
+#: Window management {{{
+
+#: New window
+
+# map kitty_mod+enter new_window
+# map cmd+enter new_window
+
+#:: You can open a new kitty window running an arbitrary program, for
+#:: example::
+
+#:: map kitty_mod+y launch mutt
+
+#:: You can open a new window with the current working directory set
+#:: to the working directory of the current window using::
+
+#:: map ctrl+alt+enter launch --cwd=current
+
+#:: You can open a new window that is allowed to control kitty via
+#:: the kitty remote control facility with launch --allow-remote-
+#:: control. Any programs running in that window will be allowed to
+#:: control kitty. For example::
+
+#:: map ctrl+enter launch --allow-remote-control some_program
+
+#:: You can open a new window next to the currently active window or
+#:: as the first window, with::
+
+#:: map ctrl+n launch --location=neighbor
+#:: map ctrl+f launch --location=first
+
+#:: For more details, see launch
+#:: .
+
+#: New OS window
+
+# map kitty_mod+n new_os_window
+# map cmd+n new_os_window
+
+#:: Works like new_window above, except that it opens a top-level OS
+#:: window. In particular you can use new_os_window_with_cwd to open
+#:: a window with the current working directory.
+
+#: Close window
+
+# map kitty_mod+w close_window
+# map shift+cmd+d close_window
+
+#: Next window
+
+# map kitty_mod+] next_window
+
+#: Previous window
+
+# map kitty_mod+[ previous_window
+
+#: Move window forward
+
+# map kitty_mod+f move_window_forward
+
+#: Move window backward
+
+# map kitty_mod+b move_window_backward
+
+#: Move window to top
+
+# map kitty_mod+` move_window_to_top
+
+#: Start resizing window
+
+# map kitty_mod+r start_resizing_window
+# map cmd+r start_resizing_window
+
+#: First window
+
+# map kitty_mod+1 first_window
+# map cmd+1 first_window
+
+#: Second window
+
+# map kitty_mod+2 second_window
+# map cmd+2 second_window
+
+#: Third window
+
+# map kitty_mod+3 third_window
+# map cmd+3 third_window
+
+#: Fourth window
+
+# map kitty_mod+4 fourth_window
+# map cmd+4 fourth_window
+
+#: Fifth window
+
+# map kitty_mod+5 fifth_window
+# map cmd+5 fifth_window
+
+#: Sixth window
+
+# map kitty_mod+6 sixth_window
+# map cmd+6 sixth_window
+
+#: Seventh window
+
+# map kitty_mod+7 seventh_window
+# map cmd+7 seventh_window
+
+#: Eighth window
+
+# map kitty_mod+8 eighth_window
+# map cmd+8 eighth_window
+
+#: Ninth window
+
+# map kitty_mod+9 ninth_window
+# map cmd+9 ninth_window
+
+#: Tenth window
+
+# map kitty_mod+0 tenth_window
+
+#: Visually select and focus window
+
+# map kitty_mod+f7 focus_visible_window
+
+#:: Display overlay numbers and alphabets on the window, and switch
+#:: the focus to the window when you press the key. When there are
+#:: only two windows, the focus will be switched directly without
+#:: displaying the overlay. You can change the overlay characters and
+#:: their order with option visual_window_select_characters.
+
+#: Visually swap window with another
+
+# map kitty_mod+f8 swap_with_window
+
+#:: Works like focus_visible_window above, but swaps the window.
+
+#: }}}
+
+#: Tab management {{{
+
+#: Next tab
+
+# map kitty_mod+right next_tab
+# map shift+cmd+] next_tab
+# map ctrl+tab next_tab
+
+#: Previous tab
+
+# map kitty_mod+left previous_tab
+# map shift+cmd+[ previous_tab
+# map ctrl+shift+tab previous_tab
+
+#: New tab
+
+# map kitty_mod+t new_tab
+# map cmd+t new_tab
+
+#: Close tab
+
+# map kitty_mod+q close_tab
+# map cmd+w close_tab
+
+#: Close OS window
+
+# map shift+cmd+w close_os_window
+
+#: Move tab forward
+
+# map kitty_mod+. move_tab_forward
+
+#: Move tab backward
+
+# map kitty_mod+, move_tab_backward
+
+#: Set tab title
+
+# map kitty_mod+alt+t set_tab_title
+# map shift+cmd+i set_tab_title
+
+
+#: You can also create shortcuts to go to specific tabs, with 1 being
+#: the first tab, 2 the second tab and -1 being the previously active
+#: tab, -2 being the tab active before the previously active tab and
+#: so on. Any number larger than the number of tabs goes to the last
+#: tab and any number less than the number of previously used tabs in
+#: the history goes to the oldest previously used tab in the history::
+
+#: map ctrl+alt+1 goto_tab 1
+#: map ctrl+alt+2 goto_tab 2
+
+#: Just as with new_window above, you can also pass the name of
+#: arbitrary commands to run when using new_tab and new_tab_with_cwd.
+#: Finally, if you want the new tab to open next to the current tab
+#: rather than at the end of the tabs list, use::
+
+#: map ctrl+t new_tab !neighbor [optional cmd to run]
+#: }}}
+
+#: Layout management {{{
+
+#: Next layout
+
+# map kitty_mod+l next_layout
+
+
+#: You can also create shortcuts to switch to specific layouts::
+
+#: map ctrl+alt+t goto_layout tall
+#: map ctrl+alt+s goto_layout stack
+
+#: Similarly, to switch back to the previous layout::
+
+#: map ctrl+alt+p last_used_layout
+
+#: There is also a toggle_layout action that switches to the named
+#: layout or back to the previous layout if in the named layout.
+#: Useful to temporarily "zoom" the active window by switching to the
+#: stack layout::
+
+#: map ctrl+alt+z toggle_layout stack
+#: }}}
+
+#: Font sizes {{{
+
+#: You can change the font size for all top-level kitty OS windows at
+#: a time or only the current one.
+
+#: Increase font size
+
+# map kitty_mod+equal change_font_size all +2.0
+# map kitty_mod+plus change_font_size all +2.0
+# map kitty_mod+kp_add change_font_size all +2.0
+# map cmd+plus change_font_size all +2.0
+# map cmd+equal change_font_size all +2.0
+# map shift+cmd+equal change_font_size all +2.0
+
+#: Decrease font size
+
+# map kitty_mod+minus change_font_size all -2.0
+# map kitty_mod+kp_subtract change_font_size all -2.0
+# map cmd+minus change_font_size all -2.0
+# map shift+cmd+minus change_font_size all -2.0
+
+#: Reset font size
+
+# map kitty_mod+backspace change_font_size all 0
+# map cmd+0 change_font_size all 0
+
+
+#: To setup shortcuts for specific font sizes::
+
+#: map kitty_mod+f6 change_font_size all 10.0
+
+#: To setup shortcuts to change only the current OS window's font
+#: size::
+
+#: map kitty_mod+f6 change_font_size current 10.0
+#: }}}
+
+#: Select and act on visible text {{{
+
+#: Use the hints kitten to select text and either pass it to an
+#: external program or insert it into the terminal or copy it to the
+#: clipboard.
+
+#: Open URL
+
+# map kitty_mod+e open_url_with_hints
+
+#:: Open a currently visible URL using the keyboard. The program used
+#:: to open the URL is specified in open_url_with.
+
+#: Insert selected path
+
+# map kitty_mod+p>f kitten hints --type path --program -
+
+#:: Select a path/filename and insert it into the terminal. Useful,
+#:: for instance to run git commands on a filename output from a
+#:: previous git command.
+
+#: Open selected path
+
+# map kitty_mod+p>shift+f kitten hints --type path
+
+#:: Select a path/filename and open it with the default open program.
+
+#: Insert selected line
+
+# map kitty_mod+p>l kitten hints --type line --program -
+
+#:: Select a line of text and insert it into the terminal. Useful for
+#:: the output of things like: `ls -1`.
+
+#: Insert selected word
+
+# map kitty_mod+p>w kitten hints --type word --program -
+
+#:: Select words and insert into terminal.
+
+#: Insert selected hash
+
+# map kitty_mod+p>h kitten hints --type hash --program -
+
+#:: Select something that looks like a hash and insert it into the
+#:: terminal. Useful with git, which uses SHA1 hashes to identify
+#:: commits.
+
+#: Open the selected file at the selected line
+
+# map kitty_mod+p>n kitten hints --type linenum
+
+#:: Select something that looks like filename:linenum and open it in
+#:: your default editor at the specified line number.
+
+#: Open the selected hyperlink
+
+# map kitty_mod+p>y kitten hints --type hyperlink
+
+#:: Select a hyperlink (i.e. a URL that has been marked as such by
+#:: the terminal program, for example, by `ls --hyperlink=auto`).
+
+
+#: The hints kitten has many more modes of operation that you can map
+#: to different shortcuts. For a full description see hints kitten
+#: .
+#: }}}
+
+#: Miscellaneous {{{
+
+#: Show documentation
+
+# map kitty_mod+f1 show_kitty_doc overview
+
+#: Toggle fullscreen
+
+# map kitty_mod+f11 toggle_fullscreen
+# map ctrl+cmd+f toggle_fullscreen
+
+#: Toggle maximized
+
+# map kitty_mod+f10 toggle_maximized
+
+#: Toggle macOS secure keyboard entry
+
+# map opt+cmd+s toggle_macos_secure_keyboard_entry
+
+#: Unicode input
+
+# map kitty_mod+u kitten unicode_input
+# map ctrl+cmd+space kitten unicode_input
+
+#: Edit config file
+
+# map kitty_mod+f2 edit_config_file
+# map cmd+, edit_config_file
+
+#: Open the kitty command shell
+
+# map kitty_mod+escape kitty_shell window
+
+#:: Open the kitty shell in a new window / tab / overlay / os_window
+#:: to control kitty using commands.
+
+#: Increase background opacity
+
+# map kitty_mod+a>m set_background_opacity +0.1
+
+#: Decrease background opacity
+
+# map kitty_mod+a>l set_background_opacity -0.1
+
+#: Make background fully opaque
+
+# map kitty_mod+a>1 set_background_opacity 1
+
+#: Reset background opacity
+
+# map kitty_mod+a>d set_background_opacity default
+
+#: Reset the terminal
+
+# map kitty_mod+delete clear_terminal reset active
+# map opt+cmd+r clear_terminal reset active
+
+#:: You can create shortcuts to clear/reset the terminal. For
+#:: example::
+
+#:: # Reset the terminal
+#:: map f1 clear_terminal reset active
+#:: # Clear the terminal screen by erasing all contents
+#:: map f1 clear_terminal clear active
+#:: # Clear the terminal scrollback by erasing it
+#:: map f1 clear_terminal scrollback active
+#:: # Scroll the contents of the screen into the scrollback
+#:: map f1 clear_terminal scroll active
+#:: # Clear everything on screen up to the line with the cursor or the start of the current prompt (needs shell integration)
+#:: map f1 clear_terminal to_cursor active
+#:: # Same as above except cleared lines are moved into scrollback
+#:: map f1 clear_terminal to_cursor_scroll active
+
+#:: If you want to operate on all kitty windows instead of just the
+#:: current one, use all instead of active.
+
+#:: Some useful functions that can be defined in the shell rc files
+#:: to perform various kinds of clearing of the current window:
+
+#:: .. code-block:: sh
+
+#:: clear-only-screen() {
+#:: printf "\e[H\e[2J"
+#:: }
+
+#:: clear-screen-and-scrollback() {
+#:: printf "\e[H\e[3J"
+#:: }
+
+#:: clear-screen-saving-contents-in-scrollback() {
+#:: printf "\e[H\e[22J"
+#:: }
+
+#:: For instance, using these escape codes, it is possible to remap
+#:: Ctrl+L to both scroll the current screen contents into the
+#:: scrollback buffer and clear the screen, instead of just clearing
+#:: the screen. For ZSH, in ~/.zshrc, add:
+
+#:: .. code-block:: zsh
+
+#:: ctrl_l() {
+#:: builtin print -rn -- $'\r\e[0J\e[H\e[22J' >"$TTY"
+#:: builtin zle .reset-prompt
+#:: builtin zle -R
+#:: }
+#:: zle -N ctrl_l
+#:: bindkey '^l' ctrl_l
+
+#:: Alternatively, you can just add map ctrl+l clear_terminal
+#:: to_cursor_scroll active to kitty.conf which works with no changes
+#:: to the shell rc files, but only clears up to the prompt, it does
+#:: not clear anytext at the prompt itself.
+
+#: Clear up to cursor line
+
+# map cmd+k clear_terminal to_cursor active
+
+#: Reload kitty.conf
+
+# map kitty_mod+f5 load_config_file
+# map ctrl+cmd+, load_config_file
+
+#:: Reload kitty.conf, applying any changes since the last time it
+#:: was loaded. Note that a handful of options cannot be dynamically
+#:: changed and require a full restart of kitty. Particularly, when
+#:: changing shortcuts for actions located on the macOS global menu
+#:: bar, a full restart is needed. You can also map a keybinding to
+#:: load a different config file, for example::
+
+#:: map f5 load_config /path/to/alternative/kitty.conf
+
+#:: Note that all options from the original kitty.conf are discarded,
+#:: in other words the new configuration *replace* the old ones.
+
+#: Debug kitty configuration
+
+# map kitty_mod+f6 debug_config
+# map opt+cmd+, debug_config
+
+#:: Show details about exactly what configuration kitty is running
+#:: with and its host environment. Useful for debugging issues.
+
+#: Send arbitrary text on key presses
+
+#:: E.g. map ctrl+shift+alt+h send_text all Hello World
+
+#:: You can tell kitty to send arbitrary (UTF-8) encoded text to the
+#:: client program when pressing specified shortcut keys. For
+#:: example::
+
+#:: map ctrl+alt+a send_text all Special text
+
+#:: This will send "Special text" when you press the Ctrl+Alt+A key
+#:: combination. The text to be sent decodes ANSI C escapes
+#:: so you can use escapes like \e to send control
+#:: codes or \u21fb to send Unicode characters (or you can just input
+#:: the Unicode characters directly as UTF-8 text). You can use
+#:: `kitten show-key` to get the key escape codes you want to
+#:: emulate.
+
+#:: The first argument to send_text is the keyboard modes in which to
+#:: activate the shortcut. The possible values are normal,
+#:: application, kitty or a comma separated combination of them. The
+#:: modes normal and application refer to the DECCKM cursor key mode
+#:: for terminals, and kitty refers to the kitty extended keyboard
+#:: protocol. The special value all means all of them.
+
+#:: Some more examples::
+
+#:: # Output a word and move the cursor to the start of the line (like typing and pressing Home)
+#:: map ctrl+alt+a send_text normal Word\e[H
+#:: map ctrl+alt+a send_text application Word\eOH
+#:: # Run a command at a shell prompt (like typing the command and pressing Enter)
+#:: map ctrl+alt+a send_text normal,application some command with arguments\r
+
+#: Open kitty Website
+
+# map shift+cmd+/ open_url https://sw.kovidgoyal.net/kitty/
+
+#: Hide macOS kitty application
+
+# map cmd+h hide_macos_app
+
+#: Hide macOS other applications
+
+# map opt+cmd+h hide_macos_other_apps
+
+#: Minimize macOS window
+
+# map cmd+m minimize_macos_window
+
+#: Quit kitty
+
+# map cmd+q quit
+
+#: }}}
+
+#: }}}
+
+
+# vim:ft=kitty
+
+## name: Catppuccin Kitty Frappé
+## author: Catppuccin Org
+## license: MIT
+## upstream: https://github.com/catppuccin/kitty/blob/main/themes/frappe.conf
+## blurb: Soothing pastel theme for the high-spirited!
+
+
+
+# The basic colors
+foreground #c6d0f5
+background #303446
+selection_foreground #303446
+selection_background #f2d5cf
+
+# Cursor colors
+cursor #f2d5cf
+cursor_text_color #303446
+
+# URL underline color when hovering with mouse
+url_color #f2d5cf
+
+# Kitty window border colors
+active_border_color #babbf1
+inactive_border_color #737994
+bell_border_color #e5c890
+
+# OS Window titlebar colors
+wayland_titlebar_color system
+macos_titlebar_color system
+
+# Tab bar colors
+active_tab_foreground #232634
+active_tab_background #ca9ee6
+inactive_tab_foreground #c6d0f5
+inactive_tab_background #292c3c
+tab_bar_background #232634
+
+# Colors for marks (marked text in the terminal)
+mark1_foreground #303446
+mark1_background #babbf1
+mark2_foreground #303446
+mark2_background #ca9ee6
+mark3_foreground #303446
+mark3_background #85c1dc
+
+# The 16 terminal colors
+
+# black
+color0 #51576d
+color8 #626880
+
+# red
+color1 #e78284
+color9 #e78284
+
+# green
+color2 #a6d189
+color10 #a6d189
+
+# yellow
+color3 #e5c890
+color11 #e5c890
+
+# blue
+color4 #8caaee
+color12 #8caaee
+
+# magenta
+color5 #f4b8e4
+color13 #f4b8e4
+
+# cyan
+color6 #81c8be
+color14 #81c8be
+
+# white
+color7 #b5bfe2
+color15 #a5adce
diff --git a/tools/obsidian/latex-suite-snippet b/tools/obsidian/latex-suite-snippet
new file mode 100644
index 0000000..e76d877
--- /dev/null
+++ b/tools/obsidian/latex-suite-snippet
@@ -0,0 +1,489 @@
+[
+ {trigger: "mk", replacement: "$$0$", options: "tA"
+ },
+ {trigger: "dm", replacement: "$$\n$0\n$$", options: "tAw"
+ },
+ {trigger: "beg", replacement: "\\begin{$0}\n$1\n\\end{$0}", options: "mA"
+ },
+ // Dashes
+ // {trigger: "--", replacement: "–", options: "tA"},
+ // {trigger: "–-", replacement: "—", options: "tA"},
+ // {trigger: "—-", replacement: "---", options: "tA"},
+ // Greek letters
+ {trigger: "@a", replacement: "\\alpha", options: "mA"
+ },
+ {trigger: "@b", replacement: "\\beta", options: "mA"
+ },
+ {trigger: "@g", replacement: "\\gamma", options: "mA"
+ },
+ {trigger: "@G", replacement: "\\Gamma", options: "mA"
+ },
+ {trigger: "@d", replacement: "\\delta", options: "mA"
+ },
+ {trigger: "@D", replacement: "\\Delta", options: "mA"
+ },
+ {trigger: "@e", replacement: "\\epsilon", options: "mA"
+ },
+ {trigger: ":e", replacement: "\\varepsilon", options: "mA"
+ },
+ {trigger: "@z", replacement: "\\zeta", options: "mA"
+ },
+ {trigger: "@t", replacement: "\\theta", options: "mA"
+ },
+ {trigger: "@T", replacement: "\\Theta", options: "mA"
+ },
+ {trigger: ":t", replacement: "\\vartheta", options: "mA"
+ },
+ {trigger: "@i", replacement: "\\iota", options: "mA"
+ },
+ {trigger: "@k", replacement: "\\kappa", options: "mA"
+ },
+ {trigger: "@l", replacement: "\\lambda", options: "mA"
+ },
+ {trigger: "@L", replacement: "\\Lambda", options: "mA"
+ },
+ {trigger: "@s", replacement: "\\sigma", options: "mA"
+ },
+ {trigger: "@S", replacement: "\\Sigma", options: "mA"
+ },
+ {trigger: "@u", replacement: "\\upsilon", options: "mA"
+ },
+ {trigger: "@U", replacement: "\\Upsilon", options: "mA"
+ },
+ {trigger: "@o", replacement: "\\omega", options: "mA"
+ },
+ {trigger: "@O", replacement: "\\Omega", options: "mA"
+ },
+ {trigger: "ome", replacement: "\\omega", options: "mA"
+ },
+ {trigger: "Ome", replacement: "\\Omega", options: "mA"
+ },
+ // Text environment
+ {trigger: "text", replacement: "\\text{$0}$1", options: "mA"
+ },
+ {trigger: "\"", replacement: "\\text{$0}$1", options: "mA"
+ },
+ // Basic operations
+ {trigger: "sr", replacement: "^{2}", options: "mA"
+ },
+ {trigger: "cb", replacement: "^{3}", options: "mA"
+ },
+ {trigger: "pow", replacement: "^{$0}$1", options: "mA"
+ },
+ {trigger: "_", replacement: "_{$0}$1", options: "mA"
+ },
+ {trigger: "sb", replacement: "_{$0}$1", options: "mA"
+ },
+ {trigger: "sts", replacement: "_\\text{$0}", options: "mA"
+ },
+ {trigger: "sq", replacement: "\\sqrt{ $0 }$1", options: "mA"
+ },
+ {trigger: "//", replacement: "\\frac{$0}{$1}$2", options: "mA"
+ },
+ {trigger: "ee", replacement: "e^{ $0 }$1", options: "mA"
+ },
+ {trigger: "invs", replacement: "^{-1}", options: "mA"
+ },
+ {trigger: /([A-Za-z
+ ])(\d)/, replacement: "[[0]]_{[[1]]}", options: "rmA", description: "Auto letter subscript", priority: -1
+ },
+ {trigger: /([^\\
+ ])(exp|log|ln)/, replacement: "[[0]]\\[[1]]", options: "rmA"
+ },
+ {trigger: "conj", replacement: "^{*}", options: "mA"
+ },
+ {trigger: "Re", replacement: "\\mathrm{Re}", options: "mA"
+ },
+ {trigger: "Im", replacement: "\\mathrm{Im}", options: "mA"
+ },
+ {trigger: "bf", replacement: "\\mathbf{$0}", options: "mA"
+ },
+ {trigger: "rm", replacement: "\\mathrm{$0}$1", options: "mA"
+ },
+ // Linear algebra
+ {trigger: /([^\\
+ ])(det)/, replacement: "[[0]]\\[[1]]", options: "rmA"
+ },
+ {trigger: "trace", replacement: "\\mathrm{Tr}", options: "mA"
+ },
+ // More operations
+ {trigger: "([a-zA-Z])hat", replacement: "\\hat{[[0]]}", options: "rmA"
+ },
+ {trigger: "([a-zA-Z])bar", replacement: "\\bar{[[0]]}", options: "rmA"
+ },
+ {trigger: "([a-zA-Z])dot", replacement: "\\dot{[[0]]}", options: "rmA", priority: -1
+ },
+ {trigger: "([a-zA-Z])ddot", replacement: "\\ddot{[[0]]}", options: "rmA", priority: 1
+ },
+ {trigger: "([a-zA-Z])tilde", replacement: "\\tilde{[[0]]}", options: "rmA"
+ },
+ {trigger: "([a-zA-Z])und", replacement: "\\underline{[[0]]}", options: "rmA"
+ },
+ {trigger: "([a-zA-Z])vec", replacement: "\\vec{[[0]]}", options: "rmA"
+ },
+ {trigger: "([a-zA-Z]),\\.", replacement: "\\mathbf{[[0]]}", options: "rmA"
+ },
+ {trigger: "([a-zA-Z])\\.,", replacement: "\\mathbf{[[0]]}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}),\\.", replacement: "\\boldsymbol{\\[[0]]}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK})\\.,", replacement: "\\boldsymbol{\\[[0]]}", options: "rmA"
+ },
+ {trigger: "hat", replacement: "\\hat{$0}$1", options: "mA"
+ },
+ {trigger: "bar", replacement: "\\bar{$0}$1", options: "mA"
+ },
+ {trigger: "dot", replacement: "\\dot{$0}$1", options: "mA", priority: -1
+ },
+ {trigger: "ddot", replacement: "\\ddot{$0}$1", options: "mA"
+ },
+ {trigger: "cdot", replacement: "\\cdot", options: "mA"
+ },
+ {trigger: "tilde", replacement: "\\tilde{$0}$1", options: "mA"
+ },
+ {trigger: "und", replacement: "\\underline{$0}$1", options: "mA"
+ },
+ {trigger: "vec", replacement: "\\vec{$0}$1", options: "mA"
+ },
+ // More auto letter subscript
+ {trigger: /([A-Za-z
+ ])_(\d\d)/, replacement: "[[0]]_{[[1]]}", options: "rmA"
+ },
+ {trigger: /\\hat{([A-Za-z
+ ])
+ }(\d)/, replacement: "\\hat{[[0]]}_{[[1]]}", options: "rmA"
+ },
+ {trigger: /\\vec{([A-Za-z
+ ])
+ }(\d)/, replacement: "\\vec{[[0]]}_{[[1]]}", options: "rmA"
+ },
+ {trigger: /\\mathbf{([A-Za-z
+ ])
+ }(\d)/, replacement: "\\mathbf{[[0]]}_{[[1]]}", options: "rmA"
+ },
+ {trigger: "xnn", replacement: "x_{n}", options: "mA"
+ },
+ {trigger: "xii", replacement: "x_{i}", options: "mA"
+ },
+ {trigger: "xjj", replacement: "x_{j}", options: "mA"
+ },
+ {trigger: "xp1", replacement: "x_{n+1}", options: "mA"
+ },
+ {trigger: "ynn", replacement: "y_{n}", options: "mA"
+ },
+ {trigger: "yii", replacement: "y_{i}", options: "mA"
+ },
+ {trigger: "yjj", replacement: "y_{j}", options: "mA"
+ },
+ // Symbols
+ {trigger: "ooo", replacement: "\\infty", options: "mA"
+ },
+ {trigger: "sum", replacement: "\\sum", options: "mA"
+ },
+ {trigger: "prod", replacement: "\\prod", options: "mA"
+ },
+ {trigger: "\\sum", replacement: "\\sum_{${0:i}=${1:1}}^{${2:N}} $3", options: "m"
+ },
+ {trigger: "\\prod", replacement: "\\prod_{${0:i}=${1:1}}^{${2:N}} $3", options: "m"
+ },
+ {trigger: "lim", replacement: "\\lim_{ ${0:n} \\to ${1:\\infty} } $2", options: "mA"
+ },
+ {trigger: "+-", replacement: "\\pm", options: "mA"
+ },
+ {trigger: "-+", replacement: "\\mp", options: "mA"
+ },
+ {trigger: "...", replacement: "\\dots", options: "mA"
+ },
+ {trigger: "nabl", replacement: "\\nabla", options: "mA"
+ },
+ {trigger: "del", replacement: "\\nabla", options: "mA"
+ },
+ {trigger: "xx", replacement: "\\times", options: "mA"
+ },
+ {trigger: "**", replacement: "\\cdot", options: "mA"
+ },
+ {trigger: "para", replacement: "\\parallel", options: "mA"
+ },
+ {trigger: "===", replacement: "\\equiv", options: "mA"
+ },
+ {trigger: "!=", replacement: "\\neq", options: "mA"
+ },
+ {trigger: ">=", replacement: "\\geq", options: "mA"
+ },
+ {trigger: "<=", replacement: "\\leq", options: "mA"
+ },
+ {trigger: ">>", replacement: "\\gg", options: "mA"
+ },
+ {trigger: "<<", replacement: "\\ll", options: "mA"
+ },
+ {trigger: "simm", replacement: "\\sim", options: "mA"
+ },
+ {trigger: "sim=", replacement: "\\simeq", options: "mA"
+ },
+ {trigger: "prop", replacement: "\\propto", options: "mA"
+ },
+ {trigger: "<->", replacement: "\\leftrightarrow ", options: "mA"
+ },
+ {trigger: "->", replacement: "\\to", options: "mA"
+ },
+ {trigger: "!>", replacement: "\\mapsto", options: "mA"
+ },
+ {trigger: "=>", replacement: "\\implies", options: "mA"
+ },
+ {trigger: "=<", replacement: "\\impliedby", options: "mA"
+ },
+ {trigger: "and", replacement: "\\cap", options: "mA"
+ },
+ {trigger: "orr", replacement: "\\cup", options: "mA"
+ },
+ {trigger: "inn", replacement: "\\in", options: "mA"
+ },
+ {trigger: "notin", replacement: "\\not\\in", options: "mA"
+ },
+ {trigger: "\\\\\\", replacement: "\\setminus", options: "mA"
+ },
+ {trigger: "sub=", replacement: "\\subseteq", options: "mA"
+ },
+ {trigger: "sup=", replacement: "\\supseteq", options: "mA"
+ },
+ {trigger: "eset", replacement: "\\emptyset", options: "mA"
+ },
+ {trigger: "set", replacement: "\\{ $0 \\}$1", options: "mA"
+ },
+ {trigger: "e\\xi sts", replacement: "\\exists", options: "mA", priority: 1
+ },
+ {trigger: "LL", replacement: "\\mathcal{L}", options: "mA"
+ },
+ {trigger: "HH", replacement: "\\mathcal{H}", options: "mA"
+ },
+ {trigger: "CC", replacement: "\\mathbb{C}", options: "mA"
+ },
+ {trigger: "RR", replacement: "\\mathbb{R}", options: "mA"
+ },
+ {trigger: "ZZ", replacement: "\\mathbb{Z}", options: "mA"
+ },
+ {trigger: "NN", replacement: "\\mathbb{N}", options: "mA"
+ },
+ // Handle spaces and backslashes
+ // Snippet variables can be used as shortcuts when writing snippets.
+ // For example, ${GREEK} below is shorthand for "alpha|beta|gamma|Gamma|delta|..."
+ // You can edit snippet variables under the Advanced snippet settings section.
+ {trigger: "([^\\\\])(${GREEK})", replacement: "[[0]]\\[[1]]", options: "rmA", description: "Add backslash before Greek letters"
+ },
+ {trigger: "([^\\\\])(${SYMBOL})", replacement: "[[0]]\\[[1]]", options: "rmA", description: "Add backslash before symbols"
+ },
+ // Insert space after Greek letters and symbols
+ {trigger: "\\\\(${GREEK}|${SYMBOL}|${MORE_SYMBOLS})([A-Za-z])", replacement: "\\[[0]] [[1]]", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) sr", replacement: "\\[[0]]^{2}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) cb", replacement: "\\[[0]]^{3}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) rd", replacement: "\\[[0]]^{$0}$1", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) hat", replacement: "\\hat{\\[[0]]}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) dot", replacement: "\\dot{\\[[0]]}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) bar", replacement: "\\bar{\\[[0]]}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) vec", replacement: "\\vec{\\[[0]]}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) tilde", replacement: "\\tilde{\\[[0]]}", options: "rmA"
+ },
+ {trigger: "\\\\(${GREEK}|${SYMBOL}) und", replacement: "\\underline{\\[[0]]}", options: "rmA"
+ },
+ // Derivatives and integrals
+ {trigger: "par", replacement: "\\frac{ \\partial ${0:y} }{ \\partial ${1:x} } $2", options: "m"
+ },
+ {trigger: /pa([A-Za-z
+ ])([A-Za-z
+ ])/, replacement: "\\frac{ \\partial [[0]] }{ \\partial [[1]] } ", options: "rm"
+ },
+ {trigger: "ddt", replacement: "\\frac{d}{dt} ", options: "mA"
+ },
+ {trigger: /([^\\
+ ])int/, replacement: "[[0]]\\int", options: "mA", priority: -1
+ },
+ {trigger: "\\int", replacement: "\\int $0 \\, d${1:x} $2", options: "m"
+ },
+ {trigger: "dint", replacement: "\\int_{${0:0}}^{${1:1}} $2 \\, d${3:x} $4", options: "mA"
+ },
+ {trigger: "oint", replacement: "\\oint", options: "mA"
+ },
+ {trigger: "iint", replacement: "\\iint", options: "mA"
+ },
+ {trigger: "iiint", replacement: "\\iiint", options: "mA"
+ },
+ {trigger: "oinf", replacement: "\\int_{0}^{\\infty} $0 \\, d${1:x} $2", options: "mA"
+ },
+ {trigger: "infi", replacement: "\\int_{-\\infty}^{\\infty} $0 \\, d${1:x} $2", options: "mA"
+ },
+ // Trigonometry
+ {trigger: /([^\\
+ ])(arcsin|sin|arccos|cos|arctan|tan|csc|sec|cot)/, replacement: "[[0]]\\[[1]]", options: "rmA", description: "Add backslash before trig funcs"
+ },
+ {trigger: /\\(arcsin|sin|arccos|cos|arctan|tan|csc|sec|cot)([A-Za-gi-z
+ ])/,
+ replacement: "\\[[0]] [[1]]", options: "rmA",
+ description: "Add space after trig funcs. Skips letter h to allow sinh, cosh, etc."
+ },
+ {trigger: /\\(sinh|cosh|tanh|coth)([A-Za-z
+ ])/,
+ replacement: "\\[[0]] [[1]]", options: "rmA",
+ description: "Add space after hyperbolic trig funcs"
+ },
+ // Visual operations
+ {trigger: "U", replacement: "\\underbrace{ ${VISUAL} }_{ $0 }", options: "mA"
+ },
+ {trigger: "O", replacement: "\\overbrace{ ${VISUAL} }^{ $0 }", options: "mA"
+ },
+ {trigger: "B", replacement: "\\underset{ $0 }{ ${VISUAL} }", options: "mA"
+ },
+ {trigger: "C", replacement: "\\cancel{ ${VISUAL} }", options: "mA"
+ },
+ {trigger: "K", replacement: "\\cancelto{ $0 }{ ${VISUAL} }", options: "mA"
+ },
+ {trigger: "S", replacement: "\\sqrt{ ${VISUAL} }", options: "mA"
+ },
+ // Physics
+ {trigger: "kbt", replacement: "k_{B}T", options: "mA"
+ },
+ {trigger: "msun", replacement: "M_{\\odot}", options: "mA"
+ },
+ // Quantum mechanics
+ {trigger: "dag", replacement: "^{\\dagger}", options: "mA"
+ },
+ {trigger: "o+", replacement: "\\oplus ", options: "mA"
+ },
+ {trigger: "ox", replacement: "\\otimes ", options: "mA"
+ },
+ {trigger: "bra", replacement: "\\bra{$0} $1", options: "mA"
+ },
+ {trigger: "ket", replacement: "\\ket{$0} $1", options: "mA"
+ },
+ {trigger: "brk", replacement: "\\braket{ $0 | $1 } $2", options: "mA"
+ },
+ {trigger: "outer", replacement: "\\ket{${0:\\psi}} \\bra{${0:\\psi}} $1", options: "mA"
+ },
+ // Chemistry
+ {trigger: "pu", replacement: "\\pu{ $0 }", options: "mA"
+ },
+ {trigger: "cee", replacement: "\\ce{ $0 }", options: "mA"
+ },
+ {trigger: "he4", replacement: "{}^{4}_{2}He ", options: "mA"
+ },
+ {trigger: "he3", replacement: "{}^{3}_{2}He ", options: "mA"
+ },
+ {trigger: "iso", replacement: "{}^{${0:4}}_{${1:2}}${2:He}", options: "mA"
+ },
+ // Environments
+ {trigger: "pmat", replacement: "\\begin{pmatrix}\n$0\n\\end{pmatrix}", options: "MA"
+ },
+ {trigger: "bmat", replacement: "\\begin{bmatrix}\n$0\n\\end{bmatrix}", options: "MA"
+ },
+ {trigger: "Bmat", replacement: "\\begin{Bmatrix}\n$0\n\\end{Bmatrix}", options: "MA"
+ },
+ {trigger: "vmat", replacement: "\\begin{vmatrix}\n$0\n\\end{vmatrix}", options: "MA"
+ },
+ {trigger: "Vmat", replacement: "\\begin{Vmatrix}\n$0\n\\end{Vmatrix}", options: "MA"
+ },
+ {trigger: "matrix", replacement: "\\begin{matrix}\n$0\n\\end{matrix}", options: "MA"
+ },
+ {trigger: "pmat", replacement: "\\begin{pmatrix}$0\\end{pmatrix}", options: "nA"
+ },
+ {trigger: "bmat", replacement: "\\begin{bmatrix}$0\\end{bmatrix}", options: "nA"
+ },
+ {trigger: "Bmat", replacement: "\\begin{Bmatrix}$0\\end{Bmatrix}", options: "nA"
+ },
+ {trigger: "vmat", replacement: "\\begin{vmatrix}$0\\end{vmatrix}", options: "nA"
+ },
+ {trigger: "Vmat", replacement: "\\begin{Vmatrix}$0\\end{Vmatrix}", options: "nA"
+ },
+ {trigger: "matrix", replacement: "\\begin{matrix}$0\\end{matrix}", options: "nA"
+ },
+ {trigger: "cases", replacement: "\\begin{cases}\n$0\n\\end{cases}", options: "mA"
+ },
+ {trigger: "align", replacement: "\\begin{align}\n$0\n\\end{align}", options: "mA"
+ },
+ {trigger: "array", replacement: "\\begin{array}\n$0\n\\end{array}", options: "mA"
+ },
+ // Brackets
+ {trigger: "avg", replacement: "\\langle $0 \\rangle $1", options: "mA"
+ },
+ {trigger: "norm", replacement: "\\lvert $0 \\rvert $1", options: "mA", priority: 1
+ },
+ {trigger: "Norm", replacement: "\\lVert $0 \\rVert $1", options: "mA", priority: 1
+ },
+ {trigger: "ceil", replacement: "\\lceil $0 \\rceil $1", options: "mA"
+ },
+ {trigger: "floor", replacement: "\\lfloor $0 \\rfloor $1", options: "mA"
+ },
+ {trigger: "mod", replacement: "|$0|$1", options: "mA"
+ },
+ {trigger: "(", replacement: "(${VISUAL})", options: "mA"
+ },
+ {trigger: "[", replacement: "[${VISUAL}]", options: "mA"
+ },
+ {trigger: "{", replacement: "{${VISUAL}}", options: "mA"
+ },
+ {trigger: "(", replacement: "($0)$1", options: "mA"
+ },
+ {trigger: "{", replacement: "{$0}$1", options: "mA"
+ },
+ {trigger: "[", replacement: "[$0]$1", options: "mA"
+ },
+ {trigger: "lr(", replacement: "\\left( $0 \\right) $1", options: "mA"
+ },
+ {trigger: "lr{", replacement: "\\left\\{ $0 \\right\\} $1", options: "mA"
+ },
+ {trigger: "lr[", replacement: "\\left[ $0 \\right] $1", options: "mA"
+ },
+ {trigger: "lr|", replacement: "\\left| $0 \\right| $1", options: "mA"
+ },
+ {trigger: "lra", replacement: "\\left< $0 \\right> $1", options: "mA"
+ },
+ // User defined
+ {trigger: "b\\otimes ed", replacement: "\\boxed{$1}", options: "mA"
+ },
+ {trigger: "\\disp", replacement: "\\displaystyle $0", options: "mA"
+ },
+ // Misc
+ // Automatically convert standalone letters in text to math (except a, A, I).
+ // (Un-comment to enable)
+ // {trigger: /([^'])\b([B-HJ-Zb-z])\b([\n\s.,?!:'])/, replacement: "[[0]]$[[1]]$[[2]]", options: "tA"},
+ // Automatically convert Greek letters in text to math.
+ // {trigger: "(${GREEK})([\\n\\s.,?!:'])", replacement: "$\\[[0]]$[[1]]", options: "rtAw"},
+ // Automatically convert text of the form "x=2" and "x=n+1" to math.
+ // {trigger: /([A-Za-z]=\d+)([\n\s.,?!:'])/, replacement: "$[[0]]$[[1]]", options: "rtAw"},
+ // {trigger: /([A-Za-z]=[A-Za-z][+-]\d+)([\n\s.,?!:'])/, replacement: "$[[0]]$[[1]]", options: "tAw"},
+ // Snippet replacements can have placeholders.
+ {trigger: "tayl", replacement: "${0:f}(${1:x} + ${2:h}) = ${0:f}(${1:x}) + ${0:f}'(${1:x})${2:h} + ${0:f}''(${1:x}) \\frac{${2:h}^{2}}{2!} + \\dots$3", options: "mA", description: "Taylor expansion"
+ },
+ // Snippet replacements can also be JavaScript functions.
+ // See the documentation for more information.
+ {trigger: /iden(\d)/, replacement: (match) => {
+ const n = match[
+ 1
+ ];
+
+ let arr = [];
+ for (let j = 0; j < n; j++) {
+ arr[j
+ ] = [];
+ for (let i = 0; i < n; i++) {
+ arr[j
+ ][i
+ ] = (i === j) ? 1 : 0;
+ }
+ }
+
+ let output = arr.map(el => el.join(" & ")).join(" \\\\\n");
+ output = `\\begin{pmatrix
+ }\n${output
+ }\n\\end{pmatrix
+ }`;
+ return output;
+ }, options: "mA", description: "N x N identity matrix"
+ },
+]
diff --git a/tools/obsidian/obsidian.vimrc b/tools/obsidian/obsidian.vimrc
new file mode 100644
index 0000000..db4a0cc
--- /dev/null
+++ b/tools/obsidian/obsidian.vimrc
@@ -0,0 +1,111 @@
+" Put this in OBSIDIAN_VAULT/.obsidian.vimrc
+set clipboard=unnamed " Sync with System Clipboard
+
+" Colemak vim-like
+noremap n j
+noremap e k
+noremap i l
+
+" Similar position to i
+noremap l i
+noremap L I
+" ne[k]st
+noremap k n
+noremap K N
+" [j]ump
+noremap j e
+noremap J E
+
+" Y to yank to end of line
+noremap Y y$
+
+""" Visual mode surrounding
+exmap addbold obcommand editor:toogle-bold
+exmap additalic obcommand editor:toogle-italic
+exmap addhighlight obcommand editor:toogle-highlight
+exmap addcode obcommand editor:toogle-code
+exmap adddel obcommand editor:toogle-strikethrough
+vnoremap ~ :adddel " Add delete to selection
+vnoremap ` c`"` " editor:toogle-code is buggy
+vnoremap * :addbold " Add bold to selection
+vnoremap _ :additalic " Add italic to selection
+vnoremap = :addhighlight " Add highlight to selection
+
+""" Commands
+exmap write editor:save-file
+exmap w editor:save-file
+exmap q workspace:close-tab-group
+
+exmap prevtab obcommand workspace:previous-tab
+exmap nexttab obcommand workspace:next-tab
+nnoremap H :prevtab
+nnoremap I :nexttab
+
+exmap prevhist obcommand app:go-back
+exmap nexthist obcommand app:go-forward
+nnoremap gh :prevhist
+nnoremap gi :nexthist
+
+exmap reload :source .obsidian.vimrc
+
+unmap
+exmap vsplit obcommand workspace:split-vertical
+exmap hsplit obcommand workspace:split-horizontal
+map | :vsplit
+map - :hsplit
+" map bd
+
+exmap chat obcommand obsidian-custom-frames:open-custom-frames-chatgpt
+map ai :chat
+
+
+
+""" g-commands
+exmap tsource obcommand editor:toggle-source
+exmap tpreview obcommand markdown:toggle-preview
+nnoremap gs :tsource
+nnoremap gp :tpreview
+
+exmap wl obcommand editor:focus-left
+exmap wr obcommand editor:focus-right
+exmap wt obcommand editor:focus-top
+exmap wb obcommand editor:focus-bottom
+
+map h :wl
+map i :wr
+map n :wb
+map e :wt
+
+exmap FoldToggle obcommand editor:toggle-fold
+exmap FoldLess obcommand editor:fold-less
+exmap FoldMore obcommand editor:fold-more
+exmap FoldAll obcommand editor:fold-all
+exmap UnfoldAll obcommand editor:unfold-all
+nnoremap za :FoldToggle
+nnoremap zr :FoldLess
+nnoremap zm :FoldMore
+nnoremap zM :FoldAll
+nnoremap zR :UnfoldAll
+
+exmap switchany obcommand darlal-switcher-plus:switcher-plus:open
+exmap switchcmd obcommand darlal-switcher-plus:switcher-plus:open-commands
+exmap switchrecent obcommand darlal-switcher-plus:switcher-plus:open-related-items
+map :switchany
+map : :switchcmd
+map fr :switchrecent
+
+" b : +buffer
+exmap bd obcommand
+exmap DeleteOthers obcommand workspace:close-others
+map bd :bd
+map bX :DeleteOthers
+
+" m : +major/markdown
+exmap addCallout obcommand editor:insert-callout
+map mb :addbold
+map mi :additalic
+map mc :addcode
+map md :adddel
+map mh :addhighlight
+map mp :tpreview
+map mo :addCallout
diff --git a/tools/powershell/Aliases.ps1 b/tools/powershell/Aliases.ps1
index b835dc0..35986f6 100644
--- a/tools/powershell/Aliases.ps1
+++ b/tools/powershell/Aliases.ps1
@@ -1,6 +1,6 @@
# $DOTFILES/tools\powershell\Aliases.ps1
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# Aliases for PowerShell
### VARIABLES ###
$EDITOR = "code"
@@ -29,3 +29,7 @@ function cdls { param( [string] $dirname) Set-Location $dirname && Get-ChildItem
# Python & Conda #
Set-Alias "py" "python"
Set-Alias "ipy" "ipython"
+
+if ($isWindows) {
+function kex { wsl -d kali-linux kex --sl -s }
+}
diff --git a/tools/powershell/Environment.ps1 b/tools/powershell/Environment.ps1
index cf43c80..dad0a92 100644
--- a/tools/powershell/Environment.ps1
+++ b/tools/powershell/Environment.ps1
@@ -1,6 +1,6 @@
# $DOTFILES/tools\powershell\Environment.ps1
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by Microsoft.PowerShell_profile.ps1
diff --git a/tools/powershell/Prompt.ps1 b/tools/powershell/Prompt.ps1
index e34817b..9f43a8a 100644
--- a/tools/powershell/Prompt.ps1
+++ b/tools/powershell/Prompt.ps1
@@ -1,6 +1,6 @@
# $DOTFILES/tools\powershell\Prompt.ps1
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# Use starship to set prompt
$ENV:STARSHIP_CONFIG = Join-Path $DOTFILES "tools" "starship" "starship_pwsh.toml"
diff --git a/tools/starship/starship_fish.toml b/tools/starship/starship_fish.toml
new file mode 100644
index 0000000..fb8f6f1
--- /dev/null
+++ b/tools/starship/starship_fish.toml
@@ -0,0 +1,208 @@
+# starship.toml
+# ~/.config/starship.toml
+format = '''$os$time $username @ $hostname $directory $all$character'''
+continuation_prompt = "[r % ](bold cyan) " # Doesn't work in fish
+
+add_newline = true
+
+[time]
+disabled = false
+format = '[\[$time\]](purple)'
+time_format = '%H:%M'
+
+[username]
+format = '[$user](bold)'
+show_always = true
+
+[hostname]
+ssh_only = false
+ssh_symbol = ' '
+
+[character]
+success_symbol = "[ >](bold green)"
+error_symbol = "[ >](bold red)"
+vimcmd_symbol = "[ <](bold green)"
+
+[directory]
+truncation_length = 2
+truncate_to_repo = true
+read_only = " "
+style = "bold cyan"
+truncation_symbol = ".../"
+
+[directory.substitutions]
+"~/Documents" = " "
+"~/Downloads" = " "
+"~/Music" = " "
+"~/Pictures" = " "
+"Source" = " "
+"src" = " "
+
+[aws]
+symbol = " "
+
+[buf]
+symbol = " "
+
+[c]
+symbol = " "
+
+[conda]
+symbol = " "
+
+[crystal]
+symbol = " "
+
+[dart]
+symbol = " "
+
+
+[docker_context]
+symbol = " "
+
+[elixir]
+symbol = " "
+
+[elm]
+symbol = " "
+
+[fennel]
+symbol = " "
+
+[fossil_branch]
+symbol = " "
+
+[git_branch]
+symbol = " "
+
+[git_commit]
+tag_symbol = ' '
+
+[golang]
+symbol = " "
+
+[guix_shell]
+symbol = " "
+
+[haskell]
+symbol = " "
+
+[haxe]
+symbol = " "
+
+[hg_branch]
+symbol = " "
+
+[java]
+symbol = " "
+
+[julia]
+symbol = " "
+
+[kotlin]
+symbol = " "
+
+[lua]
+symbol = " "
+
+[memory_usage]
+symbol = " "
+
+[meson]
+symbol = " "
+
+[nim]
+symbol = " "
+
+[nix_shell]
+symbol = " "
+
+[nodejs]
+symbol = " "
+
+[ocaml]
+symbol = " "
+
+[os]
+disabled = false
+
+[os.symbols]
+Alpaquita = " "
+Alpine = " "
+AlmaLinux = " "
+Amazon = " "
+Android = " "
+Arch = " "
+Artix = " "
+CentOS = " "
+Debian = " "
+DragonFly = " "
+Emscripten = " "
+EndeavourOS = " "
+Fedora = " "
+FreeBSD = " "
+Garuda = " "
+Gentoo = " "
+HardenedBSD = " "
+Illumos = " "
+Kali = " "
+Linux = " "
+Mabox = " "
+Macos = " "
+Manjaro = " "
+Mariner = " "
+MidnightBSD = " "
+Mint = " "
+NetBSD = " "
+NixOS = " "
+OpenBSD = " "
+openSUSE = " "
+OracleLinux = " "
+Pop = " "
+Raspbian = " "
+Redhat = " "
+RedHatEnterprise = " "
+RockyLinux = " "
+Redox = " "
+Solus = " "
+SUSE = " "
+Ubuntu = " "
+Unknown = " "
+Void = " "
+Windows = " "
+
+[package]
+symbol = " "
+
+[perl]
+symbol = " "
+
+[php]
+symbol = " "
+
+[pijul_channel]
+symbol = " "
+
+[python]
+symbol = " "
+
+[rlang]
+symbol = " "
+
+[ruby]
+symbol = " "
+
+[rust]
+symbol = " "
+
+[scala]
+symbol = " "
+
+[swift]
+symbol = " "
+
+[zig]
+symbol = " "
+
+[gradle]
+symbol = " "
diff --git a/tools/starship/starship_zsh.toml b/tools/starship/starship_zsh.toml
index 6308e99..2880b83 100644
--- a/tools/starship/starship_zsh.toml
+++ b/tools/starship/starship_zsh.toml
@@ -28,7 +28,8 @@ truncation_length = 2
truncate_to_repo = true
read_only = " "
style ="bold cyan"
-truncation_symbol = ".../"
+truncation_symbol = ":"
+fish_style_pwd_dir_length = 1
[directory.substitutions]
"~/Documents" = " "
diff --git a/tools/vscode/keybindings.json b/tools/vscode/keybindings.json
index de4390b..77fd805 100644
--- a/tools/vscode/keybindings.json
+++ b/tools/vscode/keybindings.json
@@ -1,485 +1,487 @@
// Place your key bindings in this file to override the defaultsauto[]
[
- // #region quickOpen (Telescope)
- { // Telescope emulator
- "key": "space space",
- "command": "workbench.action.quickOpen",
- "when": "!editorFocus && !inputFocus"
- },
- {
- "key": "ctrl+p",
- "command": "workbench.action.quickOpen"
- },
- {
- "key": "ctrl+e",
- "command": "workbench.action.quickOpenNavigatePrevious",
- "when": "inQuickOpen"
- },
- {
- "key": "ctrl+n",
- "command": "workbench.action.quickOpenNavigateNext",
- "when": "inQuickOpen"
- },
- {
- "key": "ctrl+[",
- "command": "workbench.action.closeQuickOpen",
- "when": "inQuickOpen"
- },
- // #endregion
- // #region plugin: code runner
- {
- "key": "ctrl+alt+n",
- "command": "-code-runner.run"
- },
- // #endregion
- {
- "key": "ctrl+oem_1", // ctrl+;
- "command": "extension.insertSemicolon",
- "when": "editorTextFocus"
- },
- { // change to toggle comment
- "key": "ctrl+oem_2", // ctrl+/;
- "command": "-extension.insertSemicolon",
- "when": "editorTextFocus"
- },
- {
- "key": "ctrl+shift+oem_1",
- "command": "extension.insertSemicolonWithNewLine",
- "when": "editorTextFocus"
- },
- {
- "key": "ctrl+shift+oem_2",
- "command": "-extension.insertSemicolonWithNewLine",
- "when": "editorTextFocus"
- },
- {
- "key": "ctrl+shift+oem_2",
- "command": "github.copilot.acceptCursorPanelSolution",
- "when": "github.copilot.activated && github.copilot.panelVisible"
- },
- {
- "key": "ctrl+oem_2",
- "command": "-github.copilot.acceptCursorPanelSolution",
- "when": "github.copilot.activated && github.copilot.panelVisible"
- },
- {
- "key": "f9",
- "command": "csdevkit.debug.noDebugFileLaunch"
- },
- {
- "key": "ctrl+h",
- "command": "-editor.action.startFindReplaceAction",
- "when": "editorFocus || editorIsOpen"
- },
- {
- "key": "ctrl+h",
- "command": "-extension.vim_ctrl+h",
- "when": "editorTextFocus && vim.active && vim.use && !inDebugRepl"
- },
- {
- "key": "ctrl+r",
- "command": "-workbench.action.reloadWindow",
- "when": "isDevelopment"
- },
- {
- "key": "ctrl+alt+r",
- "command": "-workbench.action.terminal.runRecentCommand",
- "when": "terminalFocus && terminalHasBeenCreated && !accessibilityModeEnabled || terminalFocus && terminalProcessSupported && !accessibilityModeEnabled"
- },
- {
- "key": "ctrl+r",
- "command": "-workbench.action.terminal.runRecentCommand",
- "when": "accessibilityModeEnabled && terminalFocus && terminalHasBeenCreated || accessibilityModeEnabled && terminalFocus && terminalProcessSupported || accessibilityModeEnabled && accessibleViewIsShown && terminalHasBeenCreated && accessibleViewCurrentProviderId == 'terminal' || accessibilityModeEnabled && accessibleViewIsShown && terminalProcessSupported && accessibleViewCurrentProviderId == 'terminal'"
- },
- {
- "key": "ctrl+shift+r",
- "command": "-rerunSearchEditorSearch",
- "when": "inSearchEditor"
- },
- {
- "key": "ctrl+shift+r",
- "command": "-editor.action.refactor",
- "when": "editorHasCodeActionsProvider && textInputFocus && !editorReadonly"
- },
- {
- "key": "ctrl+shift+r",
- "command": "-workbench.action.quickOpenNavigatePreviousInRecentFilesPicker",
- "when": "inQuickOpen && inRecentFilesPicker"
- },
- {
- "key": "ctrl+e",
- "command": "cursorEnd",
- "when": "textInputFocus"
- },
- // #region Nvim-Tree like File Explorer
- // n, e : move cursor up/down
- // h : move cursor to parent folder
- // l : open file or folder
- { // z: Close all folders
- "key": "z",
- "command": "workbench.files.action.collapseExplorerFolders",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // e: Close left sidebar if is in file explorer
- "key": "space e",
- "command": "workbench.action.toggleSidebarVisibility",
- "when": "sideBarFocus && !inputFocus && !searchViewletVisible && filesExplorerFocus"
- },
- { // e: Focus on file explorer if is on sidebar and not in file explorer
- "key": "space e",
- "command": "workbench.files.action.focusFilesExplorer",
- "when": "sideBarFocus && !inputFocus && !searchViewletVisible && !filesExplorerFocus"
- },
- { // g: Focus on file explorer if is on sidebar and not in file explorer
- "key": "space g",
- "command": "workbench.scm.focus",
- "when": "sideBarFocus && !inputFocus && !searchViewletVisible && !scmViewletVisible"
- },
- { // a: add
- "key": "a",
- "command": "explorer.newFile",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // p: paste
- "key": "p",
- "command": "filesExplorer.paste",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // x: cut
- "key": "x",
- "command": "filesExplorer.cut",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // d: delete
- "key": "d",
- "command": "deleteFile",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // r: rename
- "key": "r",
- "command": "renameFile",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // s: open in vertical split / to side
- "key": "s",
- "command": "explorer.openToSide",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // A: add folder
- "key": "shift+a",
- "command": "explorer.newFolder",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // C: Copy path
- "key": "shift+c",
- "command": "copyFilePath",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // E: Open in File Explorer
- "key": "shift+e",
- "command": "revealFileInOS",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // E: Open in File Explorer (WSL)
- "key": "shift+e",
- "command": "remote-wsl.revealInExplorer",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus && remoteName == 'wsl'"
- },
- { // O: Open with System App
- "key": "shift+o",
- "command": "openInExternalApp.open",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // Y: Copy Relative Path
- "key": "shift+y",
- "command": "copyRelativeFilePath",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // R: Copy Relative Path
- "key": "shift+r",
- "command": "workbench.files.action.refreshFilesExplorer",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- { // T: Open in terminal
- "key": "shift+t",
- "command": "openInIntegratedTerminal",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- // #endregion
- {
- "key": "ctrl+p",
- "command": "workbench.action.files.openFileFolder",
- "when": "isMacNative && openFolderWorkspaceSupport"
- },
- {
- "key": "ctrl+o",
- "command": "-workbench.action.files.openFileFolder",
- "when": "isMacNative && openFolderWorkspaceSupport"
- },
- {
- "key": "ctrl+p",
- "command": "-extension.vim_ctrl+p",
- "when": "editorTextFocus && vim.active && vim.use && !inDebugRepl || vim.active && vim.use && !inDebugRepl && vim.mode == 'CommandlineInProgress' || vim.active && vim.use && !inDebugRepl && vim.mode == 'SearchInProgressMode'"
- },
- {
- "key": "ctrl+o",
- "command": "-workbench.action.files.openFolderViaWorkspace",
- "when": "!openFolderWorkspaceSupport && workbenchState == 'workspace'"
- },
- // #region Vim-like Hover Browsing
- {
- "key": "h",
- "command": "editor.action.scrollLeftHover",
- "when": "editorHoverFocused"
- },
- {
- "key": "n",
- "command": "editor.action.scrollDownHover",
- "when": "editorHoverFocused"
- },
- {
- "key": "e",
- "command": "editor.action.scrollUpHover",
- "when": "editorHoverFocused"
- },
- {
- "key": "i",
- "command": "editor.action.scrollRightHover",
- "when": "editorHoverFocused"
- },
- // #endregion
- // #region Vim-like Jupyter Navigation
- {
- "key": "n",
- "command": "notebook.focusNextEditor",
- "when": "editorTextFocus && inputFocus && notebookEditorFocused && vim.mode == 'Normal' && notebookEditorCursorAtBoundary != 'none' && notebookEditorCursorAtBoundary != 'top'"
- },
- {
- "key": "j",
- "command": "-notebook.focusNextEditor",
- "when": "editorTextFocus && inputFocus && notebookEditorFocused && vim.mode == 'Normal' && notebookEditorCursorAtBoundary != 'none' && notebookEditorCursorAtBoundary != 'top'"
- },
- {
- "key": "e",
- "command": "notebook.focusPreviousEditor",
- "when": "editorTextFocus && inputFocus && notebookEditorFocused && vim.mode == 'Normal' && notebookEditorCursorAtBoundary != 'bottom' && notebookEditorCursorAtBoundary != 'none'"
- },
- {
- "key": "k",
- "command": "-notebook.focusPreviousEditor",
- "when": "editorTextFocus && inputFocus && notebookEditorFocused && vim.mode == 'Normal' && notebookEditorCursorAtBoundary != 'bottom' && notebookEditorCursorAtBoundary != 'none'"
- },
- // #endregion
- {
- "key": "e",
- "command": "list.focusUp",
- "when": "notebookEditorFocused && !inputFocus && !notebookOutputInputFocused"
- },
- {
- "key": "k",
- "command": "-list.focusUp",
- "when": "notebookEditorFocused && !inputFocus && !notebookOutputInputFocused"
- },
- {
- "key": "e",
- "command": "list.focusUp",
- "when": "listFocus && !inputFocus"
- },
- {
- "key": "k",
- "command": "-list.focusUp",
- "when": "listFocus && !inputFocus"
- },
- {
- "key": "f",
- "command": "filesExplorer.findInWorkspace",
- "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
- },
- {
- "key": "n",
- "command": "list.focusDown",
- "when": "listFocus && !inputFocus"
- },
- {
- "key": "j",
- "command": "-list.focusDown",
- "when": "listFocus && !inputFocus"
- },
- {
- "key": "i",
- "command": "list.select",
- "when": "listFocus && !inputFocus"
- },
- {
- "key": "l",
- "command": "-list.select",
- "when": "listFocus && !inputFocus"
- },
- {
- "key": "ctrl+shift+g c",
- "command": "-gitlens.showQuickCommitFileDetails",
- "when": "editorTextFocus && !gitlens:disabled && config.gitlens.keymap == 'chorded'"
- },
- {
- "key": "ctrl+shift+g s",
- "command": "git.stageAll"
- },
- {
- "key": "ctrl+shift+g g",
- "command": "workbench.view.scm",
- "when": "workbench.scm.active"
- },
- {
- "key": "ctrl+shift+g",
- "command": "-workbench.view.scm",
- "when": "workbench.scm.active"
- },
- {
- "key": "ctrl+k ctrl+shift+b",
- "command": "editor.action.goToSelectionAnchor"
- },
- {
- "key": "ctrl+k ctrl+shift+i",
- "command": "workbench.action.selectProductIconTheme"
- },
- {
- "key": "ctrl+l p",
- "command": "-extension.openPrGitProvider"
- },
- {
- "key": "ctrl+l g",
- "command": "-extension.openInGitHub"
- },
- {
- "key": "ctrl+l c",
- "command": "-extension.copyGitHubLinkToClipboard"
- },
- // #region Use ^n ^e to navigate completions
- {
- "key": "ctrl+n",
- "command": "workbench.action.files.newUntitledFile",
- "when": "!suggestWidgetVisible && !inQuickOpen"
- },
- {
- "key": "ctrl+n",
- "command": "-workbench.action.files.newUntitledFile"
- },
- {
- "key": "ctrl+n",
- "command": "selectNextSuggestion",
- "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus || suggestWidgetVisible && textInputFocus && !suggestWidgetHasFocusedSuggestion"
- },
- {
- "key": "ctrl+e",
- "command": "selectPrevSuggestion",
- "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus || suggestWidgetVisible && textInputFocus && !suggestWidgetHasFocusedSuggestion"
- },
- // #endregion
- // #region Terminal Control, use ^a as prefix / leader key
- // tmux-like terminal control
- { // prefix + x : kill terminal
- "key": "ctrl+a x",
- "command": "workbench.action.terminal.kill",
- "when": "terminalFocus"
- },
- { // prefix + c : create new terminal
- "key": "ctrl+a c",
- "command": "workbench.action.terminal.new",
- "when": "terminalFocus"
- },
- { // prefix + | : split terminal vertically
- "key": "ctrl+a shift+\\",
- "command": "workbench.action.terminal.split",
- "when": "terminalFocus"
- },
- { // prefix + \ : split terminal vertically
- "key": "ctrl+a \\",
- "command": "workbench.action.terminal.split",
- "when": "terminalFocus"
- },
- { // prefix + / : search
- "key": "ctrl+a /",
- "command": "workbench.action.terminal.focusFind",
- "when": "terminalFocus"
- },
- { // prefix + t : toggle terminal
- "key": "ctrl+a t",
- "command": "workbench.action.terminal.toggleTerminal",
- "when": "terminalFocus"
- },
- { // prefix + ^a: show information
- "key": "ctrl+a ctrl+a",
- "command": "workbench.action.terminal.focusHover",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
- },
- {
- "key": "ctrl+k ctrl+i",
- "command": "-workbench.action.terminal.focusHover",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
- },
- { // prefix + 1 : focus terminal 1
- "key": "ctrl+a 1",
- "command": "workbench.action.terminal.focusAtIndex1",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
- },
- { // prefix + 2 : focus terminal 2
- "key": "ctrl+a 2",
- "command": "workbench.action.terminal.focusAtIndex2",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
- },
- { // prefix + 3 : focus terminal 3
- "key": "ctrl+a 3",
- "command": "workbench.action.terminal.focusAtIndex3",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
- },
- { // prefix + g : Go to recent directory
- "key": "ctrl+a g",
- "command": "workbench.action.terminal.goToRecentDirectory",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- },
- {
- "key": "ctrl+g",
- "command": "-workbench.action.terminal.goToRecentDirectory",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- },
- { // prefix + d : detach terminal
- "key": "ctrl+a d",
- "command": "workbench.action.terminal.detachSession",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- },
- { // prefix + a : attach to session
- "key": "ctrl+a a",
- "command": "workbench.action.terminal.attachToSession",
- "when": "terminalFocus"
- },
- {
- "key": "ctrl+a h",
- "command": "workbench.action.terminal.focusPreviousPane",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- },
- {
- "key": "ctrl+a i",
- "command": "workbench.action.terminal.focusNextPane",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- },
- {
- "key": "ctrl+a shift+H",
- "command": "workbench.action.terminal.resizePaneLeft",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- },
- {
- "key": "ctrl+a shift+N",
- "command": "workbench.action.terminal.resizePaneDown",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- },
- {
- "key": "ctrl+a shift+E",
- "command": "workbench.action.terminal.resizePaneUp",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- },
- {
- "key": "ctrl+a shift+I",
- "command": "workbench.action.terminal.resizePaneRight",
- "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
- }
+ // #region quickOpen (Telescope)
+ { // Telescope emulator
+ "key": "space space",
+ "command": "workbench.action.quickOpen",
+ "when": "!editorFocus && !inputFocus"
+ },
+ {
+ "key": "ctrl+p",
+ "command": "workbench.action.quickOpen"
+ },
+ {
+ "key": "ctrl+e",
+ "command": "workbench.action.quickOpenNavigatePrevious",
+ "when": "inQuickOpen"
+ },
+ {
+ "key": "ctrl+n",
+ "command": "workbench.action.quickOpenNavigateNext",
+ "when": "inQuickOpen"
+ },
+ {
+ "key": "ctrl+[",
+ "command": "workbench.action.closeQuickOpen",
+ "when": "inQuickOpen"
+ },
+ // #endregion
+ // #region plugin: code runner
+ {
+ "key": "ctrl+alt+n",
+ "command": "-code-runner.run"
+ },
+ // #endregion
+ // #region Comment and semicolons
+ {
+ "key": "ctrl+oem_1", // ctrl+;
+ "command": "extension.insertSemicolon",
+ "when": "editorTextFocus"
+ },
+ { // change to toggle comment
+ "key": "ctrl+oem_2", // ctrl+/;
+ "command": "-extension.insertSemicolon",
+ "when": "editorTextFocus"
+ },
+ {
+ "key": "ctrl+shift+oem_1",
+ "command": "extension.insertSemicolonWithNewLine",
+ "when": "editorTextFocus"
+ },
+ {
+ "key": "ctrl+shift+oem_2",
+ "command": "-extension.insertSemicolonWithNewLine",
+ "when": "editorTextFocus"
+ },
+ {
+ "key": "ctrl+shift+oem_2",
+ "command": "github.copilot.acceptCursorPanelSolution",
+ "when": "github.copilot.activated && github.copilot.panelVisible"
+ },
+ {
+ "key": "ctrl+oem_2",
+ "command": "-github.copilot.acceptCursorPanelSolution",
+ "when": "github.copilot.activated && github.copilot.panelVisible"
+ },
+ // #endregion
+ {
+ "key": "f9",
+ "command": "csdevkit.debug.noDebugFileLaunch"
+ },
+ {
+ "key": "ctrl+h",
+ "command": "-editor.action.startFindReplaceAction",
+ "when": "editorFocus || editorIsOpen"
+ },
+ {
+ "key": "ctrl+h",
+ "command": "-extension.vim_ctrl+h",
+ "when": "editorTextFocus && vim.active && vim.use && !inDebugRepl"
+ },
+ {
+ "key": "ctrl+r",
+ "command": "-workbench.action.reloadWindow",
+ "when": "isDevelopment"
+ },
+ {
+ "key": "ctrl+alt+r",
+ "command": "-workbench.action.terminal.runRecentCommand",
+ "when": "terminalFocus && terminalHasBeenCreated && !accessibilityModeEnabled || terminalFocus && terminalProcessSupported && !accessibilityModeEnabled"
+ },
+ {
+ "key": "ctrl+r",
+ "command": "-workbench.action.terminal.runRecentCommand",
+ "when": "accessibilityModeEnabled && terminalFocus && terminalHasBeenCreated || accessibilityModeEnabled && terminalFocus && terminalProcessSupported || accessibilityModeEnabled && accessibleViewIsShown && terminalHasBeenCreated && accessibleViewCurrentProviderId == 'terminal' || accessibilityModeEnabled && accessibleViewIsShown && terminalProcessSupported && accessibleViewCurrentProviderId == 'terminal'"
+ },
+ {
+ "key": "ctrl+shift+r",
+ "command": "-rerunSearchEditorSearch",
+ "when": "inSearchEditor"
+ },
+ {
+ "key": "ctrl+shift+r",
+ "command": "-editor.action.refactor",
+ "when": "editorHasCodeActionsProvider && textInputFocus && !editorReadonly"
+ },
+ {
+ "key": "ctrl+shift+r",
+ "command": "-workbench.action.quickOpenNavigatePreviousInRecentFilesPicker",
+ "when": "inQuickOpen && inRecentFilesPicker"
+ },
+ {
+ "key": "ctrl+e",
+ "command": "cursorEnd",
+ "when": "textInputFocus"
+ },
+ // #region Nvim-Tree like File Explorer
+ // n, e : move cursor up/down
+ // h : move cursor to parent folder
+ // i : open file or folder
+ {
+ "key": "e",
+ "command": "list.focusUp",
+ "when": "notebookEditorFocused && !inputFocus && !notebookOutputInputFocused"
+ },
+ {
+ "key": "k",
+ "command": "-list.focusUp",
+ "when": "notebookEditorFocused && !inputFocus && !notebookOutputInputFocused"
+ },
+ {
+ "key": "e",
+ "command": "list.focusUp",
+ "when": "listFocus && !inputFocus"
+ },
+ {
+ "key": "k",
+ "command": "-list.focusUp",
+ "when": "listFocus && !inputFocus"
+ },
+ {
+ "key": "f",
+ "command": "filesExplorer.findInWorkspace",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ {
+ "key": "n",
+ "command": "list.focusDown",
+ "when": "listFocus && !inputFocus"
+ },
+ {
+ "key": "j",
+ "command": "-list.focusDown",
+ "when": "listFocus && !inputFocus"
+ },
+ {
+ "key": "i",
+ "command": "list.select",
+ "when": "listFocus && !inputFocus"
+ },
+ {
+ "key": "l",
+ "command": "-list.select",
+ "when": "listFocus && !inputFocus"
+ },
+ { // z: Close all folders
+ "key": "z",
+ "command": "workbench.files.action.collapseExplorerFolders",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // e: Close left sidebar if is in file explorer
+ "key": "space e",
+ "command": "workbench.action.toggleSidebarVisibility",
+ "when": "sideBarFocus && !inputFocus && !searchViewletVisible && filesExplorerFocus"
+ },
+ { // e: Focus on file explorer if is on sidebar and not in file explorer
+ "key": "space e",
+ "command": "workbench.files.action.focusFilesExplorer",
+ "when": "sideBarFocus && !inputFocus && !searchViewletVisible && !filesExplorerFocus"
+ },
+ { // g: Focus on file explorer if is on sidebar and not in file explorer
+ "key": "space g",
+ "command": "workbench.scm.focus",
+ "when": "sideBarFocus && !inputFocus && !searchViewletVisible && !scmViewletVisible"
+ },
+ { // a: add
+ "key": "a",
+ "command": "explorer.newFile",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // p: paste
+ "key": "p",
+ "command": "filesExplorer.paste",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // x: cut
+ "key": "x",
+ "command": "filesExplorer.cut",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // d: delete
+ "key": "d",
+ "command": "deleteFile",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // r: rename
+ "key": "r",
+ "command": "renameFile",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // s: open in vertical split / to side
+ "key": "s",
+ "command": "explorer.openToSide",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // A: add folder
+ "key": "shift+a",
+ "command": "explorer.newFolder",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // C: Copy path
+ "key": "shift+c",
+ "command": "copyFilePath",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // E: Open in File Explorer
+ "key": "shift+e",
+ "command": "revealFileInOS",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // E: Open in File Explorer (WSL)
+ "key": "shift+e",
+ "command": "remote-wsl.revealInExplorer",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus && remoteName == 'wsl'"
+ },
+ { // O: Open with System App
+ "key": "shift+o",
+ "command": "openInExternalApp.open",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // Y: Copy Relative Path
+ "key": "shift+y",
+ "command": "copyRelativeFilePath",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // R: Copy Relative Path
+ "key": "shift+r",
+ "command": "workbench.files.action.refreshFilesExplorer",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ { // T: Open in terminal
+ "key": "shift+t",
+ "command": "openInIntegratedTerminal",
+ "when": "filesExplorerFocus && foldersViewVisible && !explorerResourceIsRoot && !explorerResourceReadonly && !inputFocus"
+ },
+ // #endregion
+ {
+ "key": "ctrl+p",
+ "command": "workbench.action.files.openFileFolder",
+ "when": "isMacNative && openFolderWorkspaceSupport"
+ },
+ {
+ "key": "ctrl+o",
+ "command": "-workbench.action.files.openFileFolder",
+ "when": "isMacNative && openFolderWorkspaceSupport"
+ },
+ {
+ "key": "ctrl+p",
+ "command": "-extension.vim_ctrl+p",
+ "when": "editorTextFocus && vim.active && vim.use && !inDebugRepl || vim.active && vim.use && !inDebugRepl && vim.mode == 'CommandlineInProgress' || vim.active && vim.use && !inDebugRepl && vim.mode == 'SearchInProgressMode'"
+ },
+ {
+ "key": "ctrl+o",
+ "command": "-workbench.action.files.openFolderViaWorkspace",
+ "when": "!openFolderWorkspaceSupport && workbenchState == 'workspace'"
+ },
+ // #region Vim-like Hover Browsing
+ {
+ "key": "h",
+ "command": "editor.action.scrollLeftHover",
+ "when": "editorHoverFocused"
+ },
+ {
+ "key": "n",
+ "command": "editor.action.scrollDownHover",
+ "when": "editorHoverFocused"
+ },
+ {
+ "key": "e",
+ "command": "editor.action.scrollUpHover",
+ "when": "editorHoverFocused"
+ },
+ {
+ "key": "i",
+ "command": "editor.action.scrollRightHover",
+ "when": "editorHoverFocused"
+ },
+ // #endregion
+ // #region Vim-like Jupyter Navigation
+ {
+ "key": "n",
+ "command": "notebook.focusNextEditor",
+ "when": "editorTextFocus && inputFocus && notebookEditorFocused && vim.mode == 'Normal' && notebookEditorCursorAtBoundary != 'none' && notebookEditorCursorAtBoundary != 'top'"
+ },
+ {
+ "key": "j",
+ "command": "-notebook.focusNextEditor",
+ "when": "editorTextFocus && inputFocus && notebookEditorFocused && vim.mode == 'Normal' && notebookEditorCursorAtBoundary != 'none' && notebookEditorCursorAtBoundary != 'top'"
+ },
+ {
+ "key": "e",
+ "command": "notebook.focusPreviousEditor",
+ "when": "editorTextFocus && inputFocus && notebookEditorFocused && vim.mode == 'Normal' && notebookEditorCursorAtBoundary != 'bottom' && notebookEditorCursorAtBoundary != 'none'"
+ },
+ {
+ "key": "k",
+ "command": "-notebook.focusPreviousEditor",
+ "when": "editorTextFocus && inputFocus && notebookEditorFocused && vim.mode == 'Normal' && notebookEditorCursorAtBoundary != 'bottom' && notebookEditorCursorAtBoundary != 'none'"
+ },
+ // #endregion
+ {
+ "key": "ctrl+shift+g c",
+ "command": "-gitlens.showQuickCommitFileDetails",
+ "when": "editorTextFocus && !gitlens:disabled && config.gitlens.keymap == 'chorded'"
+ },
+ {
+ "key": "ctrl+shift+g s",
+ "command": "git.stageAll"
+ },
+ {
+ "key": "ctrl+shift+g g",
+ "command": "workbench.view.scm",
+ "when": "workbench.scm.active"
+ },
+ {
+ "key": "ctrl+shift+g",
+ "command": "-workbench.view.scm",
+ "when": "workbench.scm.active"
+ },
+ {
+ "key": "ctrl+k ctrl+shift+b",
+ "command": "editor.action.goToSelectionAnchor"
+ },
+ {
+ "key": "ctrl+k ctrl+shift+i",
+ "command": "workbench.action.selectProductIconTheme"
+ },
+ {
+ "key": "ctrl+l p",
+ "command": "-extension.openPrGitProvider"
+ },
+ {
+ "key": "ctrl+l g",
+ "command": "-extension.openInGitHub"
+ },
+ {
+ "key": "ctrl+l c",
+ "command": "-extension.copyGitHubLinkToClipboard"
+ },
+ // #region Use ^n ^e to navigate completions
+ {
+ "key": "ctrl+n",
+ "command": "workbench.action.files.newUntitledFile",
+ "when": "!suggestWidgetVisible && !inQuickOpen"
+ },
+ {
+ "key": "ctrl+n",
+ "command": "-workbench.action.files.newUntitledFile"
+ },
+ {
+ "key": "ctrl+n",
+ "command": "selectNextSuggestion",
+ "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus || suggestWidgetVisible && textInputFocus && !suggestWidgetHasFocusedSuggestion"
+ },
+ {
+ "key": "ctrl+e",
+ "command": "selectPrevSuggestion",
+ "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus || suggestWidgetVisible && textInputFocus && !suggestWidgetHasFocusedSuggestion"
+ },
+ // #endregion
+ // #region Terminal Control, use ^a as prefix / leader key
+ // tmux-like terminal control
+ { // prefix + x : kill terminal
+ "key": "ctrl+a x",
+ "command": "workbench.action.terminal.kill",
+ "when": "terminalFocus"
+ },
+ { // prefix + c : create new terminal
+ "key": "ctrl+a c",
+ "command": "workbench.action.terminal.new",
+ "when": "terminalFocus"
+ },
+ { // prefix + | : split terminal vertically
+ "key": "ctrl+a shift+\\",
+ "command": "workbench.action.terminal.split",
+ "when": "terminalFocus"
+ },
+ { // prefix + \ : split terminal vertically
+ "key": "ctrl+a \\",
+ "command": "workbench.action.terminal.split",
+ "when": "terminalFocus"
+ },
+ { // prefix + / : search
+ "key": "ctrl+a /",
+ "command": "workbench.action.terminal.focusFind",
+ "when": "terminalFocus"
+ },
+ { // prefix + t : toggle terminal
+ "key": "ctrl+a t",
+ "command": "workbench.action.terminal.toggleTerminal",
+ "when": "terminalFocus"
+ },
+ { // prefix + ^a: show information
+ "key": "ctrl+a ctrl+a",
+ "command": "workbench.action.terminal.focusHover",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
+ },
+ {
+ "key": "ctrl+k ctrl+i",
+ "command": "-workbench.action.terminal.focusHover",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
+ },
+ { // prefix + 1 : focus terminal 1
+ "key": "ctrl+a 1",
+ "command": "workbench.action.terminal.focusAtIndex1",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
+ },
+ { // prefix + 2 : focus terminal 2
+ "key": "ctrl+a 2",
+ "command": "workbench.action.terminal.focusAtIndex2",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
+ },
+ { // prefix + 3 : focus terminal 3
+ "key": "ctrl+a 3",
+ "command": "workbench.action.terminal.focusAtIndex3",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalIsOpen || terminalFocus && terminalProcessSupported || terminalHasBeenCreated && terminalTabsFocus || terminalIsOpen && terminalTabsFocus || terminalProcessSupported && terminalTabsFocus"
+ },
+ { // prefix + g : Go to recent directory
+ "key": "ctrl+a g",
+ "command": "workbench.action.terminal.goToRecentDirectory",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ },
+ {
+ "key": "ctrl+g",
+ "command": "-workbench.action.terminal.goToRecentDirectory",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ },
+ { // prefix + d : detach terminal
+ "key": "ctrl+a d",
+ "command": "workbench.action.terminal.detachSession",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ },
+ { // prefix + a : attach to session
+ "key": "ctrl+a a",
+ "command": "workbench.action.terminal.attachToSession",
+ "when": "terminalFocus"
+ },
+ {
+ "key": "ctrl+a h",
+ "command": "workbench.action.terminal.focusPreviousPane",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ },
+ {
+ "key": "ctrl+a i",
+ "command": "workbench.action.terminal.focusNextPane",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ },
+ {
+ "key": "ctrl+a shift+H",
+ "command": "workbench.action.terminal.resizePaneLeft",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ },
+ {
+ "key": "ctrl+a shift+N",
+ "command": "workbench.action.terminal.resizePaneDown",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ },
+ {
+ "key": "ctrl+a shift+E",
+ "command": "workbench.action.terminal.resizePaneUp",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ },
+ {
+ "key": "ctrl+a shift+I",
+ "command": "workbench.action.terminal.resizePaneRight",
+ "when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
+ }
]
\ No newline at end of file
diff --git a/tools/vscode/vscode.vimrc b/tools/vscode/vscode.vimrc
index b7e7690..84ab90d 100644
--- a/tools/vscode/vscode.vimrc
+++ b/tools/vscode/vscode.vimrc
@@ -30,9 +30,11 @@ noremap J E
noremap Y y$
" 分词版本的w和b,支持中文,需要插件
+" 为了保证递归解析,而不是打断,使用 `nmap` 而不是 `nnoremap`
+" 由于 VSCode Vim 的限制,递归解析存在缺陷,目前这种情况,2w 符合预期,但 dw 不符合预期
" Comment if you don't use cjk or the plugin
-noremap w cjkWordHandler.cursorWordEndRight
-noremap b cjkWordHandler.cursorWordStartLeft
+nmap w cjkWordHandler.cursorWordEndRight
+nmap b cjkWordHandler.cursorWordStartLeft
" keep selection after indent (define in settings.json)
" voremap < workbench.action.quickOpen
noremap : workbench.action.showCommands
+noremap E workbench.view.explorer
+
" q : +quit
noremap qq :quit
noremap qQ :qall
noremap Q :quit
+
" w : +write/window
noremap ww :write
noremap wa :wall
@@ -66,6 +71,7 @@ noremap we workbench.action.focusAboveGroup
noremap wE workbench.action.splitEditorUp
noremap wi workbench.action.focusRightGroup
noremap wI workbench.action.splitEditorRight
+
" f : +find/file
noremap ff workbench.action.quickOpen
noremap fF workbench.view.search
@@ -77,6 +83,7 @@ noremap fR workbench.action.openRecent
noremap fs workbench.action.search.toggleQueryDetails
noremap ft workbench.action.terminal.toggleTerminal
noremap fx workbench.view.extensions
+
" p : +project (requires Project Manager extension)
noremap pp projectManager.listProjects
noremap pP projectManager.listAnyProjects#sideBarAny
@@ -87,12 +94,16 @@ noremap pF projectManager.filterProjectsByTag
noremap pg projectManager.listGitProjects#sideBarGit
noremap pr workbench.action.openRecent
noremap ps projectManager.saveProject
+
" g : +git
noremap gg workbench.view.scm
noremap gS git.stageAll
+
" j : +jump
noremap jj workbench.action.gotoLine
+
" l : +language (define in settings.json)
+
" u : +ui
noremap ui workbench.action.selectTheme
noremap uw editor.action.toggleWordWrap
@@ -117,14 +128,18 @@ noremap tC testing.debugCurrentTest
noremap tx testing.cancelTestRun
" d : +debug
" h : +help
+
" c : +code
-noremap cr coderunner.run
+noremap cr code-runner.run
noremap cf editor.action.formatDocument
noremap c editor.action.trimTrailingWhitespace
noremap cs workbench.action.gotoSymbol
noremap cS workbench.action.showAllSymbols
+
" b : +buffer
noremap bb workbench.action.showAllEditors
noremap bd :bdelete
noremap bh :bprevious
noremap bi :bnext
+
+" 中文分词测试用例
diff --git a/tools/zsh/common.zshrc b/tools/zsh/common.zshrc
index d5ee087..123f13c 100644
--- a/tools/zsh/common.zshrc
+++ b/tools/zsh/common.zshrc
@@ -1,6 +1,6 @@
# $DOTFILES/tools/zsh/common.zshrc
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# This is the entry point for all zsh configuration files
# 这是所有zsh配置文件的入口点
diff --git a/tools/zsh/global.zshenv b/tools/zsh/global.zshenv
index a9c1a49..9d886d9 100644
--- a/tools/zsh/global.zshenv
+++ b/tools/zsh/global.zshenv
@@ -1,6 +1,6 @@
# $DOTFILES/tools/zsh/global.zshenv
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# $DOTFILES/tools/zsh/global.zshenv
# system-wide zshenv file 系统级别的 zshenv 文件,用于设置全局环境变量
diff --git a/tools/zsh/mod/alias.zsh b/tools/zsh/mod/alias.zsh
index 9af0607..9ca36f7 100644
--- a/tools/zsh/mod/alias.zsh
+++ b/tools/zsh/mod/alias.zsh
@@ -1,6 +1,6 @@
# $DOTFILES/tools/zsh/mod/alias.zsh
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by user's zshrc 在用户的 zshrc 中被引用
# PowerShell Equivalent, for cross-platform compatibility
@@ -34,7 +34,7 @@ if command -v lsd > /dev/null; then
alias ls='lsd -A -I .DS_Store -I .git'
alias l='lsd -lah'
alias ll='lsd -l'
- alias tree='lsd --tree -I .DS_Store -I .git'
+ alias tree='lsd --tree -I .DS_Store -I .git -A'
fi
# fzf - Fuzzy Finder
@@ -92,3 +92,8 @@ if command -v brew > /dev/null; then
alias brewc="brew cleanup"
alias brewr="brew uninstall"
fi
+
+alias -s {htm,html,css,scss,js,jsx,ts,tsx,json,jsonc}=code
+alias -s {md,markdown}=code
+alias -s {py,sh,rb,pl,php,java,c,cpp,h,hpp}=nvim
+alias -s {cs,csx,fs,fsx,razor}=code
diff --git a/tools/zsh/mod/config.zsh b/tools/zsh/mod/config.zsh
index 86d1885..77e710f 100644
--- a/tools/zsh/mod/config.zsh
+++ b/tools/zsh/mod/config.zsh
@@ -1,6 +1,6 @@
# $DOTFILES/tools/zsh/mod/config.zsh
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by user's zshrc 在用户的 zshrc 中被引用
# ZSH Config, no need to `export` these variables
@@ -38,8 +38,8 @@ done
# Use `set -k` to mark leading `#` as a comment character
set -k
-# TODO: Below should be reorganized
-export PATH=$HOME/.local/bin:$PATH
+# # TODO: Below should be reorganized
+# export PATH=$HOME/.local/bin:$PATH
-export NVM_DIR="$HOME/.config/nvm"
-[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
+# export NVM_DIR="$HOME/.config/nvm"
+# [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
diff --git a/tools/zsh/mod/env.zsh b/tools/zsh/mod/env.zsh
index 73beddd..c1fd0d9 100644
--- a/tools/zsh/mod/env.zsh
+++ b/tools/zsh/mod/env.zsh
@@ -1,6 +1,6 @@
# $DOTFILES/tools/zsh/mod/env.zsh
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by user's zshrc 在用户的 zshrc 中被引用
# This file stores only environment variables that only called by
diff --git a/tools/zsh/mod/keymap.zsh b/tools/zsh/mod/keymap.zsh
index eac5169..e1fbbd5 100644
--- a/tools/zsh/mod/keymap.zsh
+++ b/tools/zsh/mod/keymap.zsh
@@ -1,6 +1,6 @@
# $DOTFILES/tools/zsh/mod/keymap.zsh
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by user's zshrc 在用户的 zshrc 中被引用
diff --git a/tools/zsh/mod/navi.zsh b/tools/zsh/mod/navi.zsh
index ef9682b..86cf282 100644
--- a/tools/zsh/mod/navi.zsh
+++ b/tools/zsh/mod/navi.zsh
@@ -1,6 +1,6 @@
# $DOTFILES/tools/zsh/mod/navi.zsh
# Date: 2024-12-01
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by user's zshrc 在用户的 zshrc 中被引用
# Relative navigation #
diff --git a/tools/zsh/mod/prompt.zsh b/tools/zsh/mod/prompt.zsh
index 01be5dc..2953dcb 100644
--- a/tools/zsh/mod/prompt.zsh
+++ b/tools/zsh/mod/prompt.zsh
@@ -1,6 +1,6 @@
# $DOTFILES/tools/zsh/mod/prompt.zsh
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# Sourced by user's zshrc 在用户的 zshrc 中被引用
export STARSHIP_CONFIG=$DOTFILES/tools/starship/starship_zsh.toml
diff --git a/tools/zsh/zshenv b/tools/zsh/zshenv
index d84cf50..7411ed5 100644
--- a/tools/zsh/zshenv
+++ b/tools/zsh/zshenv
@@ -1,13 +1,13 @@
# $DOTFILES/tools/zsh/zshenv
# Date: 2024-11-30
-# Author: contact@js0ny.net
+# Author: js0ny
# User-specific environment variables for zsh 用户级别的 zsh 环境变量
# Location:
# $ZDOTDIR/.zshenv (specified by ZDOTDIR)
# ~/.zshenv (default location)
# Linking:
-# ln -sf $DOTFILES/tools/zsh/.zshenv $ZDOTDIR/.zshenv
+# ln -sf $DOTFILES/tools/zsh/zshenv $ZDOTDIR/.zshenv
# This file is sourced by all zsh sessions upon startup.
# For me (this user), define XDG Base Directory Specification variables