[
  {
    "path": ".Makefile.after",
    "content": "# -*- mode: makefile; -*-\n####################################################################################\n# .Makefile.after (local hook for GNU make, extending Makefile)\n# Time-stamp: <Thu 2016-03-03 14:18 svarrette>\n#            __  __       _         __ _ _              __ _\n#           |  \\/  | __ _| | _____ / _(_) | ___   __ _ / _| |_ ___ _ __\n#           | |\\/| |/ _` | |/ / _ \\ |_| | |/ _ \\ / _` | |_| __/ _ \\ '__|\n#          _| |  | | (_| |   <  __/  _| | |  __/| (_| |  _| ||  __/ |\n#         (_)_|  |_|\\__,_|_|\\_\\___|_| |_|_|\\___(_)__,_|_|  \\__\\___|_|\n###################################################################################\nINSTALL_SCRIPT=./install.sh\nBATS=$(shell which bats 2>/dev/null)\n\n.PHONY: tests\n\ninstall: setup\n\t$(INSTALL_SCRIPT) --all --dry-run\n\nuninstall:\n\t$(INSTALL_SCRIPT) --delete --all --dry-run\n\nifeq ($(BATS),)\ntests:\n\t@echo \"the Unit tests of Falkor's dotfiles rely on Bats which does not seem present on your system\"\n\t@echo \"See https://github.com/sstephenson/bats for details\"\n\t@echo \"installation notes can be found in tests/setup_bats.sh\"\nelse\ntests:\n\t$(BATS) tests\nendif\n"
  },
  {
    "path": ".falkor/config",
    "content": "# config\n# /!\\ DO NOT EDIT THIS FILE: it has been automatically generated\n---\n:project:\n  :name: Falkor's Dotfiles\n  :type:\n  - :none\n  :by: Falkor\n  :author: Sebastien Varrette aka Falkor\n  :mail: Sebastien.Varrette@uni.lu\n  :summary: Sebastien Varrette aka Falkor's dotfiles\n  :description: Sebastien Varrette aka Falkor's dotfiles\n  :forge: :github\n  :source: https://github.com/Falkor/dotfiles\n  :project_page: https://github.com/Falkor/dotfiles\n  :origin: https://github.com/Falkor/dotfiles.git\n  :license: GPL-3.0\n  :issues_url: https://github.com/Falkor/dotfiles/issues\n  :tags:\n  - dotfiles\n  - zsh\n  - bash\n  - git\n  - vim\n:gitflow:\n  :branches:\n    :master: production\n    :develop: master\n"
  },
  {
    "path": ".gitignore",
    "content": ".vagrant/\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \".submodules/Makefiles\"]\n\tpath = .submodules/Makefiles\n\turl = https://github.com/Falkor/Makefiles.git\n\tbranch = devel\n[submodule \"tests/helpers/assertions\"]\n\tpath = tests/helpers/assertions\n\turl = https://github.com/jasonkarns/bats-assert\n[submodule \"oh-my-zsh/custom/themes/powerlevel10k\"]\n\tpath = oh-my-zsh/custom/themes/powerlevel10k\n\turl = https://github.com/romkatv/powerlevel10k.git\n[submodule \"oh-my-zsh/custom/plugins/zsh-syntax-highlighting\"]\n\tpath = oh-my-zsh/custom/plugins/zsh-syntax-highlighting\n\turl = https://github.com/zsh-users/zsh-syntax-highlighting.git\n[submodule \"oh-my-zsh/custom/plugins/zsh-completions\"]\n\tpath = oh-my-zsh/custom/plugins/zsh-completions\n\turl = https://github.com/zsh-users/zsh-completions.git\n[submodule \"oh-my-zsh/custom/plugins/nix-zsh-completions\"]\n\tpath = oh-my-zsh/custom/plugins/nix-zsh-completions\n\turl = https://github.com/nix-community/nix-zsh-completions.git\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: bash\nsudo: false\ncache:\n  - apt\nos:\n  - linux\n#  - osx\nbefore_script:\n  - source ./tests/setup_bats.sh\naddons:\n  apt:\n    packages:\n    - zsh\n  hosts:\n    - travis.dev\nenv:\n  - TRAVIS_CI_RUN=true GIT_SSH='ssh -o StrictHostKeyChecking=no' GIT_AUTHOR_NAME='Travis CI' GIT_AUTHOR_EMAIL='travis@example.com'\nbefore install:\n  - if [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then brew update      ; fi\n  - if [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then brew install bats; fi\n# install:\n#   - if [ \"$(uname -s)\" != \"Darwin\"  ]; then sudo apt-get update -qq && sudo apt-get install -y zsh; fi\nscript:\n  - bats tests\nnotifications:\n  email:\n    on_success: never\n  slack:\n    secure: NBN4QhHuaXpwZIxUOzZi29Z4iW0EK/d2ID7zZqz+1RDO/9BD7QqX5unM/SFP46oTbhEqNH/vMLLMFQ9i9l7Z1i6Z6nCNRiLRIjgPSL+3GMamPQm1Pj4JaLkwLHogxHdRvozfU3tdSG9uGmK++Aak/NLC/i5TASGrBMgKrmXLXEk=\n\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at Sebastien.Varrette@uni.lu. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (C) 2016 Sebastien Varrette aka Falkor\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n"
  },
  {
    "path": "Makefile",
    "content": "####################################################################################\n# Makefile (configuration file for GNU make - see http://www.gnu.org/software/make/)\n# Time-stamp: <Wed 2020-05-06 10:26 svarrette>\n#     __  __       _         __ _ _\n#    |  \\/  | __ _| | _____ / _(_) | ___\n#    | |\\/| |/ _` | |/ / _ \\ |_| | |/ _ \\\n#    | |  | | (_| |   <  __/  _| | |  __/\n#    |_|  |_|\\__,_|_|\\_\\___|_| |_|_|\\___|\n#\n# Copyright (c) 2012 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n# .             http://varrette.gforge.uni.lu\n#\n####################################################################################\n#\n############################## Variables Declarations ##############################\nSHELL = /bin/bash\n\nUNAME = $(shell uname)\n\n# Some directories\nSUPER_DIR   = $(shell basename `pwd`)\n\nXDG_CACHE_HOME  ?= $(HOME)/.cache\nXDG_CONFIG_HOME ?= $(HOME)/.config\nXDG_DATA_HOME   ?= $(HOME)/.local/share\n\n# Git stuff management\nHAS_GITFLOW      = $(shell git flow version 2>/dev/null || [ $$? -eq 0 ])\nLAST_TAG_COMMIT = $(shell git rev-list --tags --max-count=1)\nLAST_TAG = $(shell git describe --tags $(LAST_TAG_COMMIT) )\nTAG_PREFIX = \"v\"\n# GITFLOW_BR_MASTER  = $(shell git config --get gitflow.branch.master)\n# GITFLOW_BR_DEVELOP = $(shell git config --get gitflow.branch.develop)\nGITFLOW_BR_MASTER=production\nGITFLOW_BR_DEVELOP=master\n\nCURRENT_BRANCH          = $(shell git rev-parse --abbrev-ref HEAD)\nGIT_BRANCHES            = $(shell git for-each-ref --format='%(refname:short)' refs/heads/ | xargs echo)\nGIT_REMOTES             = $(shell git remote | xargs echo )\nGIT_ROOTDIR             = $(shell git rev-parse --show-toplevel)\nGIT_HOOKSDIR            = .git/hooks\nSRC_HOOKSDIR            = config/hooks\n#SRC_HOOKSDIR_TO_ROOTDIR = $(shell git -C \"$(GIT_ROOTDIR)/$(SRC_HOOKSDIR)\" rev-parse --show-cdup)\nSRC_PRECOMMIT_HOOK      = $(wildcard $(SRC_HOOKSDIR)/pre-commit*.sh)\n\nGIT_DIRTY    = $(shell git diff --shortstat 2> /dev/null | tail -n1 )\n# Git subtrees repositories\n# Format: '<url>[|<branch>]' - don't forget the quotes. if branch is ignored, 'master' is used\n#GIT_SUBTREE_REPOS = 'https://github.com/ULHPC/easybuild-framework.git|develop'  \\\n\t\t\t\t\t 'https://github.com/hpcugent/easybuild-wiki.git'\nGITSTATS     = ./.submodules/gitstats/gitstats\nGITSTATS_DIR = gitstats\n\n# Branches to update on 'make up'\nGIT_BRANCHES_TO_UPDATE = $(GITFLOW_BR_DEVELOP) $(GITFLOW_BR_MASTER)\n\nifeq (,$(wildcard .bumpversion.cfg))\nVERSION  = $(shell [ -f VERSION ] && head VERSION || echo '0.0.1')\nelse\nVERSION = $(shell bumpversion --dry-run --allow-dirty --list minor | grep current_version | cut -d '=' -f 2)\nendif\n\n# OR try to guess directly from the last git tag\n#VERSION    = $(shell  git describe --tags $(LAST_TAG_COMMIT) | sed \"s/^$(TAG_PREFIX)//\")\nMAJOR      = $(shell echo $(VERSION) | sed \"s/^\\([0-9]*\\).*/\\1/\")\nMINOR      = $(shell echo $(VERSION) | sed \"s/[0-9]*\\.\\([0-9]*\\).*/\\1/\")\nPATCH      = $(shell echo $(VERSION) | sed \"s/[0-9]*\\.[0-9]*\\.\\([0-9]*\\).*/\\1/\")\n# total number of commits\nBUILD      = $(shell git log --oneline | wc -l | sed -e \"s/[ \\t]*//g\")\n#REVISION   = $(shell git rev-list $(LAST_TAG).. --count)\nifeq (,$(wildcard .bumpversion.cfg))\nNEXT_MAJOR_VERSION = $(shell expr $(MAJOR) + 1).0.0-b$(BUILD)\nNEXT_MINOR_VERSION = $(MAJOR).$(shell expr $(MINOR) + 1).0-b$(BUILD)\nNEXT_PATCH_VERSION = $(MAJOR).$(MINOR).$(shell expr $(PATCH) + 1)-b$(BUILD)\nelse\nNEXT_MAJOR_VERSION = $(shell expr $(MAJOR) + 1).0.0\nNEXT_MINOR_VERSION = $(MAJOR).$(shell expr $(MINOR) + 1).0\nNEXT_PATCH_VERSION = $(MAJOR).$(MINOR).$(shell expr $(PATCH) + 1)\nendif\n\n# Python stuff\n# See https://pip.pypa.io/en/stable/user_guide/#requirements-files\nPIP_REQUIREMENTS_FILE = requirements.txt\n\n##################### Main targets #####################\n# Default targets - append your own with TARGETS += <xXx>\nTARGETS =\n# Default targets for 'make [dist]clean' - append your own with [DIST]CLEAN_TARGETS += [dist]clean-<xXx>\nCLEAN_TARGETS = clean-gitstats\nDISTCLEAN_TARGETS =\n# Default targets for 'make setup' - append your own with SETUP_TARGETS += setup-<xXx>\nSETUP_TARGETS = setup-git setup-gitflow setup-submodules setup-subtrees setup-githooks\n# Default targets for 'make git-clone'. To append your own:\n#   Define\nGIT_CLONE_TARGETS =\n\n\n################### Custom Makefile  ###################\n# Local configuration - Kept for compatibity reason\nLOCAL_MAKEFILE = .Makefile.local\n\n# Makefile custom hooks\nMAKEFILE_BEFORE = .Makefile.before\nMAKEFILE_AFTER  = .Makefile.after\n\n### Main variables\n.PHONY: all info archive clean help release start_bump_major start_bump_minor start_bump_patch subtree_setup subtree_up subtree_diff  upgrade versioninfo doc\n\n############################### Now starting rules ################################\n# Load local settings, if existing (to override variable eventually)\nifneq (,$(wildcard $(LOCAL_MAKEFILE)))\ninclude $(LOCAL_MAKEFILE)\nendif\nifneq (,$(wildcard $(MAKEFILE_BEFORE)))\ninclude $(MAKEFILE_BEFORE)\nendif\n\n### Below default could be set in .Makefile.{local,before}\n# Default python virtualenv - by default under venv/$(basename <dir>)\nPYTHON_VENV_DIR ?= venv\nPYTHON_VENV     ?= $(SUPER_DIR)\n# Default Git clone parameters (url, target path for the working directory)\nPYENV_GIT_REPO_URL            ?= https://github.com/pyenv/pyenv.git\nPYENV_GIT_REPO                ?= $(XDG_DATA_HOME)/pyenv\nPYENV_VIRTUALENV_GIT_REPO_URL ?= https://github.com/pyenv/pyenv-virtualenv.git\nPYENV_VIRTUALENV_GIT_REPO     ?= $(XDG_DATA_HOME)/pyenv/plugins/pyenv-virtualenv\n\n# Required rule : what's to be done each time\nall: $(TARGETS)\n\n# Test values of variables - for debug purposes\ninfo:\n\t@echo \"--- Compilation commands --- \"\n\t@echo \"HAS_GITFLOW      -> '$(HAS_GITFLOW)'\"\n\t@echo \"--- Directories --- \"\n\t@echo \"SUPER_DIR       -> '$(SUPER_DIR)'\"\n\t@echo \"XDG_CONFIG_HOME -> '$(XDG_CONFIG_HOME)'\"\n\t@echo \"XDG_CACHE_HOME  -> '$(XDG_CACHE_HOME)'\"\n\t@echo \"XDG_DATA_HOME   -> '$(XDG_DATA_HOME)'\"\n\t@echo \"--- Git stuff ---\"\n\t@echo \"GIT_ROOTDIR            -> '$(GIT_ROOTDIR)'\"\n\t@echo \"GITFLOW                -> '$(GITFLOW)'\"\n\t@echo \"GITFLOW_BR_MASTER      -> '$(GITFLOW_BR_MASTER)'\"\n\t@echo \"GITFLOW_BR_DEVELOP     -> '$(GITFLOW_BR_DEVELOP)'\"\n\t@echo \"CURRENT_BRANCH         -> '$(CURRENT_BRANCH)'\"\n\t@echo \"GIT_BRANCHES           -> '$(GIT_BRANCHES)'\"\n\t@echo \"GIT_REMOTES            -> '$(GIT_REMOTES)'\"\n\t@echo \"GIT_DIRTY              -> '$(GIT_DIRTY)'\"\n\t@echo \"GIT_SUBTREE_REPOS      -> '$(GIT_SUBTREE_REPOS)'\"\n\t@echo \"GIT_BRANCHES_TO_UPDATE -> '$(GIT_BRANCHES_TO_UPDATE)'\"\n\t@echo \"GIT_HOOKSDIR           -> '$(GIT_HOOKSDIR)'\"\n\t@echo \"SRC_HOOKSDIR           -> '$(SRC_HOOKSDIR)'\"\n\t@echo \"SRC_HOOKSDIR_TO_ROOTDIR-> '$(SRC_HOOKSDIR_TO_ROOTDIR)'\"\n\t@echo \"SRC_PRECOMMIT_HOOK     -> '$(SRC_PRECOMMIT_HOOK)'\"\n\t@echo \"--- Python stuff ---\"\n\t@echo \"PYTHON_VENV_DIR        -> '${PYTHON_VENV_DIR}'\"\n\t@echo \"PYTHON_VENV            -> '${PYTHON_VENV}'\"\n\t@echo \"PYENV_GIT_REPO_URL     -> '${PYENV_GIT_REPO_URL}'\"\n\t@echo \"PYENV_GIT_REPO         -> '${PYENV_GIT_REPO}'\"\n\t@echo \"PYENV_VIRTUALENV_GIT_REPO_URL -> '${PYENV_VIRTUALENV_GIT_REPO_URL}'\"\n\t@echo \"PYENV_VIRTUALENV_GIT_REPO     -> '${PYENV_VIRTUALENV_GIT_REPO}'\"\n\t@echo \"\"\n\t@echo \"Consider running 'make versioninfo' to get info on git versionning variables\"\n\n############################### Archiving ################################\narchive: clean\n\ttar -C ../ -cvzf ../$(SUPER_DIR)-$(VERSION).tar.gz --exclude \".svn\" --exclude \".git\"  --exclude \"*~\" --exclude \".DS_Store\" $(SUPER_DIR)/\n\n############################### Git Bootstrapping rules ################################\n.PHONE: setup setup-git setup-gitflow setup-xdg setup-git-lfs\nsetup: $(SETUP_TARGETS)\n\t@if [ -d \"$(GIT_ROOTDIR)/$(SRC_HOOKSDIR)\" ]; then \\\n\t\techo \"=> setup local git hooks\"; \\\n\t\t$(MAKE) setup_git_hooks; \\\n\tfi\n\t@if [ -f .gitattributes ] && [ -n \"$(shell grep '=lfs' .gitattributes)\" ]; then \\\n\t\techo \"=> setup git-lfs\"; \\\n\t\t$(MAKE) setup-git-lfs; \\\n\tfi\n\t@if [ -f .envrc ]; then \\\n\t\t$(MAKE) setup-direnv; \\\n\tfi\n\nsetup-git:\n\t-git fetch origin\n\t-git branch --track $(GITFLOW_BR_MASTER) origin/$(GITFLOW_BR_MASTER)\n\nsetup-gitflow:\n\tgit config gitflow.branch.master     $(GITFLOW_BR_MASTER)\n\tgit config gitflow.branch.develop    $(GITFLOW_BR_DEVELOP)\n\tgit config gitflow.prefix.feature    feature/\n\tgit config gitflow.prefix.release    release/\n\tgit config gitflow.prefix.hotfix     hotfix/\n\tgit config gitflow.prefix.support    support/\n\tgit config gitflow.prefix.versiontag $(TAG_PREFIX)\n\nsetup-submodules:\n\t-$(MAKE) update\n\nsetup-subtrees:\n\t$(if $(GIT_SUBTREE_REPOS), $(MAKE) subtree_setup)\n\nsetup-githooks:\n\t@if [ -d \"$(GIT_ROOTDIR)/$(SRC_HOOKSDIR)\" ]; then \\\n\t\techo \"=> setup local git hooks\"; \\\n\t\t$(MAKE) _setup_git_hooks; \\\n\tfi\n\n_setup_git_hooks:\n\t@if [ -n \"$(SRC_PRECOMMIT_HOOK)\" ]; then \\\n\t\tif [ -f \"$(GIT_ROOTDIR)/$(SRC_PRECOMMIT_HOOK)\" ] && [ ! -f \"$(GIT_ROOTDIR)/$(GIT_HOOKSDIR)/pre-commit\" ]; then \\\n\t\t\techo \"=> setup Git pre-commit hook\"; \\\n\t\t\tln -s ../../$(SRC_PRECOMMIT_HOOK) $(GIT_ROOTDIR)/$(GIT_HOOKSDIR)/pre-commit; \\\n\t\tfi ; \\\n\tfi\n\nifneq (,$(shell which git-lfs 2>/dev/null))\nsetup-git-lfs:\n\tgit-lfs pull\nelse\nsetup-git-lfs:\n\t@echo \"*** ERROR *** git-lfs extension not found on your system\"\n\t@echo \"              install it (see https://git-lfs.github.com/) and run \"\n\t@echo \"        make $@\"\nendif\n\nsetup-xdg:\n\t@echo \"=> setup XDG Base Directories\"\n\tmkdir -p $(XDG_CONFIG_HOME)\n\tmkdir -p $(XDG_DATA_HOME)\n\tmkdir -p $(XDG_CACHE_HOME)\n\ndefine __SHELL_PROFILE_SOURCE_IF_PRESENT\n\n# Add the following to your favorite shell config (~/.bashrc or ~/.zshrc etc.)\nif [ -f \"$1\" ]; then\n\t. $1\nfi\n\nendef\n.PHONY: setup-shell-direnv setup-shell-pyenv\nsetup-shell-direnv:\n\t$(info $(call __SHELL_PROFILE_SOURCE_IF_PRESENT,$(XDG_CONFIG_HOME)/direnv/init.sh))\nsetup-shell-pyenv:\n\t$(info $(call __SHELL_PROFILE_SOURCE_IF_PRESENT,$(XDG_CONFIG_HOME)/pyenv/init.sh))\n\n\n# --- Direnv\n.PHONY: setup-direnv setup-pyenv setup-venv setup-python\nsetup-direnv: setup-xdg\n\t@echo \"=> setup direnv -- see https://varrette.gforge.uni.lu/tutorials/pyenv.html\"\n\tmkdir -p $(XDG_CONFIG_HOME)/direnv\n\t@if [ ! -f \"$(XDG_CONFIG_HOME)/direnv/init.sh\" ]; then \\\n\t\techo \" - creating $(XDG_CONFIG_HOME)/direnv/init.sh\"; \\\n\t\tcurl -o $(XDG_CONFIG_HOME)/direnv/init.sh https://raw.githubusercontent.com/Falkor/dotfiles/master/shell/available/direnv.sh; \\\n\tfi\n\t@echo \" - sample override of direnv-stdlib in $(XDG_CONFIG_HOME)/direnv/direnvrc\"\n\t@if [ ! -f \"$(XDG_CONFIG_HOME)/direnv/direnvrc\" ]; then \\\n\t\tcurl -o $(XDG_CONFIG_HOME)/direnv/direnvrc https://raw.githubusercontent.com/Falkor/dotfiles/master/direnv/direnvrc; \\\n\tfi\n\t@echo \" - sample '.envrc' for your projects in  $(XDG_CONFIG_HOME)/direnv/envrc\"\n\t@if [ ! -f \"$(XDG_CONFIG_HOME)/direnv/envrc\" ]; then \\\n\t\tcurl -o $(XDG_CONFIG_HOME)/direnv/envrc https://raw.githubusercontent.com/Falkor/dotfiles/master/direnv/envrc; \\\n\tfi\n\t@$(MAKE) setup-shell-direnv\n\n# --- pyenv\nsetup-pyenv: setup-xdg git-clone-pyenv git-clone-pyenv-virtualenv\n\t@echo \"=> setup pyenv -- see https://varrette.gforge.uni.lu/tutorials/pyenv.html\"\n\tmkdir -p $(XDG_CONFIG_HOME)/pyenv\n\t@if [ ! -f \"$(XDG_CONFIG_HOME)/pyenv/init.sh\" ]; then \\\n\t\techo \" - creating $(XDG_CONFIG_HOME)/pyenv/init.sh\"; \\\n\t\tcurl -o $(XDG_CONFIG_HOME)/pyenv/init.sh https://raw.githubusercontent.com/Falkor/dotfiles/master/shell/available/pyenv.sh; \\\n\tfi\n\t@$(MAKE) setup-shell-pyenv\n\n# --- venv\nsetup-venv:\n\tpython3 -m venv $(PYTHON_VENV_DIR)/$(PYTHON_VENV)\n\n# --- python\nifneq (,$(wildcard ./$(PIP_REQUIREMENTS_FILE)))\nsetup-python:\n\t@echo \"=> updating pip version\"\n\tpip install --upgrade pip\n\t@echo \"=> installing Python dependencies from Requirements files '$(PIP_REQUIREMENTS_FILE)'\"\n\tpip install -r $(PIP_REQUIREMENTS_FILE)\nelse\nsetup-python:\n\t@echo \"=> updating pip version\"\n\tpip install --upgrade pip\nendif\n\n\n\n### Git clone\n#######\n# Usage: $(eval $(call __GIT_CLONE,<suffix>,<path>,<url>))\n##\ndefine __GIT_CLONE\n.PHONY: git-clone-$1\ngit-clone-$1:\n\t@if [ ! -d \"$2\" ]; then \\\n\t\tmkdir -p $(shell dirname $2); \\\n\t\techo \"=> cloning '$3' into $2\"; \\\n\t\tgit clone $3 $2; \\\n\telse \\\n\t\techo \"... existing directory '$2', thus exiting\"; \\\n\tfi\nGIT_CLONE_TARGETS += git-clone-$1\nendef\n$(eval $(call __GIT_CLONE,pyenv,$(PYENV_GIT_REPO),$(PYENV_GIT_REPO_URL)))\n$(eval $(call __GIT_CLONE,pyenv-virtualenv,$(PYENV_VIRTUALENV_GIT_REPO),$(PYENV_VIRTUALENV_GIT_REPO_URL)))\n\nfetch:\n\tgit fetch --all -v\n\nversioninfo:\n\t@echo \"Current version: $(VERSION)\"\n\t@echo \"Last tag: $(LAST_TAG)\"\n\t@echo \"$(shell git rev-list $(LAST_TAG).. --count) commit(s) since last tag\"\n\t@echo \"Build: $(BUILD) (total number of commits)\"\n\t@echo \"next major version: $(NEXT_MAJOR_VERSION)\"\n\t@echo \"next minor version: $(NEXT_MINOR_VERSION)\"\n\t@echo \"next patch version: $(NEXT_PATCH_VERSION)\"\n\n### Git flow management\nifeq ($(HAS_GITFLOW),)\nstart_bump_patch start_bump_minor start_bump_major release:\n\t@echo \"Unable to find git-flow on your system. \"\n\t@echo \"See https://github.com/nvie/gitflow for installation details\"\nelse\n\ndefine __VERSION_BUMP\nstart_bump_$1:\n\t$$(if $$(GIT_DIRTY), $$(error \"Unable to bump version: Dirty Git repository\"))\n\t@echo \"Start the '$1' release of the repository from $$(VERSION) to $2\"\n\tgit pull origin\n\tgit flow release start $2\n\t@sleep 1\n\t@if [ -f VERSION ]; then \\\n\t\techo $2 > VERSION; \\\n\t\tgit commit -s -m \"$1 bump to version $2\" VERSION; \\\n\tfi\n\t@if [ -f .bumpversion.cfg ]; then \\\n\t\techo \"=> using 'bumpversion [...] $1'\"; \\\n\t\tbumpversion --commit --no-tag $1; \\\n\tfi\n\t@echo \"=> run 'make release' once you finished the bump\"\nendef\n\n$(eval $(call __VERSION_BUMP,patch,$(NEXT_PATCH_VERSION)))\n$(eval $(call __VERSION_BUMP,minor,$(NEXT_MINOR_VERSION)))\n$(eval $(call __VERSION_BUMP,major,$(NEXT_MAJOR_VERSION)))\n\nrelease: clean\n\t@if [ -f .bumpversion.cfg ]; then \\\n\t\techo \"=> release using 'bumpversion [...] release'\"; \\\n\t\tbumpversion --commit --no-tag release; \\\n\tfi\n\tgit flow release finish -s $(VERSION:%rc=%)\n\tgit checkout $(GITFLOW_BR_MASTER)\n\tgit push origin\n\tgit checkout $(GITFLOW_BR_DEVELOP)\n\tgit push origin\n\tgit push origin --tags\nendif\n\n### Git (submodule|branch)  management: pull and upgrade to the latest version\nup update:\n\t$(if $(GIT_DIRTY), $(error \"Unable to pull latest commits: Dirty Git repository\"))\n\t@for br in $(GIT_BRANCHES_TO_UPDATE); do \\\n\t\techo -e \"\\n=> Pulling and updating the local branch '$$br'\\n\"; \\\n\t\tgit checkout $$br; \\\n\t\tgit pull origin $$br; \\\n\tdone\n\tgit checkout $(CURRENT_BRANCH)\n\t@echo \"=> updating (NOT upgrading) git submodule\"\n\tgit submodule init\n\tgit submodule update\n\n### Git submodule upgrade\nupgrade: update\n\tgit submodule foreach 'git fetch origin; git checkout $$(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'\n\t-@for submoddir in $(shell git submodule status | awk '{ print $$2 }' | xargs echo); do \\\n\t\tgit commit -s -m \"Upgrading Git submodule '$$submoddir' to the latest version\" $$submoddir || true;\\\n\tdone\n\n\n### Git subtree management\nifeq ($(GIT_SUBTREE_REPOS),)\nsubtree_setup subtree_diff subtree_up:\n\t@echo \"no repository configured in GIT_SUBTREE_REPOS...\"\nelse\nsubtree_setup:\n\t@for elem in $(GIT_SUBTREE_REPOS); do \\\n\t\turl=`echo $$elem | cut -d '|' -f 1`; \\\n\t\trepo=`basename $$url .git`; \\\n\t\tif [[ ! \"$(GIT_REMOTES)\" =~ \"$$repo\"  ]]; then \\\n\t\t\techo \"=> initializing Git remote '$$repo'\"; \\\n\t\t\tgit remote add -f $$repo $$url; \\\n\t\tfi \\\n\tdone\n\nsubtree_diff:\n\t@for elem in $(GIT_SUBTREE_REPOS); do \\\n\t\turl=`echo $$elem | cut -d '|' -f 1`; \\\n\t\trepo=`basename $$url .git`; \\\n\t\tpath=`echo $$repo | tr '-' '/'`; \\\n\t\tbr=`echo $$elem | cut -d '|' -f 2`;  \\\n\t\t[ \"$$br\" == \"$$url\" ] && br='master'; \\\n\t\techo -e \"\\n============ diff on subtree '$$path' with remote '$$repo/$$br' ===========\\n\"; \\\n\t\tgit diff $${repo}/$$br $(CURRENT_BRANCH):$$path; \\\n\tdone\n\nsubtree_up:\n\t$(if $(GIT_DIRTY), $(error \"Unable to pull subtree(s): Dirty Git repository\"))\n\t@for elem in $(GIT_SUBTREE_REPOS); do \\\n\t\turl=`echo $$elem | cut -d '|' -f 1`; \\\n\t\trepo=`basename $$url .git`; \\\n\t\tpath=`echo $$repo | tr '-' '/'`; \\\n\t\tbr=`echo $$elem | cut -d '|' -f 2`;  \\\n\t\t[ \"$$br\" == \"$$url\" ] && br='master'; \\\n\t\techo -e \"\\n===> pulling changes into subtree '$$path' using remote '$$repo/$$br'\"; \\\n\t\techo -e \"     \\__ fetching remote '$$repo'\"; \\\n\t\tgit fetch $$repo; \\\n\t\techo -e \"     \\__ pulling changes\"; \\\n\t\tgit subtree pull --prefix $$path --squash $${repo} $${br}; \\\n\tdone\nendif\n\n\n### [Dist]Clean option\nclean: $(CLEAN_TARGETS)\ndistclean: $(DISTCLEAN_TARGETS)\n\nclean-gitstats:\n\t@if [ -d \"$(GITSTATS_DIR)\" ]; then \\\n\t\techo \"==> removing '$(GITSTATS_DIR)' directory\"; \\\n\t\trm -rf $(GITSTATS_DIR); \\\n\tfi\n\n# Perform various git statistics\nstats:\n\t@if [ ! -d $(GITSTATS_DIR) ]; then mkdir -p $(GITSTATS_DIR); fi\n\t$(GITSTATS) . $(GITSTATS_DIR)/\n\ndoc:\n\t@if [ -n \"`which mkdocs`\" ]; then \\\n\t\tmkdocs serve; \\\n\tfi\n\n# # force recompilation\n# force :\n# \t@touch $(MAIN_TEX)\n# \t@$(MAKE)\n\n\n# print help message\nhelp :\n\t@echo '+----------------------------------------------------------------------+'\n\t@echo '|                        Available Commands                            |'\n\t@echo '+----------------------------------------------------------------------+'\n\t@echo '| make setup:   Initiate git-flow for your local copy of the repository|'\n\t@echo '| make start_bump_{major,minor,patch}: start a new version release with|'\n\t@echo '|               git-flow at a given level (major, minor or patch bump) |'\n\t@echo '| make release: Finalize the release using git-flow                    |'\n\t@echo '+----------------------------------------------------------------------+'\n\nifneq (,$(wildcard $(MAKEFILE_AFTER)))\ninclude $(MAKEFILE_AFTER)\nendif\n"
  },
  {
    "path": "README.md",
    "content": "-*- mode: markdown; mode: visual-line; fill-column: 80 -*-\n\n[![Licence](https://img.shields.io/badge/license-GPL--3.0-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html) ![By Falkor](https://img.shields.io/badge/by-Falkor-blue.svg)  [![Build Status](https://travis-ci.org/Falkor/dotfiles.svg?branch=master)](https://travis-ci.org/Falkor/dotfiles) [![github](https://img.shields.io/badge/git-github-lightgray.svg)](https://github.com/Falkor/dotfiles) [![Falkor/dotfiles issues](https://img.shields.io/github/issues/Falkor/dotfiles.svg)](https://github.com/Falkor/dotfiles/issues) ![](https://img.shields.io/github/stars/Falkor/dotfiles.svg) [![Documentation Status](https://readthedocs.org/projects/falkor-dotfiles/badge/?version=latest)](https://readthedocs.org/projects/falkor-dotfiles/?badge=latest)\n\n         ______    _ _             _       _____        _    __ _ _\n        |  ____|  | | |           ( )     |  __ \\      | |  / _(_) |\n        | |__ __ _| | | _____  _ __/ ___  | |  | | ___ | |_| |_ _| | ___ ___\n        |  __/ _` | | |/ / _ \\| '__|/ __| | |  | |/ _ \\| __|  _| | |/ _ \\ __|\n        | | | (_| | |   < (_) | |   \\__ \\ | |__| | (_) | |_| | | | |  __\\__ \\\n        |_|  \\__,_|_|_|\\_\\___/|_|   |___/ |_____/ \\___/ \\__|_| |_|_|\\___|___/\n\n\n       Copyright (c) 2011-2025 Sebastien Varrette aka Falkor\n\n# Sebastien Varrette aka Falkor's dotfiles\n\nThese are my configuration files for `bash`, `zsh`, `git`, `vim` etc. so as to set up a system the way I like it.\nFor instance, here is a screenshot of my terminal illustrating its behaviour on classical contexts commonly met on a daily usage of interactions with git repositories etc.\n\n![](https://raw.githubusercontent.com/Falkor/dotfiles/master/screenshots/screenshot_falkor_iterm.png)\n\n__Warning:__ Use these dotfiles at your own risk!\n\nIn the sequel, when providing a command, `$>` denotes a prompt and is not part of the commands.\n\n## Pre-requisites\n\nYou should install the following elements to use the full functionality of\nthese config files:\n\n* bash\n* bash-completions\n* zsh\n* zsh-completions\n* screen\n* git\n* subversion\n* vim\n* screen\n\nOn __Mac OS__, assuming you have installed [HomeBrew](http://brew.sh/) (you really should), you can use `brew/Brewfile.minimal` to install these dependencies as follows:\n\n~~~bash\n# Install brew bundle -- see https://github.com/Homebrew/homebrew-bundle\n$> brew tap Homebrew/bundle\n# Collect the Brewfile\n$> curl -o /tmp/Brewfile https://raw.githubusercontent.com/Falkor/dotfiles/master/brew/Brewfile.minimal\n# Install Falkor's dotfile dependencies\n$> brew bundle --file=/tmp/Brewfile -v\n~~~\n\nOn __Linux__:\n\n~~~bash\n# Debian / Ubuntu\n$> sudo apt-get install git git-flow bash-completion screen curl subversion zsh fonts-font-awesome\n~~~\n\n## Falkor's dotfiles Installation\n\n### All-in-one git-free install\n\nUsing `curl` (adapt the `--all` option to whatever you prefer -- see below table):\n\n``` bash\n$> curl -fsSL https://raw.githubusercontent.com/Falkor/dotfiles/master/install.sh | bash -s -- --all\n```\n\n### Using Git and the embedded Makefile\n\nThis repository is hosted on [Github](https://github.com/Falkor/dotfiles). You can clone the repository wherever you want.\nPersonally, I like to keep it in `~/git/github.com/Falkor/dotfiles`, with `~/.dotfiles.falkor.d` as a symlink. This behaviour will be reflected in the `install.sh` script _i.e._ if it is invoked from a directory that differs from `~/.dotfiles.falkor.d`, a symlink will be created toward the place where your cloned this repository.\n\nOtherwise, to clone this repository directly into `~/.dotfiles.falkor.d/`, proceed as follows\n\n        $> git clone https://github.com/Falkor/dotfiles.git ~/.dotfiles.falkor.d\n\n**`/!\\ IMPORTANT`**: Once cloned, initiate your local copy of the repository by running:\n\n        $> cd ~/.dotfiles.falkor.d\n        $> make setup\n\nThis will initiate the [Git submodules of this repository](.gitmodules) and setup the [git flow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) layout for this repository.\n\nNow to install all my dotfiles, run:\n\n~~~bash\n    $> make install\n~~~\n\n### Using Git and the embedded `install.sh` script\n\nThe above `make install` command actually runs (see `.Makefile.after`):\n\n~~~bash\n     $> ./install.sh --all   # Equivalent of 'make install'\n~~~\n\nNote that __by default__ (_i.e._ without option), the `install.sh` script does nothing __except__ cloning the Falkor/dotfiles directory if it does not yet exists (in `~/.dotfiles.falkor.d` by default).\n\n* if you __do not want to install everything__ but only a subpart, kindly refer to the below table to find the proper command-line argument to use. Ex:\n\n```bash\n         $> ./install.sh --zsh --vim --git\n```\n\n* if you want to install everything in a row, use as suggested above the `--all` option\n\n\n## Updating / Upgrading\n\nUpgrading is normally as simple as:\n\n     $> make -C ~/.config/dotfiles.falkor.d update\n\nOR, if you prefer a more atomic approach:\n\n     $> cd ~/.config/dotfiles.falkor.d\n     $> make update\n\nNote that if you wish to __upgrade__ the [Git submodules](.gitmodules) to the latest version, you should run:\n\n     $> make upgrade\n\n## Uninstalling / Removing Falkor's dotfile\n\nYou can use `install.sh --delete` to remove Falkor's dotfiles.\n\n__`/!\\ IMPORTANT`__: pay attention to use the options matching you installation package.\n\n* if you install __all__ dotfiles, run:\n\n```bash\n     $> ./install.sh --delete --all     # OR make uninstall\n```\n\n* if you install __only__ a subpart of the dotfiles, adapt the command line option. Ex:\n\n```bash\n     $> ./install.sh --delete --zsh --vim --git\n```\n\n\n## What's included and how to customize?\n\n| Tools                                                                          | Type                  | Installation            | Documentation                                |\n|--------------------------------------------------------------------------------|-----------------------|-------------------------|----------------------------------------------|\n| [Bourne-Again shell (bash)](http://tiswww.case.edu/php/chet/bash/bashtop.html) | shell                 | `./install.sh --bash`   | [`bash/README.md`](bash/README.md)           |\n| [zsh](http://www.zsh.org/) / [Oh-my-zsh](http://ohmyz.sh/)                     | shell                 | `./install.sh --zsh`    | [`oh-my-zsh/README.md`](oh-my-zsh/README.md) |\n| [VI iMproved (vim)](http://www.vim.org/)                                       | editor                | `./install.sh --vim`    | [`vim/README.md`](vim/README.md)             |\n| [GNU Emacs](https://www.gnu.org/software/emacs/)                               | editor                | `./install.sh --emacs`  | `emacs/README.md`                            |\n| [Git `--fast-version-control`](https://git-scm.com/)                           | VCS                   | `./install.sh --git`    | [`git/README.md`](git/README.md)             |\n| [GNU screen](https://www.gnu.org/software/screen/)                             | terminal multiplexers | `./install.sh --screen` | [`screen/README.md`](screen/README.md)       |\n|                                                                                |                       |                         |                                              |\n\nAs mentioned above, if you want to install all dotfiles in one shot, just use\n\n      $> ./install.sh --all      # OR 'make install'\n\n## Issues / Feature request\n\nYou can submit bug / issues / feature request using the [`Falkor/dotfiles` Project Tracker](https://github.com/Falkor/dotfiles/issues)\n\n## Developments / Contributing to the code\n\nIf you want to contribute to the code, you shall be aware of the way this repository is organized and developed.\nThese elements are detailed on `docs/contributing/`\n\n## Licence\n\nThis project is released under the terms of the [GPL-3.0](LICENCE) licence.\n\n[![Licence](https://www.gnu.org/graphics/gplv3-88x31.png)](http://www.gnu.org/licenses/gpl-3.0.html)\n\n## Resources\n\nYou can find of course many other resources in terms dotfiles repositories.\nI suggest you to take a look at the following places I inspired:\n\n* [Your unofficial guide to dotfiles on GitHub](https://dotfiles.github.io/)\n* My friend [H.Cartiaux's dotfiles](https://github.com/hcartiaux/dotfiles)\n* [Holman's does dotfiles](https://github.com/holman/dotfiles), for his idea of bundling the [homebrew](http://brew.sh) configuration\n* [Mathias’s dotfiles](https://github.com/mathiasbynens/dotfiles),  for featuring `~/.osx` _i.e._ sensible hacker defaults for OS X;\n* [Awesome dotfiles](https://github.com/webpro/awesome-dotfiles), a curated list of dotfiles resources. Inspired by the [awesome](https://github.com/sindresorhus/awesome) list thing.\n* [Carlo's dotfiles](https://github.com/caarlos0/dotfiles)\n"
  },
  {
    "path": "VERSION",
    "content": "1.4.0-b458\n"
  },
  {
    "path": "Vagrantfile",
    "content": "# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!\nVAGRANTFILE_API_VERSION = \"2\"\n\nVagrant.configure(VAGRANTFILE_API_VERSION) do |config|\n  # (nearly) All below boxes were generated using [vagrant-vms](https://github.com/Falkor/vagrant-vms/)\n  {\n   :centos => 'centos/7',\n   :debian => 'debian/contrib-jessie64',\n   :ubuntu => 'ubuntu/trusty64'\n  }.each do |os,name|\n    boxname = os.to_s.downcase.gsub(/_/, '-')\n    # Only the Ubuntu box is booted by default\n    config.vm.define boxname, :autostart => (os =~ /ubuntu/), :primary => (os =~ /ubuntu/) do |local|\n      local.vm.box = name\n      local.vm.host_name = ENV['VAGRANT_HOSTNAME'] || boxname.concat(\".vagrant.com\")\n    end\n  end\nend\n"
  },
  {
    "path": "atom/README.md",
    "content": "Generate the package list using:\n\n     apm list --installed --bare > package-list.txt\n\nImport it with \n\n    apm install --packages-file ./package-list.txt\n"
  },
  {
    "path": "atom/package-list.txt",
    "content": "atomic-emacs@0.9.2\nauto-indent@0.5.0\nautocomplete-clang@0.10.0\nbuild@0.67.0\nbuild-cmake@0.8.3\nbuild-tools@4.5.7\nbusy@0.7.0\nclock@1.9.0\nemacs-flow@0.1.2\ngit-plus@7.2.0\nlanguage-cmake@0.3.0\nlanguage-latex@1.0.0\nlanguage-lisp@0.2.0\nlatex@0.42.2\nlinter-clang@3.4.6\nmarkdown-scroll-sync@2.1.2\nopen-recent@5.0.0\npdf-view@0.54.0\ntree-view-git-status@1.3.0\n\n"
  },
  {
    "path": "bash/.bash_profile",
    "content": "# -*- mode:sh; -*-\n#\n# ~/.bash_profile\n#\n\n[[ -f ~/.bashrc ]] && . ~/.bashrc || true\n\n\n[[ -s \"$HOME/.rvm/scripts/rvm\" ]] && source \"$HOME/.rvm/scripts/rvm\" # Load RVM into a shell session *as a function*\n"
  },
  {
    "path": "bash/.bashrc",
    "content": "#! /bin/bash\n################################################################################\n#  .bashrc -- my personal Bourne-Again shell (aka bash) configuration\n#             see https://github.com/Falkor/dotfiles\n#\n#  Copyright (c) 2010-2017 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n#                https://varrette.gforge.uni.lu\n#                   _               _\n#                  | |__   __ _ ___| |__  _ __ ___\n#                  | '_ \\ / _` / __| '_ \\| '__/ __|\n#               _  | |_) | (_| \\__ \\ | | | | | (__\n#              (_) |_.__/ \\__,_|___/_| |_|_|  \\___|\n#\n################################################################################\n# This file is NOT part of GNU bash\n#\n# This program is free software: you can redistribute it and/or modify it under\n# the terms of the GNU General Public License as published by the Free Software\n# Foundation, either version 3 of the License, or (at your option) any later\n# version.\n#\n# This program is distributed in the hope that it will be useful, but WITHOUT\n# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n# details.\n#\n# You should have received a copy of the GNU General Public License along with\n# this program.  If not, see <http://www.gnu.org/licenses/>.\n################################################################################\n# Resources:\n#  - http://bitbucket.org/dmpayton/dotfiles/src/tip/.bashrc\n#  - https://github.com/rtomayko/dotfiles/blob/rtomayko/.bashrc\n\n# If not running interactively, don't do anything\ncase $- in\n    *i*) ;;\n    *) return;;\nesac\n\n# Basic variables\n: ${HOME=~}\n: ${LOGNAME=$(id -un)}\n: ${UNAME=$(uname)}\n# See https://specifications.freedesktop.org/basedir-spec/latest/\n: ${XDG_CONFIG_HOME=$HOME/.config}\n: ${XDG_DATA_HOME=$HOME/.local/share}\n: ${XDG_CACHE_HOME=$HOME/.cache}\nexport XDG_CONFIG_HOME XDG_DATA_HOME XDG_CACHE_HOME\n\n# complete hostnames from this file\n: ${HOSTFILE=~/.ssh/known_hosts}\n\n# readline config\n: ${INPUTRC=~/.inputrc}\n\n# Get rid of mail notification\nunset MAILCHECK\n\n# Local configuration\nBASH_CUSTOM_CONFIG_DIR=$XDG_CONFIG_HOME/bash/custom\nCOMMON_CONFIG_DIR=$XDG_CONFIG_HOME/shell\nCOMMON_CUSTOM_CONFIG_DIR=$COMMON_CONFIG_DIR/custom\n\n\n# ----------------------------------------------------------------------\n#  SHELL OPTIONS\n# ----------------------------------------------------------------------\n# bring in system bashrc\ntest -r /etc/bashrc &&\n    . /etc/bashrc\n\n# shell opts. see bash(1) for details\nshopt -s cdspell                 >/dev/null 2>&1  # correct minor errors in the spelling\n# of a directory in a cd command\nshopt -s extglob                 >/dev/null 2>&1  # extended pattern matching\nshopt -s hostcomplete            >/dev/null 2>&1  # perform hostname completion\n# on '@'\n#shopt -s no_empty_cmd_completion >/dev/null 2>&1\nshopt -u mailwarn                >/dev/null 2>&1\n\n# default umask\numask 0022\n\n# ----------------------------------------------------------------------\n# LS WITH COLORS\n# ----------------------------------------------------------------------\n#for *BSD/darwin\nexport CLICOLOR=1\n\n# we always pass these to ls(1)\nLS_COMMON=\"-hB\"\n\nls --color=auto &> /dev/null && LS_COMMON=\"${LS_COMMON} --color=auto\" || true\n\nalias ls=\"command ls ${LS_COMMON}\"\n\n# ----------------------------------------------------------------------\n#  ALIASES\n# ----------------------------------------------------------------------\n# these use the ls aliases above\nalias ll=\"ls -l\"\nalias la=\"ll -a\"\nalias l.=\"ls -d .*\"\n# Mandatory aliases to confirm destructive operations\nalias cp='cp -iv'\nalias mv='mv -iv'\nalias rm='rm -i'\n\nalias ..='cd ..'\n\n# Color aliases\nalias grep='grep --color=auto'\n#alias fgrep='fgrep --color=auto'\n#alias egrep='egrep --color=auto'\n\n# ----------------------------------------------------------------------\n# ENVIRONMENT CONFIGURATION\n# ----------------------------------------------------------------------\n# detect interactive shell\ncase \"$-\" in\n    *i*) INTERACTIVE=yes ;;\n    *)   unset INTERACTIVE ;;\nesac\n\n# detect login shell\ncase \"$0\" in\n    -*) LOGIN=yes ;;\n    *)  unset LOGIN ;;\nesac\n\n# enable en_US locale w/ UTF-8 encodings if not already configured\n: ${LANG:=\"en_US.UTF-8\"}\n: ${LANGUAGE:=\"en\"}\n: ${LC_ALL:=\"en_US.UTF-8\"}\nexport LANG LANGUAGE LC_ALL\n\n# ----------------------------------------------------------------------\n# PATH\n# ----------------------------------------------------------------------\npathadd() {\n    if [ -d \"$1\" ] && ! echo $PATH | grep -E -q \"(^|:)$1($|:)\" ; then\n        [ \"$2\" = \"after\" ] && PATH=\"$PATH:${1%/}\" || PATH=\"${1%/}:$PATH\"\n    fi\n}\npathrm() {\n    PATH=\"$(echo $PATH | sed -e \"s;\\(^\\|:\\)${1%/}\\(:\\|\\$\\);\\1\\2;g\" -e 's;^:\\|:$;;g' -e 's;::;:;g')\"\n}\n# Complete default PATH eventually\nfor bindir in /usr/local/bin $HOME/bin; do\n    pathadd ${bindir}\ndone\npathadd $HOME/.rvm/bin after\n\nmanpathadd() {\n    if [ -d \"$1\" ] && ! echo $MANPATH | grep -E -q \"(^|:)$1($|:)\" ; then\n        [ \"$2\" = \"after\" ] && MANPATH=\"$MANPATH:${1%/}\" || MANPATH=\"${1%/}:$MANPATH\"\n    fi\n}\n# Complete default MANPATH eventually\n# for mandir in /usr/local/share/man $HOME/share/man; do\n#     manpathadd ${mandir}\n# done\n\nPKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig\nLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib\n\n# ----------------------------------------------------------------------\n# MACOS X / DARWIN SPECIFIC\n# ----------------------------------------------------------------------\n# if [ \"${UNAME}\" = \"Darwin\" ]; then\n#     test -x \"/usr/libexec/java_home\" &&\n#         export JAVE_HOME=$(/usr/libexec/java_home)\n# fi\n\n# ----------------------------------------------------------------------\n# PAGER / EDITOR\n# ----------------------------------------------------------------------\n# Default editor\ntest -n \"$(command -v vim)\" && EDITOR=vim || EDITOR=nano\nexport EDITOR\n# Default pager ('less' is so much better than 'more'...)\nif test -n \"$(command -v less)\" ; then\n    #PAGER=\"less -FirSwX\"\n    PAGER=\"less\"\n    MANPAGER=\"$PAGER\"\nelse\n    PAGER=more\n    MANPAGER=\"$PAGER\"\nfi\nexport PAGER MANPAGER\n\n# ----------------------------------------------------------------------\n# BASH COMPLETION\n# ----------------------------------------------------------------------\n# enable programmable completion features (you don't need to enable\n# this, if it's already enabled in /etc/bash.bashrc and /etc/profile\n# sources /etc/bash.bashrc).\nif ! shopt -oq posix; then\n    test -n \"$(command -v brew)\" && BREW_BASH_COMPLETION=\"$(brew --prefix)/etc/bash_completion\" ||  BREW_BASH_COMPLETION=\"\"\n    for f in /usr/share/bash-completion/bash_completion \\\n                 /etc/bash_completion ${BREW_BASH_COMPLETION} \\\n                 /opt/local/etc/bash_completion\n    do\n        if [ -r \"$f\" ]; then\n            . $f\n            break\n        fi\n    done\nfi\n\n# ----------------------------------------------------------------------\n# OAR Batch scheduler\n# ----------------------------------------------------------------------\n# Resources:\n# - http://wiki-oar.imag.fr/index.php/Customization_tips\n# - http://wiki-oar.imag.fr/index.php/Oarsh_and_bash_completion\n\n# oarsh completion\nfunction _oarsh_complete_()\n{\n    local word=${COMP_WORDS[COMP_CWORD]}\n    local list\n    list=$(uniq \"$OAR_NODEFILE\" | tr '\\n' ' ')\n    COMPREPLY=($(compgen -W \"$list\" -- \"${word}\"))\n}\ncomplete -F _oarsh_complete_ oarsh\n\n# Job + Remaining time\n__oar_ps1_remaining_time(){\n    if [ -n \"$OAR_JOB_WALLTIME_SECONDS\" -a -n \"$OAR_NODE_FILE\" -a -r \"$OAR_NODE_FILE\" ]; then\n        DATE_NOW=$(date +%s)\n        DATE_JOB_START=$(stat -c %Y \"$OAR_NODE_FILE\")\n        DATE_TMP=$OAR_JOB_WALLTIME_SECONDS\n        ((DATE_TMP = (DATE_TMP - DATE_NOW + DATE_JOB_START) / 60))\n        echo -n \"[OAR$OAR_JOB_ID->$DATE_TMP]\"\n    fi\n}\n\n# OAR motd\ntest -n \"$INTERACTIVE\" && test -n \"$OAR_NODE_FILE\" && (\n        echo \"[OAR] OAR_JOB_ID=$OAR_JOB_ID\"\n        echo \"[OAR] Your nodes are:\"\n        sort \"$OAR_NODE_FILE\" | uniq -c | awk '{printf(\"      %s*%d\\n\",$2,$1)}END{printf(\"\\n\")}' | sed -e 's/,$//'\n    )\n\n\n# ----------------------------------------------------------------------\n# BASH HISTORY\n# ----------------------------------------------------------------------\n# Increase the history size\nHISTSIZE=10000\nHISTFILESIZE=20000\n\n# Add date and time to the history\nHISTTIMEFORMAT=\"[%d/%m/%Y %H:%M:%S] \"\n\n# ----------------------------------------------------------------------\n# VERSION CONTROL SYSTEM - CVS, SVN and GIT\n# ----------------------------------------------------------------------\n# === CVS ===\nexport CVS_RSH='ssh'\n\n# === SVN ===\nexport SVN_EDITOR=$EDITOR\n\n# Some code from https://github.com/nojhan/liquidprompt\n_LP_OPEN_ESC=\"\\[\"\n_LP_CLOSE_ESC=\"\\]\"\nti_sgr0=\"$( { tput sgr0 || tput me ; } 2>/dev/null )\"\nLP_COLOR_UP=${LP_COLOR_UP:-$GREEN}\nLP_COLOR_CHANGES=${LP_COLOR_CHANGES:-$RED}\nLP_COLOR_DIFF=${LP_COLOR_DIFF:-$PURPLE}\nNO_COL=\"${_LP_OPEN_ESC}${ti_sgr0}${_LP_CLOSE_ESC}\"\n\n# Escape the given strings\n# Must be used for all strings injected in PS1 that may comes from remote sources,\n# like $PWD, VCS branch names...\n_lp_escape() {\n    echo -nE \"${1//\\\\/\\\\\\\\}\"\n}\n# Get the branch name of the current directory\n# For the first level of the repository, gives the repository name\n_lp_svn_branch()\n{\n    local root=\n    local url=\n    eval \"$(LANG=C LC_ALL=C svn info 2>/dev/null | sed -n 's/^URL: \\(.*\\)/url=\"\\1\"/p;s/^Repository Root: \\(.*\\)/root=\"\\1\"/p' )\"\n    [[ -z \"${root-}\" ]] && return\n\n    # Make url relative to root\n    url=\"${url:${#root}}\"\n    if [[ \"$url\" == */trunk* ]]; then\n        echo -n trunk\n    elif [[ \"$url\" == */branches/?* ]]; then\n        url=\"${url##*/branches/}\"\n        _lp_escape \"${url%/*}\"\n    elif [[ \"$url\" == */tags/?* ]]; then\n        url=\"${url##*/tags/}\"\n        _lp_escape \"${url%/*}\"\n    else\n        _lp_escape \"${root##*/}\"\n    fi\n}\n# Set a color depending on the branch state:\n# - green if the repository is clean\n#   (use $LP_SVN_STATUS_OPTIONS to define what that means with\n#    the --depth option of 'svn status')\n# - red if there is changes to commit\n# Note that, due to subversion way of managing changes,\n# informations are only displayed for the CURRENT directory.\n_lp_svn_branch_color()\n{\n    (( LP_ENABLE_SVN )) || return\n\n    local branch\n    branch=\"$(_lp_svn_branch)\"\n    if [[ -n \"$branch\" ]]; then\n        local changes\n        changes=$(( $(svn status | \\grep -c -v \"?\") ))\n        if (( changes == 0 )); then\n            echo -nE \"${LP_COLOR_UP}${branch}${NO_COL}\"\n        else\n            echo -nE \"${LP_COLOR_CHANGES}${branch}${NO_COL}(${LP_COLOR_DIFF}$changes${NO_COL})\" # changes to commit\n        fi\n    fi\n}\n\n## display the current subversion revision (to be used later in the prompt)\n__svn_ps1() {\n    (\n        local svnversion\n        svnversion=$(svnversion | sed -e \"s/[:M]//g\")\n        # Continue if $svnversion is numerical\n        let $svnversion\n        if [[ \"$?\" -eq \"0\" ]]\n        then\n            printf \" (%s:%s)\" \"$(_lp_svn_branch_color)\" \"$(svnversion)\"\n        fi\n    ) 2>/dev/null\n}\n\n# === GIT ===\n# render __git_ps1 even better so as to show activity in a git repository\n#\n# see https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh for\n# configuration info of the GIT_PS1* variables\n#\nexport GIT_PS1_SHOWDIRTYSTATE=true\nexport GIT_PS1_SHOWSTASHSTATE=true\nexport GIT_PS1_SHOWUNTRACKEDFILES=true\n#export GIT_PS1_SHOWUPSTREAM=\"auto\"\nexport GIT_PS1_DESCRIBE_STYLE='branch'\n#export GIT_PS1_SHOWCOLORHINTS=true\n\nfunction_exists() {\n    declare -f -F $1 > /dev/null\n    return $?\n}\n# GIT bash completion and access to __git_ps1 is set in\nif ! type __git_ps1 &>/dev/null\nthen\n    # Try to load separately the file git-prompt\n    for f in \\\n        /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh \\\n            /etc/bash-completion.d/git-prompt \\\n            /usr/share/git/completion/git-prompt.sh \\\n            /usr/lib/git-core/git-sh-prompt\n    do\n        if [ -r \"$f\" ]; then\n            . $f\n            break\n        fi\n    done\nfi\n\n# ----------------------------------------------------------------------\n# PROMPT\n# ----------------------------------------------------------------------\n# Previous version:\n#PS1='\\[\\e[36;1m\\][\\t]\\[\\e[0m\\]:$?: \\u@\\[\\e[4;36m\\]\\h\\[\\e[0m\\] \\[\\e[34;1m\\]\\W\\[\\e[0m\\]\\[\\e[0;32m\\]$(__git_ps1 \"(%s)\")$(__svn_ps1)\\[\\e[0m\\]> '\n\n# Define some colors to use in the prompt\nRESET_COLOR=\"\\[\\e[0m\\]\"\nBOLD_COLOR=\"\\[\\e[1m\\]\"\n# B&W\nWHITE=\"\\[\\e[0;37m\\]\"\nGRAY=\"\\[\\e[1;30m\\]\"\nBLACK=\"\\[\\e[0;30m\\]\"\n# RGB\nRED=\"\\[\\e[0;31m\\]\"\nGREEN=\"\\[\\e[0;32m\\]\"\nBLUE=\"\\[\\e[34;1m\\]\"\n# other\nYELLOW=\"\\[\\e[0;33m\\]\"\nLIGHT_CYAN=\"\\[\\e[36;1m\\]\"\nCYAN_UNDERLINE=\"\\[\\e[4;36m\\]\"\n\n# Configure user color and prompt type depending on whoami\nif [ \"$LOGNAME\" = \"root\" ]; then\n    COLOR_USER=\"${RED}\"\n    P=\"#\"\nelse\n    COLOR_USER=\"${WHITE}\"\n    P=\"\"\nfi\n\n# Configure a set of useful variables for the prompt\nif [[ \"$(echo $UNAME | grep -c -i -e '^.*bsd$')\" == \"1\" ]] ; then\n    DOMAIN=$(hostname | cut -d '.' -f 2)\nelse\n    DOMAIN=$(hostname -f | cut -d '.' -f 2)\nfi\n\n# get virtualization information\nXENTYPE=\"\"\nif [ -f \"/sys/hypervisor/uuid\" ]; then\n    if [ \"$(</sys/hypervisor/uuid)\" == \"00000000-0000-0000-0000-000000000000\" ]; then\n        XENTYPE=\",Dom0\"\n    else\n        XENTYPE=\",DomU\"\n    fi\nfi\n# Test the PS1_EXTRA variable\nif [ -z \"${PS1_EXTRA}\" -a -f \"/proc/cmdline\" ]; then\n    # Here PS1_EXTRA is not set and/or empty, check additionally if it has not\n    # been set via kernel comment\n    kernel_ps1_extra=\"$(grep PS1_EXTRA /proc/cmdline)\"\n    if [ -n \"${kernel_ps1_extra}\" ]; then\n        PS1_EXTRA=$( sed -e \"s/.*PS1_EXTRA=\\\"\\?\\([^ ^\\t^\\\"]\\+\\)\\\"\\?.*/\\1/g\" /proc/cmdline )\n    fi\nfi\nPS1_EXTRAINFO=\"${BOLD_COLOR}${DOMAIN}${XENTYPE}${RESET_COLOR}\"\nif [ -n \"${PS1_EXTRA}\" ]; then\n    PS1_EXTRAINFO=\"${PS1_EXTRAINFO},${YELLOW}${PS1_EXTRA}${RESET_COLOR}\"\nfi\n\n\n# # Bash support for ZSH-like 'preexec' and 'precmd' functions.\n# # See http://www.twistedmatrix.com/users/glyph/preexec.bash.txt\n# test -r ~/.dotfiles.github.d/bash/preexec.bash &&\n# . ~/.dotfiles.github.d/bash/preexec.bash\n\n\n# This function is called from a subshell in $PS1, to provide the colorized\n# exit status of the last run command.\n# Exit status 130 is also considered as good as it corresponds to a CTRL-D\n__colorized_exit_status() {\n    printf -- \"\\$(status=\\$? ; if [[ \\$status = 0 || \\$status = 130  ]]; then \\\n                                echo -e '\\[\\e[01;32m\\]'\\$status;              \\\n                              else                                            \\\n                                echo -e '\\[\\e[01;31m\\]'\\$status; fi)\"\n}\n\n# Simple (basic) prompt\n__set_simple_prompt() {\n    unset PROMPT_COMMAND\n    PS1=\"[\\u@\\h] \\w(${DOMAIN}) ${P}> \"\n}\n\n# most compact version\n__set_compact_prompt() {\n    unset PROMPT_COMMAND\n    PS1=\"${COLOR_USER}${P}${RESET_COLOR}> \"\n}\n\n###########\n# my prompt; the format is as follows:\n#\n#    [hh:mm:ss]:$?: username@hostname(domain[,xentype][,extrainfo]) workingdir(svn/git status)$>\n#    `--------'  ^  `------' `------'         `--------'`--------------'\n#       cyan     |  root:red   cyan              light     green\n#                |           underline            blue   (absent if not relevant)\n#           exit code of\n#        the previous command\n#\n# The git/svn status part is quite interesting: if you are in a directory under\n# version control, you have the following information in the prompt:\n#   - under GIT: current branch name, followed by a '*' if the repository has\n#                uncommitted changes, followed by a '+' if some elements were\n#                'git add'ed but not commited.\n#   - under SVN: show (svn:XX[M]) where XX is the current revision number,\n#                followed by 'M' if the repository has uncommitted changes\n#\n# `domain` reflect the current domain of the machine that run the prompt\n# (guessed from hostname -f)\n# `xentype` is DOM0 or domU depending if the machine is a Xen dom0 or domU\n# Finally, is the environment variable PS1_EXTRA is set (or passed to the\n# kernel), then its content is displayed here.\n#\n# This prompt is perfect for terminal with black background, in my case the\n# Vizor color set (see http://visor.binaryage.com/) or iTerm2\n__set_my_prompt() {\n    PS1=\"$(__colorized_exit_status) ${LIGHT_CYAN}[\\t]${RESET_COLOR} ${COLOR_USER}\\u${RESET_COLOR}@${CYAN_UNDERLINE}\\h${RESET_COLOR}(${PS1_EXTRAINFO}) ${BLUE}\\W${RESET_COLOR}${GREEN}\\$(__git_ps1 \\\" (%s)\\\")\\$(__svn_ps1)${RESET_COLOR}${P}> \"\n}\n# TODO: define the same for white background.\n\n\n# --------------------------------------------------------------------\n# SSH/GPG AGENT\n# --------------------------------------------------------------------\n# # ssh-agent initialization - using keychain\n# #if [ ! -e \"$SSH_AUTH_SOCK\" ]; then\n# # eval `ssh-agent` 1>/dev/null;\n# #keychain --clear --noask ~/.ssh/id_dsa\n# #. ~/.keychain/${HOSTNAME}-sh\n\n# # gpg-agent initialization\n# #if [ ! -e \"$GPG_AGENT_INFO\" ]; then\n# #        eval `gpg-agent --daemon > $HOME/.gpg-agent-info`;\n# # source $HOME/.gpg-agent-info;\n# #fi\n\n\n######\n# Remove duplicate entries from a PATH style value while retaining\n# the original order. Use PATH if no <path> is given.\n# Usage: puniq [<path>]\n#\n# Example:\n#   $ puniq /usr/bin:/usr/local/bin:/usr/bin\n#   /usr/bin:/usr/local/bin\n###\npuniq () {\n    echo \"$1\" |tr : '\\n' |nl |sort -u -k 2,2 |sort -n |\n        cut -f 2- |tr '\\n' : |sed -e 's/:$//' -e 's/^://'\n}\n\n# -------------------------------------------------------------------\n# USER SHELL ENVIRONMENT\n# -------------------------------------------------------------------\n\n# Set the color prompt by default when interactive\nif [ -n \"$PS1\" ]; then\n    __set_my_prompt\nfi\nexport PS1\n\n# MOTD\ntest -n \"$INTERACTIVE\" -a -n \"$LOGIN\" && {\n    uname -npsr\n    uptime\n}\n\n\n# Customizations\nfor f in \\\n    ~/.bash_aliases \\\n    ~/.bash_private\ndo\n    if [ -r \"$f\" ]; then\n        . $f\n    fi\ndone\n\n#______________________________________________\n# Load Eventually [custom] local configs either\n# - common to all shells (from ~/.config/shell/[custom/]*.sh typically)\n# - specific to bash (from ~/.config/bash/custom/*.sh typically)\nfor d in \\\n${COMMON_CONFIG_DIR} \\\n${COMMON_CUSTOM_CONFIG_DIR} \\\n${BASH_CUSTOM_CONFIG_DIR}\ndo\n  if [ -d \"${d}\" ]; then\n    for f in ${d}/*.sh; do\n      [[ -r \"$f\" ]] && source $f\n    done\n    for f in ${d}/*.bash; do\n      [[ -r \"$f\" ]] && source $f\n    done\n  fi\ndone\n\n# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.\nif [ -d \"$HOME/.rvm\" ]; then\n  export PATH=\"$PATH:$HOME/.rvm/bin\"\n  [[ -s \"$HOME/.rvm/scripts/rvm\" ]] && source \"$HOME/.rvm/scripts/rvm\"\n  [[ -r \"${rvm_path}/scripts/completion\" ]] && . ${rvm_path}/scripts/completion\nfi\n\n#______________________\n# condense PATH entries\nPATH=\"$(puniq \"$PATH\")\"\nMANPATH=\"$(puniq \"$MANPATH\")\"\nPKG_CONFIG_PATH=\"$(puniq \"$PKG_CONFIG_PATH\")\"\nLD_LIBRARY_PATH=\"$(puniq \"$LD_LIBRARY_PATH\")\"\nexport PATH MANPATH PKG_CONFIG_PATH LD_LIBRARY_PATH\n\n# I hate this ring\n#set bell-style visible\n"
  },
  {
    "path": "bash/.inputrc",
    "content": "# -*- mode:sh; -*-\n################################################################################\n#  .inputrc -- my personal Readline configuration\n#             see https://github.com/Falkor/dotfiles\n#\n#  Copyright (c) 2010 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n#                http://varrette.gforge.uni.lu\n#                 _                   _\n#                (_)_ __  _ __  _   _| |_ _ __ ___\n#                | | '_ \\| '_ \\| | | | __| '__/ __|\n#               _| | | | | |_) | |_| | |_| | | (__\n#              (_)_|_| |_| .__/ \\__,_|\\__|_|  \\___|\n#                        |_|\n################################################################################\n# Resource\n# - https://github.com/rtomayko/dotfiles/blob/rtomayko/.inputrc\n\n# do not bell on tab-completion\nset bell-style bell\n\n# set expand-tilde off\n# set input-meta off\n# set convert-meta on\n# set output-meta off\n# set horizontal-scroll-mode off\n# set history-preserve-point on\n# set mark-directories on\n# set mark-symlinked-directories on\n# set match-hidden-files off\n\n# # completion settings\n# set page-completions off\n# set completion-query-items 2000\n# set completion-ignore-case off\n# set show-all-if-ambiguous on\n# set show-all-if-unmodified on\n# set completion-prefix-display-length 10\n# set print-completions-horizontally off\n\n# mappings for Ctrl-up-arrow and Ctrl-down-arrow for word moving\n## arrow up\n#\"\\e[A\":forward-word\n## arrow down\n#\"\\e[B\":backward-word\n# mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving\n#\"\\e[1;5C\": forward-word\n#\"\\e[1;5D\": backward-word\n#\"\\e[5C\":   forward-word\n#\"\\e[5D\":   backward-word\n#\"\\e\\e[C\":  forward-word\n#\"\\e\\e[D\":  backward-word\n"
  },
  {
    "path": "bash/README.md",
    "content": "# DEPRECATED!!! Falkor's Dotfiles -- Bourne-Again Shell (bash) configuration\n\n**IMPORTANT**: consider these configurations as deprecated and obsolete. You should better switch to [oh-my-bash](https://github.com/ohmybash/oh-my-bash) as instructed [here](https://gitlab.com/svarrette-anssi/tutorial-git/-/blob/main/docs/TP/config.md?ref_type=heads#bash-oh-my-bash)\n\n> [Oh-My-Bash](https://ohmybash.github.io/) is an open source, community-driven framework for managing your [BASH](https://www.gnu.org/software/bash/) configuration. It comes bundled with a ton of helpful functions, helpers, plugins, themes, and a few things that make you shout...\"\n\nSee the available [themes](https://github.com/ohmybash/oh-my-bash/blob/master/themes/THEMES.md) to find your prefered one.\nBelow instuctions will setup the minimalist [`purity` theme](https://github.com/ohmybash/oh-my-bash/blob/master/themes/THEMES.md#purity)\n\n```bash\n# Preliminaries: install fonts and dependencies\nsudo apt install curl fontconfig fonts-powerline fonts-font-awesome\n# Install oh-my-bash: download installer, check it and run it\ncurl -fsSL --skip-existing -o /tmp/oh-my-bash-installer.sh \\\n   https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh \nless /tmp/oh-my-bash-installer.sh  # review installer\nbash /tmp/oh-my-bash-installer.sh  # run it\n# adapting theme\nsed -i 's/OSH_THEME=\\\"font\\\"/OSH_THEME=\\\"purity\\\"/' ~/.bashrc\n# Enjoy !\nsource ~/.bashrc\n# cleanup\nrm /tmp/oh-my-bash-installer.sh\n```\n\n## Old README content\n\n## Screenshot\n\n![](https://raw.githubusercontent.com/Falkor/dotfiles/master/screenshots/screenshot_falkor_bash.png)\n\n## Installation\n\nYou can use the `install.sh` script featured with the [Falkor's dotfile](https://github.com/Falkor/dotfile) repository.\n\n``` bash\ncd ~/.dotfiles.falkor.d\n./install.sh --bash   \n```\nThis will setup the following files:\n\n* `~/.bashrc`\n* `~/.inputrc`\n* `~/.bash_profile`\n* `~/.bash_aliases`\n\n## Uninstall\n\n``` bash\ncd ~/.dotfiles.falkor.d\n./install.sh --delete --bash\n```\n\n## Customizations\n\nUse the `~/.bash_private` as a place holder for your own customization. This file is loaded by the `.bashrc` file.\n"
  },
  {
    "path": "bash/custom/.gitignore",
    "content": "*.sh\n"
  },
  {
    "path": "bash/custom/README.md",
    "content": "Place here all your local (custom) settings as `*.sh` files.\nThey are sourced by Falkor's bashrc\n\n"
  },
  {
    "path": "bash/preexec.bash",
    "content": "#!/bin/bash\n\n# preexec.bash -- Bash support for ZSH-like 'preexec' and 'precmd' functions.\n\n# The 'preexec' function is executed before each interactive command is\n# executed, with the interactive command as its argument.  The 'precmd'\n# function is executed before each prompt is displayed.\n\n# To use, in order:\n\n#  1. source this file\n#  2. define 'preexec' and/or 'precmd' functions (AFTER sourcing this file),\n#  3. as near as possible to the end of your shell setup, run 'preexec_install'\n#     to kick everything off.\n\n# Note: this module requires 2 bash features which you must not otherwise be\n# using: the \"DEBUG\" trap, and the \"PROMPT_COMMAND\" variable.  preexec_install\n# will override these and if you override one or the other this _will_ break.\n\n# This is known to support bash3, as well as *mostly* support bash2.05b.  It\n# has been tested with the default shells on MacOS X 10.4 \"Tiger\", Ubuntu 5.10\n# \"Breezy Badger\", Ubuntu 6.06 \"Dapper Drake\", and Ubuntu 6.10 \"Edgy Eft\".\n\n\n# Copy screen-run variables from the remote host, if they're available.\n\nif [[ \"$SCREEN_RUN_HOST\" == \"\" ]]\nthen\n    SCREEN_RUN_HOST=\"$LC_SCREEN_RUN_HOST\"\n    SCREEN_RUN_USER=\"$LC_SCREEN_RUN_USER\"\nfi\n\n# This variable describes whether we are currently in \"interactive mode\";\n# i.e. whether this shell has just executed a prompt and is waiting for user\n# input.  It documents whether the current command invoked by the trace hook is\n# run interactively by the user; it's set immediately after the prompt hook,\n# and unset as soon as the trace hook is run.\npreexec_interactive_mode=\"\"\n\n# Default do-nothing implementation of preexec.\nfunction preexec () {\n    true\n}\n\n# Default do-nothing implementation of precmd.\nfunction precmd () {\n    true\n}\n\n# This function is installed as the PROMPT_COMMAND; it is invoked before each\n# interactive prompt display.  It sets a variable to indicate that the prompt\n# was just displayed, to allow the DEBUG trap, below, to know that the next\n# command is likely interactive.\nfunction preexec_invoke_cmd () {\n    precmd\n    preexec_interactive_mode=\"yes\"\n}\n\n# This function is installed as the DEBUG trap.  It is invoked before each\n# interactive prompt display.  Its purpose is to inspect the current\n# environment to attempt to detect if the current command is being invoked\n# interactively, and invoke 'preexec' if so.\nfunction preexec_invoke_exec () {\n    if [[ -n \"$COMP_LINE\" ]]\n    then\n        # We're in the middle of a completer.  This obviously can't be\n        # an interactively issued command.\n        return\n    fi\n    if [[ -z \"$preexec_interactive_mode\" ]]\n    then\n        # We're doing something related to displaying the prompt.  Let the\n        # prompt set the title instead of me.\n        return\n    else\n        # If we're in a subshell, then the prompt won't be re-displayed to put\n        # us back into interactive mode, so let's not set the variable back.\n        # In other words, if you have a subshell like\n        #   (sleep 1; sleep 2)\n        # You want to see the 'sleep 2' as a set_command_title as well.\n        if [[ 0 -eq \"$BASH_SUBSHELL\" ]]\n        then\n            preexec_interactive_mode=\"\"\n        fi\n    fi\n    if [[ \"preexec_invoke_cmd\" == \"$BASH_COMMAND\" ]]\n    then\n        # Sadly, there's no cleaner way to detect two prompts being displayed\n        # one after another.  This makes it important that PROMPT_COMMAND\n        # remain set _exactly_ as below in preexec_install.  Let's switch back\n        # out of interactive mode and not trace any of the commands run in\n        # precmd.\n\n        # Given their buggy interaction between BASH_COMMAND and debug traps,\n        # versions of bash prior to 3.1 can't detect this at all.\n        preexec_interactive_mode=\"\"\n        return\n    fi\n\n    # In more recent versions of bash, this could be set via the \"BASH_COMMAND\"\n    # variable, but using history here is better in some ways: for example, \"ps\n    # auxf | less\" will show up with both sides of the pipe if we use history,\n    # but only as \"ps auxf\" if not.\n    local this_command=`history 1 | sed -e \"s/^[ ]*[0-9]*[ ]*//g\"`;\n\n    # If none of the previous checks have earlied out of this function, then\n    # the command is in fact interactive and we should invoke the user's\n    # preexec hook with the running command as an argument.\n    preexec \"$this_command\"\n}\n\n# Execute this to set up preexec and precmd execution.\nfunction preexec_install () {\n\n    # *BOTH* of these options need to be set for the DEBUG trap to be invoked\n    # in ( ) subshells.  This smells like a bug in bash to me.  The null stderr\n    # redirections are to quiet errors on bash2.05 (i.e. OSX's default shell)\n    # where the options can't be set, and it's impossible to inherit the trap\n    # into subshells.\n\n    set -o functrace > /dev/null 2>&1\n    shopt -s extdebug > /dev/null 2>&1\n\n    # Finally, install the actual traps.\n    PROMPT_COMMAND=\"${PROMPT_COMMAND};preexec_invoke_cmd\"\n    trap 'preexec_invoke_exec' DEBUG\n}\n\n# Since this is the reason that 99% of everybody is going to bother with a\n# pre-exec hook anyway, we'll include it in this module.\n\n# Change the title of the xterm.\nfunction preexec_xterm_title () {\n    local title=\"$1\"\n    echo -ne \"\\033]0;$title\\007\" > /dev/stderr\n}\n\nfunction preexec_screen_title () {\n    local title=\"$1\"\n    echo -ne \"\\033k$1\\033\\\\\" > /dev/stderr\n}\n\n# Abbreviate the \"user@host\" string as much as possible to preserve space in\n# screen titles.  Elide the host if the host is the same, elide the user if the\n# user is the same.\nfunction preexec_screen_user_at_host () {\n    local RESULT=\"\"\n    if [[ \"$SCREEN_RUN_HOST\" == \"$SCREEN_HOST\" ]]\n    then\n        return\n    else\n        if [[ \"$SCREEN_RUN_USER\" == \"$USER\" ]]\n        then\n            echo -n \"@${SCREEN_HOST}\"\n        else\n            echo -n \"${USER}@${SCREEN_HOST}\"\n        fi\n    fi\n}\n\nfunction preexec_xterm_title_install () {\n    # These functions are defined here because they only make sense with the\n    # preexec_install below.\n    function precmd () {\n        preexec_xterm_title \"${TERM} - ${USER}@${SCREEN_HOST} `dirs -0` $PROMPTCHAR\"\n        if [[ \"${TERM}\" == screen ]]\n        then\n            preexec_screen_title \"`preexec_screen_user_at_host`${PROMPTCHAR}\"\n        fi\n    }\n\n    function preexec () {\n        # xterm seems to treat backslashes funny; they terminate the escape\n        # sequence or something.  I'm not sure why, but if we don't escape them\n        # by doubling them (like so) then running an interactive command with a\n        # backslash in it will result in a messed-up terminal and half a\n        # terminal title echoed onto the command line.\n        thiscmd=\"$(echo \"$1\" | sed -e 's/\\\\/\\\\\\\\/g' | head -n 1)\"\n        preexec_xterm_title \"${TERM} - $thiscmd {`dirs -0`} (${USER}@${SCREEN_HOST})\"\n        if [[ \"${TERM}\" == screen ]]\n        then\n            local cutit=\"$1\"\n            local cmdtitle=`echo \"$cutit\" | cut -d \" \" -f 1`\n            if [[ \"$cmdtitle\" == \"exec\" ]]\n            then\n                local cmdtitle=`echo \"$cutit\" | cut -d \" \" -f 2`\n            fi\n            if [[ \"$cmdtitle\" == \"screen\" ]]\n            then\n                # Since stacked screens are quite common, it would be nice to\n                # just display them as '$$'.\n                local cmdtitle=\"${PROMPTCHAR}\"\n            else\n                local cmdtitle=\":$cmdtitle\"\n            fi\n            preexec_screen_title \"`preexec_screen_user_at_host`${PROMPTCHAR}$cmdtitle\"\n        fi\n    }\n\n    preexec_install\n}\n"
  },
  {
    "path": "bin/git-changelog",
    "content": "#!/usr/bin/env ruby\n################################################################################\n#  git-changelog -- populate a ChangeLog fie from the commit messages\n#                   see http://github.com/Falkor/dotfiles\n#\n#  Copyright (c) 2010 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n#                http://varrette.gforge.uni.lu\n#\n#             _ _             _                            _             \n#        __ _(_) |_       ___| |__   __ _ _ __   __ _  ___| | ___   __ _ \n#       / _` | | __|____ / __| '_ \\ / _` | '_ \\ / _` |/ _ \\ |/ _ \\ / _` |\n#      | (_| | | ||_____| (__| | | | (_| | | | | (_| |  __/ | (_) | (_| |\n#       \\__, |_|\\__|     \\___|_| |_|\\__,_|_| |_|\\__, |\\___|_|\\___/ \\__, |\n#       |___/                                   |___/              |___/ \n#\n################################################################################\n# This file is NOT part of GIT\n#\n# This program is free software: you can redistribute it and/or modify it under\n# the terms of the GNU General Public License as published by the Free Software\n# Foundation, either version 3 of the License, or (at your option) any later\n# version.\n#\n# This program is distributed in the hope that it will be useful, but WITHOUT\n# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n# details.\n#\n# You should have received a copy of the GNU General Public License along with\n# this program.  If not, see <http://www.gnu.org/licenses/>.\n################################################################################\n# Courtesy from http://snipplr.com/view/6261/ruby-git-changelog/ \n\ncmd=`git log --pretty='format:%ci::%an <%ae>::%s'`\n\nlist = {}\nlist_order = []\n\ncmd.each do |l|\n  date, author, subject = l.chomp.split(\"::\")\n  date, time, zone = date.split(\" \")\n\n  id = \"#{date}\\t#{author}\"\n  if not list[id]\n    list[id] = []\n    list_order << {:id => id, :value => list[id]}\n  end\n  list[id] << subject\nend\n\n# list.each do |id, value|\nlist_order.each do |i|\n  id = i[:id]\n  value = i[:value]\n\n  puts \"#{id}\"\n  puts value.map { |e| \"\\t* #{e}\" }.join(\"\\n\")\n  puts \"\\n\"\nend\n"
  },
  {
    "path": "bin/sshb",
    "content": "#!/bin/bash\n################################################################################\n#                    _     _               _ _____\n#            ___ ___| |__ | |__           (_)_   _|__ _ __ _ __ ___\n#           / __/ __| '_ \\| '_ \\   _____  | | | |/ _ \\ '__| '_ ` _ \\\n#           \\__ \\__ \\ | | | |_) | |_____| | | | |  __/ |  | | | | | |\n#           |___/___/_| |_|_.__/          |_| |_|\\___|_|  |_| |_| |_|\n#                                   _     _\n#                          __ _  __| | __| | ___  _ __\n#                         / _` |/ _` |/ _` |/ _ \\| '_ \\\n#                        | (_| | (_| | (_| | (_) | | | |\n#                         \\__,_|\\__,_|\\__,_|\\___/|_| |_|\n#\n################################################################################\n# SSH with host name and IP address in background (only in iTerm.app)\n# All credits to [kpumuk](http://github.com/kpumuk/dotfiles.git)\n\n# First, check to see if we have the correct terminal!\nif [ \"$(tty)\" == 'not a tty' ] || [ \"$TERM_PROGRAM\" != \"iTerm.app\" ] ; then\n    /usr/bin/ssh \"$@\"\n    exit $?\nfi\n\nfunction __calculate_iterm_window_dimensions {\n    local size=( $(osascript -e \"tell application \\\"iTerm\\\"\n    get bounds of window 1\n  end tell\" | tr ',' ' ') )\n\n    local x1=${size[0]} y1=${size[1]} x2=${size[2]} y2=${size[3]}\n  # 15px - scrollbar width\n    local w=$(( $x2 - $x1 - 15 ))\n  # 44px - titlebar + tabs height\n    local h=$(( $y2 - $y1 - 44))\n    echo \"${w}x${h}\"\n}\n\n# Console dimensions\nDIMENSIONS=$(__calculate_iterm_window_dimensions)\n\nBG_COLOR=\"#000000\"       # Background color\nFG_COLOR=\"#fffafa\"       # Foreground color\n#FG_COLOR=\"#662020\"       # Foreground color\nGRAVITY=\"NorthEast\"      # Text gravity (NorthWest, North, NorthEast,\n                         # West, Center, East, SouthWest, South, SouthEast)\nOFFSET1=\"20,10\"          # Text offset (host name)\nOFFSET2=\"20,80\"          # Text offset (ip address)\nFONT_SIZE=\"60\"           # Font size in points\nFONT_STYLE=\"Normal\"      # Font style (Any, Italic, Normal, Oblique)\n# Font path\n#FONT=\"$HOME/bin/.bash/bash/resources/SimpleLife.ttf\"\n\nHOSTNAME=`echo $@ | sed -e \"s/.*@//\" -e \"s/ .*//\"`\n\noutput=`dscacheutil -q host -a name $HOSTNAME`\nRESOLVED_HOSTNAME=`echo -e \"$output\"|grep '^name:'|awk '{print $2}'`\nRESOLVED_IP=`echo -e \"$output\"|grep '^ip_address:'|awk '{print $2}'`\n\nfunction set_bg {\n  local tty=$(tty)\n  osascript -e \"\n    tell application \\\"iTerm\\\"\n      repeat with theTerminal in terminals\n        tell theTerminal\n          try\n            tell session id \\\"$tty\\\"\n              set background image path to \\\"$1\\\"\n            end tell\n          on error errmesg number errn\n          end try\n        end tell\n      end repeat\n    end tell\"\n}\n\n\non_exit () {\n    if [ ! -f /tmp/iTermBG.empty.png ]; then\n        convert -size \"$DIMENSIONS\" xc:\"$BG_COLOR\" \"/tmp/iTermBG.empty.png\"\n    fi\n    set_bg \"/tmp/iTermBG.empty.png\"\n    rm \"/tmp/iTermBG.$$.png\"\n}\ntrap on_exit EXIT\n# -font \"$FONT\"\n\nconvert \\\n    -size \"$DIMENSIONS\" xc:\"$BG_COLOR\" -gravity \"$GRAVITY\" -fill \"$FG_COLOR\" \\\n    -family \"Georgia\" -style \"$FONT_STYLE\" -pointsize \"$FONT_SIZE\" -antialias \\\n    -draw \"text $OFFSET1 '${RESOLVED_HOSTNAME:-$HOSTNAME}'\" \\\n    -pointsize 30 -draw \"text $OFFSET2 '${RESOLVED_IP:-}'\" \\\n    \"/tmp/iTermBG.$$.png\"  2>/dev/null\nset_bg \"/tmp/iTermBG.$$.png\"\n\n/usr/bin/ssh \"$@\"\n\n"
  },
  {
    "path": "brew/Brewfile",
    "content": "# -*- mode: ruby -*-\n# Minimal Brewfile\n#\n# Pre-configuration for brew sources\ntap 'buo/cask-upgrade'\ntap 'caskroom/cask'\ntap 'caskroom/fonts'\ntap 'homebrew/bundle'\ntap 'homebrew/completions'\ntap 'homebrew/core'\ntap 'homebrew/dupes'\ntap 'homebrew/services'\ntap 'homebrew/versions'\ntap 'railwaycat/emacsmacport'\n\n# Couple of mandatory applications\nbrew 'autoconf'\nbrew 'autojump'\nbrew 'readline'\nbrew 'bash'\nbrew 'boost', args: ['with-mpi', 'without-single']\nbrew 'cmake'\nbrew 'coreutils'\nbrew 'ctags-exuberant'\nbrew 'chromaprint'\nbrew 'dsh'\nbrew 'figlet'\nbrew 'gdbm'\nbrew 'git', args: [ 'without-completions']\nbrew 'git-crypt'\nbrew 'git-extras'\nbrew 'git-flow-avh'\nbrew 'gnuplot', args: ['with-aquaterm', 'with-qt', 'with-pdflib-lite', 'with-cairo' ]\nbrew 'htop'\nbrew 'imapfilter'\nbrew 'imagemagick'\nbrew 'ipcalc'\nbrew 'jpegoptim'\nbrew 'libyaml'\nbrew 'lua'\nbrew 'mas'\nbrew 'mkdocs'\nbrew 'mr'\nbrew 'ninja'\nbrew 'nmap'\nbrew 'offlineimap'\nbrew 'optipng'\nbrew 'openssl'\nbrew 'perl'\nbrew 'pow'\nbrew 'qt'\nbrew 'sqlite'\nbrew 'packer'\nbrew 'pandoc'\nbrew 'parallel'\nbrew 'python'\nbrew 'homebrew/science/r'   # R statistical\nbrew 'ruby'\nbrew 'stow'\nbrew 'subversion'\nbrew 'task'\nbrew 'timewarrior'\nbrew 'tree'\nbrew 'terminal-notifier'\nbrew 'tig'\nbrew 'vim'\nbrew 'watch'\nbrew 'wget'\n# more recent rsync\nbrew 'homebrew/dupes/rsync'\n\n# completions\nbrew 'bash-completion'\nbrew 'brew-cask-completion'\nbrew 'zsh-completions'\n\n# Mac GUIs Apps\ncask '1password'\ncask 'alfred'\ncask 'aquaterm'\ncask 'atom'\ncask 'calibre'\ncask 'emacs-mac'\ncask 'dropbox'\ncask 'gpgtools'\ncask 'google-chrome'\ncask 'gpgtools'\ncask 'mactex'\ncask 'marked'\ncask 'omnigraffle'\ncask 'rowanj-gitx'\ncask 'rstudio'\ncask 'skim'\ncask 'skype'\ncask 'spamsieve'\ncask 'the-unarchiver'\ncask 'vagrant'\ncask 'vagrant-manager'\ncask 'virtualbox'\ncask 'xquartz'\ncask 'yujitach-menumeters'\n\n# Special fonts\ncask 'font-source-code-pro-for-powerline'\ncask 'font-hack-nerd-font'\ncask 'font-lato'\n\n# Mac Store Apps\nmas 'Numbers', id: 409203825\nmas 'Keynote', id: 409183694\nmas 'Slack', id: 803453959\nmas 'Pages', id: 409201541\nmas 'Tweetbot', id: 557168941\nmas \"Xcode\", id: 497799835\n"
  },
  {
    "path": "brew/Brewfile.minimal",
    "content": "# -*- mode: ruby -*-\n# Minimal Brewfile for Falkor's dotfile installation --\n# see https://github.com/Falkor/dotfiles\n\n# Pre-configuration for brew sources\ntap \"buo/cask-upgrade\"\ntap \"d12frosted/emacs-plus\"\ntap \"homebrew/bundle\"\ntap \"homebrew/cask\"\ntap \"homebrew/cask-fonts\"\ntap \"homebrew/cask-versions\"\ntap \"homebrew/core\"\ntap \"homebrew/services\"\ntap \"romkatv/powerlevel10k\"\n\n# Couple of mandatory applications\nbrew 'readline'\nbrew 'bash'\nbrew 'bash-completion'\nbrew 'coreutils'\nbrew 'curl'\nbrew 'git'\nbrew \"git-extras\"\nbrew \"git-flow-avh\"\nbrew 'mas'\nbrew \"romkatv/powerlevel10k/powerlevel10k\"\nbrew 'subversion'\nbrew 'terminal-notifier'\nbrew 'tig'\nbrew 'vim'\nbrew 'wget'\n\n\n# completions\nbrew 'bash-completion'\nbrew 'brew-cask-completion'\nbrew 'zsh-completions'\n\n# Mac GUIs Apps\ncask 'atom'\nbrew \"d12frosted/emacs-plus/emacs-plus@27\", args: [\"with-spacemacs-icon\"]\ncask \"iterm2\"\ncask \"sublime-text\"\n\n\nmas \"Xcode\", id: 497799835\n\n# Special fonts\ncask 'font-source-code-pro-for-powerline'\ncask 'font-hack-nerd-font'\n"
  },
  {
    "path": "curl/.curlrc",
    "content": "# Reference: https://github.com/davidosomething/dotfiles\n\n# https://github.com/drduh/macOS-Security-and-Privacy-Guide#curl\n\n#user-agent = \"Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0\"\nreferer = \";auto\"\nconnect-timeout = 10\nprogress-bar\nmax-time = 90\n#verbose\nshow-error\nremote-time\nipv4\n"
  },
  {
    "path": "direnv/.gitignore",
    "content": "allow\n"
  },
  {
    "path": "direnv/direnvrc",
    "content": "# -*- mode: sh; -*-\n# Custom global configuration for [direnv](https://direnv.net/)\n# i.e. override/complete the direnv-stdlib:\n#           https://github.com/direnv/direnv/blob/master/stdlib.sh\n#\n# Quick installation of this file:\n#    mkdir -p ~/.config/direnv\n#    cd ~/.config/direnv\n#    curl -o direnvrc https://raw.githubusercontent.com/Falkor/dotfiles/master/direnv/direnvrc\n#\n# Sample .envrc you can use for Python projects based on the\n# layouts defined in this file:\n# https://github.com/Falkor/dotfiles/blob/master/direnv/envrc\n#\n############################ Python ############################\n# Workfow based on:\n# - 'pyenv' to easily switch to a special version of python\n# - 'pyenv-virtualenv' to manage python versions AND virtualenvs\n#\n# Typical .envrc for your python project using the below functions:\n#    if [ -f \".python-version\" ]; then\n#       pyversion=$(head .python-version)\n#    else\n#       pyversion=2.7.16\n#    fi\n#    pvenv=$(basename $PWD)\n#\n#    use python ${pyversion}\n#    layout virtualenv ${pyversion} ${pvenv}\n#    layout activate ${pvenv}\n#\n# Adapted from\n#  - https://github.com/direnv/direnv/wiki/Python#-pyenv and\n#  - https://github.com/direnv/direnv/wiki/Python#-virtualenvwrapper\n#  - https://github.com/direnv/direnv/wiki/Python#venv-stdlib-module\n#\n# Side note:\n# It appeared required to reload the pyenv [virtualenv-]init as for\n# It May be due to the fact that direnv is creating a new bash\n#  sub-process to load the stdlib, direnvrc and .envrc\n###\n\n# === Use a specific python version (with pyenv) ===\n# Usage in .envrc:\n#    use python <version>\nuse_python() {\n    if has pyenv; then\n        local pyversion=$1\n        eval \"$(pyenv init --path)\"\n        eval \"$(pyenv init -)\"\n        pyenv local ${pyversion} || log_error \"Could not find pyenv version '${pyversion}'. Consider running 'pyenv install ${pyversion}'\"\n    fi\n}\n\n# === Support for Python >=3.3 venv ===\n# See https://github.com/direnv/direnv/wiki/Python#venv-stdlib-module\n# Python 3.3 and later provide built-in support for virtual environments via the venv module in the standard library.\n# Usage in .envrc:\n#   export VIRTUAL_ENV_HOME=.venv    # Default: ~/venv\n#   layout python-venv <name>        # creates ${VIRTUAL_ENV_HOME}/<name> venv\nrealpath() {\n    [[ $1 = /* ]] && echo \"$1\" || echo \"$PWD/${1#./}\"\n}\nlayout_python-venv() {\n    local pvenv=$1\n\n    VIRTUAL_ENV_HOME=${VIRTUAL_ENV_HOME:-~/venv}\n    VIRTUAL_ENV=${VIRTUAL_ENV:-${VIRTUAL_ENV_HOME}/${pvenv}}\n    unset PYTHONHOME\n    export VIRTUAL_ENV\n    if [[ ! -d $VIRTUAL_ENV ]]; then\n        log_status \"no venv found; creating $VIRTUAL_ENV\"\n        python3 -m venv \"$VIRTUAL_ENV\"\n    fi\n    PATH_add \"${VIRTUAL_ENV}/bin\"\n}\n\n# === Create a new virtualenv ===\n# Usage in .envrc:\n#    layout virtualenv <version> <name>\nlayout_virtualenv() {\n    local pyversion=$1\n    local pvenv=$2\n    if has pyenv; then\n        pyenv local ${pyversion}\n        if [ -n \"$(which pyenv-virtualenv)\" ]; then\n            eval \"$(pyenv virtualenv-init -)\"\n            pyenv virtualenv --force --quiet ${pyversion} ${pvenv}\n        else\n            log_error \"pyenv-virtualenv is not installed.\"\n        fi\n    elif has python3; then\n        # Use venv by default\n        layout_python-venv ${pvenv}\n    else\n        log_error \"pyenv or python3 venv not found.\"\n    fi\n}\n\n# === Activate a virtualenv ===\n# Note that pyenv-virtualenv uses 'python -m venv' if it is\n# available (CPython 3.3 and newer) and  'virtualenv' otherwise\n# Usage in .envrc:\n#    layout activate <name>\nlayout_activate() {\n    if has pyenv; then\n        local pyenvprefix=$(pyenv prefix)\n        local pyversion=$(pyenv version-name)\n        local pvenv=\"$1\"\n        # Below initialization is necessary to recall ;(\n\n        pyenv activate ${pvenv}\n    else\n        source ${VIRTUAL_ENV}/bin/activate\n    fi\n}\n"
  },
  {
    "path": "direnv/envrc",
    "content": "# -*- mode: sh; -*-\n# (rootdir)/.envrc : local direnv configuration file\n# Assumes the presence of '~/.config/direnv/direnvrc' from  \n#    https://github.com/Falkor/dotfiles/blob/master/direnv/direnvrc\n#\n# Grab the latest version of this file from\n#      https://github.com/Falkor/dotfiles/blob/master/direnv/envrc\n#  \n# Quick installation of this file for your project:\n#    cd /path/to/projectdir\n#    curl -o .envrc https://raw.githubusercontent.com/Falkor/dotfiles/master/direnv/envrc\n\n# Default python version and virtualenv (basename of the root project directory)\n[ -f \".python-version\" ]    && pyversion=$(head .python-version) || pyversion=3.7.4\n[ -f \".python-virtualenv\" ] && pvenv=$(head  .python-virtualenv) || pvenv=$(basename $PWD)\n\nuse python ${pyversion}\n# Create the virtualenv if not yet done\nlayout virtualenv ${pyversion} ${pvenv}\n# activate it\nlayout activate ${pvenv} \n"
  },
  {
    "path": "direnv/init.sh",
    "content": "# Custom load for direnv\n# See https://direnv.net/\n\nif [ -n \"$(which direnv 2>/dev/null)\" ]; then\n    eval \"$(direnv hook $(basename $SHELL))\"\n    # export DIRENV_WARN_TIMEOUT=100s\n\n    # See https://github.com/direnv/direnv/wiki/Python#restoring-the-ps\n    show_virtual_env() {\n        if [[ -n \"$VIRTUAL_ENV\" && -n \"$DIRENV_DIR\" ]]; then\n            echo \"($(basename $VIRTUAL_ENV))\"\n        fi\n    }\n    if [[ -n ${ZSH_VERSION-} ]]; then\n        setopt PROMPT_SUBST\n    else\n        export -f show_virtual_env\n    fi\n\n    PS1='$(show_virtual_env) '$PS1\nfi\n"
  },
  {
    "path": "docs/contributing/index.md",
    "content": "This project is released under the terms of the [GPL-3.0 Licence](LICENSE). So you are more than welcome to contribute to its development as follows:\n\n1. [Fork](https://help.github.com/articles/fork-a-repo/) it.\n2. Clone your _forked_ copy of this repository as follows (adapt accordingly):\n\n        $> mkdir -p ~/git/github.com/<YOUR_LOGIN>\n        $> cd ~/git/github.com/<YOUR_LOGIN>\n        $> git clone https://github.com/<YOUR_LOGIN>/dotfiles.git\n\n3. **`/!\\ IMPORTANT`**: Once cloned, initiate your local copy of the repository ([Git-flow](https://github.com/nvie/gitflow), Git [submodules](.gitmodules) etc.) by running:\n\n        $> cd dotfiles\n\t\t$> make setup\n\n4. Create your own feature branch\n\n          $> git checkout -b my-new-feature\n\n5. Commit your changes (`git commit -am 'Added some feature'`)\n6. Push to the branch (`git push origin my-new-feature`)\n7. Create a new [Pull Request](https://help.github.com/articles/using-pull-requests/) to submit your changes to me.\n\nThis assumes that you have understood the [directory tree structure](layout.md) of this repository.\n\nFinally, you shall be aware of the way the [semantic versioning](versioning.md) procedure of this Puppet module are handled.\n"
  },
  {
    "path": "docs/contributing/layout.md",
    "content": "\nThis dotfile repository is organized as follows:\n\n~~~bash\n.\n├── LICENSE         # GPL v3 Licence\n├── Makefile        # GNU Make configuration\n├── README.md       # This file\n├── VERSION         # /!\\ DO NOT EDIT. Current repository version\n├── Vagrantfile     # Pilot Vagrant to test this repository\n├── bash/\n│   ├── .bashrc     # bash configuration\n│   └── .inputrc    # readline configuration\n├── bin/            # some bin scripts\n├── docs/           # [Read the Docs](readthedocs.org) main directory\n├── emacs           # [My emacs configuration](https://github.com/Falkor/emacs-config2/)\n├── fonts/          # Exported fonts\n├── git/            # My git configuration\n├── install.sh      # Installation script\n├── mkdocs.yml      # [Read the Docs](readthedocs.org) configuration\n├── oh-my-zsh/\n│   └── custom\n│       ├── *.zsh   # Some custom ZSH [completion] files\n│       ├── plugins\n│       │   ├── falkor\n│       │   │   └── falkor.plugin.zsh   # personal ZSH aliases / functions\n│       │   └── zsh-completions         # plugin to integrate zsh-completions to oh-my-zsh\n│       └── private_aliases.zsh         # NOT MEANT TO BE TRACKED\n├── screen/         # GNU screen configuration\n├── screenshots/    # screenshots to illustrate my configs\n└── vim/            # Vim configuration\n~~~\n"
  },
  {
    "path": "docs/contributing/setup.md",
    "content": "There is a number of pre-requisite programs / framework you shall install to be able to correctly contribute to this Puppet module.\n\n### Git Branching Model\n\nThe Git branching model for this repository follows the guidelines of\n[gitflow](http://nvie.com/posts/a-successful-git-branching-model/).\nIn particular, the central repository holds two main branches with an infinite lifetime:\n\n* `production`: the *production-ready* branch\n* `master`: the main branch where the latest developments interviene. This is the *default* branch you get when you clone the repository.\n\nThus you are more than encouraged to install the [git-flow](https://github.com/nvie/gitflow) extensions following the [installation procedures](https://github.com/nvie/gitflow/wiki/Installation) to take full advantage of the proposed operations. The associated [bash completion](https://github.com/bobthecow/git-flow-completion) might interest you also.\n\n### Repository Setup\n\nAs mentioned in the [installation notes](/), to make your local copy of the repository ready to use the [git-flow](https://github.com/nvie/gitflow) workflow\n\n\t    $> make setup\n\nThis will also initiate the [Git submodules of this repository](.gitmodules).\n"
  },
  {
    "path": "docs/contributing/versioning.md",
    "content": "The operation consisting of releasing a new version of this repository is automated by a set of tasks within the root `Makefile`.\n\nIn this context, a version number have the following format:\n\n      <major>.<minor>.<patch>[-b<build>]\n\nwhere:\n\n* `< major >` corresponds to the major version number\n* `< minor >` corresponds to the minor version number\n* `< patch >` corresponds to the patching version number\n* (eventually) `< build >` states the build number _i.e._ the total number of commits within the `master` branch.\n\nExample: \\`1.0.0-b28\\`\n\nThe current version number is stored in the root file `VERSION`. __/!\\ NEVER MAKE ANY MANUAL CHANGES TO THIS FILE__\n\nFor more information on the version, run:\n\n     $> make versioninfo\n\nIf a new version number such be bumped, you simply have to run:\n\n      $> make start_bump_{major,minor,patch}\n\nThis will start the release process for you using `git-flow`.\nOnce you have finished to commit your last changes, make the release effective by running:\n\n      $> make release\n\nIt will finish the release using `git-flow`, create the appropriate tag in the `production` branch and merge all things the way they should be.\n"
  },
  {
    "path": "docs/emacs/index.md",
    "content": "# Falkor's Dotfiles -- GNU Emacs configuration\n\n## Screenshot\n\n![](https://raw.githubusercontent.com/Falkor/dotfiles/master/screenshots/screenshot_falkor_emacs.png)\n"
  },
  {
    "path": "docs/index.md",
    "content": "-*- mode: markdown; mode: visual-line;  -*-\n\n# Falkor/dotfiles\n\n[![Licence](https://img.shields.io/badge/license-GPL--3.0-blue.svg)](http://www.gnu.org/licenses/gpl-3.0.html) ![By Falkor](https://img.shields.io/badge/by-Falkor-blue.svg)  [![Build Status](https://travis-ci.org/Falkor/dotfiles.svg?branch=master)](https://travis-ci.org/Falkor/dotfiles) [![github](https://img.shields.io/badge/git-github-lightgray.svg)](https://github.com/Falkor/dotfiles) [![Falkor/dotfiles issues](https://img.shields.io/github/issues/Falkor/dotfiles.svg)](https://github.com/Falkor/dotfiles/issues) ![](https://img.shields.io/github/stars/Falkor/dotfiles.svg) [![Documentation Status](https://readthedocs.org/projects/falkor-dotfiles/badge/?version=latest)](https://readthedocs.org/projects/falkor-dotfiles/?badge=latest)\n\n      Copyright (c) 2011-2016 Sebastien Varrette aka Falkor <Sebastien.Varrette@uni.lu>\n\n| [Project Page](https://github.com/Falkor/dotfiles) | [Documentation](http://falkor-dotfiles.readthedocs.org/en/latest/) | [Issues](https://github.com/Falkor/dotfiles/issues) |\n\n-----------\nThe [`Falkor/dotfiles`](https://github.com/Falkor/dotfiles) repository holds my configuration files for `bash`, `zsh`, `git`, `vim` etc. so as to set up a system the way I like it.\n\nThis is the main page of the documentation for this repository, which is hosted and managed by [Read the Docs](http://falkor-dotfiles.readthedocs.org/en/latest/).\nIt proposes to detail the following elements:\n\n* An [Overview](overview.md) of the project is proposed, with installation notes.\n* How to [test these dotfiles with Vagrant](vagrant.md)\n* How to [contribute](contributing/index.md) to these development. In particular, we detail:\n     - the [directory tree structure](contributing/layout.md)\n\t - the steps to follow to [setup this repository](contributing/setup.md)\n\t - information as regard the [semantic versioning](contributing/versioning.md) of this Puppet module.\n     - Apart form the directory layout, we will cover various configuration aspects (mainly [git-flow](https://github.com/nvie/gitflow))\n* Details on the [Read the Docs](http://falkor-dotfiles.readthedocs.org/en/latest/) management.\n"
  },
  {
    "path": "docs/rtfd.md",
    "content": "The documentation for this project is handled by [Read the Docs](https://readthedocs.org/), a web service dedicated to documentation management for the open source community.\n\n* [Reference documentation](https://docs.readthedocs.org/en/latest/)\n\nBy default, the [`Falkor/dotfiles`](https://github.com/Falkor/dotfiles) repository is bound to the [falkor-dotfiles](http://falkor-dotfiles.rtfd.org) project on Read the Docs (to avoid confusion with other `dotfiles` projects).\n\nYou might wish to generate locally the docs:\n\n* Install [`mkdocs`](http://www.mkdocs.org/#installation)\n* Preview your documentation from the project root by running `mkdocs serve` and visit with your favorite browser the URL `http://localhost:8000`\n* build the full documentation locally (in the `site/` directory) by running `mkdocs build`.\n"
  },
  {
    "path": "docs/vagrant.md",
    "content": "-*- mode: markdown; mode: visual-line; -*-\n\n# Falkor's dotfiles Tests with Vagrant\n\nThe best way to test these dotfiles in a non-intrusive way is to rely on [Vagrant](http://www.vagrantup.com/).\n[Vagrant](http://vagrantup.com/) uses [Oracle's VirtualBox](http://www.virtualbox.org/) to build configurable, lightweight, and portable virtual machines dynamically.\n\n* [Reference installation notes](http://docs.vagrantup.com/v2/installation/) -- assuming you have installed [Oracle's VirtualBox](http://www.virtualbox.org/)\n* [installation notes on Mac OS](http://sourabhbajaj.com/mac-setup/Vagrant/README.html) using [Homebrew](http://brew.sh/) and [Cask](http://sourabhbajaj.com/mac-setup/Homebrew/Cask.html)\n\nThe `Vagrantfile` at the root of the repository pilot the provisioning of many vagrant boxes generated through the [vagrant-vms](https://github.com/falkor/vagrant-vms) repository and available on [Vagrant cloud](https://atlas.hashicorp.com/boxes/search?utf8=%E2%9C%93&sort=&provider=virtualbox&q=svarrette).\n\nYou can list the available vagrant box as follows:\n\n       $> vagrant status\n\t   Current machine states:\n\n       centos-7                  not created (virtualbox)\n\t   debian-7                  not created (virtualbox)\n\n       This environment represents multiple VMs. The VMs are all listed\n\t   above with their current state. For more information about a specific\n\t   VM, run `vagrant status NAME`.\n\nAs suggested, you can run a debian 7 machine for instance by issuing:\n\n      $> vagrant up debian-7\n\nThen you can ssh into the machine afterwards:\n\n      $> vagrant ssh debian-7\n\nOnce within the box, feel free to try my dotfiles. You can install them by running:\n\n      $> /vagrant/install.sh      # /vagrant mounts the root of the Falkor's dotfile repository\n      $> chsh -s $(which zsh)     # Set zsh as the login shell\n"
  },
  {
    "path": "git/.gitconfig",
    "content": "# -*- mode: gitconfig; -*-\n################################################################################\n#  .gitconfig -- my personal GIT configuration\n#                see http://github.com/Falkor/dotfiles\n#\n#  Copyright (c) 2010 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n#                http://varrette.gforge.uni.lu\n#\n#                _ _                   __ _\n#           __ _(_) |_ ___ ___  _ __  / _(_) __ _\n#          / _` | | __/ __/ _ \\| '_ \\| |_| |/ _` |\n#         | (_| | | || (_| (_) | | | |  _| | (_| |\n#        (_)__, |_|\\__\\___\\___/|_| |_|_| |_|\\__, |\n#          |___/                            |___/\n#\n################################################################################\n# Resources:\n#  - http://stackoverflow.com/questions/267761/what-does-your-gitconfig-contain\n\n# As introduced in Git >= 1.7.10 (see http://git-scm.com/docs/git-config#_includes)\n[include]\n    # For username / credentials / private business etc.\n    path = config.local\n\n[alias]\n    up  = pull origin\n    pu  = push origin\n    st  = status\n    df  = diff\n    ci  = commit -s\n    w   = whatchanged --abbrev-commit\n    ls  = ls-files\n    gr  = log --graph --pretty=format:'%C(auto)%h -%d %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit\n    grd = log --graph --pretty=format:'%C(auto)%h -%d %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit\n    # From http://progit.org/book/ch2-11.html\n    unadd = reset HEAD\n    unstage = reset HEAD --\n    last = log -1 HEAD\n    amend = commit --amend\n    # From http://j.shirley.im/tech/git-flow/\n    feature-start = flow feature start\n    feature-finish = ! git flow feature finish\n\n    # From https://github.com/tgamblin/dotfiles/blob/master/home/.gitconfig\n    br = branch --sort=-committerdate \\\n        --format '%(HEAD) %(color:yellow)%(objectname:short)%(color:reset)  %(if)%(HEAD)%(then)%(color:green)%(refname:short)%(color:reset)%(else)%(refname:short)%(end) - %(color:cyan)(%(committerdate:relative))%(color:reset)'\n\n    bv = branch --sort=-committerdate \\\n        --format '%(HEAD) %(color:yellow)%(objectname:short)%(color:reset)  %(if)%(HEAD)%(then)%(color:green)%(refname:short)%(color:reset)%(else)%(refname:short)%(end) - %(color:cyan)(%(committerdate:relative))%(color:reset)%(if)%(upstream)%(then) -> %(color:magenta)%(upstream:short) %(color:white)%(upstream:track)%(color:reset)%(end)'\n\n    #\n    # `git b` with no arguments shows branches ordered by commit date\n    # (most recent first)\n    #\n    # With arguments, it behaves like `git branch`\n    #\n    b = !\"f() { \\\n            if [ $# -ne 0 ]; then \\\n                git branch \\\"$@\\\"; \\\n            else \\\n                git for-each-ref --sort=-committerdate refs/heads/ \\\n                --format='%(HEAD) %(color:yellow)%(objectname:short)%(color:reset)  %(if)%(HEAD)%(then)%(color:green)%(refname:short)%(color:reset)%(else)%(refname:short)%(end) - %(color:cyan)(%(committerdate:relative))%(color:reset)'; \\\n            fi; \\\n        }; f\"\n    #\n    # Make tarball out of the current head.  Tarball and the contained\n    # directory will be named by the date and current HEADs SHA.\n    #\n    tarball = !\"f() { \\\n        filename=\\\"$1\\\"; \\\n        if [ \\\"x$filename\\\" = x ]; then \\\n            name=\\\"$(basename $(git rev-parse --show-toplevel))\\\" && \\\n            head=$(git log -1 --format=\\\"%h\\\" HEAD) && \\\n            dstamp=$(git log -1 --format=\\\"%ci\\\" HEAD | awk '{print $1}') && \\\n            filename=\\\"${name}-${dstamp}-${head}\\\"; \\\n        fi; \\\n        git archive --format=tar.gz --prefix=\\\"${filename}/\\\" HEAD -o ${filename}.tar.gz; \\\n    }; f\"\n    #\n    # Git Statistics\n    #\n    # - ghstats\n    #     Show same statistics that GitHub's contributors page does:\n    #     commits, insertions, & deletions, over the current branch.\n    #\n    # - lcontrib:\n    #     Use `git blame` to sum up lines contributed by all users\n    #     that are still in the current HEAD. This differs from\n    #     ghstats becausae it shows only lines in the current\n    #     snapshot, NOT insertions and deletions from all commits.\n    #\n    # - scontrib:\n    #     Show raw #commits made by users in current branch.\n    #\n    # All of the above aliases can take paths as arguments, e.g., if\n    # your repo has a subdirectory called \"lib\", you could do:\n    #\n    #   git ghstats lib\n    #\n    # You can provide relative or absolute paths. You can also exclude\n    # paths from the statistics using git pathspecs, e.g. if you\n    # wanted to exclude contributions made in a directory containing\n    # external dependencies:\n    #\n    #   # In the repository root\n    #   git ghstats . \":(exclude)lib/external\"\n    #\n    # NOTE: You cannot currently use relative paths with exclude.\n    #       ONLY do this one in the repository root.\n    #\n    scontrib = !\"f() {\\\n        printf '%7s %-30s %s\\n' COMMITS NAME EMAIL && \\\n        git log --branches --pretty=format:'%<(30)%aN %aE' HEAD -- $( \\\n            for d in \\\"$@\\\"; do echo \\\"${GIT_PREFIX:-${d}}\\\"; done \\\n        )| sort | uniq -c | sort -nr; \\\n    }; f\"\n\n    lcontrib = \"!f() { \\\n        for file in $( \\\n            git ls-tree --name-only -r HEAD -- $( \\\n                for d in \\\"$@\\\"; do echo \\\"${GIT_PREFIX:-${d}}\\\"; done \\\n            ) \\\n        ); do \\\n            git blame -w --line-porcelain $file | \\\n                perl -ne '\\\n                    if (/^[0-9a-f]{40} / .. /^filename /) { \\\n                        $author = $_ if (s/^author //); \\\n                    } else { \\\n                        print $author unless /^\\\\s*(\\\\#.*)?$/; \\\n                    }'; \\\n        done | sort | uniq -c | sort -nr; \\\n    }; f\"\n\n    ghstats = \"!f() { \\\n        printf \\\"%-8s%-9s%-9s%-9s%s\\\\n\\\" '#' COMMITS INSERTED DELETED AUTHOR; \\\n        git log --use-mailmap --shortstat HEAD -- $( \\\n            for d in \\\"$@\\\"; do \\\n                echo \\\"${GIT_PREFIX:-${d}}\\\"; \\\n            done \\\n        ) | perl -e ' \\\n            while (<>) { \\\n                if (/^Author: (.*)$/) { \\\n                    $a = $1; \\\n                    $c{$a} = 0 unless defined $c{$a}; \\\n                    $i{$a}=0 unless defined $i{$a}; \\\n                    $d{$a}=0 unless defined $d{$a}; \\\n                } \\\n                if (/^ (\\\\d+) files? changed(?:, (\\\\d+) insertions?\\\\(\\\\+\\\\))?(?:, (\\\\d+) deletions?\\\\(\\\\-\\\\))?/) { \\\n                    $c{$a} += 1; \\\n                    $i{$a} += $2; \\\n                    $d{$a} += $3; \\\n                } \\\n            }; \\\n            printf(\\\"%-9d%-9d%-9d%s\\\\n\\\", $c{$_}, $i{$_}, $d{$_}, $_) for (keys %i);' \\\n        | sort -nr | nl -n ln -w 5; \\\n    }; f\"\n\n    closed = \"!for br in $(git branch); do if git is-merged $br &>/dev/null; then echo $br; fi; done\"\n\n    # get the github name of this repository by looking at all the github\n    # remotes and picking the most popular name there.\n    ghname = \"!f() {\\\n        git remote -v |\\\n            perl -ne '\\\n                if (s/.*github.com[:\\\\/]([^\\\\/]*)\\\\/([^.\\\\s]*).*/\\\\2/) { print; }'|\\\n            sort |\\\n            uniq |\\\n            head -1;\\\n        }; f\"\n\n\n[color]\n    diff   = auto\n    status = auto\n    branch = auto\n    ui = auto\n    ui = true\n\n[color \"branch\"]\n    current = yellow reverse\n    local   = green\n    remote  = red\n\n[color \"diff\"]\n    meta = yellow bold\n    frag = magenta bold\n    Old = red bold\n    new = green bold\n\n[color \"status\"]\n    added =  green  bold\n    changed = magenta\n    untracked = red\n\n[core]\n    autocrlf = input\n    safecrlf = warn\n    # pager = less -FRSX\n    # Switch to Delta - https://github.com/dandavison/delta\n    pager = delta\n    editor = vim\n    mergeoptions = --no-edit\n\n[interactive]\n    diffFilter = delta --color-only\n\n[delta]\n    navigate = true  # use n and N to move between diff sections\n    side-by-side = true\n\n[pull]\n    #rebase = false\n    rebase = true\n\n[push]\n    default = matching\n\n[filter \"lfs\"]\n\tclean = git-lfs clean -- %f\n\tsmudge = git-lfs smudge -- %f\n\tprocess = git-lfs filter-process\n\trequired = true\n[merge]\n  tool = meld\n  conflictstyle = diff3\n[diff]\n  guitool = meld\n  colorMoved = default\n"
  },
  {
    "path": "git/.gitignore",
    "content": "*.local\n"
  },
  {
    "path": "git/README.md",
    "content": "# Falkor's Dotfiles -- some git configuration\n\n![](https://git-scm.com/images/logo@2x.png)\n\n[Git](https://git-scm.com/) is probably one of the most awesome productivity tool I use so far.\n\n> [Git](https://git-scm.com/) is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.\n\nIf you want to know more bout git, you might wish to take a look at the slides I made as an [introduction to git](https://github.com/ULHPC/documents/blob/master/slides/ULHPC_School/2015/intro_git/intro_git.pdf) during the [UL HPC School](https://hpc.uni.lu/hpc-school/2015/06/index.html).\nSee also the [Git Cheat Sheet](https://training.github.com/kit/downloads/github-git-cheat-sheet.pdf) proposed on Github.\n\n## Git installation\n\nInstallation of [Git](http://git-scm.com/) is relatively simple (actually it comes bundled with your system normally):\n\n### Linux / Mac OS\n\n```bash\n$ apt install git git-flow      # On Debian-like systems\n$ yum install git gitflow       # On CentOS-like systems\n$ brew install git git-flow     # On Mac OS, using [Homebrew](http://mxcl.github.com/homebrew/)\n```\n\n### Windows\n\nUse [git-for-windows](https://git-for-windows.github.io/), which includes Git Bash/GUI and  Shell Integration\n\n* use PLINk from Putty\n* install Git bash + command prompt\n* select checkout windows / commit unix\n\n## Git configuration\n\nThe way I organize my git configurations is as follows:\n\n| File                         | Alternative          | Visibility | Description                                    |\n|------------------------------|----------------------|------------|------------------------------------------------|\n| `~/.config/git/config`       | `~/.gitconfig`       | Public     | general aliases and core/colors configurations |\n| `~/.config/git/config.local` | `~/.gitconfig.local` | Private    | username / credentials / private business etc. |\n\nNote that this hierarchy assume the availability of the `include.path` directive within Git which was introduced in __Git >= 1.7.10__ (see <http://git-scm.com/docs/git-config#_includes>)\nA sample `config.local.example` is provided that you can inspire to create your own (not-tracked) `config.local` file.\n\n## Installation for Falkor's Git configuration\n\nYou can use the `install.sh` script featured with the [Falkor's dotfile](https://github.com/Falkor/dotfile) repository.\n\n``` bash\n$ cd ~/.config/dotfiles.falkor.d\n$ ./install.sh --git     # OR ./install.sh --with-git\n# Copy and adapt local configuration\n$ cd ~/.config/git/\n$ cp ~/.config/dotfiles.falkor.d/git/config.local.example  config.local\n$ vim ~/.config/git/config.local\n# /!\\ ADAPT name , email etc.\n```\n\n## Uninstall\n\n``` bash\n$ cd ~/.config/dotfiles.falkor.d\n$ ./install.sh --delete --git\n```\n\n## Resources\n\nConsider these resources to become more familiar (if not yet) with Git:\n\n* [Simple Git Guide](http://rogerdudler.github.io/git-guide/)\n* [Git book](http://book.git-scm.com/index.html)\n* [Github:help](http://help.github.com/mac-set-up-git/)\n* [Git reference](http://gitref.org/)\n* [Git Cheat Sheet](https://training.github.com/kit/downloads/github-git-cheat-sheet.pdf) proposed on Github.\n"
  },
  {
    "path": "git/config.local.example",
    "content": "# ~/.config/git/config.local\n# Local [private] Git configuration\n\n[user]\n    name = \"Firsname Lastname\"\n    email = \"firsname.lastname@domain.org\"\n    # signingKey = <GPG KEY ID>\n    # signingKey = ~/.ssh/id_ed25519-sk\n\n### In case you want to use your SSH key for commit signs\n#[gpg]\n#   format = ssh\n#[gpg \"ssh\"]\n#   allowedSignersFile = ~/.ssh/allowed_signers\n\n\n### uncomment to automatically sign each commit/tag\n# [commit]\n#     gpgsign = true\n# [tag]\n#     gpgsign = true\n\n\n# [init]\n#   defaultBranch = master\n"
  },
  {
    "path": "git/ignore",
    "content": "# Automatically created by GitHub for Mac\n\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\r\r\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n"
  },
  {
    "path": "gnupg/4F156AD7-transition-statement.md.asc",
    "content": "-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA512\n\n- -*- mode: markdown; mode; auto-fill; -*-\n\n      Time-stamp: <Sun 2017-03-05 21:59 svarrette>\n\nI am transitioning my GPG keys from an old 1024-bit DSA key (`0xA403AC45DD01D5C0`)\nto a new 4096-bit RSA key (`0x5D08BCDD4F156AD7`).\nThe old key will continue to be valid for a short period of time after the\nposting of this message, but future signatures will be created from the new key\nand I prefer all new correspondance to be encrypted with the new key.\n\nThis transition document is signed with both keys to certify the transition.\n\nThe **old** key was:\n\n    pub   1024D/0xA403AC45DD01D5C0 2006-05-19\n          Key fingerprint = E273 5952 5AB9 A7FA D786  2C15 A403 AC45 DD01 D5C0\n\nThe **new** key is:\n\n    pub   4096R/0x5D08BCDD4F156AD7 2017-03-01\n          Key fingerprint = 1A53 FD6E 09A4 4DBA 7A9F  D72B 5D08 BCDD 4F15 6AD7\n\nNote that the signing of this message may have been done by a **SUBKEY** of the\nabove key.\n\n- --------------------------------------------------------------------------------\nTo fetch the new key from a public key server, you can use the following:\n\n      gpg --keyserver pgp.mit.edu --recv-key 5D08BCDD4F156AD7\n\n\n* _If you already know my old key_, you can verify that the new key has been\n  signed by the old one using:\n\n         gpg --check-sigs  5D08BCDD4F156AD7\n\n* _If you don’t know (yet) my old key_, or you want to be extra careful, you can\n  check the fingerprint against the one above:\n\n         gpg --fingerprint 5D08BCDD4F156AD7\n\nYou can verify the signatures on this message by downloading the plain\ntext file as linked and running:\n\n     gpg --verify <filename>\n\nFinally, if you are satisfied that you have the right key, that the UIDs match\nwhat you expect, and you are certain of my identity, I would appreciate it if\nyou would sign my new key:\n\n     gpg --sign-key 5D08BCDD4F156AD7\n     gpg --keyserver pgp.mit.edu --send-key 5D08BCDD4F156AD7\n\n- --------------------------------------------------------------------------------\nPlease contact me via e-mail at <Sebastien.Varrette@uni.lu> if you have any\nquestions about this document or this transition.\n\n  Sebastien Varrette\n-----BEGIN PGP SIGNATURE-----\n\niQIcBAEBCgAGBQJYvH+TAAoJECjhDmEWLJXUVDEP/3S1wocVFhwAcomJF5PdrKPU\nQBXbsnxf7jfBOdGI5Ou4uKHLOdGORnxsHaU4ForPto5g1vAPEtP6dGXOLrWok1Dq\n87KQKJJoncdnIitscYO3btY3zbOef+6it9cEOzEK8wR/jgBJ8JRiZSW/j1Q2eFiR\npGKkcWBMHthsW3VUZb3hih1HA71oxurmkF3Pky9Sr4EYVOtQjZM7HuHgiYHIRsq4\nLtibsZe+vC6Jw8RULmeUBGf+CmfO2RfycBe0dAO07QbT7Su8wnC5Rxzg9sW07fjq\nbNQaCXxz9cGRi9ikC9LALGSynTGiPoaGcLfXS6w6OaBzz/dkC+hoEyEw/o1jbQfk\nrnHJ9w4DiefR9fbEU0/uhIqjejx+4MWRK1qkpYivSCd5e89glB4+fHwfuS+Mk8wz\nRNH9n3wg4FWuqsM5W7zl6e4CjflkMiAbOKIiefNby8hGePj1BZB2eIXEnTjb2efa\njK2wWRe/613AlF5eeKqoJlQJJXIh+N1SkzJy/VjDZf3KVRGsL6f2YosLSAMl4RN1\nZAILPjuJ09HawQDqrEsI/X3tiXV/b+8bOs66zbLe/widTk/XeGCaLmetmZVjNTsG\nd/ojJcmwwncnU9p8x3MjuQMT1oxdK7PEc3aQlTjzLANUQ0qFDSHtQYMPkCiKOSyo\n4lu0PDRyH7r3krMQqbk3\n=6JDX\n-----END PGP SIGNATURE-----\n"
  },
  {
    "path": "gnupg/DD01D5C0-transition-statement.md.asc",
    "content": "-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA512\n\n- -*- mode: markdown; mode; auto-fill; -*-\n\n      Time-stamp: <Sun 2017-03-05 21:59 svarrette>\n\nI am transitioning my GPG keys from an old 1024-bit DSA key (`0xA403AC45DD01D5C0`)\nto a new 4096-bit RSA key (`0x5D08BCDD4F156AD7`).\nThe old key will continue to be valid for a short period of time after the\nposting of this message, but future signatures will be created from the new key\nand I prefer all new correspondance to be encrypted with the new key.\n\nThis transition document is signed with both keys to certify the transition.\n\nThe **old** key was:\n\n    pub   1024D/0xA403AC45DD01D5C0 2006-05-19\n          Key fingerprint = E273 5952 5AB9 A7FA D786  2C15 A403 AC45 DD01 D5C0\n\nThe **new** key is:\n\n    pub   4096R/0x5D08BCDD4F156AD7 2017-03-01\n          Key fingerprint = 1A53 FD6E 09A4 4DBA 7A9F  D72B 5D08 BCDD 4F15 6AD7\n\nNote that the signing of this message may have been done by a **SUBKEY** of the\nabove key.\n\n- --------------------------------------------------------------------------------\nTo fetch the new key from a public key server, you can use the following:\n\n      gpg --keyserver pgp.mit.edu --recv-key 5D08BCDD4F156AD7\n\n\n* _If you already know my old key_, you can verify that the new key has been\n  signed by the old one using:\n\n         gpg --check-sigs  5D08BCDD4F156AD7\n\n* _If you don’t know (yet) my old key_, or you want to be extra careful, you can\n  check the fingerprint against the one above:\n\n         gpg --fingerprint 5D08BCDD4F156AD7\n\nYou can verify the signatures on this message by downloading the plain\ntext file as linked and running:\n\n     gpg --verify <filename>\n\nFinally, if you are satisfied that you have the right key, that the UIDs match\nwhat you expect, and you are certain of my identity, I would appreciate it if\nyou would sign my new key:\n\n     gpg --sign-key 5D08BCDD4F156AD7\n     gpg --keyserver pgp.mit.edu --send-key 5D08BCDD4F156AD7\n\n- --------------------------------------------------------------------------------\nPlease contact me via e-mail at <Sebastien.Varrette@uni.lu> if you have any\nquestions about this document or this transition.\n\n  Sebastien Varrette\n-----BEGIN PGP SIGNATURE-----\n\niEYEAREKAAYFAli8ftYACgkQpAOsRd0B1cCriwCfXtx48Ei/Rp4LGB8Dot7EdnXB\n20kAniG/ZpvwPf85ZQJ/Z0uqj9RhjECF\n=9ND2\n-----END PGP SIGNATURE-----\n"
  },
  {
    "path": "gnupg/README.md",
    "content": "# GPG:  Gnu Privacy Guard\n\n* Old resources, still usefull: \n   * [Tutorial](https://futureboy.us/pgp.html) + [personnal Tutorial](https://varrette.gforge.uni.lu/blog/2017/03/14/tutorial-gpg-gnu-privacy-guard/)\n   * [GPG Keypairs](https://stelfox.net/knowledge_base/linux/gpg_keypairs/)\n   * [Generating More Secure GPG Keys: A Step-by-Step Guide](https://spin.atomicobject.com/2013/11/24/secure-gpg-keys-guide/)\n\n* [Guide to using YubiKey for GPG and SSH](https://github.com/drduh/YubiKey-Guide)      \n* [OpenPGP Best Practices](https://riseup.net/en/security/message-security/openpgp/best-practices)  \n* [GnuPG](https://www.gnupg.org/): implementation of the OpenPGP standard aka [RFC4880](http://www.ietf.org/rfc/rfc4880.txt)\n   - Hybrid encryption framework based on [Web of Trust](https://en.wikipedia.org/wiki/Web_of_trust)\n    - `Mail | Document | Git commit...` encryption / signature\n\n\n![](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/PGP_diagram.svg/575px-PGP_diagram.svg.png)\n\n[TOC]\n\n## Installation\n\nApart from the below (preferred) solutions per OS, a cross-platform approach relies on Thunderbird and the [Enigmail](https://enigmail.wiki/) extension.\n\n### Linux/BSD\n\n* Install the `gnupg` package.\n* You might also consider [GPGME -- GnuPG Made Easy]() -- [tutorial](http://www.nico.schottelius.org/docs/a-small-introduction-for-using-gpgme/)\n\n### Mac OS X\n\n* Install the [GPGTools Suite](https://gpgtools.org/)\n    - GPG for Apple Mail and GPG Keychain\n\t- GPhttps://github.com/Falkor/dotfiles/blob/master/gnupg/gpg.confG Services and MacGPG\n\n### Windows\n\n[Gpg4win](http://www.gpg4win.org/) (GNU Privacy Guard for Windows) is the reference package implementation to use [GPG](https://www.gnupg.org/) under windows -- [tutorial](https://www.deepdotweb.com/2015/02/21/pgp-tutorial-for-windows-kleopatra-gpg4win/)\n\nIt includes the following programs:\n\n* __GnuPG__, which forms the heart of Gpg4win - the actual encryption software.\n* __Kleopatra__, the central certificate administration of Gpg4win, which ensures uniform user navigation for all cryptographic operations.\n* __GNU Privacy Assistant (GPA)__, an alternative program for managing certificates, in addition to Kleopatra.\n* __GnuPG for Outlook (GpgOL)__, an extension for Microsoft Outlook 2003 and 2007, which is used to sign and encrypt messages.\n* __GPG Explorer eXtension (GpgEX)__, an extension for Windows Explorer which can be used to sign and encrypt files using the context menu.\n* __Claws Mail__, a full e-mail program that offers very good support for GnuPG.\n\n## Configuration \n\nsee `{gpg,dirmngr,gpg-agent}.conf` which are provided as [part of my personnal dotfiles](https://github.com/Falkor/dotfiles/tree/master/gnupg).\n\nEnable them as follows:\n\n```bash\ncd ~/.gnupg\nln -s ../path/to/dotfile/repo/gnupg config.gnupg.d  # convenient directory \nln -s config.gnupg.d/gpg.conf .      \nln -s config.gnupg.d/dirmngr.conf .\nln -s config.gnupg.d/gpg-agent.conf .\n```\n\n#### Pinentry\n\nYou can configure your favorite pinentry program to prompt for your GPG passphrase/PIN\n\n```bash\n# Debian-like systems\n$ sudo apt install pinentry-curses pinentry-qt pinentry-gtk2\t\n$ sudo update-alternatives --config pinentry\nThere ahttps://github.com/Falkor/dotfiles/blob/master/gnupg/gpg.confre 5 choices for the alternative pinentry (providing /usr/bin/pinentry).\n\n  Selection    Path                      Priority   Status\n------------------------------------------------------------\n* 0            /usr/bin/pinentry-gnome3   90        auto mode\n  1            /usr/bin/pinentry-curses   50        manual mode\n  2            /usr/bin/pinentry-gnome3   90        manual mode\n  3            /usr/bin/pinentry-gtk-2    85        manual mode\n  4            /usr/bin/pinentry-qt       80        manual mode\n  5            /usr/bin/pinentry-tty      30        manual mode\n\nPress <enter> to keep the current choice[*], or type selection number: 1\nupdate-alternatives: using /usr/bin/pinentry-curses to provide /usr/bin/pinentry (pinentry) in manual mode\n```\n\nNote that when using `pinentry-{tty,ncurses}`, it may happen that you don't get access to the pinentry program. It's most likely a problem tied to the GPG_TTY environnement variable - ensure you set somewhere in your shell\n\n```bash\nexport GPG_TTY=$(tty)\n```\n\nAlternatively, you can force your GPG agent to reset the tty used (in particular) by your pinentry program.\n\n```bash\ngpg-connect-agent \"updatestartuptty\" /bye >/dev/null\n```\n\nNote that managing the correct TTY across multiple tabs in your favorite shell (Guake etc.) can be cumbersome. So it's probably easier to rely on a pinentry GUI like **pinentry-gtk-2**.\n\n## GPG Key Generation\n\nConsider using the  provided script [`scripts/generate-gpg-key`](https://github.com/Falkor/dotfiles/blob/master/gnupg/scripts/generate-gpg-key) which implements and automate the generation of GPG key pairs according to [recommended best practices](https://help.riseup.net/en/security/message-security/openpgp/best-practices).  \n\n```bash\n$ ./scripts/generate-gpg-key -h   # help\n$ ./scripts/generate-gpg-key \n# By default, operate in a temporary directory \nWorking directory: GNUPGHOME = /tmp/user/<uid>/tmp.c26KOD8LdO\n=> generating batch file for the master key /tmp/user/<uid>/tmp.c26KOD8LdO/generate-master-key.batch\n=> generating master key\ngpg: keybox '/tmp/user/<uid>/tmp.c26KOD8LdO/pubring.kbx' created\ngpg: === Generating your GPG key ===\ngpg: -> Generating master key (for certification only)\ngpg: /tmp/user/<uid>/tmp.c26KOD8LdO/trustdb.gpg: trustdb created\ngpg: directory '/tmp/user/<uid>/tmp.c26KOD8LdO/openpgp-revocs.d' created\ngpg: revocation certificate stored as '/tmp/user/<uid>/tmp.c26KOD8LdO/openpgp-revocs.d/C808C0230ED24EF393EDFCA6EC70200B9BF93DCB.rev'\ngpg: done\n=== Current GPG key status ===\ngpg: checking the trustdb\ngpg: marginals needed: 3  completes needed: 1  trust model: pgp\ngpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u\n/tmp/user/<uid>/tmp.c26KOD8LdO/pubring.kbx\n-----------------------------------------\nsec   rsa4096/0x3156CC64BB58247D <date> [C]     \n      6D1F481568A1D64F98BF228B3156CC64BB58247D  \nuid                   [ultimate] <name> <email>\n\n=> collecting generated Key ID\n   Master Key ID for <email>: 6D1F481568A1D64F98BF228B3156CC64BB58247D\n=> Generating subkey for 'sign' usage\n=> Generating subkey for 'encrypt' usage\n=> Generating subkey for 'auth' usage\n=== Current GPG key status ===\n/tmp/user/<uid>/tmp.c26KOD8LdO/pubring.kbx\n-----------------------------------------\nsec   rsa4096/0x3156CC64BB58247D <date> [C]     \n      6D1F481568A1D64F98BF228B3156CC64BB58247D  \nuid                   [ultimate] <name> <email>\nssb   rsa4096/0x48D1E2129D0CCEC6 <date> [S] [expires: <date>]\nssb   rsa4096/0xEE74576ED76B1148 <date> [E] [expires: <date>]\nssb   rsa4096/0x68E5153F63FA7B79 <date> [A] [expires: <date>]\n\n=> exports/backup your public key\n=> exports/backup your **private** master key\n=> exports/backup your **private** subkeys\n=> revocation cerfificate for OpenPGP (master) key 6D1F481568A1D64F98BF228B3156CC64BB58247D:\n   /tmp/user/<uid>/tmp.c26KOD8LdO/openpgp-revocs.d/6D1F481568A1D64F98BF228B3156CC64BB58247D.rev\n=> export GPG's trustDB to a text file\n=> preparing for (optional) SSH support via the GPG subkey with 'A[uth]' usage\n   assumes you specify the key to use in sshcontrol file via its keygrip internal identifier\n Current keygrips in use: (gpg -K --with-keygrip [...])\nsec   rsa4096/0x3156CC64BB58247D <date> [C]     \n      6D1F481568A1D64F98BF228B3156CC64BB58247D  \n      Keygrip = 6F165EAF3AF6A678A072841654E6702974A885B3\nuid                   [ultimate] <name> <email>\nssb   rsa4096/0x48D1E2129D0CCEC6 <date> [S] [expires: <date>]\n      Keygrip = CC34AFAD18486AD790CCA9A708D858057F022FD2\nssb   rsa4096/0xEE74576ED76B1148 <date> [E] [expires: <date>]\n      Keygrip = CBE87BF5CB84AE288E4829BE66B286FBCDFEAEAE\nssb   rsa4096/0x68E5153F63FA7B79 <date> [A] [expires: <date>]\n      Keygrip = 47A0554C7508280F10E277B40186257857DD6E03\n\n   selected keygrip (subkey with 'A' usage): '47A0554C7508280F10E277B40186257857DD6E03'\n=> creating /tmp/user/<uid>/tmp.c26KOD8LdO/sshcontrol\n/!\\ WARNING: To get gpg-agent to handle requests from SSH, you still need to:\n/!\\ WARNING: - add 'enable-ssh-support' into ${GNUPGOME}/gpg-agent.conf\n/!\\ WARNING: - change the value of the SSH_AUTH_SOCK environment variable in your favorite shell configuration (.bashrc,.zshrc etc.)\n/!\\ WARNING:     export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)\n/!\\ WARNING:     gpgconf --launch gpg-agent\n/!\\ WARNING: To cleanup the working directory (NOT done by default):\n/!\\ WARNING:          rm -rf /tmp/user/<uid>/tmp.c26KOD8LdO\n```\n\nIf you want to generate them in the persistent (expected) directory, use \n\n```bash\n$ export GNUPGHOME=$HOME/.gnupg   # To place in your shell config \n$ ./scripts/generate-gpg-key -d ~${GNUPGHOME} \n```\n\n### Customization: add a photo and/or other identities\n\nAssuming you have a JPEG photo of you, you can attach it in your key with **addphoto**\n\n> Note: photographs must be in a JPG format and  should be as small (in byte size) as possible. A reasonable rule is to  make a picture that is no larger than 240 pixels wide by 288 pixels  high, and a size less than 10,000 bytes. Use a face shot like you would  with a passport photograph.\n\n```bash\n# Collect the Master Key ID\n$ gpg -K --keyid-format 0xlong\n#             vvvvvvvvvvvvvvvvvv\nsec   rsa4096/0x3156CC64BB58247D <date> [C]     # <--- 0xlong version \n      6D1F481568A1D64F98BF228B3156CC64BB58247D  # <--- exact version \nuid                   [ultimate] <name> <email>\nssb   rsa4096/0x48D1E2129D0CCEC6 <date> [S] [expires: <date>]\nssb   rsa4096/0xEE74576ED76B1148 <date> [E] [expires: <date>]\nssb   rsa4096/0x68E5153F63FA7B79 <date> [A] [expires: <date>]\n\n# Fully automated version to collect KEYID\n$ KEYID=$(gpg --keyid-format long  --with-colons --fingerprint $(git config --get user.email) | awk '{print $1}')\n\n# ... Edit the master key from its ID\n$ gpg --edit-key ${KEYID}  # Note: you may rely purely on the email attached to the key with\n#                            gpg --edit-key $(git config --get user.email)\n# [...]\ngpg> addphoto \nPick an image to use for your photo ID.  The image must be a JPEG file.\nRemember that the image is stored within your public key.  If you use a\nvery large picture, your key will become very large as well!\nKeeping the image close to 240x288 is a good size to use.\n\nEnter JPEG filename for photo ID: ~/path/to/picture.jpeg\n# The photo will be displayed -- confirm it \nIs this photo correct (y/N/q)? y\n\nsec  rsa4096/3156CC64BB58247D\n     created: <date>  expires: never       usage: C   \n     trust: ultimate      validity: ultimate\nssb  rsa4096/48D1E2129D0CCEC6\n     created: <date>  expires: <date>  usage: S   \nssb  rsa4096/EE74576ED76B1148\n     created: <date>  expires: <date>  usage: E   \nssb  rsa4096/68E5153F63FA7B79\n     created: <date>  expires: <date>  usage: A   \ngpg> save\n```\n\nTo add another identity with **adduid**:\n\n```bash\n# As above\n$ gpg --edit-key ${KEYID}  # Note: you may rely purely on the email attached to the key with\n#                            gpg --edit-key $(git config --get user.email)\ngpg> adduid \nReal name: <name2> \nEmail address: <email2>\nComment: \nYou selected this USER-ID:\n    \"<name2> <email2>\"\n\nChange (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O\n\nsec  rsa4096/3156CC64BB58247D\n     created: <date>  expires: never       usage: C   \n     trust: ultimate      validity: ultimate\nssb  rsa4096/48D1E2129D0CCEC6\n     created: <date>  expires: <date>  usage: S   \nssb  rsa4096/EE74576ED76B1148\n     created: <date>  expires: <date>  usage: E   \nssb  rsa4096/68E5153F63FA7B79\n     created: <date>  expires: <date>  usage: A      \n[ultimate] (1)  <name> <email>\n[ultimate] (2)  [jpeg image of size 4617]\n[ unknown] (3). <name> <email>\n\ngpg> save\n```\n\nNow if you check your key: \n\n```bash\n$ gpg -K --keyid-format 0xlong\n#             vvvvvvvvvvvvvvvvvv\nsec   rsa4096/0x3156CC64BB58247D <date> [C]     # <--- long version \n      6D1F481568A1D64F98BF228B3156CC64BB58247D  # <--- exact version \nuid                   [ultimate] <name> <email>\nuid                   [ultimate] [jpeg image of size 4617]\nuid                   [ultimate] <name2> <email2>\nssb   rsa4096/0x48D1E2129D0CCEC6 <date> [S] [expires: <date>]\nssb   rsa4096/0xEE74576ED76B1148 <date> [E] [expires: <date>]\nssb   rsa4096/0x68E5153F63FA7B79 <date> [A] [expires: <date>]\n```\n\n### ~~Customization:  enforce stronger cryptography preferences.~~\n\n**/!\\ UPDATE (2023)  does not seem required any more. defaults seems ok**\n\nBy default, the encryption preferences specified in your public key are probably not as strong as they should be. Thus you should set stronger default security preferences (to use SHA512, AES256 and ZLIB by default) using the `setpref` command, *i.e.*:\n\n```bash\n# As above\n$ gpg --edit-key ${KEYID}  # Note: you may rely purely on the email attached to the key with\n#                            gpg --edit-key $(git config --get user.email)\n\n```\n\nSee also [Gist: GPG Cheat Sheet  and best practices ](https://gist.github.com/MorganGeek/5e6b89d351d34dfbc576db610b0c02e8)\n\n## Transfer your GPG key to [Multiple] Yubikeys\n\nIf you own security keys (such as yubikeys), it's time to transfer the generated keys to them! \n\nSee (the excellent) [Dr Duh Yubikey guide](https://github.com/drduh/YubiKey-Guide#configure-smartcard) for detailed instructions.\n\n## Enable SSH access using a GPG key for authentication\n\nResources:\n\n* [blog: How to enable SSH access using a GPG key for authentication](https://opensource.com/article/19/4/gpg-subkeys-ssh)\n* [Gist: OpenPGP SSH access with Yubikey and GnuPG](https://gist.github.com/artizirk/d09ce3570021b0f65469cb450bee5e29)\n\n### Setup (sshcontrol, gpg-agent etc.)\n\nThis assumes you have a dedicated GPG subkey with authenticate capability (which is the case from the above scripted generation)\n\n```bash\n$ gpg -K --keyid-format long --with-keygrip $(git config --get user.email)\nsec   rsa4096/0x3156CC64BB58247D <date> [C]     \n      6D1F481568A1D64F98BF228B3156CC64BB58247D  \n      Keygrip = 6F165EAF3AF6A678A072841654E6702974A885B3\nuid                   [ultimate] <name> <email>\nuid                   [ultimate] [jpeg image of size 4617]\nuid                   [ultimate] <name2> <email2>\nssb   rsa4096/0x48D1E2129D0CCEC6 <date> [S] [expires: <date>]\n      Keygrip = CC34AFAD18486AD790CCA9A708D858057F022FD2\nssb   rsa4096/0xEE74576ED76B1148 <date> [E] [expires: <date>]\n      Keygrip = CBE87BF5CB84AE288E4829BE66B286FBCDFEAEAE\nssb   rsa4096/0x68E5153F63FA7B79 <date> [A] [expires: <date>]   # <-- Subkey we're interested to \n      Keygrip = 47A0554C7508280F10E277B40186257857DD6E03 # <-- Associated Keygrip to put into ~/.gnupg/sshcontrol\n```\n\nNormally the `sshcontrol` file was already populated. othewise create it as follows: \n\n```bash\n# /!\\ ADAPT Keygrip accordingly - pay attention (again) to select your 'A' subkey \necho \"<keygrip-subkey-A>\" > ~/.gnupg/sshcontrol\n```\n\n* To get **gpg-agent** to handle requests from SSH, you need to enable support by adding the line `enable-ssh-support` in `~/.gnupg/gpg-agent.conf` (already done in  the provided configuration)\n\n* Then you need to tell SSH _how_ to access the **gpg-agent**. This is done by changing the value of the `SSH_AUTH_SOCK` environment variable.\n    Add the following lines in your favorite shell configuration (`.bashrc`,`.zshrc` etc.):\n\n    ```bash\n    export GPG_TTY=$(tty)\n    export SSH_AUTH_SOCK=\"$(gpgconf --list-dirs agent-ssh-socket)\"\n    gpgconf --launch gpg-agent\n    ```\n    \n    A more complete setup is provided in a dedicated script you can source in your favorite shell configuration (`.bashrc`,`.zshrc` etc.). In particular, you probably want to do the above only if `enable-ssh-support` is present in the `gpg-agent.conf` configuration file. \n\nYou can check that it works as follows: \n\n```bash\n# If GPG keys moved to Yubikey and Yubikey is absent\n$ ssh-add -L  # Lists public key of all identities currently represented by the agent.\nThe agent has no identities.\n# Plug [one of] your Yubikey(s)\n$  ssh-add -L \nssh-rsa <public-key>== cardno:<serial>\n```\n\n### Save public key for identity file configuration\n\nSo it's a good idea to extract the OpenPGP SSH public key which can be added (as \"normal\") in any server `~/.ssh/authorized_key` file. \n\n```bash\n# remove the trailing comment cardno serial  \n$ ssh-add -L | grep cardno | sed 's/\\(cardno\\):.*$/\\1/' | tee ~/.ssh/id_rsa_openpgp_yubikey.pub\nssh-rsa <public-key>== cardno\n# /!\\ IMPORTANT: put the same access rights you would put on an SSH private key or some ssh-agent wrappers may fail\n$ chmod 400 ~/.ssh/id_rsa_openpgp_yubikey.pub\n```\n\nAs per [DrDuh Yubikey Guide on SSH](https://github.com/drduh/YubiKey-Guide#optional-save-public-key-for-identity-file-configuration):\n\n>  By default, SSH attempts to use all the identities available via the agent. That's why when using  the `IdentityFile` option in  an ssh config, you typically point to a private key path. For the YubiKey - indeed, in general for keys stored in an ssh agent - `IdentityFile` should point to the *public* key file and `ssh` will select the appropriate private key from those available via the ssh agent. with `IdentitiesOnly yes`, `ssh` will not automatically enumerate public keys loaded into `ssh-agent` or `gpg-agent`. This means `publickey` authentication will not proceed unless explicitly named by `ssh -i [identity_file]` or in `.ssh/config` on a per-host basis.\n\nFor instance with github: \n\n```bash\nHost github.com\n  IdentitiesOnly yes\n  IdentityFile ~/.ssh/id_rsa_openpgp_yubikey.pub\n```\n\nCheck that it works (after uploading the public key in yoru profile, : \n\n```bash\n# Better have a 'journal -fax' running in parallel to detect TTY issue\n$ ssh git@github.com\nPTY allocation request failed on channel 0\nHi svarrette-anssi! You've successfully authenticated, but GitHub does not provide shell access.\nConnection to github.com closed.\n```\n\n*Note* **if you are using multiple yubikeys** to store the same GPG indentity (see [`yubikeys.md`](../yubikeys.md#transfer-your-gpg-keys-to-your-first-yubikey) ), repeat the same test with each yubikey to ensure it works just fine -- **recall to invoke [`yubi-switch`](https://github.com/Falkor/dotfiles/blob/master/oh-my-zsh/custom/plugins/falkor/falkor.plugin.zsh#L366) prior to running the ssh command**. \n\n## GPG CLI Usage\n\n~~~bash\ngpg --list-keys [pattern]                            # List available PGP key(s)\ngpg --keyserver keys.openpgp.org --search-keys <pattern> # Search \\& Import\ngpg --keyserver keys.openpgp.org --recv-keys <ID>        # Import\ngpg --keyserver keys.openpgp.org --send-keys <ID>        # Export to server\n~~~\n\n`/!\\ IMPORTANT:` sending _encrypted_ mails to `user@domain.org` assumes that you **trust** his key, _i.e._ that you _sign_ (after careful check) this key (using GPG Keychain / GPA).\n\n~~~bash\ngpg [-K] --fingerprint <mail>                  # Get (with -K) / Check fingerprint\ngpg --sign-key --ask-cert-level <ID>           # Sign Key <ID> AFTER check\ngpg --keyserver keys.openpgp.org  --send-keys <ID>  # Send back signed key\n~~~\n\nNow if you want to encrypt / decrypt / digitally sign files:\n\n~~~bash\ngpg --encrypt [-r <recipient>] <file>     # => <file>.gpg\nrm -f <file>    # /!\\ WARNING: encryption does not delete the input (clear-text) file\n\ngpg --decrypt <file>.gpg           # Decrypt PGP encrypted file\ngpg --armor --detach-sign <file>  # Generate signature file <file>.asc\n~~~\n\n## GPG Keychain / Keyring\n\n* Linux / Mac OS: `~/.gnupg/`\n* Windows:   `C:\\\\Documents and Settings\\<LOGIN>\\Application Data\\gnupg\\`\n\nMore genrally, you can manage your secret data with a [system keyring](https://dev.to/setevoy/what-is-linux-keyring-gnome-keyring-secret-service-and-d-bus-4kgd), i.e. [Kwallet](https://utils.kde.org/projects/kwalletmanager/) or [`gnome-keyring`](https://wiki.gnome.org/Projects/GnomeKeyring) etc. \n\nFor instance, to install `gnome-keyring` (on Debian systems (even when relying on KDE Plasma as it's way better supported than Kwallet -- see [blog](https://www.jwillikers.com/gnome-keyring-in-kde-plasma))\n\n```bash\n$ sudo apt install gnome-keyring seahorse\n\n# Autostart SSH and Secrets components of the GNOME keyring on login \ncp /etc/xdg/autostart/{gnome-keyring-secrets.desktop,gnome-keyring-ssh.desktop} ~/.config/autostart/\nsed -i '/^OnlyShowIn.*$/d' ~/.config/autostart/gnome-keyring-secrets.desktop\nsed -i '/^OnlyShowIn.*$/d' ~/.config/autostart/gnome-keyring-ssh.desktop\n```\n\n## Using GPG within git\n\n* Sign tags using your GPG key with the `-s` option\n    - add Signed-off-by line by the committer using `-s` : `git commit -s [...]`\n    - GPG sign commit with `-S`: `git commit -s -S [...]`\n    - tag sign: `git tag -s <name>`\n* Assumes that you have configured git with your GPG signing key ID (typically into `~/.config/git/config.local`). \n    Example below -- see also [my personal configuration](https://github.com/Falkor/dotfiles/blob/master/git/config.local.example)\n\n~~~ini\n[user]\n    name = Firstname Lastname\n    email = firstname.lastname@domain.com\n    signingkey = 0x<GPG-Key-ID>\n\n[commit]\n\tgpgsign = true\n\n[tag]\n\tgpgsign = true\n~~~\n\n## (old notes) Using GPG within Keybase.io\n\n* [Blog: GPG: Strong Keys, Rotation, and Keybase](https://sungo.wtf/2016/11/23/gpg-strong-keys-rotation-and-keybase.html)\n* [Playing with Keybase.io](http://nishanttotla.com/blog/playing-with-keybase-io/)\n* **Alternative to Keybase.io: [Keyoxide](https://keyoxide.org)** \n    * Both rely on GPG Notations which can be added to user ID(s) and can be used to create [OpenPGP identity proofs](https://keyoxide.org/guides/openpgp-proofs).\n\n\n[Keybase.io](https://keybase.io) aims to make life with GPG easier. It does a really good job but it encourages a bad behavior in key management, _i.e._ by default, it creates and stores a private key on their server. We can never truly verify the condition of their server so a Keybase-hosted private key should always be considered untrustworthy.\nSo we will configure [Keybase.io](https://keybase.io) to just use our existing key\n\nInstall keybase:\n\n~~~bash\n$> {apt | dnf | brew cask} install keybase\n~~~\n\nYou can then configure the completion files on your system:\n\n* [Bash completion file](https://github.com/dtiersch/keybase-completion) -- see [Issue #147](https://github.com/keybase/keybase-issues/issues/147) in the Keybase Bugtracker\n* [ZSH completion file](https://github.com/rbirnie/oh-my-zsh-keybase/blob/master/keybase/_keybase) -- see [Issue #519](https://github.com/keybase/keybase-issues/issues/519) in the Keybase Bugtracker\n\nNow you can select your (local) gpg key and import the **public** key to Keybase.io (thus using the `--no-import` option).\n\n~~~bash\nkeybase pgp select --no-import <keyID>\n#    Algo    Key Id             Created   UserId\n=    ====    ======             =======   ======\n1    4096R   <keyid>                      <firstname> <lastname> <email> [...]\nChoose a key: 1\n▶ INFO Bundle unlocked: <keyID>\n▶ INFO Generated new PGP key:\n▶ INFO   user: <uid> \n▶ INFO   4096-bit RSA key, ID <keyID>, created <date>\n▶ INFO Key <keyID> imported\n~~~\n\n**Adding Trust Using Public Account**\n\n~~~bash\n# prove that the twitter account @<login> really belongs to you\n$ keybase prove twitter <login>\n\n# repeat for github, your web site etc...\n$ keybase prove github <login>\n$ keybase prove web https://<url>\n~~~\n\n## (Old notes) Using GPG within Git-crypt\n\n* [reference doc](https://www.agwa.name/projects/git-crypt/)\n* [Github project](https://github.com/AGWA/git-crypt)\n* [tutorial](http://www.starkandwayne.com/blog/secure-your-boshworkspace-with-git-crypt/)\n\n### Installation\n\n~~~bash\n# OSX\nbrew install git-crypt\n\n# Debian/Ubuntu\nsudo apt-get install libssl-dev\ncd /tmp && wget https://github.com/AGWA/git-crypt/archive/0.5.0.zip\nunzip 0.5.0.zip && cd git-crypt-0.5.0/\nmake && sudo make install\n~~~\n\n### Initial Repository Setup\n\nConfigure/setup a repository to use `git-crypt` as follows:\n\n```bash\n $ git-crypt init\n```\n\nThis will generate a symmetric key for encrypting your files (stored in `.git/git-crypt/keys/default`).\n\nYou need also to enable a git [pre-commit hook](https://git-scm.com/book/it/v2/Customizing-Git-Git-Hooks) to avoid accidentally adding unencrypted files -- see [issue #45](https://github.com/AGWA/git-crypt/issues/45).\nExample of such a pre-commit hook, to be placed as `.git/hooks/pre-commit` (in executable mode), can be found on [this gist](https://gist.github.com/Falkor/848c82daa63710b6c132bb42029b30ef) -- [raw version](https://gist.github.com/Falkor/848c82daa63710b6c132bb42029b30ef/raw/605a40d778c521e8993a316fa2568ad384fd06ff/pre-commit.git-crypt.sh)\n\n```bash\n  $ curl <url/to/raw/gist> -o .git/hooks/pre-commit\n  $ chmod +x .git/hooks/pre-commit\n```\n\n\nNow you can **share the repository with others (or with yourself) using GPG**:\n\n```bash\n  $ git-crypt add-gpg-user <ID>\n```\n\nThis will create a encrypted version of the symmetric key and stores it in `.git-crypt/keys/default/0/<FINGERPRINT>.gpg`.\nExample:\n\n~~~bash\n# Add yourself i.e. sign the encryption key with my GPG key and store it into '.git-crypt/'\n$> git-crypt add-gpg-user <your-keyID>\n[master d91d341] Add 1 git-crypt collaborator\n 2 files changed, 3 insertions(+)\n create mode 100644 .git-crypt/.gitattributes> p\n create mode 100644 .git-crypt/keys/default/0/<your-exact-KeyID>.gpg\n~~~\n\nThis encrypted key can be decrypted by running:\n\n     $> git-crypt unlock\n\nYou can add as many collaborators as you wish.\nNote that since distributing keys can be cumbersome, the above mentioned [tutorial](http://www.starkandwayne.com/blog/secure-your-boshworkspace-with-git-crypt/) combines `git-crypt` with the [keybase.io](https://keybase.io/docs/command_line) service, which seems btw very promising however request some tests.\n\n### Encrypted files configuration within `.gitattributes`\n\nSpecify files/wildcard patterns to encrypt by creating a [`.gitattributes`](https://git-scm.com/docs/gitattributes) file at the root of  the repository through the following format:\n\n```\n<pattern>   filter=git-crypt diff=git-crypt\n```\n\nExample:\n\n~~~bash\n#\n# specify which files to encrypt using [git-crypt](https://www.agwa.name/projects/git-crypt/)\n#\n\n# Certificate private keys\n*.key filter=git-crypt diff=git-crypt\n\n# Host SSH private keys\n*ssh_*_key filter=git-crypt diff=git-crypt\n\n# runner config\n*.toml filter=git-crypt diff=git-crypt\n\n# Apache htaccess pasword protected\n*.htpasswd filter=git-crypt diff=git-crypt\n\n# specific apache vhost hosting LDAP binding credentials\nservers/gaia/www/etc/httpd/sites-available/default-ssl filter=git-crypt diff=git-crypt\n~~~\n\nRemember to commit the `.gitattributes` file.\n\n`/!\\ IMPORTANT:` you should have **unlock** the repository before adding an encrypted file.\n\nAssuming you plan to add a `*.key` file (thus expected to be encrypted), proceed as follows:\n\n~~~bash\n# Eventually unlock the repository\n$ git-crypt unlock\n$ echo 'secret' > secret.key\n$ git add secret.key\n$ git commit -s -m \"add secret.key (encrypted) file\" secret.key\n~~~\n\nNote that thanks to the pre-commit hook, in case you have forgotten to unlock the repository, the above commit command would fail as follows:\n\n~~~bash\n$ git commit -s -m \"add secret.key (encrypted) file\" secret.key\n    encrypted: secret.key *** WARNING: staged/committed version is NOT ENCRYPTED! ***\n\nWarning: one or more files is marked for encryption via .gitattributes but\nwas staged and/or committed before the .gitattributes file was in effect.\nRun 'git-crypt status' with the '-f' option to stage an encrypted version.\n~~~\n\nSo assuming you did well, you can commit the file and check that the content is indeed encrypted:\n\n~~~bash\n$ git commit -s -m \"add secret.key (encrypted) file\" secret.key\n[master 9ae570f] add secret.key (encrypted) file\n 1 file changed, 0 insertions(+), 0 deletions(-)\n create mode 100644 secret.key\n$ cat secret.key\nsecret\n\n# Lock back the repository\n$ git-crypt lock\n$ cat secret.key\nGITCRYPT�ἅ�)&f\\���Lp�<%\n~~~\n\n`/!\\ IMPORTANT`: the pre-commit hook is a nice safeguard but **remains local** to your personal copy of the repository.\nIn particular, it is **not shared** with you collaborator upon cloning operations. You'll typically need to integrate the setup of that hook through the `[m|r]ake setup` operation\n\n## (Old notes) Using GPG for Password Management with `pass`\n\nAnother nice git-based approach that team nicely with GPG relies on the `pass` utility and a carefully crafted git repository\n\n### Password repository layout\n\nPasswords are meant to be stored into a git repository where each password is contained in a file, encrypted with GnuPG using public keys of all the allowed admins.\nThe structure of the passwords repository is thus typically as follows:\n\n~~~bash\nPassword Store\n├── admin_gnupg      # GnuPG configuration directory for the password repository\n│   ├── gpg.conf     # admin group definition\n│   ├── pubring      # holds the administrator's public keys\n│   └── reencrypt.sh # facility script to re-encrypt every password when admin group changes\n├── extra\n│   ├── ...\n│   └── twitter\n│       └── login.gpg # encrypted password to connect to twitter with login 'login'\n└── [...]\n~~~\n\nWhen possible, passwords should be stored with the following structure:\n\n    <path/to/passwords-repo>/<category>/<target>/<login>.gpg\n\n### Password management (the manual way)\n\nTo display a password, you just need to decrypt the GPG-encrypted password, typically as follows:\n\n    gpg -d extra/twitter/ULHPC.gpg\n\nTo add a new encrypted password, use:\n\n    GNUPGHOME=<path_to_passwords-repo>/admin_gnupg gpg -r admin -e -o extra/twitter/ULHPC.gpg\n\nThen, don't forget to git add/commit/push your changes.\n\n### Password management using the [`pass` utility](http://zx2c4.com/projects/password-store/)\n\n_Pass_ is an utility to insert, display or copy to clipboard passwords stored\ninto git repository. It is not mandatory to use it, but it eases password management.\nAfter installation (`brew install pass`), using pass requires two configuration steps:\n\n* Set the `PASSWORD_STORE_DIR` environment variable, which contains the path of the password repository:\n\n    \texport PASSWORD_STORE_DIR=<path_to_passwords-repo>\n\n* Set the GNUPGHOME environement variable to the admin_gnupg subdirectory:\n\n    \texport GNUPGHOME=$PASSWORD_STORE_DIR/admin_gnupg\n\nThen the CLI usage is summarized below:\n\n~~~bash\n$ pass help      # Pass usage\n$ pass git pull  # Fetch latest passwords\n$ pass           # List passwords\n$ pass extra/twitter/login         # Display a password\n$ pass -c extra/twitter/login      # Copy a password to clipboard\n$ pass insert extra/twitter/toto   # Insert a new password\n$ pass git push                    # Push your changes\n~~~\n\n_Notes_: Git commit is done automatically by the `pass` utility.\nIf you need to add comments in addition to the password, use the `-m` option to insert extra lines.\n\n### Extra `pass` Utilities / commodities\n\n* Zsh/Bash completions: <http://git.zx2c4.com/password-store/tree/contrib>\n* Env sourcing (in your .zshrc):\n\n    ```bash\n    eval `/path/to/passwords-repo/.passrc`\n    ```\n\n* shell alias:\n\n    ```pass\n    alias pass='eval `/path/to/passwords-repo/.passrc` && pass'\n    ```\n\n"
  },
  {
    "path": "gnupg/dirmngr.conf",
    "content": "# Time-stamp: <Sun 2023-12-10 00:57 svarrette>\n################################################################################\n# ~/.gnupg/dirmngr.conf: GnuPG's network access daemon configuration\n#               _ _                                                 __\n#            __| (_)_ __ _ __ ___  _ __   __ _ _ __ ___ ___  _ __  / _|\n#           / _` | | '__| '_ ` _ \\| '_ \\ / _` | '__/ __/ _ \\| '_ \\| |_\n#          | (_| | | |  | | | | | | | | | (_| | | | (_| (_) | | | |  _|\n#           \\__,_|_|_|  |_| |_| |_|_| |_|\\__, |_|(_)___\\___/|_| |_|_|\n#                                        |___/\n# Adapted from https://github.com/bfrg/gpg-guide/blob/master/dirmngr.conf\n# Since GnuPG 2.1 dirmngr takes care of OpenPGP keyservers.\n################################################################################\n# ┌───────────────────────────────────────────────────────────────────────────┐\n# │ Key servers                                                               │\n# └───────────────────────────────────────────────────────────────────────────┘\n# Now managed by dirmngr\n# See https://frank.sauerburger.io/2020/01/15/openpgp-keyservers.html\n# Note: SKS peer mesh graphs: https://spider.pgpkeys.eu/graphs/\nkeyserver hkps://keys.openpgp.org\n#keyserver hkps://keyserver.ubuntu.com:443\n#keyserver hkps://hkps.pool.sks-keyservers.net\n#keyserver hkps://pgp.ocf.berkeley.edu\n# Proxy to use for keyservers\n#keyserver-options http-proxy=http://127.0.0.1:8118\n#keyserver-options http-proxy=socks5-hostname://127.0.0.1:9050\n"
  },
  {
    "path": "gnupg/gpg-agent.conf",
    "content": "# Time-stamp: <Sun 2023-12-10 10:02 svarrette>\n####################################################################################\n# ~/.gnupg/gpg-agent.conf - Secret key management for GnuPG configuration\n#                                                   _                     __\n#     __ _ _ __   __ _        __ _  __ _  ___ _ __ | |_   ___ ___  _ __  / _|\n#    / _` | '_ \\ / _` |_____ / _` |/ _` |/ _ \\ '_ \\| __| / __/ _ \\| '_ \\| |_\n#   | (_| | |_) | (_| |_____| (_| | (_| |  __/ | | | |_ | (_| (_) | | | |  _|\n#    \\__, | .__/ \\__, |      \\__,_|\\__, |\\___|_| |_|\\__(_)___\\___/|_| |_|_|\n#    |___/|_|    |___/             |___/\n#\n# Daemon to manage secret (private) keys independently from any protocol\n# The agent is automatically started on demand by gpg, gpgconf, or gpg-connect-agent\n# After changing the configuration, reload the agent with\n#             gpg-connect-agent reloadagent /bye\n#\n# In case you want to use the included SSH Agent, you may start the agent using:\n#        gpg-connect-agent /bye\n#\n# If you want to manually terminate the currently-running agent, you can safely\n# do so with:\n#        gpgconf --kill gpg-agent\n#\n# Resources:\n# - https://github.com/bfrg/gpg-guide/blob/master/gpg-agent.conf\n# - https://github.com/drduh/config/blob/master/gpg-agent.conf\n# Documentation:\n#   https://www.gnupg.org/documentation/manuals/gnupg/Agent-Options.html\n####################################################################################\n\nttyname $GPG_TTY\ndefault-cache-ttl 60\nmax-cache-ttl 120\n\n# Select PIN entry program (qt, curses, gnome3,...)\n# Debian/Ubuntu; select default program with\n#     sudo update-alternatives --config pinentry\n# pinentry-program /usr/bin/pinentry-curses\n# pinentry-program /usr/bin/pinentry-tty\n# pinentry-program /usr/bin/pinentry-gtk-2\n# pinentry-program /usr/bin/pinentry-x11\n# pinentry-program /usr/bin/pinentry-qt\n# pinentry-program /usr/local/bin/pinentry-curses\n# pinentry-program /usr/local/bin/pinentry-mac\n# pinentry-program /opt/homebrew/bin/pinentry-mac\n\n# ┌───────────────────────────────────────────────────────────────────────────┐\n# │ Use GnuPG agent for SSH keys (instead of ssh-agent)                       │\n# └───────────────────────────────────────────────────────────────────────────┘\n# See also https://gist.github.com/artizirk/d09ce3570021b0f65469cb450bee5e29\n\nenable-ssh-support\n# Time a SSH cache entry is valid\n# default-cache-ttl-ssh 600\n\n#\n# Note: Make sure that gpg-agent is always started with login.\n#\n# This can be done by adding the following to ~/.bashrc or ~/.zshrc:\n#   # Start gpg-agent if not already running\n#   if ! pgrep -x -u \"${USER}\" gpg-agent &> /dev/null; then\n#        gpg-connect-agent /bye &> /dev/null\n#   fi\n#\n# Additionally add:\n#   # Set SSH to use gpg-agent (see 'man gpg-agent', section EXAMPLES)\n#   unset SSH_AGENT_PID\n#   if [ \"${gnupg_SSH_AUTH_SOCK_by:-0}\" -ne $$ ]; then\n#       # export SSH_AUTH_SOCK=\"/run/user/$UID/gnupg/S.gpg-agent.ssh\"\n#       export SSH_AUTH_SOCK=\"$(gpgconf --list-dirs agent-ssh-socket)\"\n#   fi\n#\n#   # Set GPG TTY as stated in 'man gpg-agent'\n#   export GPG_TTY=$(tty)\n#\n#   # Refresh gpg-agent tty in case user switches into an X session\n#   gpg-connect-agent updatestartuptty /bye > /dev/null\n#\n# For more details, see https://wiki.archlinux.org/title/GnuPG#SSH_agent\n#\n# The above code is provided in gpg-agent.sh you can source in your favorite\n# shell config\n"
  },
  {
    "path": "gnupg/gpg.conf",
    "content": "# Time-stamp: <Sun 2023-12-10 01:02 svarrette>\n################################################################################\n# ~/.gnupg/gpg.conf\n#     ___                   ____   ____ ____     ____             __ _\n#    / _ \\ _ __   ___ _ __ |  _ \\ / ___|  _ \\   / ___|___  _ __  / _(_) __ _\n#   | | | | '_ \\ / _ \\ '_ \\| |_) | |  _| |_) | | |   / _ \\| '_ \\| |_| |/ _` |\n#   | |_| | |_) |  __/ | | |  __/| |_| |  __/  | |__| (_) | | | |  _| | (_| |\n#    \\___/| .__/ \\___|_| |_|_|    \\____|_|      \\____\\___/|_| |_|_| |_|\\__, |\n#         |_|                                                          |___/\n#\n# Adapted from https://github.com/drduh/config/blob/master/gpg.conf\n# Documentation:\n#   https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html\n#   https://www.gnupg.org/documentation/manuals/gnupg/GPG-Esoteric-Options.html\n# 'gpg --version' to get capabilities\n################################################################################\n# ┌───────────────────────────────────────────────────────────────────────────┐\n# │ Default key and recipient                                                 │\n# └───────────────────────────────────────────────────────────────────────────┘\n\n# Default/trusted key ID to use (helpful with throw-keyids)\n# Only useful if you have more than  one secret key in your keyring\n#default-key 0x<keyID>\n#trusted-key 0x<keyID>\n# Group recipient keys (preferred ID last)\n#group keygroup = 0xFF00000000000001 0xFF00000000000002 0xFF3E7D88647EBCDB\ndefault-recipient-self\n\n# ┌───────────────────────────────────────────────────────────────────────────┐\n# │ Algorithms and ciphers                                                    │\n# └───────────────────────────────────────────────────────────────────────────┘\n\n# Use AES256, 192, or 128 as cipher\npersonal-cipher-preferences AES256 AES192 AES\n# Use SHA512, 384, or 256 as digest\npersonal-digest-preferences SHA512 SHA384 SHA256\n# Use ZLIB, BZIP2, ZIP, or no compression\npersonal-compress-preferences ZLIB BZIP2 ZIP Uncompressed\n# Default preferences for new keys\ndefault-preference-list SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed\n# SHA512 as digest to sign keys\ncert-digest-algo SHA512\n# SHA512 as digest for symmetric ops\ns2k-digest-algo SHA512\n# AES256 as cipher for symmetric ops\ns2k-cipher-algo AES256\n# Disable obsolete algo\ndisable-cipher-algo 3DES\n#Deactivated, because there are a lot of SHA-1 based signatures out there and we still need to support them for a little while longer.\n#weak-digest SHA1\n\n# ┌───────────────────────────────────────────────────────────────────────────┐\n# │ Behavior                                                                  │\n# └───────────────────────────────────────────────────────────────────────────┘\n\n# UTF-8 support for compatibility\ncharset utf-8\n# Show Unix timestamps\nfixed-list-mode\n# No comments in signature\nno-comments\n# No version in output\nno-emit-version\n# Disable banner\nno-greeting\n# Long hexidecimal key format\nkeyid-format 0xlong\n# Display UID validity\nlist-options show-uid-validity\nverify-options show-uid-validity\n# Display all keys and their fingerprints\nwith-fingerprint\n# Display key origins and updates\n#with-key-origin\n# Cross-certify subkeys are present and valid\nrequire-cross-certification\n# Disable caching of passphrase for symmetrical ops\nno-symkey-cache\n# Enable smartcard\nuse-agent\n# Disable recipient key ID in messages\n#throw-keyids\n# Verbose output\n#verbose\n# Show expired subkeys\n#list-options show-unusable-subkeys\n\n# ┌───────────────────────────────────────────────────────────────────────────┐\n# │ Key servers                                                               │\n# └───────────────────────────────────────────────────────────────────────────┘\n# Now managed by dirmngr -- see dirmngr.conf\n\n\n# ┌───────────────────────────────────────────────────────────────────────────┐\n# │ SSH support                                                               │\n# └───────────────────────────────────────────────────────────────────────────┘\n"
  },
  {
    "path": "gnupg/scdaemon.conf",
    "content": "# Time-stamp: <Fri 2023-12-08 17:11 svarrette>\n###################################################################################\n#                  _                                                    __\n#      ___  ___ __| | __ _  ___ _ __ ___   ___  _ __    ___ ___  _ __  / _|\n#     / __|/ __/ _` |/ _` |/ _ \\ '_ ` _ \\ / _ \\| '_ \\  / __/ _ \\| '_ \\| |_\n#     \\__ \\ (_| (_| | (_| |  __/ | | | | | (_) | | | || (_| (_) | | | |  _|\n#     |___/\\___\\__,_|\\__,_|\\___|_| |_| |_|\\___/|_| |_(_)___\\___/|_| |_|_|\n#\n###################################################################################\n# Smartcard daemon for the GnuPG system\n#\n# Reminder: GnuPG Smart Card stack looks something like this\n#    Yubikey -> pcscd -> scdaemon -> gpg-agent -> gpg commandline tool and other clients\n#\n# After any changes in this file, it's probably a good idea to restart your gpg-agent:\n#                systemctl --user restart gpg-agent.service\n###\n\n# https://support.yubico.com/hc/en-us/articles/4819584884124-Resolving-GPG-s-CCID-conflicts\n# logfile /tmp/scdaemon.log\n# debug-all\n\n# instruct scdaemon to use pcsc interface instead of the default direct connect mode.\ndisable-ccid\ndisable-application piv\npcsc-shared\npcsc-driver   /usr/lib/x86_64-linux-gnu/libpcsclite.so.1\ncard-timeout  1\n\n# Always try to use yubikey as the first reader\n# even when other smart card readers are connected\n# Name of the reader can be found using the pcsc_scan command\n# If you have problems with gpg not recognizing the Yubikey\n# then make sure that the string here matches exacly pcsc_scan\n# command output. Also check journalctl -f for errors.\nreader-port Yubico YubiKey\n"
  },
  {
    "path": "gnupg/scripts/generate-gpg-key",
    "content": "#! /bin/bash\n# Time-stamp: <Sat 2023-12-09 13:17 svarrette>\n############################################################################################\n#    ____ ____   ____   _  __             ____                           _   _\n#   / ___|  _ \\ / ___| | |/ /___ _   _   / ___| ___ _ __   ___ _ __ __ _| |_(_) ___  _ __\n#  | |  _| |_) | |  _  | ' // _ \\ | | | | |  _ / _ \\ '_ \\ / _ \\ '__/ _` | __| |/ _ \\| '_ \\ .\n#  | |_| |  __/| |_| | | . \\  __/ |_| | | |_| |  __/ | | |  __/ | | (_| | |_| | (_) | | | |\n#   \\____|_|    \\____| |_|\\_\\___|\\__, |  \\____|\\___|_| |_|\\___|_|  \\__,_|\\__|_|\\___/|_| |_|\n#                                |___/\n#\n#                       copyright (c) S. Varrette\n#\n# Creates a new GPG keypair following recommended [ULHPC]/LAM best practices\n#\n# Usage: see generate-gpg-key -h\n############################################################################################\n# set -o errexit -o pipefail  # FIXME breaks script at subkey_entry\n\n# cosmetics\nCOLOR_BOLD=\"\\033[1m\"\nCOLOR_VIOLET=\"\\033[0;35m\"\nCOLOR_RESET=\"\\033[0m\"\n\n# Local variables\n# SCRIPTDIR=\"$(cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n#TOP_DIR=\"$(  cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && git rev-parse --show-toplevel)\"\nCMD_PREFIX=\n# OPTS=\n\nGIT_AUTHOR_NAME=\"$(git config --get user.name)\"\nGIT_AUTHOR_EMAIL=\"$(git config --get user.email)\"\n\n# Default GPG algo\nGPG_ALGO=rsa4096\n\n################################################################################\ninfo()    { echo -e \"${COLOR_BOLD}$*${COLOR_RESET}\"; }\nerror()   { echo -e \"${COLOR_BOLD}*** ERROR *** $*${COLOR_RESET}\"; }\nwarning() { echo -e \"${COLOR_VIOLET}/!\\\\ WARNING:${COLOR_RESET} $*\"; }\nprint_error_and_exit() { error \"$*\"; exit 1; }\nusage() {\n    cat <<EOF\n$(basename \"$0\"): create a new GPG key pair withing a temporary directory\nfollowing recommended [ULHPC]/LAM best practices, i.e.:\n- A single master key used for certification only (i.e. generating subkeys) (no\n  expiration)\n- A dedicated subkey per usage ('sign', encrypt' and 'auth') (1y expiration)\n- revocation certificates\n- An (armored) backup of all keys\n\nIn addition, to prepare for an eventual SSH usage via the GPG subkey with 'A'\nusage, a sshcontrol file is setup (matching the appropriate Keygrip).\n\n/!\\\\ IMPORTANT: These keys are generated in a batch (unattended) way and assumes\nyou have properly set your git configuration to extract your git user name and\nemail with the following commands:\n     git config --get user.{name,email}\n\nSo ensure this works on your machine.\nAt the end, you should get a GPG key pair with the following characteristics:\n\n   $ gpg -K \\$(git config --get user.email) --keyid-format 0xlong\n   sec   rsa4096/<KeyID> $(date +%F) [C]    # Master key\n         <Long-KeyID>\n   uid                   [ultimate] <firstname> <name> <email>\n   ssb   rsa4096/<subkey-S-ID> $(date +%F) [S] [expires: <date>]\n   ssb   rsa4096/<subkey-E-ID> $(date +%F) [E] [expires: <date>]\n   ssb   rsa4096/<subkey-A-ID> $(date +%F) [A] [expires: <date>]\n\nUSAGE\n  $(basename \"$0\") [-d /path/to/tmpdir]\n\nOPTIONS:\n  -n --dry-run      Dry run mode: (tries to) echo the commands to be run\n  -a --algo ALGO    Set sub key algorithm (Ex: rsa4086, ed25519). Default: ${GPG_ALGO}.\n                    See supported algorithms with 'gpg --with-colons --list-config curve'\n  -d --dir DIR      Set working directory (Default: random temporary directory)\n\nEXAMPLE\n  $(basename \"$0\")\n  $(basename \"$0\") -d ~/.gnupg\n\nYou're free afterwards to import the GPG keys to your Yubikeys following for\ninstance the following guide:\n           https://github.com/drduh/YubiKey-Guide\nEOF\n}\n\n####\n# ask to continue. exit 1 if the answer is no (actually starts with n|N*)\n##\nreally_continue() {\n    echo -e -n \"${COLOR_VIOLET}/!\\\\ WARNING:${COLOR_RESET} Are you sure you want to continue? [Y|n] \"\n    read -r ans\n    case $ans in\n        n*|N*) exit 1;;\n    esac\n}\n\nprint_current_gpg_key() {\n    info  \"=== Current GPG key status ===\"\n    ${CMD_PREFIX} gpg -K --keyid-format 0xlong\n}\n\n################################################################################\n# Check for options\nwhile [ $# -ge 1 ]; do\n    case $1 in\n        -h | --help)    usage; exit 0;;\n        -n | --dry-run) CMD_PREFIX=\"echo\";;\n        -a | --algo)    shift; GPG_ALGO=\"$1\";;\n        -d | --prefix | --*dir)  shift; WORKDIR=\"$1\";;\n        *) # OPTS=\"$*\";\n            break;;\n    esac\n    shift\ndone\n\n# Safeguards\n[ -z \"$(which gpg)\" ] && print_error_and_exit \"Unable to find gpg\"\n[ -z \"${GIT_AUTHOR_NAME}\" ]  && print_error_and_exit \"Unable to get GIT_AUTHOR_NAME variable (from git config --get user.name)\"\n[ -z \"${GIT_AUTHOR_EMAIL}\" ] && print_error_and_exit \"Unable to get GIT_AUTHOR_EMAIL variable (from git config --get user.email)\"\n\n\n[ -z \"${WORKDIR}\" ] && GNUPGHOME=\"$(mktemp -d)\" || GNUPGHOME=\"${WORKDIR}\"\nexport GNUPGHOME\ninfo \"Working directory: GNUPGHOME = ${GNUPGHOME}\"\n\n### Generating Master key\nMASTER_KEY_BATCH=${GNUPGHOME}/generate-master-key.batch\n\nif [ ! -f \"${MASTER_KEY_BATCH}\" ]; then\n    info \"=> generating batch file for the master key ${MASTER_KEY_BATCH}\"\n    cat > \"${MASTER_KEY_BATCH}\" << EOF\n%echo === Generating your GPG key ===\n%echo -> Generating master key (for certification only)\nKey-Type: RSA\nKey-Length: 4096\n# Key generated is a master key (\"certificate\")\nKey-Usage: cert\n\n# select a name and email address\nName-Real:  ${GIT_AUTHOR_NAME}\nName-Email: ${GIT_AUTHOR_EMAIL}\n\n# Do not set the key to expire\nExpire-Date: 0\n\n# Do a commit here, so that we can later print \"done\" :-)\n%commit\n%echo done\nEOF\nfi\n\nif [ ! -f \"${GNUPGHOME}/pubring.kbx\" ]; then\n    info \"=> generating master key\"\n    ${CMD_PREFIX} gpg --generate-key --batch \"${MASTER_KEY_BATCH}\"\nfi\nprint_current_gpg_key\n\n\n### Generatind dedicated subkeys (one per usage)\ninfo \"=> collecting generated Key ID\"\nKEYID=$(gpg --list-options show-only-fpr-mbox --list-secret-keys \"${GIT_AUTHOR_EMAIL}\" | awk '{print $1}' | head -n1)\n# Alternative way:\n# KEYID=$(gpg --keyid-format long  --with-colons --fingerprint \"${GIT_AUTHOR_EMAIL}\" | grep pub | cut -d ':' -f 5 | head -n1)\n[ -z \"${KEYID}\" ] && print_error_and_exit \"No KeyID collected... exiting\"\necho \"   Master Key ID for ${GIT_AUTHOR_EMAIL}: ${KEYID}\"\n\nfor type in sign encrypt auth; do\n    subtype=${type:0:1}\n    # echo \"   - checking '${type}' subkey (ssb format: '${subtype}')\"\n    subkey_entry=\"$(gpg --keyid-format long  --with-colons -K  \"${GIT_AUTHOR_EMAIL}\" | grep ssb | cut -d ':' -f 5,12 | grep -E \":${subtype}\" | head -n1)\"\n    if [ -z \"${subkey_entry}\" ]; then\n        info \"=> Generating subkey for '${type}' usage\"\n        ${CMD_PREFIX} gpg --batch --quick-add-key \"${KEYID}\" \"${GPG_ALGO}\" \"${type}\" 1y\n    else\n        echo \"   ... found existing ${type} subkey (with ID: $(echo \"${subkey_entry}\" | cut -d':' -f1))\"\n    fi\ndone\nprint_current_gpg_key\n\n### Backup your GPG keys\nGPG_EXPORT_DIR=${GNUPGHOME}/backup.d/${GIT_AUTHOR_EMAIL}\nGPG_PUBLIC_KEY=${GPG_EXPORT_DIR}/$(whoami).asc\nGPG_PRIVATE_KEY=${GPG_EXPORT_DIR}/private-key-$(whoami).asc\nGPG_PRIVATE_SUBKEY=${GPG_EXPORT_DIR}/private-subkeys-$(whoami).asc\nGPG_TRUSTDB=${GPG_EXPORT_DIR}/trustdb.txt\nGPG_REVOKE=${GNUPGHOME}/openpgp-revocs.d/${KEYID}.rev\n\n${CMD_PREFIX} mkdir -p ${GPG_EXPORT_DIR}\nif [ ! -f \"${GPG_PUBLIC_KEY}\" ]; then\n    info \"=> exports/backup your public key\"\n    ${CMD_PREFIX} gpg --armor --export ${KEYID}  > ${GPG_PUBLIC_KEY}\nfi\nif [ ! -f \"${GPG_PRIVATE_KEY}\" ]; then\n    info \"=> exports/backup your **private** master key\"\n    ${CMD_PREFIX} gpg --armor --export-secret-keys    ${KEYID} > ${GPG_PRIVATE_KEY}\n    ${CMD_PREFIX} chmod 400 ${GPG_PRIVATE_KEY}\nfi\nif [ ! -f \"${GPG_PRIVATE_SUBKEY}\" ]; then\n    info \"=> exports/backup your **private** subkeys\"\n    ${CMD_PREFIX} gpg --armor --export-secret-subkeys ${KEYID} > ${GPG_PRIVATE_SUBKEY}\n    ${CMD_PREFIX} chmod 400 ${GPG_PRIVATE_SUBKEY}\nfi\nif [ -f \"${GPG_REVOKE}\" ]; then\n    info \"=> revocation cerfificate for OpenPGP (master) key ${KEYID}:\"\n    echo \"   ${GPG_REVOKE}\"\n# else\n#     info \"=> generating revocation certificate for Key ID ${KEYID}\"\n#     ${CMD_PREFIX} gpg --output ${GPG_REVOKE} --gen-revoke ${KEYID}\n#     warning \"Better keep the $(basename ${GPG_REVOKE}) certificate file stored (or printed)\"\n#     warning \"in a (secondary) place that allows retrieval in case the main backup fails.\"\nfi\ninfo \"=> export GPG's trustDB to a text file\"\n${CMD_PREFIX} gpg --export-ownertrust > ${GPG_TRUSTDB}\n\n\n### Prepare SSH usage via the GPG subkey with 'A' usage\nGPG_KEYGRIP_SUBKEY_A=$(gpg -K --keyid-format long --with-keygrip ${GIT_AUTHOR_EMAIL} | grep -A1 '\\[A\\]' | grep Keygrip | sed 's/.*Keygrip\\s*=\\s*//')\nGPG_SSHCONTROL=${GNUPGHOME}/sshcontrol\n\nif [ ! -f \"${GPG_SSHCONTROL}\" ]; then\n    info \"=> preparing for (optional) SSH support via the GPG subkey with 'A[uth]' usage\"\n    echo \"   assumes you specify the key to use in sshcontrol file via its keygrip internal identifier\"\n    echo \" Current keygrips in use: (gpg -K --with-keygrip [...])\"\n    ${CMD_PREFIX} gpg -K --keyid-format long --with-keygrip ${GIT_AUTHOR_EMAIL}\n    info \"   selected keygrip (subkey with 'A' usage): '${GPG_KEYGRIP_SUBKEY_A}'\"\n    info \"=> creating ${GPG_SSHCONTROL}\"\n    echo \"${GPG_KEYGRIP_SUBKEY_A}\" > ${GPG_SSHCONTROL}\n    warning \"To get gpg-agent to handle requests from SSH, you still need to:\"\n    warning \"- add 'enable-ssh-support' into \\${GNUPGOME}/gpg-agent.conf\"\n    warning \"- change the value of the SSH_AUTH_SOCK environment variable in your favorite shell configuration (.bashrc,.zshrc etc.)\"\n    warning \"    export SSH_AUTH_SOCK=\\$(gpgconf --list-dirs agent-ssh-socket)\"\n    warning \"    gpgconf --launch gpg-agent\"\nfi\n\n\n\nwarning \"To cleanup the working directory (NOT done by default):\"\nwarning \"         rm -rf ${GNUPGHOME}\"\n#${CMD_PREFIX} rm -rf ${GNUPGHOME}/*\n"
  },
  {
    "path": "install.sh",
    "content": "#!/usr/bin/env bash\n# Time-stamp: <Mon 2017-01-23 01:55 svarrette>\n################################################################################\n#      _____     _ _              _           _       _    __ _ _\n#     |  ___|_ _| | | _____  _ __( )___    __| | ___ | |_ / _(_) | ___  ___\n#     | |_ / _` | | |/ / _ \\| '__|// __|  / _` |/ _ \\| __| |_| | |/ _ \\/ __|\n#     |  _| (_| | |   < (_) | |    \\__ \\ | (_| | (_) | |_|  _| | |  __/\\__ \\\n#     |_|  \\__,_|_|_|\\_\\___/|_|    |___/  \\__,_|\\___/ \\__|_| |_|_|\\___||___/\n#\n################################################################################\n# Installation script for Falkor aka S.Varrette's dotfiles within the homedir of the\n# user running this script.\n# Adapted from the install script set for [ULHPC/dotfiles](https://github.com/ULHPC/dotfiles)\n\n#set -x # Debug\n\n### Global variables\nVERSION=0.1\nCOMMAND=$(basename \"$0\")\nVERBOSE=\"\"\nDEBUG=\"\"\nSIMULATION=\"\"\nUPDATE=\"\"\nMODE=\"\"\nFORCE=\"\"\n\n### displayed colors\nCOLOR_GREEN=\"\\033[0;32m\"\nCOLOR_RED=\"\\033[0;31m\"\nCOLOR_YELLOW=\"\\033[0;33m\"\nCOLOR_VIOLET=\"\\033[0;35m\"\nCOLOR_BACK=\"\\033[0m\"\n\n### Local variables\nSCRIPTDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\nDOTFILES_DIR=dotfiles.falkor.d\n[ -n \"${XDG_CONFIG_HOME}\" ] && PREFIX=\"${XDG_CONFIG_HOME}\" || PREFIX=\"$HOME/.config\"\n[ -n \"${XDG_DATA_HOME}\" ]   && DATADIR=\"${XDG_DATA_HOME}\"  || DATADIR=\"$HOME/.local/share\"\n[ \"$COMMAND\" == 'bash' ]    && COMMAND=\"${PREFIX}/${DOTFILES_DIR}/install.sh\"\n\n# List of available dotfiles -- now get by __set_falkor_dotfiles_available(<path>)\n#AVAILABLE_DOTFILES=$(find ${SCRIPTDIR}/ -mindepth 1 -maxdepth 1 -type d \\( ! -iname '.*' \\) -exec basename {} \\; | grep -Ev '(bin|docs|screenshots|tests)' | xargs echo rvm )\nAVAILABLE_DOTFILES=\n\n# GIT URLs\nOH_MY_ZSH_REPO=\"https://github.com/robbyrussell/oh-my-zsh.git\"\nZSH_THEME_POWERLEVEL9K_REPO=\"https://github.com/bhilburn/powerlevel9k.git\"\nZSH_THEME_POWERLEVEL10K_REPO=\"https://github.com/romkatv/powerlevel10k.git\"\n\n# What to take care of (default is empty)\nWITH_SHELL=\"\"     # Common shell stuff\nWITH_BASH=\"\"\nWITH_ZSH=\"\"\nWITH_EMACS=\"\"\nWITH_VIM=\"\"\nWITH_GIT=\"\"\nWITH_SCREEN=\"\"\nWITH_BREW=\"\"\nWITH_CURL=\"\"\nWITH_RVM=\"\"\nWITH_DIRENV=\"\"\n\n# Default action\nACTION=\"install\"\n\n#######################\n### print functions ###\n#######################\n\n######\n# Print information in the following form: '[$2] $1' ($2=INFO if not submitted)\n# usage: info text [title]\n##\ninfo() {\n    [ -z \"$1\" ] && print_error_and_exit \"[${FUNCNAME[0]}] missing text argument\"\n    local text=$1\n    local title=$2\n    # add default title if not submitted but don't print anything\n    [ -n \"$text\" ] && text=\"${title:==>} $text\"\n    echo -e \"${COLOR_GREEN}$text${COLOR_BACK}\"\n}\ndebug()   { [ -n \"$DEBUG\"   ] && info \"$1\" \"[${COLOR_YELLOW}DEBUG${COLOR_BACK}]\"; }\nverbose() { [ -n \"$VERBOSE\" ] && info \"$1\"; }\nerror()   { info \"$1\" \"[${COLOR_RED}ERROR${COLOR_BACK}]\"; }\nwarning() { info \"$1\" \"[${COLOR_VIOLET}WARNING${COLOR_BACK}]\"; }\nprint_error_and_exit() {\n    local text=$1\n    [ -z \"$1\" ] && text=\" Bad format\"\n    error  \"$text. '$COMMAND -h' for help.\"\n    exit 1\n}\nprint_version() {\n    cat <<EOF\nThis is Falkor/dotfiles/$COMMAND version \"$VERSION\".\nCopyright (c) 2011-2017 Sebastien Varrette  (sebastien.varrette@uni.lu)\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nEOF\n}\nprint_help() {\n    less <<EOF\nNAME\n    $COMMAND -- install (or remove) Falkor's dotfiles in the current user's homedir\n\nSYNOPSIS\n    $COMMAND [-V | -h]\n    $COMMAND [--debug] [-v] [-n] [--update] [options]\n    $COMMAND --delete [options]\n\nOPTIONS\n    --debug\n        Debug mode. Causes $COMMAND to print debugging messages.\n    -h --help\n        Display a help screen and quit.\n    -n --dry-run\n        Simulation mode.\n    -v --verbose\n        Verbose mode.\n    -f --force\n        Force mode -- do not raise questions ;)\n    -V --version\n        Display the version number then quit.\n    -d --dir DIR\n        Set the dotfiles directory (Default: .dotfiles.falkor.d)\n    --prefix DIR\n        Set the prefix directory for the dotfiles (Default: ~/.config)\n    --delete --remove --uninstall\n        Remove / Restore the installed components\n    --update\n        Update the Falkor's dotfile repository to the lastest version\n    --all -a\n        Install / delete ALL Falkor's dotfiles\n    --bash --with-bash\n        Falkor's Bourne-Again shell (Bash) configuration ~/.bashrc\n    --brew --with-brew\n        Install with brew bundle\n    --direnv --with-direnv\n        Install direnv confirguration (see https://github.com/direnv/direnv)\n    --zsh --with-zsh\n        Falkor's ZSH / Oh-My-ZSH configuration\n    --emacs --with-emacs\n        Falkor's Emacs configuration\n    --vim --with-vim\n        Falkor's VIM configuration\n    --git --with-git\n        Falkor's Git configuration gitconfig[.local]\n    --screen --with-screen\n        Falkor's GNU Screen configuration ~/.screenrc\n    --rvm --with-rvm\n        Install RVM (Ruby Version Manager)\n\nEXAMPLES\n\n    To install/remove all available dotfiles:\n        $COMMAND [--delete] --all\n\n    To install/remove recommended dotfiles:\n        $COMMAND [--delete] --recommended\n\n    To install ONLY the zsh/vim/git and screen dotfiles:\n        $COMMAND [--delete] --zsh --vim --git --screen\n\nAUTHOR\n    Falkor aka Sebastien Varrette <sebastien.varrette@uni.lu>\n\nREPORTING BUGS\n    Please report bugs using the Issue Tracker of the project:\n       <https://github.com/Falkor/dotfiles/issues>\n\nCOPYRIGHT\n    This is free software; see the source for copying conditions.  There is\n    NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR\n    PURPOSE.\nEOF\n}\n#########################\n### toolbox functions ###\n#########################\n\n#####\n# execute a local command\n# usage: execute command\n###\nexecute() {\n    [ $# -eq 0 ] && print_error_and_exit \"[${FUNCNAME[0]}] missing command argument\"\n    debug \"[${FUNCNAME[0]}] $*\"\n    [ -n \"${SIMULATION}\" ] && echo \"(simulation) $*\" || eval \"$*\"\n    local exit_status=$?\n    debug \"[${FUNCNAME[0]}] exit status: $exit_status\"\n    return $exit_status\n}\n\n####\n# ask to continue. exit 1 if the answer is no\n# usage: really_continue text\n##\nreally_continue() {\n    [ -n \"${FORCE}\" ] && return || true\n    echo -e -n \"[${COLOR_VIOLET}WARNING${COLOR_BACK}] $1 Are you sure you want to continue? [Y|n] \"\n    read ans\n    case $ans in\n        n*|N*) exit 1;;\n    esac\n}\n\n#####\n# Check availability of binaries passed as arguments on the current system\n# usage: check_bin prog1 prog2 ...\n##\ncheck_bin() {\n    [ $# -eq 0 ] && print_error_and_exit \"[${FUNCNAME[0]}] missing argument\"\n    for appl in \"$@\"; do\n        echo -n -e \"=> checking availability of the command '$appl' on your system \\t\"\n        local tmp=$(which $appl)\n        [ -z \"$tmp\" ] && print_error_and_exit \"Please install $appl or check \\$PATH.\" || echo -e \"[${COLOR_GREEN} OK ${COLOR_BACK}]\"\n    done\n}\n\n###\n# Get the available dotfiles out of <path>\n##\n__set_falkor_dotfiles_available() {\n  local path=${1:-${SCRIPTDIR}}\n  AVAILABLE_DOTFILES=$(find ${path}/ -mindepth 1 -maxdepth 1 -type d \\( ! -iname '.*' \\) -exec basename {} \\; | grep -Ev '(bin|docs|screenshots|tests)' | xargs echo rvm)\n}\n\n####\n# Add (or remove) a given link pointing to the corresponding dotfile.\n# A backup of the file is performed if it previoiusly existed.\n# Upon removal, the link is deleted only if it targets the expected dotfile\n##\nadd_or_remove_link() {\n    [ $# -lt 2 ] && print_error_and_exit \"[${FUNCNAME[0]}] missing argument(s). Format: ${FUNCNAME[0]} <src> <dst> [<prefix>]\"\n    local source=$1\n    local dst=$2\n    # prefix for the source\n    local prefix=$3\n    # debug \"source=$source\"\n    # debug \"dst=$dst\"\n    # debug \"prefix=$prefix\"\n    [ -n \"${prefix}\" ] && src=\"${prefix}/${source}\" || src=\"${source}\"\n    # debug \"src=$src\"\n    if [ \"${MODE}\" == \"--delete\" ]; then\n        debug \"removing dst='$dst' (if symlink pointing to src='$source' =? $(readlink \"$dst\"))\"\n        if [[ -h \"${dst}\" && \"$(readlink \"${dst}\")\" == \"${source}\" ]]; then\n            warning \"removing the symlink '$dst'\"\n            [ -n \"${VERBOSE}\" ] && really_continue\n            execute \"rm $dst\"\n            if [ -f \"${dst}.bak\" ]; then\n                warning \"restoring ${dst} from ${dst}.bak\"\n                execute \"mv ${dst}.bak ${dst}\"\n            fi\n        fi\n    else\n        # get rid of ../ in the path upon checking\n        # real_srcpath=$(python -c \"import os,sys; print os.path.abspath(sys.argv[1])\" \"${src}\")\n        real_srcpath=$(realpath ${src})\n        [ ! -e \"${real_srcpath}\" ] && print_error_and_exit \"Unable to find the dotfile '${src}'\\n(interpreted path: '${real_srcpath}')\"\n        #[ ! -e \"${src}\" ] && print_error_and_exit \"Unable to find the dotfile '${src}'\\n(interpreted path: '${real_srcpath}')\"\n        debug \"attempt to add '$dst' symlink (pointing to '$source') if needed\"\n        # return if the symlink already exists\n        [[ -h \"${dst}\" && \"$(readlink \"${dst}\")\" == \"${source}\" ]] && return\n        if [ -e \"${dst}\" ]; then\n            warning \"The file '${dst}' already exists and will be backuped (as ${dst}.bak)\"\n            execute \"mv ${dst}{,.bak}\"\n        fi\n        execute \"ln -sf ${source} ${dst}\"\n    fi\n}\n\n###\n# Enable (or disable) a specific dotfile customization common to all shells\n# (bash, zsh...)\n##\nshell_custom_enable() {\n  local name=$1\n  local configdir=\"${PREFIX_HOME}${PREFIX}/shell\"\n  if [ \"${ACTION}\" == 'install' ]; then\n    if [ ! -d \"${configdir}\" ]; then\n      WITH_SHELL=\"--shell\"\n      __shell\n    fi\n  else\n    configdir=${PREFIX_HOME}${INSTALL_DIR}/shell\n  fi\n  local src=\"${configdir}/available/${name}.sh\"\n  local dst=\"${configdir}/${name}.sh\"\n  add_or_remove_link \"available/${name}.sh\" \"${configdir}/${name}.sh\" \"${configdir}\"\n}\n\nadd_or_remove_copy() {\n    [ $# -ne 2 ] && print_error_and_exit \"[${FUNCNAME[0]}] missing argument(s). Format: ${FUNCNAME[0]} <src> <dst>\"\n    local src=$1\n    local dst=$2\n    [ ! -f \"${src}\" ] && print_error_and_exit \"Unable to find the dotfile '${src}'\"\n    if [ \"${MODE}\" == \"--delete\" ]; then\n        debug \"removing dst='${dst}'\"\n        if [[ -f $dst ]]; then\n            warning \"removing the file '$dst'\"\n            [ -n \"${VERBOSE}\" ] && really_continue \"$@\"\n            execute \"rm ${dst}\"\n            if [ -f \"${dst}.bak\" ]; then\n                warning \"restoring ${dst} from ${dst}.bak\"\n                execute \"mv ${dst}.bak ${dst}\"\n            fi\n        fi\n    else\n        debug \"copying '$dst' from '$src'\"\n        check_bin shasum\n        # return if the symlink already exists\n        local checksum_src=$(shasum \"${src}\" | cut -d ' ' -f 1)\n        local checksum_dst=$(shasum \"${dst}\" | cut -d ' ' -f 1)\n        if [ \"${checksum_src}\" == \"${checksum_dst}\" ]; then\n            echo \"   - NOT copying '$dst' from '$src' since they are the same files\"\n            return\n        fi\n        if [ -f \"${dst}\" ]; then\n            warning \"The file '$dst' already exists and will be backuped (as ${dst}.bak)\"\n            execute \"cp ${dst}{,.bak}\"\n        fi\n        execute \"cp ${src} ${dst}\"\n    fi\n}\n\n# install_ohmyzsh() {\n#     check_bin zsh\n#     local omzsh_dir=\"${DATADIR}/oh-my-zsh\"\n#     if [ ! -d \"${omzsh_dir}\" ]; then\n#         info \"installing Oh-My-ZSH in ${DATADIR} -- see http://ohmyz.sh/\"\n#         # installation by curl if available\n#         if   [ -n \"$(which curl)\" ]; then\n#             echo \"   - installation using curl\"\n#             warning \" \"\n#             warning \"Remember to Exit the zsh shell to continue the installation!!!\"\n#             warning \" \"\n#             [ -z \"${SIMULATION}\" ] && sh -c \"$(ZSH=${omzsh_dir} curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)\"\n#         elif [ -n \"$(which wget)\" ]; then\n#             echo \"   - installation using wget\"\n#             [ -z \"${SIMULATION}\" ] && sh -c \"$(ZSH=${omzsh_dir} wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)\"\n#         else\n#             print_error_and_exit \"Unable to install oh-my-zsh/. You shall install 'curl' or 'wget' on your system\"\n#         fi\n#     fi\n# }\n\n# install_custom_ohmyzsh() {\n#     info \"installing Falkor custom plugins for oh-my-zsh/\"\n#     local customdir=\"$HOME/.oh-my-zsh/custom/\"\n#     #local falkor_customdir=\"${INSTALL_DIR}/oh-my-zsh/custom\"\n#     local falkor_customdir=\"${PREFIX_HOME}${PREFIX}/zsh/custom\"\n#     [ ! -h \"${customdir}/.ref\" ] && execute \"ln -s ${falkor_customdir} ${customdir}/.ref\"\n#     for f in `ls ${falkor_customdir}/*.zsh`; do\n#         ff=\"$(basename $f)\"\n#         if [ ! -h \"${customdir}/$ff\" ]; then\n#             echo \"     - add custom '$ff'\"\n#             execute \"ln -s .ref/$ff ${customdir}/$ff\"\n#         fi\n#     done\n#     local private_aliases=\"${customdir}/private_aliases.zsh\"\n#     if [ ! -f \"${private_aliases}\" ]; then\n#         cat  << 'EOF' > ${private_aliases}\n# #\n# # private_aliases.zsh\n# #\n# # Add your local (private) aliases for zsh here.\n# EOF\n#     fi\n#     local plugindir=\"${customdir}/plugins\"\n#     local falkor_plugindir=\"${falkor_customdir}/plugins\"\n#     [ ! -h \"${plugindir}/.ref\" ] && execute \"ln -s ../.ref/plugins ${plugindir}/.ref\"\n#     for d in `ls -d ${falkor_plugindir}/*`; do\n#         dd=`basename $d`\n#         if [ ! -h \"${plugindir}/$dd\" ]; then\n#             echo \"     - installing custom oh-my-zsh plugin '$dd'\"\n#             execute \"ln -s .ref/$dd ${plugindir}/$dd\"\n#         fi\n#     done\n#     local themedir=\"${customdir}/themes\"\n#     [ ! -d \"${themedir}\" ] && execute \"mkdir -p ${customdir}/themes\"\n#     local falkor_themedir=\"${falkor_customdir}/themes\"\n#     [ ! -h \"${themedir}/.ref\" ] && execute \"ln -s ../.ref/themes ${themedir}/.ref\"\n#     for d in `ls -d ${falkor_themedir}/*`; do\n#         dd=`basename $d`\n#         if [ ! -h \"${themedir}/$dd\" ]; then\n#             echo \"     - installing custom oh-my-zsh theme '$dd'\"\n#             execute \"ln -s .ref/$dd ${themedir}/$dd\"\n#         fi\n#     done\n#\n# }\n\n# courtesy of https://github.com/holman/dotfiles/blob/master/script/bootstrap\nsetup_gitconfig_local () {\n    local gitconfig_local=${1:-\"${PREFIX_HOME}${PREFIX}/git/config.local\"}\n    local dotfile_gitconfig_local=\"${PREFIX_HOME}${INSTALL_DIR}/git/$(basename ${gitconfig_local})\"\n    if [ -f \"${dotfile_gitconfig_local}\" ]; then\n        #add_or_remove_link \"${dotfile_gitconfig_local}\" \"${gitconfig_local}\"\n        return\n    fi\n    if [ ! -f \"${gitconfig_local}\" ]; then\n        info \"setup Local/private gitconfig '${gitconfig_local}'\"\n        [ -n \"${SIMULATION}\" ] && return\n        cat > $gitconfig_local <<'EOF'\n# -*- mode: gitconfig; -*-\n################################################################################\n#  [.git]config.local -- Private part of the GIT configuration\n#  .                   to hold username / credentials etc .\n#  NOT meant to be staged for commit under github\n#      __       _ _  __                  __ _         _                 _\n#     | _| __ _(_) ||_ | ___ ___  _ __  / _(_) __ _  | | ___   ___ __ _| |\n#     | | / _` | | __| |/ __/ _ \\| '_ \\| |_| |/ _` | | |/ _ \\ / __/ _` | |\n#     | || (_| | | |_| | (_| (_) | | | |  _| | (_| |_| | (_) | (_| (_| | |\n#     | (_)__, |_|\\__| |\\___\\___/|_| |_|_| |_|\\__, (_)_|\\___/ \\___\\__,_|_|\n#     |__||___/     |__|                      |___/\n#\n# See also: http://github.com/Falkor/dotfiles\n################################################################################\nEOF\n        local git_credential='cache'\n        local git_authorname=\n        local git_email=\n        if [ \"$(uname -s)\" == \"Darwin\" ]; then\n            git_authorname=$(dscl . -read /Users/$(whoami) RealName | tail -n1)\n            git_credential='osxkeychain'\n        elif [ \"$(uname -s)\" == \"Linux\" ]; then\n            git_authorname=$(getent passwd $(whoami) | cut -d ':' -f 5 | cut -d ',' -f 1)\n        fi\n        [ -n \"${GIT_AUTHOR_NAME}\"  ] && git_authorname=\"${GIT_AUTHOR_NAME}\"\n        [ -n \"${GIT_AUTHOR_EMAIL}\" ] && git_email=\"${GIT_AUTHOR_EMAIL}\"\n        if [ -z \"${git_authorname}\" ]; then\n            echo -e -n  \"[${COLOR_VIOLET}WARNING${COLOR_BACK}] Enter you Git author name: \"\n            read -e git_authorname\n        fi\n        if [ -z \"${git_email}\" ]; then\n            echo -e -n  \"[${COLOR_VIOLET}WARNING${COLOR_BACK}] Enter you Git author (${git_authorname}) email: \"\n            read -e git_email\n        fi\n        cat >> $gitconfig_local <<EOF\n[user]\n    name   = $git_authorname\n    email  = $git_email\n    helper = $git_credential\nEOF\n    fi\n}\n\nsetup_installdir() {\n    [ \"${ACTION}\" != 'install' ] && return\n    check_bin 'git'\n    if [ ! -d \"${PREFIX_HOME}${PREFIX}\" ]; then\n        info \"creating the prefix directory '${PREFIX_HOME}${PREFIX}'\"\n        #really_continue\n        execute \"mkdir -p ${PREFIX_HOME}${PREFIX}\"\n    fi\n    if [ -d \"${SCRIPTDIR}/.git\" -a ! -e \"${PREFIX_HOME}${INSTALL_DIR}\" ]; then\n      # check that the install script really belongs to this git repository\n      ok=$(git --git-dir=${SCRIPTDIR}/.git ls-files $COMMAND --error-unmatch 2>/dev/null)\n      if [ $? -eq 0 ]; then\n        echo -e -n \"[${COLOR_VIOLET}WARNING${COLOR_BACK}] Make '${PREFIX_HOME}${INSTALL_DIR}' a symlink to ${SCRIPTDIR} [Y|n]? \"\n        ans='Yes'\n        [ -z \"${FORCE}\" ] && read ans || true\n        case $ans in\n          n*|N*)\n          ;;\n          *)  add_or_remove_link \"${SCRIPTDIR}\" \"${PREFIX_HOME}${INSTALL_DIR}\";\n          ;;\n        esac\n      fi\n    fi\n    # Final fallback solution: clone it (in recursive mode to collect all submodules)\n    if [ ! -e \"${PREFIX_HOME}${INSTALL_DIR}\" ]; then\n        info \"Cloning Falkor dotfiles in '${PREFIX_HOME}${INSTALL_DIR}'\";\n        execute \"git clone -q https://github.com/Falkor/dotfiles.git ${PREFIX_HOME}${INSTALL_DIR}\";\n        execute \"cd ${PREFIX_HOME}${INSTALL_DIR} && git submodule init\"\n        execute \"cd ${PREFIX_HOME}${INSTALL_DIR} && git submodule update\"\n    fi\n    __set_falkor_dotfiles_available \"${PREFIX_HOME}${INSTALL_DIR}\"\n}\n\n## Try to change the current shell to $1 if needed using chsh\n__change_user_shell() {\n  local target=${1:-bash}\n  local current_shell=$(expr \"$SHELL\" : '.*/\\(.*\\)')\n  local real_target=$(grep /${target}$ /etc/shells | tail -1)\n  if [ \"${current_shell}\" != \"${target}\" ]; then\n    check_bin chsh\n    warning \"Attempt to change current shell (${current_shell}) to ${target} (actually ${real_target})\"\n    really_continue\n    execute \"chsh -s ${real_target}\"\n  fi\n}\n\n###\n# Utility function to bootstrap (or clean) a specific dotfile\n# configuration directory\n# Usage: __setup_or_clean_configdir '<name>' '<action>'\n# where:\n#  - <name> is a dotfile directory (under ~/.config/dotfiles.falkor.d/)\n#  - <action> is [ 'install', 'uninstall']\n##\n__setup_or_clean_configdir() {\n  [ $# -ne 2 ] && print_error_and_exit \"[${FUNCNAME[0]}] missing command argument\"\n  local name=$1\n  local action=$2\n  local shortname=${name}\n  [ \"${name}\" == 'oh-my-zsh' ] && shortname='zsh'\n  [ ! -d \"${PREFIX_HOME}${INSTALL_DIR}/${name}\" ] && return\n  if [ \"${ACTION}\" == \"${action}\" ]; then\n    add_or_remove_link \"${DOTFILES_DIR}/${name}\"  \"${PREFIX_HOME}${PREFIX}/${shortname}\"  \"${PREFIX_HOME}${PREFIX}\"\n  fi\n}\nsetup_configdir() {\n  __setup_or_clean_configdir \"$1\" 'install'\n}\nclean_configdir() {\n  __setup_or_clean_configdir \"$1\" 'uninstall'\n}\n\n## Install common shell configs\n__shell(){\n  [ -z \"${WITH_SHELL}\" ] && return\n  info \"${ACTION} Common Shell configuration ~/.config/shell/\"\n  setup_configdir 'shell'\n  # for n in ${SCRIPTDIR}/shell/available/*.sh; do\n  #   name=$(basename ${n} .sh)\n  #   if [[ \"${AVAILABLE_DOTFILES}\" == *${name}* ]]; then\n  #     warning \"skipping ${name} custom shell setup as it comes bundled separately\"\n  #     continue\n  #   fi\n  #   shell_custom_enable \"${name}\"\n  # done\n  clean_configdir 'shell'\n}\n## Install/remove specific dotfiles\n__bash(){\n  [ -z \"${WITH_BASH}\" ] && return\n  info \"${ACTION} Falkor's Bourne-Again shell (Bash) configuration ~/.bashrc ~/.inputrc ~/.bash_profile\"\n  setup_configdir 'bash'\n  add_or_remove_link \"${PREFIX}/bash/.bashrc\"       ~/.bashrc       \"${PREFIX_HOME}\"\n  add_or_remove_link \"${PREFIX}/bash/.inputrc\"      ~/.inputrc      \"${PREFIX_HOME}\"\n  add_or_remove_link \"${PREFIX}/bash/.bash_profile\" ~/.bash_profile\n  info \"${ACTION} custom aliases from Falkor's Oh-My-ZSH plugin (made compatible with bash) ~/${PREFIX}/bash/custom/aliases.sh\"\n  add_or_remove_link \"${PREFIX_HOME}${INSTALL_DIR}/oh-my-zsh/custom/plugins/falkor/falkor.plugin.zsh\"  \"${PREFIX_HOME}${PREFIX}/bash/custom/aliases.sh\"\n  clean_configdir 'bash'\n  __shell\n}\n# Zsh\n__zsh(){\n  [ -z \"${WITH_ZSH}\" ] && return\n  info \"${ACTION} Falkor's ZSH / Oh-My-ZSH configuration\"\n  check_bin zsh\n  setup_configdir 'oh-my-zsh'\n  # specific Oh-my-zsh config dirs\n  local omzsh_dir=\"${DATADIR}/oh-my-zsh\"\n  local configdir=\"${PREFIX}/zsh\"\n\n  local omzsh_custom_dir=\"${configdir}/custom\"\n  local omzsh_custom_theme_dir=\"${configdir}/themes\"\n  # falkor's dotfiles config dirs for ZSH\n  local zsh_dir=\"${PREFIX_HOME}${PREFIX}/zsh\"\n  local zsh_custom_dir=\"${zsh_dir}/custom\"\n  local zsh_custom_theme_dir=\"${zsh_custom_dir}/themes\"\n  powerlevel10k_themedir=\"${zsh_custom_theme_dir}/powerlevel10k\"\n\n  # Let's go\n  add_or_remove_link \"${PREFIX}/zsh/.zshenv\"      ~/.zshenv           \"${PREFIX_HOME}\"\n  if [ \"${ACTION}\" == \"install\" ]; then\n    if [ ! -d \"${omzsh_dir}\" ]; then\n      check_bin git\n      execute \"git clone ${OH_MY_ZSH_REPO} ${omzsh_dir}\" || print_error_and_exit \"Unable to install oh-my-zsh/. Check your network connection\"\n    fi\n    # Powerlevel10k should be a submodule of the dotfile\n    if [ ! -f \"${powerlevel10k_themedir}/.git\" ]; then\n        echo \"=> '${powerlevel10k_themedir}/.git'\"\n        echo $(test -d \"${powerlevel10k_themedir}/.git\")\n        info \"updating (expected) git submodule for powerlevel10k theme\"\n        execute \"cd ${PREFIX_HOME}${INSTALL_DIR} && git submodule init\"\n        execute \"cd ${PREFIX_HOME}${INSTALL_DIR} && git submodule update\"\n    fi\n    __change_user_shell 'zsh'\n  else\n    [ -d \"${omzsh_dir}\" ] && execute \"rm -rf ${omzsh_dir}\" || true\n    __change_user_shell 'bash'\n  fi\n  clean_configdir 'oh-my-zsh'\n  __shell\n}\n# GNU Emacs\n__emacs(){\n  [ -z \"${WITH_EMACS}\" ] && return\n  info \"${ACTION} Falkor's Emacs configuration\"\n  warning \"For performance reason, make this installation independently following instructions on\"\n  warning \"    https://github.com/Falkor/spacemacs \"\n  # add_or_remove_link   $INSTALL_DIR/emacs     ~/.emacs.d\n  # add_or_remove_link   ~/.emacs.d/.emacs   ~/.emacs\n}\n# VI iMproved ([m]Vim)\n__vim(){\n  [ -z \"${WITH_VIM}\" ] && return\n  info \"${ACTION} Falkor's VIM configuration\"\n  setup_configdir 'vim'\n  shell_custom_enable 'vim'\n  if  [ \"${MODE}\" != \"--delete\" ]; then\n    warning \"To use effectively this vim configuration, you need to export VIMINIT\"\n    warning \"as done in ~/${PREFIX}/shell/vim.sh : \"\n    warning \" \"\n    warning \"   export VIMINIT='let \\$MYVIMRC=\\\"\\$XDG_CONFIG_HOME/vim/vimrc\\\" | source \\$MYVIMRC'\"\n    warning \" \"\n  fi\n  clean_configdir 'vim'\n}\n# Git\n__git(){\n  [ -z \"${WITH_GIT}\" ] && return\n  info \"${ACTION} Falkor's Git configuration ~/.gitconfig[.local]\"\n  setup_configdir 'git'\n  [ \"${ACTION}\" != \"install\" ] && setup_gitconfig_local\n  clean_configdir 'git'\n\n}\n## GNU Screen\n__screen(){\n [ -z \"${WITH_SCREEN}\" ] && return\n    info \"${ACTION} ULHPC GNU Screen configuration ~/.screenrc\"\n    setup_configdir 'screen'\n    add_or_remove_link \"${PREFIX}/screen/.screenrc\"      ~/.screenrc       \"${PREFIX_HOME}\"\n    clean_configdir 'screen'\n}\n## HomeBrew -- http://brew.sh\n__brew(){\n  [ -z \"${WITH_BREW}\" -o \"$(uname -s)\" == \"Darwin\" -o \"${ACTION}\" != \"install\" ] && return\n  [ -z \"$(which brew)\" ] && return\n  brewfile=\"${INSTALL_DIR}/brew/Brewfile\"\n  [ ! -f \"${brewfile}\" ] && print_error_and_exit \"Unable to find the Brew file '${brewfile}'\"\n  info \"${ACTION} Brew Bundle configuration from '${brewfile}'\"\n  execute \"brew tap Homebrew/bundle\"    # Install brew bundle -- see https://github.com/Homebrew/homebrew-bundle\n  execute \"brew bundle --file=${brewfile} -v\"\n}\n## Curl -- https://curl.haxx.se\n__curl() {\n  [ -z \"${WITH_CURL}\" ]  && return\n  [ -z \"$(which curl)\" ] && return\n  info \"${ACTION} CURL configuration\"\n  setup_configdir 'curl'\n  shell_custom_enable 'curl'\n  clean_configdir 'curl'\n}\n# Direnv -- see http://direnv.net\n__direnv(){\n  [ -z \"${WITH_DIRENV}\" ] && return\n  info \"${ACTION} Falkor's direnv configuration ~/.config/direnv/direnvrc\"\n  setup_configdir 'direnv'\n  clean_configdir 'direnv'\n}\n## RVM -- see https://rvm.io/rvm/install\n__rvm(){\n  [ -z \"${WITH_RVM}\" ]  && return\n  info \"${ACTION} RVM -- see https://rvm.io/rvm/install\"\n  if [ \"${ACTION}\" != 'install' ]; then\n    [ -z \"$(which rvm)\" ] && warning \"Unable to find the rvm command thus exiting\" && return\n    execute \"rvm implode\"\n    execute \"gem uninstall rvm\"\n    return    # Exiting uninstall\n  fi\n  if [ ! -d \"$HOME/.rvm\" ]; then\n    execute \"gpg --keyserver hkp://keys.gnupg.net --keyserver-options timeout=5 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3\"\n    check_bin 'curl'\n    execute \"\\curl -sSL https://get.rvm.io | bash -s stable --ignore-dotfiles --with-default-gems='bundler rake git_remote_branch'\"\n  fi\n}\n\n################################################################################\n################################################################################\n# Let's go\n\nTARGETS=\n\n# Check for options\nwhile [ $# -ge 1 ]; do\n    case $1 in\n        -h | --help)    print_help;        exit 0;;\n        -V | --version) print_version;     exit 0;;\n        --debug)        DEBUG=\"--debug\";\n                        VERBOSE=\"--verbose\";;\n        -v | --verbose) VERBOSE=\"--verbose\";;\n        -f | --force)   FORCE=\"--force\";;\n        -n | --dry-run) SIMULATION=\"--dry-run\";;\n        -u | --update)  UPDATE=\"--update\";;\n        --delete | --remove | --uninstall)\n            ACTION=\"uninstall\"; MODE=\"--delete\";;\n        # -d | --dir | --installdir)\n        #     shift;\n        #     INSTALL_DIR=$1\n        #     # DOTFILES_DIR=$(basename ${INSTALL_DIR})\n        #     # PREFIX=$(dirname ${INSTALL_DIR})\n        #     ;;\n        # --dotfiledir) shift;     DOTFILES_DIR=$1;;\n        --prefix)  shift;        PREFIX=$1;;\n        --with-bash  | --bash)   TARGETS+='--bash';;\n        --with-direnv| --direnv) TARGETS+='--direnv';;\n        --with-zsh   | --zsh)    TARGETS+='--zsh';;\n        --with-shell | --shell)  TARGETS+='--shell';;\n        --with-emacs | --emacs)  TARGETS+='--emacs';;\n        --with-vim   | --vim)    TARGETS+='--vim';;\n        --with-git   | --git)    TARGETS+='--git';;\n        --with-screen| --screen) TARGETS+='--screen';;\n        --with-brew  | --brew)   TARGETS+='--brew';;\n        --with-curl  | --curl)   TARGETS+='--curl';;\n        --with-rvm   | --rvm)    TARGETS+='--curl --rvm';;\n        -r | --recommended)      TARGETS+='--bash --vim --git --screen --curl';;\n        -a | --all)              TARGETS+='--bash --brew --zsh --emacs --vim --git --screen --curl --rvm';;\n    esac\n    shift\ndone\n\ndebug \"SCRIPTDIR=${SCRIPTDIR}\"\n\nPREFIX_HOME=''\nif [[ $PREFIX == \"${HOME}\"* ]]; then\n    PREFIX_HOME=\"$HOME/\"\n    PREFIX=\"${PREFIX/#$HOME\\//}\"\nfi\n\nINSTALL_DIR=${PREFIX}/${DOTFILES_DIR}\n[ -z \"${INSTALL_DIR}\" ] && print_error_and_exit \"Wrong installation directory\"\nsetup_installdir\n\ninfo \"About to ${ACTION} Falkor's dotfiles from ${INSTALL_DIR}\"\nreally_continue\n\n# Update the repository if already present\n[[ -n \"${UPDATE}\" && -d \"${PREFIX_HOME}${INSTALL_DIR}\" ]]   && execute \"( cd ${PREFIX_HOME}${INSTALL_DIR} ; git pull )\"\n\ncd ~\n\nif [ -z \"${TARGETS}\" ]; then\n    warning \" \"\n    warning \"By default, this installer does nothing except updating ${INSTALL_DIR}.\"\n    warning \"Use '$COMMAND --all' to install all available configs. OR use a discrete set of options.\"\n    warning \"Ex: '$COMMAND $MODE --zsh --vim'\"\n    warning \" \"\n    exit 0\nfi\n\n\nfor target in ${TARGETS}; do\n    case $target in\n      *bash*)   WITH_SHELL='--shell'; WITH_BASH=\"$target\"; __bash;;\n      *brew*)   WITH_BREW=\"$target\";   __brew;;\n      *curl*)   WITH_CURL=\"$target\";   __curl;;\n      *direnv*) WITH_DIRENV=\"$target\"; __direnv;;\n      *emacs*)  WITH_EMACS=\"$target\";  __emacs;;\n      *git*)    WITH_GIT=\"$target\";    __git;;\n      *rvm*)    WITH_RVM=\"$target\";    __rvm;;\n      *screen*) WITH_SCREEN=\"$target\"; __screen;;\n      *shell*)  WITH_SHELL=\"$target\";  __shell;;\n      *vim*)    WITH_VIM=\"$target\";    __vim;;\n      *zsh*)    WITH_SHELL='--shell'; WITH_ZSH=\"$target\";  __zsh;;\n    esac\ndone\n"
  },
  {
    "path": "mkdocs.yml",
    "content": "site_name: Falkor/dotfiles\npages:\n- Home: 'index.md'\n- Overview and Installation: 'overview.md'\n- Shells:\n  - Bourne-Again Shell (bash): 'bash/README.md'\n  - Z-shell (zsh) / Oh-My-ZSH: 'oh-my-zsh/README.md'\n- Editors:\n  - VIm: 'vim/README.md'\n  - Emacs: 'emacs/index.md'\n- Misc:\n  - Git: 'git/README.md'\n  - GNU Screen: 'screen/README.md'\n- Tests with Vagrant: 'vagrant.md'\n- Documentation (RTFD): 'rtfd.md'\n- Contributing:\n  - 'Overview': 'contributing/index.md'\n  - 'Directory Layout': 'contributing/layout.md'\n  - 'Repository Setup and Developments': 'contributing/setup.md'\n  - 'Semantic Versioning': 'contributing/versioning.md'\ntheme: readthedocs\n"
  },
  {
    "path": "oh-my-zsh/.gitignore",
    "content": ".zcompdump*\n/custom.zshenv\n/custom.zshrc\n.zsh_history\n"
  },
  {
    "path": "oh-my-zsh/.p10k.zsh",
    "content": "# Generated by Powerlevel10k configuration wizard on 2020-12-23 at 12:00 CET.\n# Based on romkatv/powerlevel10k/config/p10k-rainbow.zsh, checksum 21088.\n# Wizard options: nerdfont-complete + powerline, small icons, rainbow, unicode,\n# slanted separators, slanted heads, slanted tails, 2 lines, disconnected, left frame,\n# lightest-ornaments, compact, many icons, concise, instant_prompt=verbose.\n# Type `p10k configure` to generate another config.\n#\n# Config for Powerlevel10k with powerline prompt style with colorful background.\n# Type `p10k configure` to generate your own config based on it.\n#\n# Tip: Looking for a nice color? Here's a one-liner to print colormap.\n#\n#   for i in {0..255}; do print -Pn \"%K{$i}  %k%F{$i}${(l:3::0:)i}%f \" ${${(M)$((i%6)):#3}:+$'\\n'}; done\n\n# Temporarily change options.\n'builtin' 'local' '-a' 'p10k_config_opts'\n[[ ! -o 'aliases'         ]] || p10k_config_opts+=('aliases')\n[[ ! -o 'sh_glob'         ]] || p10k_config_opts+=('sh_glob')\n[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')\n'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'\n\n() {\n  emulate -L zsh -o extended_glob\n\n  # Unset all configuration options. This allows you to apply configuration changes without\n  # restarting zsh. Edit ~/.p10k.zsh and type `source ~/.p10k.zsh`.\n  unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR'\n\n  # Zsh >= 5.1 is required.\n  autoload -Uz is-at-least && is-at-least 5.1 || return\n\n  # The list of segments shown on the left. Fill it with the most important segments.\n  typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(\n    # =========================[ Line #1 ]=========================\n    os_icon                 # os identifier\n    dir                     # current directory\n    vcs                     # git status\n    # =========================[ Line #2 ]=========================\n    newline                 # \\n\n    # prompt_char           # prompt symbol\n  )\n\n  # The list of segments shown on the right. Fill it with less important segments.\n  # Right prompt on the last prompt line (where you are typing your commands) gets\n  # automatically hidden when the input line reaches it. Right prompt above the\n  # last prompt line gets hidden if it would overlap with left prompt.\n  typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(\n    # =========================[ Line #1 ]=========================\n    status                  # exit code of the last command\n    command_execution_time  # duration of the last command\n    background_jobs         # presence of background jobs\n    direnv                  # direnv status (https://direnv.net/)\n    asdf                    # asdf version manager (https://github.com/asdf-vm/asdf)\n    virtualenv              # python virtual environment (https://docs.python.org/3/library/venv.html)\n    anaconda                # conda environment (https://conda.io/)\n    pyenv                   # python environment (https://github.com/pyenv/pyenv)\n    goenv                   # go environment (https://github.com/syndbg/goenv)\n    nodenv                  # node.js version from nodenv (https://github.com/nodenv/nodenv)\n    nvm                     # node.js version from nvm (https://github.com/nvm-sh/nvm)\n    nodeenv                 # node.js environment (https://github.com/ekalinin/nodeenv)\n    # node_version          # node.js version\n    # go_version            # go version (https://golang.org)\n    # rust_version          # rustc version (https://www.rust-lang.org)\n    # dotnet_version        # .NET version (https://dotnet.microsoft.com)\n    # php_version           # php version (https://www.php.net/)\n    # laravel_version       # laravel php framework version (https://laravel.com/)\n    # java_version          # java version (https://www.java.com/)\n    # package               # name@version from package.json (https://docs.npmjs.com/files/package.json)\n    rbenv                   # ruby version from rbenv (https://github.com/rbenv/rbenv)\n    rvm                     # ruby version from rvm (https://rvm.io)\n    fvm                     # flutter version management (https://github.com/leoafarias/fvm)\n    luaenv                  # lua version from luaenv (https://github.com/cehoffman/luaenv)\n    jenv                    # java version from jenv (https://github.com/jenv/jenv)\n    plenv                   # perl version from plenv (https://github.com/tokuhirom/plenv)\n    phpenv                  # php version from phpenv (https://github.com/phpenv/phpenv)\n    scalaenv                # scala version from scalaenv (https://github.com/scalaenv/scalaenv)\n    haskell_stack           # haskell version from stack (https://haskellstack.org/)\n    kubecontext             # current kubernetes context (https://kubernetes.io/)\n    terraform               # terraform workspace (https://www.terraform.io)\n    aws                     # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)\n    aws_eb_env              # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/)\n    azure                   # azure account name (https://docs.microsoft.com/en-us/cli/azure)\n    gcloud                  # google cloud cli account and project (https://cloud.google.com/)\n    google_app_cred         # google application credentials (https://cloud.google.com/docs/authentication/production)\n    context                 # user@hostname\n    nordvpn                 # nordvpn connection status, linux only (https://nordvpn.com/)\n    ranger                  # ranger shell (https://github.com/ranger/ranger)\n    nnn                     # nnn shell (https://github.com/jarun/nnn)\n    vim_shell               # vim shell indicator (:sh)\n    midnight_commander      # midnight commander shell (https://midnight-commander.org/)\n    nix_shell               # nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html)\n    vi_mode                 # vi mode (you don't need this if you've enabled prompt_char)\n    # vpn_ip                # virtual private network indicator\n    # load                  # CPU load\n    # disk_usage            # disk usage\n    # ram                   # free RAM\n    # swap                  # used swap\n    todo                    # todo items (https://github.com/todotxt/todo.txt-cli)\n    timewarrior             # timewarrior tracking status (https://timewarrior.net/)\n    taskwarrior             # taskwarrior task count (https://taskwarrior.org/)\n    # time                  # current time\n    # =========================[ Line #2 ]=========================\n    newline\n    # ip                    # ip address and bandwidth usage for a specified network interface\n    # public_ip             # public IP address\n    # proxy                 # system-wide http/https/ftp proxy\n    # battery               # internal battery\n    # wifi                  # wifi speed\n    # example               # example user-defined segment (see prompt_example function below)\n  )\n\n  # Defines character set used by powerlevel10k. It's best to let `p10k configure` set it for you.\n  typeset -g POWERLEVEL9K_MODE=nerdfont-complete\n  # When set to `moderate`, some icons will have an extra space after them. This is meant to avoid\n  # icon overlap when using non-monospace fonts. When set to `none`, spaces are not added.\n  typeset -g POWERLEVEL9K_ICON_PADDING=none\n\n  # When set to true, icons appear before content on both sides of the prompt. When set\n  # to false, icons go after content. If empty or not set, icons go before content in the left\n  # prompt and after content in the right prompt.\n  #\n  # You can also override it for a specific segment:\n  #\n  #   POWERLEVEL9K_STATUS_ICON_BEFORE_CONTENT=false\n  #\n  # Or for a specific segment in specific state:\n  #\n  #   POWERLEVEL9K_DIR_NOT_WRITABLE_ICON_BEFORE_CONTENT=false\n  typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=\n\n  # Add an empty line before each prompt.\n  typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=false\n\n  # Connect left prompt lines with these symbols. You'll probably want to use the same color\n  # as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND below.\n  typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%244F╭─'\n  typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX='%244F├─'\n  typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='%244F╰─❯'\n  # Connect right prompt lines with these symbols.\n  typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX=\n  typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX=\n  typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX=\n\n  # Filler between left and right prompt on the first prompt line. You can set it to ' ', '·' or\n  # '─'. The last two make it easier to see the alignment between left and right prompt and to\n  # separate prompt from command output. You might want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false\n  # for more compact prompt if using using this option.\n  typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' '\n  typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_BACKGROUND=\n  typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_GAP_BACKGROUND=\n  if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then\n    # The color of the filler. You'll probably want to match the color of POWERLEVEL9K_MULTILINE\n    # ornaments defined above.\n    typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=244\n    # Start filler from the edge of the screen if there are no left segments on the first line.\n    typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_FIRST_SEGMENT_END_SYMBOL='%{%}'\n    # End filler on the edge of the screen if there are no right segments on the first line.\n    typeset -g POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='%{%}'\n  fi\n\n  # Separator between same-color segments on the left.\n  typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='\\u2571'\n  # Separator between same-color segments on the right.\n  typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='\\u2571'\n  # Separator between different-color segments on the left.\n  typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\\uE0BC'\n  # Separator between different-color segments on the right.\n  typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\\uE0BA'\n  # The right end of left prompt.\n  # typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\\uE0BC'\n  typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\\uE0B0'\n  # The left end of right prompt.\n  typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\\uE0BA'\n  # typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\\uE0B2'\n  # The left end of left prompt.\n  typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\\uE0BA'\n  # The right end of right prompt.\n  typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL='\\uE0BC'\n  # Left prompt terminator for lines without any segments.\n  typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=\n\n  #################################[ os_icon: os identifier ]##################################\n  # OS identifier color.\n  typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=232\n  typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=7\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='⭐'\n\n  ################################[ prompt_char: prompt symbol ]################################\n  # Transparent background.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_BACKGROUND=\n  # Green prompt symbol if the last command succeeded.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=76\n  # Red prompt symbol if the last command failed.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=196\n  # Default prompt symbol.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯'\n  # Prompt symbol in command vi mode.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮'\n  # Prompt symbol in visual vi mode.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='V'\n  # Prompt symbol in overwrite vi mode.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='▶'\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true\n  # No line terminator if prompt_char is the last segment.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=\n  # No line introducer if prompt_char is the first segment.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL=\n  # No surrounding whitespace.\n  typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_{LEFT,RIGHT}_WHITESPACE=\n\n  ##################################[ dir: current directory ]##################################\n  # Current directory background color.\n  typeset -g POWERLEVEL9K_DIR_BACKGROUND=4\n  # Default current directory foreground color.\n  typeset -g POWERLEVEL9K_DIR_FOREGROUND=254\n  # If directory is too long, shorten some of its segments to the shortest possible unique\n  # prefix. The shortened directory can be tab-completed to the original.\n  typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_folders\n  # typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_with_folder_marker\n  # Replace removed segment suffixes with this symbol.\n  #typeset -g POWERLEVEL9K_SHORTEN_DELIMITER=\n  # Color of the shortened directory segments.\n  typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=250\n  # Color of the anchor directory segments. Anchor segments are never shortened. The first\n  # segment is always an anchor.\n  typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=255\n  # Display anchor directory segments in bold.\n  typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true\n  # Don't shorten directories that contain any of these files. They are anchors.\n  local anchor_files=(\n    .bzr\n    .citc\n    .git\n    .hg\n    .node-version\n    .python-version\n    .go-version\n    .ruby-version\n    .lua-version\n    .java-version\n    .perl-version\n    .php-version\n    .tool-version\n    .shorten_folder_marker\n    .svn\n    .terraform\n    CVS\n    Cargo.toml\n    composer.json\n    go.mod\n    package.json\n    stack.yaml\n  )\n  typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER=\"(${(j:|:)anchor_files})\"\n  # If set to \"first\" (\"last\"), remove everything before the first (last) subdirectory that contains\n  # files matching $POWERLEVEL9K_SHORTEN_FOLDER_MARKER. For example, when the current directory is\n  # /foo/bar/git_repo/nested_git_repo/baz, prompt will display git_repo/nested_git_repo/baz (first)\n  # or nested_git_repo/baz (last). This assumes that git_repo and nested_git_repo contain markers\n  # and other directories don't.\n  #\n  # Optionally, \"first\" and \"last\" can be followed by \":<offset>\" where <offset> is an integer.\n  # This moves the truncation point to the right (positive offset) or to the left (negative offset)\n  # relative to the marker. Plain \"first\" and \"last\" are equivalent to \"first:0\" and \"last:0\"\n  # respectively.\n  typeset -g POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=false\n  # Don't shorten this many last directory segments. They are anchors.\n  typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1\n  # Shorten directory if it's longer than this even if there is space for it. The value can\n  # be either absolute (e.g., '80') or a percentage of terminal width (e.g, '50%'). If empty,\n  # directory will be shortened only when prompt doesn't fit or when other parameters demand it\n  # (see POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS and POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT below).\n  # If set to `0`, directory will always be shortened to its minimum length.\n  typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=0\n  # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least this\n  # many columns for typing commands.\n  typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40\n  # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least\n  # COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands.\n  typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50\n  # If set to true, embed a hyperlink into the directory. Useful for quickly\n  # opening a directory in the file manager simply by clicking the link.\n  # Can also be handy when the directory is shortened, as it allows you to see\n  # the full directory that was used in previous commands.\n  typeset -g POWERLEVEL9K_DIR_HYPERLINK=false\n\n  # Enable special styling for non-writable and non-existent directories. See POWERLEVEL9K_LOCK_ICON\n  # and POWERLEVEL9K_DIR_CLASSES below.\n  typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=v3\n\n  # The default icon shown next to non-writable and non-existent directories when\n  # POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3.\n  # typeset -g POWERLEVEL9K_LOCK_ICON='⭐'\n\n  # POWERLEVEL9K_DIR_CLASSES allows you to specify custom icons and colors for different\n  # directories. It must be an array with 3 * N elements. Each triplet consists of:\n  #\n  #   1. A pattern against which the current directory ($PWD) is matched. Matching is done with\n  #      extended_glob option enabled.\n  #   2. Directory class for the purpose of styling.\n  #   3. An empty string.\n  #\n  # Triplets are tried in order. The first triplet whose pattern matches $PWD wins.\n  #\n  # If POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3, non-writable and non-existent directories\n  # acquire class suffix _NOT_WRITABLE and NON_EXISTENT respectively.\n  #\n  # For example, given these settings:\n  #\n  #   typeset -g POWERLEVEL9K_DIR_CLASSES=(\n  #     '~/work(|/*)'  WORK     ''\n  #     '~(|/*)'       HOME     ''\n  #     '*'            DEFAULT  '')\n  #\n  # Whenever the current directory is ~/work or a subdirectory of ~/work, it gets styled with one\n  # of the following classes depending on its writability and existence: WORK, WORK_NOT_WRITABLE or\n  # WORK_NON_EXISTENT.\n  #\n  # Simply assigning classes to directories doesn't have any visible effects. It merely gives you an\n  # option to define custom colors and icons for different directory classes.\n  #\n  #   # Styling for WORK.\n  #   typeset -g POWERLEVEL9K_DIR_WORK_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  #   typeset -g POWERLEVEL9K_DIR_WORK_BACKGROUND=4\n  #   typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=254\n  #   typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=250\n  #   typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=255\n  #\n  #   # Styling for WORK_NOT_WRITABLE.\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_BACKGROUND=4\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=254\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=250\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=255\n  #\n  #   # Styling for WORK_NON_EXISTENT.\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_BACKGROUND=4\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=254\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=250\n  #   typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=255\n  #\n  # If a styling parameter isn't explicitly defined for some class, it falls back to the classless\n  # parameter. For example, if POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND is not set, it falls\n  # back to POWERLEVEL9K_DIR_FOREGROUND.\n  #\n  # typeset -g POWERLEVEL9K_DIR_CLASSES=()\n\n  # Custom prefix.\n  # typeset -g POWERLEVEL9K_DIR_PREFIX='in '\n\n  #####################################[ vcs: git status ]######################################\n  # Version control system colors.\n  typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=2\n  typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=3\n  typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=3\n  typeset -g POWERLEVEL9K_VCS_CONFLICTED_BACKGROUND=3\n  # typeset -g POWERLEVEL9K_VCS_LOADING_BACKGROUND=8\n\n  # Branch icon. Set this parameter to '\\uF126 ' for the popular Powerline branch icon.\n  # typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\\uF126 '\n  typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\\ue0a0 '\n\n  # Untracked files icon. It's really a question mark, your font isn't broken.\n  # Change the value of this parameter to show a different icon.\n  # typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='\\u25CF'  # filled circle\n  # typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='\\uf059'  # circled question mark\n  typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='\\uf421'    # triangle warning\n  typeset -g POWERLEVEL9K_VCS_STAGED_ICON='±'\n  typeset -g POWERLEVEL9K_VCS_UNSTAGED_ICON='!'\n  typeset -g POWERLEVEL9K_VCS_STASH_ICON='≡'\n  typeset -g POWERLEVEL9K_VCS_TAG_ICON=' \\uF02B'\n# Below icons are not used any more\n  # typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON='\\u2193'\n  # typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON='\\u2191'\n\n\n  # Formatter for Git status.\n  #\n  # Example output: master ⇣42⇡42 *42 merge ~42 +42 !42 ?42.\n  #\n  # You can edit the function to customize how Git status looks.\n  #\n  # VCS_STATUS_* parameters are set by gitstatus plugin. See reference:\n  # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh.\n  function my_git_formatter() {\n    emulate -L zsh\n\n    if [[ -n $P9K_CONTENT ]]; then\n      # If P9K_CONTENT is not empty, use it. It's either \"loading\" or from vcs_info (not from\n      # gitstatus plugin). VCS_STATUS_* parameters are not available in this case.\n      typeset -g my_git_format=$P9K_CONTENT\n      return\n    fi\n\n    # Styling for different parts of Git status.\n    local       meta='%7F' # white foreground\n    local      clean='%0F' # black foreground\n    local   modified='%0F' # black foreground\n    local  untracked='%88F' # black red foreground\n    local conflicted='%1F'  # red foreground\n    local     tagged='%242F' # light gray foreground\n\n    local res\n\n    if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then\n      local branch=${(V)VCS_STATUS_LOCAL_BRANCH}\n      # If local branch name is at most 32 characters long, show it in full.\n      # Otherwise show the first 12 … the last 12.\n      # Tip: To always show local branch name in full without truncation, delete the next line.\n      (( $#branch > 32 )) && branch[13,-13]=\"…\"  # <-- this line\n      res+=\"${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\\%/%%}\"\n    fi\n\n    if [[ -n $VCS_STATUS_TAG\n          # Show tag only if not on a branch.\n          # Tip: To always show tag, delete the next line.\n          # && -z $VCS_STATUS_LOCAL_BRANCH  # <-- this line\n        ]]; then\n      local tag=${(V)VCS_STATUS_TAG}\n      # If tag name is at most 32 characters long, show it in full.\n      # Otherwise show the first 12 … the last 12.\n      # Tip: To always show tag name in full without truncation, delete the next line.\n      (( $#tag > 32 )) && tag[13,-13]=\"…\"  # <-- this line\n      res+=\"${tagged}${(g::)POWERLEVEL9K_VCS_TAG_ICON}${tag//\\%/%%}\"\n    fi\n\n    # Display the current Git commit if there is no branch and no tag.\n    # Tip: To always display the current Git commit, delete the next line.\n    [[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_LOCAL_BRANCH ]] &&  # <-- this line\n      res+=\"${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}\"\n\n    # Show tracking branch name if it differs from local branch.\n    if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then\n      res+=\"${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\\%/%%}\"\n    fi\n\n    # ⇣42 if behind the remote.\n    (( VCS_STATUS_COMMITS_BEHIND )) && res+=\" ${clean}⇣${VCS_STATUS_COMMITS_BEHIND}\"\n    # ⇡42 if ahead of the remote; no leading space if also behind the remote: ⇣42⇡42.\n    (( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=\" \"\n    (( VCS_STATUS_COMMITS_AHEAD  )) && res+=\"${clean}⇡${VCS_STATUS_COMMITS_AHEAD}\"\n    # ⇠42 if behind the push remote.\n    # (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=\" ${clean}⇠${VCS_STATUS_PUSH_COMMITS_BEHIND}\"\n    # (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=\" \"\n    # ⇢42 if ahead of the push remote; no leading space if also behind: ⇠42⇢42.\n    # (( VCS_STATUS_PUSH_COMMITS_AHEAD  )) && res+=\"${clean}⇢${VCS_STATUS_PUSH_COMMITS_AHEAD}\"\n    # *42 if have stashes.\n    (( VCS_STATUS_STASHES        )) && res+=\" ${clean}${(g::)POWERLEVEL9K_VCS_STASH_ICON}${VCS_STATUS_STASHES}\"\n    # 'merge' if the repo is in an unusual state.\n    [[ -n $VCS_STATUS_ACTION     ]] && res+=\" ${conflicted}${VCS_STATUS_ACTION}\"\n    # ~42 if have merge conflicts.\n    (( VCS_STATUS_NUM_CONFLICTED )) && res+=\" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}\"\n    # +42 if have staged changes.\n    (( VCS_STATUS_NUM_STAGED     )) && res+=\" ${modified}${(g::)POWERLEVEL9K_VCS_STAGED_ICON}${VCS_STATUS_NUM_STAGED}\"\n    # !42 if have unstaged changes.\n    (( VCS_STATUS_NUM_UNSTAGED   )) && res+=\" ${modified}${(g::)POWERLEVEL9K_VCS_UNSTAGED_ICON}${VCS_STATUS_NUM_UNSTAGED}\"\n    # ?42 if have untracked files. It's really a question mark, your font isn't broken.\n    # See POWERLEVEL9K_VCS_UNTRACKED_ICON above if you want to use a different icon.\n    # Remove the next line if you don't want to see untracked files at all.\n    # (( VCS_STATUS_NUM_UNTRACKED  )) && res+=\" ${untracked}${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}\"\n    (( VCS_STATUS_NUM_UNTRACKED  )) && res+=\" ${untracked}${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}\"\n    # \"─\" if the number of unstaged files is unknown. This can happen due to\n    # POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY (see below) being set to a non-negative number lower\n    # than the number of files in the Git index, or due to bash.showDirtyState being set to false\n    # in the repository config. The number of staged and untracked files may also be unknown\n    # in this case.\n    (( VCS_STATUS_HAS_UNSTAGED == -1 )) && res+=\" ${modified}─\"\n\n    typeset -g my_git_format=$res\n  }\n  functions -M my_git_formatter 2>/dev/null\n\n  # Don't count the number of unstaged, untracked and conflicted files in Git repositories with\n  # more than this many files in the index. Negative value means infinity.\n  #\n  # If you are working in Git repositories with tens of millions of files and seeing performance\n  # sagging, try setting POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY to a number lower than the output\n  # of `git ls-files | wc -l`. Alternatively, add `bash.showDirtyState = false` to the repository's\n  # config: `git config bash.showDirtyState false`.\n  typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1\n\n  # Don't show Git status in prompt for repositories whose workdir matches this pattern.\n  # For example, if set to '~', the Git repository at $HOME/.git will be ignored.\n  # Multiple patterns can be combined with '|': '~(|/foo)|/bar/baz/*'.\n  typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~'\n\n  # Disable the default Git status formatting.\n  typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true\n  # Install our own Git status formatter.\n  typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter()))+${my_git_format}}'\n  # Enable counters for staged, unstaged, etc.\n  typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # Custom prefix.\n  # typeset -g POWERLEVEL9K_VCS_PREFIX='on '\n\n  # Show status of repositories of these types. You can add svn and/or hg if you are\n  # using them. If you do, your prompt may become slow even when your current directory\n  # isn't in an svn or hg reposotiry.\n  typeset -g POWERLEVEL9K_VCS_BACKENDS=(git)\n\n  ##########################[ status: exit code of the last command ]###########################\n  # Enable OK_PIPE, ERROR_PIPE and ERROR_SIGNAL status states to allow us to enable, disable and\n  # style them independently from the regular OK and ERROR state.\n  typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true\n\n  # Status on success. No content, just an icon. No need to show it if prompt_char is enabled as\n  # it will signify success by turning green.\n  typeset -g POWERLEVEL9K_STATUS_OK=true\n  typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='✔'\n  # typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=2\n  # typeset -g POWERLEVEL9K_STATUS_OK_BACKGROUND=0\n\n  # Status when some part of a pipe command fails but the overall exit status is zero. It may look\n  # like this: 1|0.\n  typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true\n  typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='✔'\n  # typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=2\n  # typeset -g POWERLEVEL9K_STATUS_OK_PIPE_BACKGROUND=0\n\n  # Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as\n  # it will signify error by turning red.\n  typeset -g POWERLEVEL9K_STATUS_ERROR=true\n  typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='✘'\n  # typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=3\n  # typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=1\n\n  # Status when the last command was terminated by a signal.\n  typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true\n  # Use terse signal names: \"INT\" instead of \"SIGINT(2)\".\n  typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=false\n  typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION='✘'\n  # typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=3\n  # typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_BACKGROUND=1\n\n  # Status when some part of a pipe command fails and the overall exit status is also non-zero.\n  # It may look like this: 1|0.\n  typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true\n  typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='✘'\n  # typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=3\n  # typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_BACKGROUND=1\n\n  ###################[ command_execution_time: duration of the last command ]###################\n  # Execution time color.\n  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=0\n  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=3\n  # Show duration of the last command if takes at least this many seconds.\n  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3\n  # Show this many fractional digits. Zero means round to seconds.\n  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0\n  # Duration format: 1d 2h 3m 4s.\n  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s'\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # Custom prefix.\n  # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX='took '\n\n  #######################[ background_jobs: presence of background jobs ]#######################\n  # Background jobs color.\n  # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=6\n  # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=0\n  # Don't show the number of background jobs.\n  typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #######################[ direnv: direnv status (https://direnv.net/) ]########################\n  # Direnv color.\n  # typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=3\n  # typeset -g POWERLEVEL9K_DIRENV_BACKGROUND=0\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###############[ asdf: asdf version manager (https://github.com/asdf-vm/asdf) ]###############\n  # Default asdf color. Only used to display tools for which there is no color override (see below).\n  # Tip:  Override these parameters for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_FOREGROUND and\n  # POWERLEVEL9K_ASDF_${TOOL}_BACKGROUND.\n  typeset -g POWERLEVEL9K_ASDF_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_BACKGROUND=7\n\n  # There are four parameters that can be used to hide asdf tools. Each parameter describes\n  # conditions under which a tool gets hidden. Parameters can hide tools but not unhide them. If at\n  # least one parameter decides to hide a tool, that tool gets hidden. If no parameter decides to\n  # hide a tool, it gets shown.\n  #\n  # Special note on the difference between POWERLEVEL9K_ASDF_SOURCES and\n  # POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW. Consider the effect of the following commands:\n  #\n  #   asdf local  python 3.8.1\n  #   asdf global python 3.8.1\n  #\n  # After running both commands the current python version is 3.8.1 and its source is \"local\" as\n  # it takes precedence over \"global\". If POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW is set to false,\n  # it'll hide python version in this case because 3.8.1 is the same as the global version.\n  # POWERLEVEL9K_ASDF_SOURCES will hide python version only if the value of this parameter doesn't\n  # contain \"local\".\n\n  # Hide tool versions that don't come from one of these sources.\n  #\n  # Available sources:\n  #\n  # - shell   `asdf current` says \"set by ASDF_${TOOL}_VERSION environment variable\"\n  # - local   `asdf current` says \"set by /some/not/home/directory/file\"\n  # - global  `asdf current` says \"set by /home/username/file\"\n  #\n  # Note: If this parameter is set to (shell local global), it won't hide tools.\n  # Tip:  Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SOURCES.\n  typeset -g POWERLEVEL9K_ASDF_SOURCES=(shell local global)\n\n  # If set to false, hide tool versions that are the same as global.\n  #\n  # Note: The name of this parameter doesn't reflect its meaning at all.\n  # Note: If this parameter is set to true, it won't hide tools.\n  # Tip:  Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_PROMPT_ALWAYS_SHOW.\n  typeset -g POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW=false\n\n  # If set to false, hide tool versions that are equal to \"system\".\n  #\n  # Note: If this parameter is set to true, it won't hide tools.\n  # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_SYSTEM.\n  typeset -g POWERLEVEL9K_ASDF_SHOW_SYSTEM=true\n\n  # If set to non-empty value, hide tools unless there is a file matching the specified file pattern\n  # in the current directory, or its parent directory, or its grandparent directory, and so on.\n  #\n  # Note: If this parameter is set to empty value, it won't hide tools.\n  # Note: SHOW_ON_UPGLOB isn't specific to asdf. It works with all prompt segments.\n  # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_ON_UPGLOB.\n  #\n  # Example: Hide nodejs version when there is no package.json and no *.js files in the current\n  # directory, in `..`, in `../..` and so on.\n  #\n  #   typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.js|package.json'\n  typeset -g POWERLEVEL9K_ASDF_SHOW_ON_UPGLOB=\n\n  # Ruby version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_RUBY_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_RUBY_BACKGROUND=1\n  # typeset -g POWERLEVEL9K_ASDF_RUBY_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_RUBY_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Python version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_PYTHON_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_PYTHON_BACKGROUND=4\n  # typeset -g POWERLEVEL9K_ASDF_PYTHON_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_PYTHON_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Go version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_GOLANG_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_GOLANG_BACKGROUND=4\n  # typeset -g POWERLEVEL9K_ASDF_GOLANG_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_GOLANG_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Node.js version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_NODEJS_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_NODEJS_BACKGROUND=2\n  # typeset -g POWERLEVEL9K_ASDF_NODEJS_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Rust version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_RUST_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_RUST_BACKGROUND=208\n  # typeset -g POWERLEVEL9K_ASDF_RUST_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_RUST_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # .NET Core version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_BACKGROUND=5\n  # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Flutter version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_FLUTTER_BACKGROUND=4\n  # typeset -g POWERLEVEL9K_ASDF_FLUTTER_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_FLUTTER_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Lua version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_LUA_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_LUA_BACKGROUND=4\n  # typeset -g POWERLEVEL9K_ASDF_LUA_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_LUA_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Java version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_JAVA_FOREGROUND=1\n  typeset -g POWERLEVEL9K_ASDF_JAVA_BACKGROUND=7\n  # typeset -g POWERLEVEL9K_ASDF_JAVA_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_JAVA_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Perl version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_PERL_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_PERL_BACKGROUND=4\n  # typeset -g POWERLEVEL9K_ASDF_PERL_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_PERL_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Erlang version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_ERLANG_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_ERLANG_BACKGROUND=1\n  # typeset -g POWERLEVEL9K_ASDF_ERLANG_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_ERLANG_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Elixir version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_ELIXIR_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_ELIXIR_BACKGROUND=5\n  # typeset -g POWERLEVEL9K_ASDF_ELIXIR_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_ELIXIR_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Postgres version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_POSTGRES_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_POSTGRES_BACKGROUND=6\n  # typeset -g POWERLEVEL9K_ASDF_POSTGRES_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_POSTGRES_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # PHP version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_PHP_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_PHP_BACKGROUND=5\n  # typeset -g POWERLEVEL9K_ASDF_PHP_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_PHP_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Haskell version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_HASKELL_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_HASKELL_BACKGROUND=3\n  # typeset -g POWERLEVEL9K_ASDF_HASKELL_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_HASKELL_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  # Julia version from asdf.\n  typeset -g POWERLEVEL9K_ASDF_JULIA_FOREGROUND=0\n  typeset -g POWERLEVEL9K_ASDF_JULIA_BACKGROUND=2\n  # typeset -g POWERLEVEL9K_ASDF_JULIA_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # typeset -g POWERLEVEL9K_ASDF_JULIA_SHOW_ON_UPGLOB='*.foo|*.bar'\n\n  ##########[ nordvpn: nordvpn connection status, linux only (https://nordvpn.com/) ]###########\n  # NordVPN connection indicator color.\n  # typeset -g POWERLEVEL9K_NORDVPN_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_NORDVPN_BACKGROUND=4\n  # Hide NordVPN connection indicator when not connected.\n  typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_CONTENT_EXPANSION=\n  typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_VISUAL_IDENTIFIER_EXPANSION=\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #################[ ranger: ranger shell (https://github.com/ranger/ranger) ]##################\n  # Ranger shell color.\n  # typeset -g POWERLEVEL9K_RANGER_FOREGROUND=3\n  # typeset -g POWERLEVEL9K_RANGER_BACKGROUND=0\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]#######################\n  # Nnn shell color.\n  # typeset -g POWERLEVEL9K_NNN_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_NNN_BACKGROUND=6\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###########################[ vim_shell: vim shell indicator (:sh) ]###########################\n  # Vim shell indicator color.\n  # typeset -g POWERLEVEL9K_VIM_SHELL_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_VIM_SHELL_BACKGROUND=2\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_VIM_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ######[ midnight_commander: midnight commander shell (https://midnight-commander.org/) ]######\n  # Midnight Commander shell color.\n  # typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_FOREGROUND=3\n  # typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_BACKGROUND=0\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #[ nix_shell: nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) ]##\n  # Nix shell color.\n  # typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_NIX_SHELL_BACKGROUND=4\n\n  # Tip: If you want to see just the icon without \"pure\" and \"impure\", uncomment the next line.\n  # typeset -g POWERLEVEL9K_NIX_SHELL_CONTENT_EXPANSION=\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_NIX_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##################################[ disk_usage: disk usage ]##################################\n  # Colors for different levels of disk usage.\n  # typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=3\n  # typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_BACKGROUND=0\n  # typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_BACKGROUND=3\n  # typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_BACKGROUND=1\n  # Thresholds for different levels of disk usage (percentage points).\n  typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=90\n  typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL=95\n  # If set to true, hide disk usage when below $POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL percent.\n  typeset -g POWERLEVEL9K_DISK_USAGE_ONLY_WARNING=false\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_DISK_USAGE_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###########[ vi_mode: vi mode (you don't need this if you've enabled prompt_char) ]###########\n  # Foreground color.\n  typeset -g POWERLEVEL9K_VI_MODE_FOREGROUND=0\n  # Text and color for normal (a.k.a. command) vi mode.\n  typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING=NORMAL\n  typeset -g POWERLEVEL9K_VI_MODE_NORMAL_BACKGROUND=2\n  # Text and color for visual vi mode.\n  typeset -g POWERLEVEL9K_VI_VISUAL_MODE_STRING=VISUAL\n  typeset -g POWERLEVEL9K_VI_MODE_VISUAL_BACKGROUND=4\n  # Text and color for overtype (a.k.a. overwrite and replace) vi mode.\n  typeset -g POWERLEVEL9K_VI_OVERWRITE_MODE_STRING=OVERTYPE\n  typeset -g POWERLEVEL9K_VI_MODE_OVERWRITE_BACKGROUND=3\n  # Text and color for insert vi mode.\n  typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING=\n  typeset -g POWERLEVEL9K_VI_MODE_INSERT_FOREGROUND=8\n\n  ######################################[ ram: free RAM ]#######################################\n  # RAM color.\n  # typeset -g POWERLEVEL9K_RAM_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_RAM_BACKGROUND=3\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #####################################[ swap: used swap ]######################################\n  # Swap color.\n  # typeset -g POWERLEVEL9K_SWAP_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_SWAP_BACKGROUND=3\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_SWAP_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ######################################[ load: CPU load ]######################################\n  # Show average CPU load over this many last minutes. Valid values are 1, 5 and 15.\n  typeset -g POWERLEVEL9K_LOAD_WHICH=5\n  # Load color when load is under 50%.\n  # typeset -g POWERLEVEL9K_LOAD_NORMAL_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_LOAD_NORMAL_BACKGROUND=2\n  # Load color when load is between 50% and 70%.\n  # typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_LOAD_WARNING_BACKGROUND=3\n  # Load color when load is over 70%.\n  # typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_LOAD_CRITICAL_BACKGROUND=1\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_LOAD_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ################[ todo: todo items (https://github.com/todotxt/todo.txt-cli) ]################\n  # Todo color.\n  # typeset -g POWERLEVEL9K_TODO_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_TODO_BACKGROUND=8\n  # Hide todo when the total number of tasks is zero.\n  typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL=true\n  # Hide todo when the number of tasks after filtering is zero.\n  typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED=false\n\n  # Todo format. The following parameters are available within the expansion.\n  #\n  # - P9K_TODO_TOTAL_TASK_COUNT     The total number of tasks.\n  # - P9K_TODO_FILTERED_TASK_COUNT  The number of tasks after filtering.\n  #\n  # These variables correspond to the last line of the output of `todo.sh -p ls`:\n  #\n  #   TODO: 24 of 42 tasks shown\n  #\n  # Here 24 is P9K_TODO_FILTERED_TASK_COUNT and 42 is P9K_TODO_TOTAL_TASK_COUNT.\n  #\n  # typeset -g POWERLEVEL9K_TODO_CONTENT_EXPANSION='$P9K_TODO_FILTERED_TASK_COUNT'\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_TODO_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###########[ timewarrior: timewarrior tracking status (https://timewarrior.net/) ]############\n  # Timewarrior color.\n  # typeset -g POWERLEVEL9K_TIMEWARRIOR_FOREGROUND=255\n  # typeset -g POWERLEVEL9K_TIMEWARRIOR_BACKGROUND=8\n\n  # If the tracked task is longer than 24 characters, truncate and append \"…\".\n  # Tip: To always display tasks without truncation, delete the following parameter.\n  # Tip: To hide task names and display just the icon when time tracking is enabled, set the\n  # value of the following parameter to \"\".\n  typeset -g POWERLEVEL9K_TIMEWARRIOR_CONTENT_EXPANSION='${P9K_CONTENT:0:24}${${P9K_CONTENT:24}:+…}'\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_TIMEWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##############[ taskwarrior: taskwarrior task count (https://taskwarrior.org/) ]##############\n  # Taskwarrior color.\n  # typeset -g POWERLEVEL9K_TASKWARRIOR_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_TASKWARRIOR_BACKGROUND=6\n\n  # Taskwarrior segment format. The following parameters are available within the expansion.\n  #\n  # - P9K_TASKWARRIOR_PENDING_COUNT   The number of pending tasks: `task +PENDING count`.\n  # - P9K_TASKWARRIOR_OVERDUE_COUNT   The number of overdue tasks: `task +OVERDUE count`.\n  #\n  # Zero values are represented as empty parameters.\n  #\n  # The default format:\n  #\n  #   '${P9K_TASKWARRIOR_OVERDUE_COUNT:+\"!$P9K_TASKWARRIOR_OVERDUE_COUNT/\"}$P9K_TASKWARRIOR_PENDING_COUNT'\n  #\n  # typeset -g POWERLEVEL9K_TASKWARRIOR_CONTENT_EXPANSION='$P9K_TASKWARRIOR_PENDING_COUNT'\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_TASKWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##################################[ context: user@hostname ]##################################\n  # Context color when running with privileges.\n  typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=1\n  typeset -g POWERLEVEL9K_CONTEXT_ROOT_BACKGROUND=0\n  # Context color in SSH without privileges.\n  typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=3\n  typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_BACKGROUND=0\n  # Default context color (no privileges, no SSH).\n  typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=3\n  typeset -g POWERLEVEL9K_CONTEXT_BACKGROUND=0\n\n  # Context format when running with privileges: user@hostname.\n  typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%n@%m'\n  # Context format when in SSH without privileges: user@hostname.\n  typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_TEMPLATE='%n@%m'\n  # Default context format (no privileges, no SSH): user@hostname.\n  typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m'\n\n  # Don't show context unless running with privileges or in SSH.\n  # Tip: Remove the next line to always show context.\n  typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION=\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_CONTEXT_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # Custom prefix.\n  # typeset -g POWERLEVEL9K_CONTEXT_PREFIX='with '\n\n  ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]###\n  # Python virtual environment color.\n  # typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_VIRTUALENV_BACKGROUND=4\n  # Don't show Python version next to the virtual environment name.\n  typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false\n  # If set to \"false\", won't show virtualenv if pyenv is already shown.\n  # If set to \"if-different\", won't show virtualenv if it's the same as pyenv.\n  typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV=false\n  # Separate environment name from Python version only with a space.\n  typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER=\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #####################[ anaconda: conda environment (https://conda.io/) ]######################\n  # Anaconda environment color.\n  # typeset -g POWERLEVEL9K_ANACONDA_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_ANACONDA_BACKGROUND=4\n\n  # Anaconda segment format. The following parameters are available within the expansion.\n  #\n  # - CONDA_PREFIX                 Absolute path to the active Anaconda/Miniconda environment.\n  # - CONDA_DEFAULT_ENV            Name of the active Anaconda/Miniconda environment.\n  # - CONDA_PROMPT_MODIFIER        Configurable prompt modifier (see below).\n  # - P9K_ANACONDA_PYTHON_VERSION  Current python version (python --version).\n  #\n  # CONDA_PROMPT_MODIFIER can be configured with the following command:\n  #\n  #   conda config --set env_prompt '({default_env}) '\n  #\n  # The last argument is a Python format string that can use the following variables:\n  #\n  # - prefix       The same as CONDA_PREFIX.\n  # - default_env  The same as CONDA_DEFAULT_ENV.\n  # - name         The last segment of CONDA_PREFIX.\n  # - stacked_env  Comma-separated list of names in the environment stack. The first element is\n  #                always the same as default_env.\n  #\n  # Note: '({default_env}) ' is the default value of env_prompt.\n  #\n  # The default value of POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION expands to $CONDA_PROMPT_MODIFIER\n  # without the surrounding parentheses, or to the last path component of CONDA_PREFIX if the former\n  # is empty.\n  typeset -g POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION='${${${${CONDA_PROMPT_MODIFIER#\\(}% }%\\)}:-${CONDA_PREFIX:t}}'\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ################[ pyenv: python environment (https://github.com/pyenv/pyenv) ]################\n  # Pyenv color.\n  # typeset -g POWERLEVEL9K_PYENV_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_PYENV_BACKGROUND=4\n  # Hide python version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_PYENV_SOURCES=(shell local global)\n  # If set to false, hide python version if it's the same as global:\n  # $(pyenv version-name) == $(pyenv global).\n  typeset -g POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide python version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_PYENV_SHOW_SYSTEM=true\n\n  # Pyenv segment format. The following parameters are available within the expansion.\n  #\n  # - P9K_CONTENT                Current pyenv environment (pyenv version-name).\n  # - P9K_PYENV_PYTHON_VERSION   Current python version (python --version).\n  #\n  # The default format has the following logic:\n  #\n  # 1. Display \"$P9K_CONTENT $P9K_PYENV_PYTHON_VERSION\" if $P9K_PYENV_PYTHON_VERSION is not\n  #   empty and unequal to $P9K_CONTENT.\n  # 2. Otherwise display just \"$P9K_CONTENT\".\n  typeset -g POWERLEVEL9K_PYENV_CONTENT_EXPANSION='${P9K_CONTENT}${${P9K_PYENV_PYTHON_VERSION:#$P9K_CONTENT}:+ $P9K_PYENV_PYTHON_VERSION}'\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ################[ goenv: go environment (https://github.com/syndbg/goenv) ]################\n  # Goenv color.\n  # typeset -g POWERLEVEL9K_GOENV_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_GOENV_BACKGROUND=4\n  # Hide go version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_GOENV_SOURCES=(shell local global)\n  # If set to false, hide go version if it's the same as global:\n  # $(goenv version-name) == $(goenv global).\n  typeset -g POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide go version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_GOENV_SHOW_SYSTEM=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_GOENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##########[ nodenv: node.js version from nodenv (https://github.com/nodenv/nodenv) ]##########\n  # Nodenv color.\n  # typeset -g POWERLEVEL9K_NODENV_FOREGROUND=2\n  # typeset -g POWERLEVEL9K_NODENV_BACKGROUND=0\n  # Hide node version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_NODENV_SOURCES=(shell local global)\n  # If set to false, hide node version if it's the same as global:\n  # $(nodenv version-name) == $(nodenv global).\n  typeset -g POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide node version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_NODENV_SHOW_SYSTEM=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_NODENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##############[ nvm: node.js version from nvm (https://github.com/nvm-sh/nvm) ]###############\n  # Nvm color.\n  # typeset -g POWERLEVEL9K_NVM_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_NVM_BACKGROUND=5\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_NVM_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ############[ nodeenv: node.js environment (https://github.com/ekalinin/nodeenv) ]############\n  # Nodeenv color.\n  # typeset -g POWERLEVEL9K_NODEENV_FOREGROUND=2\n  # typeset -g POWERLEVEL9K_NODEENV_BACKGROUND=0\n  # Don't show Node version next to the environment name.\n  typeset -g POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION=false\n  # Separate environment name from Node version only with a space.\n  typeset -g POWERLEVEL9K_NODEENV_{LEFT,RIGHT}_DELIMITER=\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_NODEENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##############################[ node_version: node.js version ]###############################\n  # Node version color.\n  # typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_NODE_VERSION_BACKGROUND=2\n  # Show node version only when in a directory tree containing package.json.\n  typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_NODE_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #######################[ go_version: go version (https://golang.org) ]########################\n  # Go version color.\n  # typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=255\n  # typeset -g POWERLEVEL9K_GO_VERSION_BACKGROUND=2\n  # Show go version only when in a go project subdirectory.\n  typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_GO_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #################[ rust_version: rustc version (https://www.rust-lang.org) ]##################\n  # Rust version color.\n  # typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_RUST_VERSION_BACKGROUND=208\n  # Show rust version only when in a rust project subdirectory.\n  typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_RUST_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###############[ dotnet_version: .NET version (https://dotnet.microsoft.com) ]################\n  # .NET version color.\n  # typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_DOTNET_VERSION_BACKGROUND=5\n  # Show .NET version only when in a .NET project subdirectory.\n  typeset -g POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_DOTNET_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #####################[ php_version: php version (https://www.php.net/) ]######################\n  # PHP version color.\n  typeset -g POWERLEVEL9K_PHP_VERSION_FOREGROUND=0\n  typeset -g POWERLEVEL9K_PHP_VERSION_BACKGROUND=5\n  # Show PHP version only when in a PHP project subdirectory.\n  typeset -g POWERLEVEL9K_PHP_VERSION_PROJECT_ONLY=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_PHP_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##########[ laravel_version: laravel php framework version (https://laravel.com/) ]###########\n  # Laravel version color.\n  typeset -g POWERLEVEL9K_LARAVEL_VERSION_FOREGROUND=1\n  typeset -g POWERLEVEL9K_LARAVEL_VERSION_BACKGROUND=7\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_LARAVEL_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]##############\n  # Rbenv color.\n  # typeset -g POWERLEVEL9K_RBENV_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_RBENV_BACKGROUND=1\n  # Hide ruby version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_RBENV_SOURCES=(shell local global)\n  # If set to false, hide ruby version if it's the same as global:\n  # $(rbenv version-name) == $(rbenv global).\n  typeset -g POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide ruby version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_RBENV_SHOW_SYSTEM=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_RBENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ####################[ java_version: java version (https://www.java.com/) ]####################\n  # Java version color.\n  typeset -g POWERLEVEL9K_JAVA_VERSION_FOREGROUND=1\n  typeset -g POWERLEVEL9K_JAVA_VERSION_BACKGROUND=7\n  # Show java version only when in a java project subdirectory.\n  typeset -g POWERLEVEL9K_JAVA_VERSION_PROJECT_ONLY=true\n  # Show brief version.\n  typeset -g POWERLEVEL9K_JAVA_VERSION_FULL=false\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_JAVA_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###[ package: name@version from package.json (https://docs.npmjs.com/files/package.json) ]####\n  # Package color.\n  # typeset -g POWERLEVEL9K_PACKAGE_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_PACKAGE_BACKGROUND=6\n\n  # Package format. The following parameters are available within the expansion.\n  #\n  # - P9K_PACKAGE_NAME     The value of `name` field in package.json.\n  # - P9K_PACKAGE_VERSION  The value of `version` field in package.json.\n  #\n  # typeset -g POWERLEVEL9K_PACKAGE_CONTENT_EXPANSION='${P9K_PACKAGE_NAME//\\%/%%}@${P9K_PACKAGE_VERSION//\\%/%%}'\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_PACKAGE_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #######################[ rvm: ruby version from rvm (https://rvm.io) ]########################\n  # Rvm color.\n  # typeset -g POWERLEVEL9K_RVM_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_RVM_BACKGROUND=240\n  # Don't show @gemset at the end.\n  typeset -g POWERLEVEL9K_RVM_SHOW_GEMSET=false\n  # Don't show ruby- at the front.\n  typeset -g POWERLEVEL9K_RVM_SHOW_PREFIX=false\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_RVM_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###########[ fvm: flutter version management (https://github.com/leoafarias/fvm) ]############\n  # Fvm color.\n  # typeset -g POWERLEVEL9K_FVM_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_FVM_BACKGROUND=4\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_FVM_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##########[ luaenv: lua version from luaenv (https://github.com/cehoffman/luaenv) ]###########\n  # Lua color.\n  # typeset -g POWERLEVEL9K_LUAENV_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_LUAENV_BACKGROUND=4\n  # Hide lua version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_LUAENV_SOURCES=(shell local global)\n  # If set to false, hide lua version if it's the same as global:\n  # $(luaenv version-name) == $(luaenv global).\n  typeset -g POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide lua version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_LUAENV_SHOW_SYSTEM=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_LUAENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###############[ jenv: java version from jenv (https://github.com/jenv/jenv) ]################\n  # Java color.\n  # typeset -g POWERLEVEL9K_JENV_FOREGROUND=1\n  # typeset -g POWERLEVEL9K_JENV_BACKGROUND=7\n  # Hide java version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_JENV_SOURCES=(shell local global)\n  # If set to false, hide java version if it's the same as global:\n  # $(jenv version-name) == $(jenv global).\n  typeset -g POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide java version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_JENV_SHOW_SYSTEM=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_JENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###########[ plenv: perl version from plenv (https://github.com/tokuhirom/plenv) ]############\n  # Perl color.\n  # typeset -g POWERLEVEL9K_PLENV_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_PLENV_BACKGROUND=4\n  # Hide perl version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_PLENV_SOURCES=(shell local global)\n  # If set to false, hide perl version if it's the same as global:\n  # $(plenv version-name) == $(plenv global).\n  typeset -g POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide perl version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_PLENV_SHOW_SYSTEM=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_PLENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ############[ phpenv: php version from phpenv (https://github.com/phpenv/phpenv) ]############\n  # PHP color.\n  # typeset -g POWERLEVEL9K_PHPENV_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_PHPENV_BACKGROUND=5\n  # Hide php version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_PHPENV_SOURCES=(shell local global)\n  # If set to false, hide php version if it's the same as global:\n  # $(phpenv version-name) == $(phpenv global).\n  typeset -g POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide PHP version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_PHPENV_SHOW_SYSTEM=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_PHPENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #######[ scalaenv: scala version from scalaenv (https://github.com/scalaenv/scalaenv) ]#######\n  # Scala color.\n  # typeset -g POWERLEVEL9K_SCALAENV_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_SCALAENV_BACKGROUND=1\n  # Hide scala version if it doesn't come from one of these sources.\n  typeset -g POWERLEVEL9K_SCALAENV_SOURCES=(shell local global)\n  # If set to false, hide scala version if it's the same as global:\n  # $(scalaenv version-name) == $(scalaenv global).\n  typeset -g POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW=false\n  # If set to false, hide scala version if it's equal to \"system\".\n  typeset -g POWERLEVEL9K_SCALAENV_SHOW_SYSTEM=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_SCALAENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##########[ haskell_stack: haskell version from stack (https://haskellstack.org/) ]###########\n  # Haskell color.\n  # typeset -g POWERLEVEL9K_HASKELL_STACK_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_HASKELL_STACK_BACKGROUND=3\n\n  # Hide haskell version if it doesn't come from one of these sources.\n  #\n  #   shell:  version is set by STACK_YAML\n  #   local:  version is set by stack.yaml up the directory tree\n  #   global: version is set by the implicit global project (~/.stack/global-project/stack.yaml)\n  typeset -g POWERLEVEL9K_HASKELL_STACK_SOURCES=(shell local)\n  # If set to false, hide haskell version if it's the same as in the implicit global project.\n  typeset -g POWERLEVEL9K_HASKELL_STACK_ALWAYS_SHOW=true\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_HASKELL_STACK_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ################[ terraform: terraform workspace (https://www.terraform.io) ]#################\n  # Don't show terraform workspace if it's literally \"default\".\n  typeset -g POWERLEVEL9K_TERRAFORM_SHOW_DEFAULT=false\n  # POWERLEVEL9K_TERRAFORM_CLASSES is an array with even number of elements. The first element\n  # in each pair defines a pattern against which the current terraform workspace gets matched.\n  # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below)\n  # that gets matched. If you unset all POWERLEVEL9K_TERRAFORM_*CONTENT_EXPANSION parameters,\n  # you'll see this value in your prompt. The second element of each pair in\n  # POWERLEVEL9K_TERRAFORM_CLASSES defines the workspace class. Patterns are tried in order. The\n  # first match wins.\n  #\n  # For example, given these settings:\n  #\n  #   typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=(\n  #     '*prod*'  PROD\n  #     '*test*'  TEST\n  #     '*'       OTHER)\n  #\n  # If your current terraform workspace is \"project_test\", its class is TEST because \"project_test\"\n  # doesn't match the pattern '*prod*' but does match '*test*'.\n  #\n  # You can define different colors, icons and content expansions for different classes:\n  #\n  #   typeset -g POWERLEVEL9K_TERRAFORM_TEST_FOREGROUND=2\n  #   typeset -g POWERLEVEL9K_TERRAFORM_TEST_BACKGROUND=0\n  #   typeset -g POWERLEVEL9K_TERRAFORM_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  #   typeset -g POWERLEVEL9K_TERRAFORM_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <'\n  typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=(\n      # '*prod*'  PROD    # These values are examples that are unlikely\n      # '*test*'  TEST    # to match your needs. Customize them as needed.\n      '*'         OTHER)\n  typeset -g POWERLEVEL9K_TERRAFORM_OTHER_FOREGROUND=4\n  typeset -g POWERLEVEL9K_TERRAFORM_OTHER_BACKGROUND=0\n  # typeset -g POWERLEVEL9K_TERRAFORM_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]#############\n  # Show kubecontext only when the the command you are typing invokes one of these tools.\n  # Tip: Remove the next line to always show kubecontext.\n  typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens|kubectx|oc|istioctl|kogito|k9s|helmfile'\n\n  # Kubernetes context classes for the purpose of using different colors, icons and expansions with\n  # different contexts.\n  #\n  # POWERLEVEL9K_KUBECONTEXT_CLASSES is an array with even number of elements. The first element\n  # in each pair defines a pattern against which the current kubernetes context gets matched.\n  # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below)\n  # that gets matched. If you unset all POWERLEVEL9K_KUBECONTEXT_*CONTENT_EXPANSION parameters,\n  # you'll see this value in your prompt. The second element of each pair in\n  # POWERLEVEL9K_KUBECONTEXT_CLASSES defines the context class. Patterns are tried in order. The\n  # first match wins.\n  #\n  # For example, given these settings:\n  #\n  #   typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=(\n  #     '*prod*'  PROD\n  #     '*test*'  TEST\n  #     '*'       DEFAULT)\n  #\n  # If your current kubernetes context is \"deathray-testing/default\", its class is TEST\n  # because \"deathray-testing/default\" doesn't match the pattern '*prod*' but does match '*test*'.\n  #\n  # You can define different colors, icons and content expansions for different classes:\n  #\n  #   typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_FOREGROUND=0\n  #   typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_BACKGROUND=2\n  #   typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  #   typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <'\n  typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=(\n      # '*prod*'  PROD    # These values are examples that are unlikely\n      # '*test*'  TEST    # to match your needs. Customize them as needed.\n      '*'       DEFAULT)\n  typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_FOREGROUND=7\n  typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_BACKGROUND=5\n  # typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  # Use POWERLEVEL9K_KUBECONTEXT_CONTENT_EXPANSION to specify the content displayed by kubecontext\n  # segment. Parameter expansions are very flexible and fast, too. See reference:\n  # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion.\n  #\n  # Within the expansion the following parameters are always available:\n  #\n  # - P9K_CONTENT                The content that would've been displayed if there was no content\n  #                              expansion defined.\n  # - P9K_KUBECONTEXT_NAME       The current context's name. Corresponds to column NAME in the\n  #                              output of `kubectl config get-contexts`.\n  # - P9K_KUBECONTEXT_CLUSTER    The current context's cluster. Corresponds to column CLUSTER in the\n  #                              output of `kubectl config get-contexts`.\n  # - P9K_KUBECONTEXT_NAMESPACE  The current context's namespace. Corresponds to column NAMESPACE\n  #                              in the output of `kubectl config get-contexts`. If there is no\n  #                              namespace, the parameter is set to \"default\".\n  # - P9K_KUBECONTEXT_USER       The current context's user. Corresponds to column AUTHINFO in the\n  #                              output of `kubectl config get-contexts`.\n  #\n  # If the context points to Google Kubernetes Engine (GKE) or Elastic Kubernetes Service (EKS),\n  # the following extra parameters are available:\n  #\n  # - P9K_KUBECONTEXT_CLOUD_NAME     Either \"gke\" or \"eks\".\n  # - P9K_KUBECONTEXT_CLOUD_ACCOUNT  Account/project ID.\n  # - P9K_KUBECONTEXT_CLOUD_ZONE     Availability zone.\n  # - P9K_KUBECONTEXT_CLOUD_CLUSTER  Cluster.\n  #\n  # P9K_KUBECONTEXT_CLOUD_* parameters are derived from P9K_KUBECONTEXT_CLUSTER. For example,\n  # if P9K_KUBECONTEXT_CLUSTER is \"gke_my-account_us-east1-a_my-cluster-01\":\n  #\n  #   - P9K_KUBECONTEXT_CLOUD_NAME=gke\n  #   - P9K_KUBECONTEXT_CLOUD_ACCOUNT=my-account\n  #   - P9K_KUBECONTEXT_CLOUD_ZONE=us-east1-a\n  #   - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01\n  #\n  # If P9K_KUBECONTEXT_CLUSTER is \"arn:aws:eks:us-east-1:123456789012:cluster/my-cluster-01\":\n  #\n  #   - P9K_KUBECONTEXT_CLOUD_NAME=eks\n  #   - P9K_KUBECONTEXT_CLOUD_ACCOUNT=123456789012\n  #   - P9K_KUBECONTEXT_CLOUD_ZONE=us-east-1\n  #   - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01\n  typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION=\n  # Show P9K_KUBECONTEXT_CLOUD_CLUSTER if it's not empty and fall back to P9K_KUBECONTEXT_NAME.\n  POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${P9K_KUBECONTEXT_CLOUD_CLUSTER:-${P9K_KUBECONTEXT_NAME}}'\n  # Append the current context's namespace if it's not \"default\".\n  POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${${:-/$P9K_KUBECONTEXT_NAMESPACE}:#/default}'\n\n  # Custom prefix.\n  # typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX='at '\n\n  #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]#\n  # Show aws only when the the command you are typing invokes one of these tools.\n  # Tip: Remove the next line to always show aws.\n  typeset -g POWERLEVEL9K_AWS_SHOW_ON_COMMAND='aws|awless|terraform|pulumi|terragrunt'\n\n  # POWERLEVEL9K_AWS_CLASSES is an array with even number of elements. The first element\n  # in each pair defines a pattern against which the current AWS profile gets matched.\n  # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below)\n  # that gets matched. If you unset all POWERLEVEL9K_AWS_*CONTENT_EXPANSION parameters,\n  # you'll see this value in your prompt. The second element of each pair in\n  # POWERLEVEL9K_AWS_CLASSES defines the profile class. Patterns are tried in order. The\n  # first match wins.\n  #\n  # For example, given these settings:\n  #\n  #   typeset -g POWERLEVEL9K_AWS_CLASSES=(\n  #     '*prod*'  PROD\n  #     '*test*'  TEST\n  #     '*'       DEFAULT)\n  #\n  # If your current AWS profile is \"company_test\", its class is TEST\n  # because \"company_test\" doesn't match the pattern '*prod*' but does match '*test*'.\n  #\n  # You can define different colors, icons and content expansions for different classes:\n  #\n  #   typeset -g POWERLEVEL9K_AWS_TEST_FOREGROUND=28\n  #   typeset -g POWERLEVEL9K_AWS_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  #   typeset -g POWERLEVEL9K_AWS_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <'\n  typeset -g POWERLEVEL9K_AWS_CLASSES=(\n      # '*prod*'  PROD    # These values are examples that are unlikely\n      # '*test*'  TEST    # to match your needs. Customize them as needed.\n      '*'       DEFAULT)\n  # typeset -g POWERLEVEL9K_AWS_DEFAULT_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_AWS_DEFAULT_BACKGROUND=1\n  # typeset -g POWERLEVEL9K_AWS_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #[ aws_eb_env: aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) ]#\n  # AWS Elastic Beanstalk environment color.\n  # typeset -g POWERLEVEL9K_AWS_EB_ENV_FOREGROUND=2\n  # typeset -g POWERLEVEL9K_AWS_EB_ENV_BACKGROUND=0\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##########[ azure: azure account name (https://docs.microsoft.com/en-us/cli/azure) ]##########\n  # Show azure only when the the command you are typing invokes one of these tools.\n  # Tip: Remove the next line to always show azure.\n  typeset -g POWERLEVEL9K_AZURE_SHOW_ON_COMMAND='az|terraform|pulumi|terragrunt'\n  # Azure account name color.\n  # typeset -g POWERLEVEL9K_AZURE_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_AZURE_BACKGROUND=4\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_AZURE_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]###########\n  # Show gcloud only when the the command you are typing invokes one of these tools.\n  # Tip: Remove the next line to always show gcloud.\n  typeset -g POWERLEVEL9K_GCLOUD_SHOW_ON_COMMAND='gcloud|gcs'\n  # Google cloud color.\n  # typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_GCLOUD_BACKGROUND=4\n\n  # Google cloud format. Change the value of POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION and/or\n  # POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION if the default is too verbose or not informative\n  # enough. You can use the following parameters in the expansions. Each of them corresponds to the\n  # output of `gcloud` tool.\n  #\n  #   Parameter                | Source\n  #   -------------------------|--------------------------------------------------------------------\n  #   P9K_GCLOUD_CONFIGURATION | gcloud config configurations list --format='value(name)'\n  #   P9K_GCLOUD_ACCOUNT       | gcloud config get-value account\n  #   P9K_GCLOUD_PROJECT_ID    | gcloud config get-value project\n  #   P9K_GCLOUD_PROJECT_NAME  | gcloud projects describe $P9K_GCLOUD_PROJECT_ID --format='value(name)'\n  #\n  # Note: ${VARIABLE//\\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced with '%%'.\n  #\n  # Obtaining project name requires sending a request to Google servers. This can take a long time\n  # and even fail. When project name is unknown, P9K_GCLOUD_PROJECT_NAME is not set and gcloud\n  # prompt segment is in state PARTIAL. When project name gets known, P9K_GCLOUD_PROJECT_NAME gets\n  # set and gcloud prompt segment transitions to state COMPLETE.\n  #\n  # You can customize the format, icon and colors of gcloud segment separately for states PARTIAL\n  # and COMPLETE. You can also hide gcloud in state PARTIAL by setting\n  # POWERLEVEL9K_GCLOUD_PARTIAL_VISUAL_IDENTIFIER_EXPANSION and\n  # POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION to empty.\n  typeset -g POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_ID//\\%/%%}'\n  typeset -g POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_NAME//\\%/%%}'\n\n  # Send a request to Google (by means of `gcloud projects describe ...`) to obtain project name\n  # this often. Negative value disables periodic polling. In this mode project name is retrieved\n  # only when the current configuration, account or project id changes.\n  typeset -g POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS=60\n\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_GCLOUD_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #[ google_app_cred: google application credentials (https://cloud.google.com/docs/authentication/production) ]#\n  # Show google_app_cred only when the the command you are typing invokes one of these tools.\n  # Tip: Remove the next line to always show google_app_cred.\n  typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_SHOW_ON_COMMAND='terraform|pulumi|terragrunt'\n\n  # Google application credentials classes for the purpose of using different colors, icons and\n  # expansions with different credentials.\n  #\n  # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES is an array with even number of elements. The first\n  # element in each pair defines a pattern against which the current kubernetes context gets\n  # matched. More specifically, it's P9K_CONTENT prior to the application of context expansion\n  # (see below) that gets matched. If you unset all POWERLEVEL9K_GOOGLE_APP_CRED_*CONTENT_EXPANSION\n  # parameters, you'll see this value in your prompt. The second element of each pair in\n  # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES defines the context class. Patterns are tried in order.\n  # The first match wins.\n  #\n  # For example, given these settings:\n  #\n  #   typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=(\n  #     '*:*prod*:*'  PROD\n  #     '*:*test*:*'  TEST\n  #     '*'           DEFAULT)\n  #\n  # If your current Google application credentials is \"service_account deathray-testing x@y.com\",\n  # its class is TEST because it doesn't match the pattern '* *prod* *' but does match '* *test* *'.\n  #\n  # You can define different colors, icons and content expansions for different classes:\n  #\n  #   typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_FOREGROUND=28\n  #   typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  #   typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_CONTENT_EXPANSION='$P9K_GOOGLE_APP_CRED_PROJECT_ID'\n  typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=(\n      # '*:*prod*:*'  PROD    # These values are examples that are unlikely\n      # '*:*test*:*'  TEST    # to match your needs. Customize them as needed.\n      '*'             DEFAULT)\n  # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_BACKGROUND=4\n  # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  # Use POWERLEVEL9K_GOOGLE_APP_CRED_CONTENT_EXPANSION to specify the content displayed by\n  # google_app_cred segment. Parameter expansions are very flexible and fast, too. See reference:\n  # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion.\n  #\n  # You can use the following parameters in the expansion. Each of them corresponds to one of the\n  # fields in the JSON file pointed to by GOOGLE_APPLICATION_CREDENTIALS.\n  #\n  #   Parameter                        | JSON key file field\n  #   ---------------------------------+---------------\n  #   P9K_GOOGLE_APP_CRED_TYPE         | type\n  #   P9K_GOOGLE_APP_CRED_PROJECT_ID   | project_id\n  #   P9K_GOOGLE_APP_CRED_CLIENT_EMAIL | client_email\n  #\n  # Note: ${VARIABLE//\\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced by '%%'.\n  typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_CONTENT_EXPANSION='${P9K_GOOGLE_APP_CRED_PROJECT_ID//\\%/%%}'\n\n  ###############################[ public_ip: public IP address ]###############################\n  # Public IP color.\n  # typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=7\n  # typeset -g POWERLEVEL9K_PUBLIC_IP_BACKGROUND=0\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_PUBLIC_IP_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ########################[ vpn_ip: virtual private network indicator ]#########################\n  # VPN IP color.\n  # typeset -g POWERLEVEL9K_VPN_IP_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_VPN_IP_BACKGROUND=6\n  # When on VPN, show just an icon without the IP address.\n  # Tip: To display the private IP address when on VPN, remove the next line.\n  typeset -g POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION=\n  # Regular expression for the VPN network interface. Run `ifconfig` or `ip -4 a show` while on VPN\n  # to see the name of the interface.\n  typeset -g POWERLEVEL9K_VPN_IP_INTERFACE='(gpd|wg|(.*tun))[0-9]*'\n  # If set to true, show one segment per matching network interface. If set to false, show only\n  # one segment corresponding to the first matching network interface.\n  # Tip: If you set it to true, you'll probably want to unset POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION.\n  typeset -g POWERLEVEL9K_VPN_IP_SHOW_ALL=false\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_VPN_IP_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ###########[ ip: ip address and bandwidth usage for a specified network interface ]###########\n  # IP color.\n  typeset -g POWERLEVEL9K_IP_BACKGROUND=4\n  typeset -g POWERLEVEL9K_IP_FOREGROUND=0\n  # The following parameters are accessible within the expansion:\n  #\n  #   Parameter             | Meaning\n  #   ----------------------+---------------\n  #   P9K_IP_IP         | IP address\n  #   P9K_IP_INTERFACE  | network interface\n  #   P9K_IP_RX_BYTES   | total number of bytes received\n  #   P9K_IP_TX_BYTES   | total number of bytes sent\n  #   P9K_IP_RX_RATE    | receive rate (since last prompt)\n  #   P9K_IP_TX_RATE    | send rate (since last prompt)\n  typeset -g POWERLEVEL9K_IP_CONTENT_EXPANSION='${P9K_IP_RX_RATE:+⇣$P9K_IP_RX_RATE }${P9K_IP_TX_RATE:+⇡$P9K_IP_TX_RATE }$P9K_IP_IP'\n  # Show information for the first network interface whose name matches this regular expression.\n  # Run `ifconfig` or `ip -4 a show` to see the names of all network interfaces.\n  typeset -g POWERLEVEL9K_IP_INTERFACE='e.*'\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_IP_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  #########################[ proxy: system-wide http/https/ftp proxy ]##########################\n  # Proxy color.\n  # typeset -g POWERLEVEL9K_PROXY_FOREGROUND=4\n  # typeset -g POWERLEVEL9K_PROXY_BACKGROUND=0\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_PROXY_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  ################################[ battery: internal battery ]#################################\n  # Show battery in red when it's below this level and not connected to power supply.\n  typeset -g POWERLEVEL9K_BATTERY_LOW_THRESHOLD=20\n  typeset -g POWERLEVEL9K_BATTERY_LOW_FOREGROUND=1\n  # Show battery in green when it's charging or fully charged.\n  typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=2\n  # Show battery in yellow when it's discharging.\n  typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=3\n  # Battery pictograms going from low to high level of charge.\n  typeset -g POWERLEVEL9K_BATTERY_STAGES='\\uf58d\\uf579\\uf57a\\uf57b\\uf57c\\uf57d\\uf57e\\uf57f\\uf580\\uf581\\uf578'\n  # Don't show the remaining time to charge/discharge.\n  typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false\n  # typeset -g POWERLEVEL9K_BATTERY_BACKGROUND=0\n\n  #####################################[ wifi: wifi speed ]#####################################\n  # WiFi color.\n  # typeset -g POWERLEVEL9K_WIFI_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_WIFI_BACKGROUND=4\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  # Use different colors and icons depending on signal strength ($P9K_WIFI_BARS).\n  #\n  #   # Wifi colors and icons for different signal strength levels (low to high).\n  #   typeset -g my_wifi_fg=(0 0 0 0 0)                                # <-- change these values\n  #   typeset -g my_wifi_icon=('WiFi' 'WiFi' 'WiFi' 'WiFi' 'WiFi')     # <-- change these values\n  #\n  #   typeset -g POWERLEVEL9K_WIFI_CONTENT_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}$P9K_WIFI_LAST_TX_RATE Mbps'\n  #   typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}${my_wifi_icon[P9K_WIFI_BARS+1]}'\n  #\n  # The following parameters are accessible within the expansions:\n  #\n  #   Parameter             | Meaning\n  #   ----------------------+---------------\n  #   P9K_WIFI_SSID         | service set identifier, a.k.a. network name\n  #   P9K_WIFI_LINK_AUTH    | authentication protocol such as \"wpa2-psk\" or \"none\"; empty if unknown\n  #   P9K_WIFI_LAST_TX_RATE | wireless transmit rate in megabits per second\n  #   P9K_WIFI_RSSI         | signal strength in dBm, from -120 to 0\n  #   P9K_WIFI_NOISE        | noise in dBm, from -120 to 0\n  #   P9K_WIFI_BARS         | signal strength in bars, from 0 to 4 (derived from P9K_WIFI_RSSI and P9K_WIFI_NOISE)\n\n  ####################################[ time: current time ]####################################\n  # Current time color.\n  # typeset -g POWERLEVEL9K_TIME_FOREGROUND=0\n  # typeset -g POWERLEVEL9K_TIME_BACKGROUND=7\n  # Format for the current time: 09:51:02. See `man 3 strftime`.\n  typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}'\n  # If set to true, time will update when you hit enter. This way prompts for the past\n  # commands will contain the start times of their commands as opposed to the default\n  # behavior where they contain the end times of their preceding commands.\n  typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false\n  # Custom icon.\n  # typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐'\n  # Custom prefix.\n  # typeset -g POWERLEVEL9K_TIME_PREFIX='at '\n\n  # Example of a user-defined prompt segment. Function prompt_example will be called on every\n  # prompt if `example` prompt segment is added to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or\n  # POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. It displays an icon and yellow text on red background\n  # greeting the user.\n  #\n  # Type `p10k help segment` for documentation and a more sophisticated example.\n  function prompt_example() {\n    p10k segment -b 1 -f 3 -i '⭐' -t 'hello, %n'\n  }\n\n  # User-defined prompt segments may optionally provide an instant_prompt_* function. Its job\n  # is to generate the prompt segment for display in instant prompt. See\n  # https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt.\n  #\n  # Powerlevel10k will call instant_prompt_* at the same time as the regular prompt_* function\n  # and will record all `p10k segment` calls it makes. When displaying instant prompt, Powerlevel10k\n  # will replay these calls without actually calling instant_prompt_*. It is imperative that\n  # instant_prompt_* always makes the same `p10k segment` calls regardless of environment. If this\n  # rule is not observed, the content of instant prompt will be incorrect.\n  #\n  # Usually, you should either not define instant_prompt_* or simply call prompt_* from it. If\n  # instant_prompt_* is not defined for a segment, the segment won't be shown in instant prompt.\n  function instant_prompt_example() {\n    # Since prompt_example always makes the same `p10k segment` calls, we can call it from\n    # instant_prompt_example. This will give us the same `example` prompt segment in the instant\n    # and regular prompts.\n    prompt_example\n  }\n\n  # User-defined prompt segments can be customized the same way as built-in segments.\n  # typeset -g POWERLEVEL9K_EXAMPLE_FOREGROUND=3\n  # typeset -g POWERLEVEL9K_EXAMPLE_VISUAL_IDENTIFIER_EXPANSION='⭐'\n\n  # Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt\n  # when accepting a command line. Supported values:\n  #\n  #   - off:      Don't change prompt when accepting a command line.\n  #   - always:   Trim down prompt when accepting a command line.\n  #   - same-dir: Trim down prompt when accepting a command line unless this is the first command\n  #               typed after changing current working directory.\n  typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=off\n\n  # Instant prompt mode.\n  #\n  #   - off:     Disable instant prompt. Choose this if you've tried instant prompt and found\n  #              it incompatible with your zsh configuration files.\n  #   - quiet:   Enable instant prompt and don't print warnings when detecting console output\n  #              during zsh initialization. Choose this if you've read and understood\n  #              https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt.\n  #   - verbose: Enable instant prompt and print a warning when detecting console output during\n  #              zsh initialization. Choose this if you've never tried instant prompt, haven't\n  #              seen the warning, or if you are unsure what this all means.\n  typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose\n\n  # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized.\n  # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload\n  # can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you\n  # really need it.\n  typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true\n\n  # If p10k is already loaded, reload configuration.\n  # This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true.\n  (( ! $+functions[p10k] )) || p10k reload\n}\n\n# Tell `p10k configure` which file it should overwrite.\ntypeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a}\n\n(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]}\n'builtin' 'unset' 'p10k_config_opts'\n"
  },
  {
    "path": "oh-my-zsh/.zlogin",
    "content": "# -*- mode:sh; -*-\n###############################################################################\n# This file is load **after** .zshrc\n#\n# Reminder:\n# 1. `~/.zshenv` :         Usually run for every zsh\n# 2. `$ZDOTDIR/.zprofile`: Run for login shells\n# 3. `$ZDOTDIR/.zshrc`:    Run for interactive shells.`\n# 4. `$ZDOTDIR/.zlogin`:   Run for login shells (**after** .zshrc)\n\n# Load RVM into a shell session *as a function*\n\n\n[[ -s \"$HOME/.rvm/scripts/rvm\" ]] && source \"$HOME/.rvm/scripts/rvm\" # Load RVM into a shell session *as a function*\n"
  },
  {
    "path": "oh-my-zsh/.zprofile",
    "content": "# -*- mode: sh -*-\n###############################################################################\n# This file is load **before** .zshrc\n#\n# Reminder:\n# 1. `~/.zshenv` :         Usually run for every zsh\n# 2. `$ZDOTDIR/.zprofile`: Run for login shells\n# 3. `$ZDOTDIR/.zshrc`:    Run for interactive shells.`\n# 4. `$ZDOTDIR/.zlogin`:   Run for login shells (**after** .zshrc)\n\n\n# check_task=$( which task 2>/dev/null )\n# if [ -n \"${check_task}\" ]; then\n# \ttask\n# fi\n\n\n# Created by `pipx` on 2024-06-13 15:40:32\nexport PATH=\"$PATH:/home/svarrette/.local/bin\"\n"
  },
  {
    "path": "oh-my-zsh/.zshenv",
    "content": "# -*- mode: sh; -*-\n###############################################################################\n# .zshenv -- My ZSH configuration (feat. Oh-my-zsh)\n# .          see https://github.com/Falkor/dotfiles\n#                                  _\n#                          _______| |__   ___ _ ____   __\n#                         |_  / __| '_ \\ / _ \\ '_ \\ \\ / /\n#                        _ / /\\__ \\ | | |  __/ | | \\ V /\n#                       (_)___|___/_| |_|\\___|_| |_|\\_/\n#\n###############################################################################\n# Resources:\n# - https://github.com/smaximov/zsh-config\n#\n# The proposed ZSH startup files are read the the below order:\n# (see http://zsh.sourceforge.net/Guide/zshguide02.html)\n#\n# 1. `~/.zshenv` :         Usually run for every zsh\n# 2. `$ZDOTDIR/.zprofile`: Run for login shells\n# 3. `$ZDOTDIR/.zshrc`:    Run for interactive shells.`\n# 4. `$ZDOTDIR/.zlogin`:   Run for login shells (**after** .zshrc)\n#\n# In particular, assuming Falkor's dotfiles zsh repository are available under\n# ~/.config/zsh/, it should be sufficient to ake `~/.zshenv` a symbolic link\n# pointing to `$ZDOTDIR/.zshenv` (as this file sets $ZDOTDIR)\n#\n#      ln -s .config/zsh/.zshenv ~/.zshenv\n#\n# === OVERVIEW ===\n# This configuration enforces:\n# - `XDG_*` variables are set according to XDG Base Directory Specification\n#  (see https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html):\n#     * `XDG_CONFIG_HOME`: `~/.config`\n#     * `XDG_DATA_HOME`:   `~/.local/share`\n#     * `XDG_CACHE_HOME`:  `~/.cache`\n# - Some additional variables are set:\n#     * `ZDOTDIR`:       `$XDG_CONFIG_HOME/zsh`\n#     * `ZSH`:           `$XDG_DATA_HOME/oh-my-zsh`\n#     * `ZSH_CACHE_DIR`: `$XDG_CACHE_HOME/zsh`\n# - ZSH config files located under `$ZDOTDIR`.\n# - Oh My Zsh files located under `$ZSH`.\n###############################################################################\n\n# XDG  Base Directory Specification\n# See https://specifications.freedesktop.org/basedir-spec/latest/\nexport XDG_CONFIG_HOME=$HOME/.config\nexport XDG_CACHE_HOME=$HOME/.cache\nexport XDG_DATA_HOME=$HOME/.local/share\n\n# enable en_US locale w/ UTF-8 encodings if not already configured\nexport LANG=en_US.UTF-8\nexport LANGUAGE=en\nexport LC_ALL=\"${LANG}\"\n\n# Editor / pager\nunset ALTERNATE_EDITOR\n# Preferred editor for local and remote sessions\ntest -n \"$(command -v vim)\" && EDITOR=vim || EDITOR=nano\n# Uncomment if you prefer macvim\n# [[ -n $SSH_CONNECTION ]] && EDITOR='mvim'\nexport EDITOR\n#export EDITOR='emacsclient -t'\nif test -n \"$(command -v less)\" ; then\n    PAGER=\"less -FirSwX\"\n    MANPAGER=\"less -FiRswX\"\nelse\n    PAGER=more\n    MANPAGER=\"$PAGER\"\nfi\nexport PAGER MANPAGER\nexport VISUAL=$EDITOR\n\nexport PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig\n# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib\n\n# ====== ZSH Specific variables =========\nexport ZDOTDIR=$XDG_CONFIG_HOME/zsh\nexport ZSH_CACHE_DIR=$XDG_CACHE_HOME/zsh\n# Store ZSH files under XDG_CONFIG_HOME base directory.\n# This works by symlinking ~/.zshenv to ~/.config/zsh/.zshenv (this file).\nexport HISTFILE=$ZSH_CACHE_DIR/zhistory\n\n# Bugfix titles in tabs under iTerm2 - see https://gitlab.com/gnachman/iterm2/-/issues/8145\nexport DISABLE_AUTO_TITLE=\"true\"\n\n#================================================================\n# [Final] Custom ZSH enviroment variables\n[[ -f $ZDOTDIR/custom.zshenv ]] && source $ZDOTDIR/custom.zshenv\n#================================================================\n\n# $HOME, sweet $HOME\nexport PATH\n\nexport TERM=\"xterm-256color\"\n\n# === Now ${ZDOTDIR}/.zshrc will be loaded.... ===\n\n# Begin added by argcomplete\nfpath=( /usr/lib/python3/dist-packages/argcomplete/bash_completion.d \"${fpath[@]}\" )\n# End added by argcomplete\n"
  },
  {
    "path": "oh-my-zsh/.zshrc",
    "content": "# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.config/zsh/.zshrc.\n# Initialization code that may require console input (password prompts, [y/n]\n# confirmations, etc.) must go above this block; everything else may go below.\nif [[ -r \"${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh\" ]]; then\n  source \"${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh\"\nfi\n\n# -*- mode:sh; -*-\n###############################################################################\n#              __ ___  _           __  __      __ _________  _   _\n#             | _/ _ \\| |__       |  \\/  |_   |_ |__  / ___|| | | |\n#             | | | | | '_ \\ _____| |\\/| | | | | | / /\\___ \\| |_| |\n#             | | |_| | | | |_____| |  | | |_| | |/ /_ ___) |  _  |\n#             | |\\___/|_| |_|     |_|  |_|\\__, | /____|____/|_| |_|\n#             |__|                        |___/__|\n#\n###############################################################################\n# Resources:\n# - https://github.com/smaximov/zsh-config\n#\n# You SHOULD have made `~/.zshenv` a symbolic link pointing to\n# `$ZDOTDIR/.zshenv` as follow:\n#\n#           ln -s .config/zsh/.zshenv ~/.zshenv\n#\n# This ensure all expected environment variable (in particular the ones of\n# XDG Base Directory Specification (see https://specifications.freedesktop.org/basedir-spec/latest/)\n# are set\n###############################################################################\n\n# Path to your oh-my-zsh installation.\nexport ZSH=$XDG_DATA_HOME/oh-my-zsh\n\n# Custom directory location\nZSH_CUSTOM=$ZDOTDIR/custom\n\n## Update / check ZSH config\n# Courtesy https://github.com/smaximov/zsh-config/blob/master/lib/functions.zsh\nupdate-zsh-config() {\n\tomz update\n  if [ -d \"$XDG_CONFIG_HOME/dotfiles.falkor.d/.git\" ]; then\n    echo\n    echo \"=> Updating Falkor's dotfiles to the latest version\"\n    echo\n    git -C $XDG_CONFIG_HOME/dotfiles.falkor.d pull --rebase origin\n  fi\n}\n\n################## Oh-My-ZSH (optional) customizations ########################\n#\n# === Oh-My-ZSH Prompt Theme ===\n# - Default themes:'$ZSH/themes/*' i.e. ~/.local/share/oh-my-zsh/themes/*\n# - Custom themes: '$ZSH_CUSTOM/themes/*' i.e. ~/config/zsh/custom/themes/*\n\n# Specific to powerlevel9k\n# ZSH_THEME=\"powerlevel9k/powerlevel9k\"\nZSH_THEME=\"powerlevel10k/powerlevel10k\"\n# Customization of powerlevel9k: see custom falkor plugin below\n# OR overwrite these settings in $ZDOTDIR/custom.zshrc i.e. ~/config/zsh/custom.zshrc\n\n# update every 7 days by default\nexport UPDATE_ZSH_DAYS=7\n\n# Uncomment the following line to disable auto-setting terminal title.\n# DISABLE_AUTO_TITLE=\"true\"\n\n# Uncomment the following line to enable command auto-correction.\n# ENABLE_CORRECTION=\"true\"\n\n# Uncomment the following line to display red dots whilst waiting for completion.\n# COMPLETION_WAITING_DOTS=\"true\"\n\n# Uncomment the following line if you want to disable marking untracked files\n# under VCS as dirty. This makes repository status check for large repositories\n# much, much faster.\n# DISABLE_UNTRACKED_FILES_DIRTY=\"true\"\n##############################################################################\n#\n# === Oh-My-ZSH Plugins ===\nplugins=()\n# Add them wisely, as too many plugins slow down shell startup.\n#___________________\n# - Default plugins: '$ZSH/plugins/*' i.e. ~/.local/share/oh-my-zsh/plugins/*\n#   See https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins\nplugins+=(zsh-syntax-highlighting)\n# plugins+=(git-flow git-extras git-remote-branch)  # Git\nplugins+=(git-flow git-extras)  # Git\nplugins+=(nix-zsh-completions)  # Nix\nplugins+=(rake gem rvm)         # Ruby stuff\nplugins+=(pip)                  # Python stuff\nplugins+=(docker docker-compose)        # Docker stuff\nplugins+=(kubectl minikube)             # Kubernetes stuff\nif [[ \"$(uname)\" == \"Darwin\" ]]; then\n  plugins+=(macos marked2)        # Mac OS\nfi\n# Misc\nplugins+=(cp taskwarrior)\nplugins+=(zsh-ssh)\n\n#__________________\n# - Custom plugins: '$ZSH_CUSTOM/plugins/*' i.e. ~/config./zsh/custom/plugins/\n#\nplugins+=(falkor zsh-completions)\n\n#_______________________________________\n# [Final] Custom Oh-my-ZSH configuration\n# (for instance to change the plugins/themes set by Falkor's dotfiles)\n[[ -f $ZDOTDIR/custom.zshrc ]] && source $ZDOTDIR/custom.zshrc\n##############################################################################\n\n# Create ZSH cache directory unless it already exists\n[[ -d $ZSH_CACHE_DIR ]] || mkdir -p $ZSH_CACHE_DIR\n\n# Disable fancy colored shell prompts and auto-update on dumb terminals\n# if [ $TERM = \"dumb\" ]; then\n#    unsetopt zle\n#    PS1=\"$ \"\n#    DISABLE_AUTO_UPDATE=true\n# fi\n\ntypeset -U fpath\nfpath=(~/git/github.com/Falkor/falkorlib/completion $fpath)\n\n# Load Oh-my-zsh\nsource $ZSH/oh-my-zsh.sh\n\n# Load eventually common [custom] configuration, either:\n# - generic ZSH functions defined in $ZDOTDIR/lib\n# - common to all shells (from ~/.config/shell/[custom/]*.sh typically)\n# - specific custom to zsh (from ~/.config/zsh/custom/*.zsh\nfor d in \\\n  ${ZDOTDIR}/lib \\\n  ${XDG_CONFIG_HOME}/shell \\\n  ${XDG_CONFIG_HOME}/shell/custom \\\n  ${ZDOTDIR}/custom\ndo\n  if [ -d \"${d}\" ]; then\n    for f in ${d}/*.(sh|zsh)(N); do\n\t[[ -r \"$f\" ]] && source $f\n    done\n  fi\ndone\n\n# Force re-completion\nautoload -U compinit && compinit\n\n# /!\\ Reverse order (last $d below will be the first PATH entry!)\nfor d in \\\n  /usr/local/bin \\\n  ${HOME}/.rvm/bin \\\n  ${HOME}/.cargo/bin \\\n  ${HOME}/.local/bin \\\n  ${HOME}/bin\ndo\n  if [ -d \"${d}\" ]; then\n   export PATH=\"${d}:$PATH\"\n  fi\ndone\n\ntypeset -U PATH path\n\n# Bindkeys - use sudo showkey -a to get sequences\n# Shift-Left / Shift-Right\nbindkey \"^[[1;2D\" backward-word\nbindkey \"^[[1;2C\" forward-word\n# Shift-Up / Shift-Down\nbindkey \"^[[1;2A\" beginning-of-line\nbindkey \"^[[1;2B\" end-of-line\n\n# rm -rf ${XDG_CONFIG_HOME}/zsh/.zcompdump*\n\n# To customize prompt, run `p10k configure` or edit ~/.config/zsh/.p10k.zsh.\n[[ ! -f ~/.config/zsh/.p10k.zsh ]] || source ~/.config/zsh/.p10k.zsh\n\n"
  },
  {
    "path": "oh-my-zsh/README.md",
    "content": "# Falkor's Dotfiles -- OhMyZSH Customization\n\n![](http://ohmyz.sh/img/OMZLogo_BnW.png)\n\n> [Oh-My-Zsh](http://ohmyz.sh) is an open source, community-driven framework for managing your ZSH configuration. It comes bundled with a ton of helpful functions, helpers, plugins, themes, and a few things that make you shout...\n\nSo I use [Oh-My-Zsh](http://ohmyz.sh) using the excellent [powerlevel10k](https://github.com/romkatv/powerlevel10k) prompt theme and the [Darkside iTerm Color scheme](https://github.com/mbadolato/iTerm2-Color-Schemes/blob/master/schemes/Darkside.itermcolors).\n\nThe font I use is [Meslo Nerd Font patched for Powerlevel10k](https://github.com/romkatv/powerlevel10k#meslo-nerd-font-patched-for-powerlevel10k) at 15pt (for both Regular and Non-ASCII font).\nYou can find more information on  the way I configured iTerm2 on [my blog](https://varrette.gforge.uni.lu/blog/2017/01/17/configuring-mac-os-on-your-brand-new-laptop/#iterm2-configuration).\n\n## Screenshot\n\n![](https://raw.githubusercontent.com/Falkor/dotfiles/master/screenshots/screenshot_falkor_iterm.png)\n\n## Pre-requisites\n\n### Dependency packages\n\nInstall [fzf](https://github.com/junegunn/fzf)\n\n### Meslo Nerd Font patched for Powerlevel10k\n\nSee [instructions from powerlevel10k](https://github.com/romkatv/powerlevel10k#meslo-nerd-font-patched-for-powerlevel10k): if you are using iTerm2 or Termux, `p10k configure` can install the recommended font for you. Simply answer Yes when asked whether to install Meslo Nerd Font.\n\n### Alternative: [Source Code Pro Patched fonts](https://github.com/Falkor/dotfiles/blob/master/fonts/SourceCodePro%2BPowerline%2BAwesome%2BRegular.ttf)\n\nYou should install the [Source Code Pro Patched fonts](https://github.com/Falkor/dotfiles/raw/master/fonts/SourceCodePro%2BPowerline%2BAwesome%2BRegular.ttf) following [these instructions](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions#step-2-install-powerline-fonts) yet adapted to this font.\n\n### [Darkside](https://github.com/mbadolato/iTerm2-Color-Schemes/blob/master/schemes/Darkside.itermcolors) Color Scheme\n\n![](https://github.com/mbadolato/iTerm2-Color-Schemes/raw/master/screenshots/darkside.png)\n\nYou can find it (and many other color schemes) on <http://iterm2colorschemes.com/> and within [the associated  github repository](https://github.com/mbadolato/iTerm2-Color-Schemes) (under `scheme/`).\n\nInstall it within [iTerm2](https://www.iterm2.com/) by picking `Darkside[.itermcolors]` under `iTerm Preferences / Profiles / Colors / Load Presets`.\nYou'll have to repeat it for all your profiles.\n\n## Falkor's Custom plugin for Oh-My-ZSH\n\nLots of things I do every day have been shortened within one, two or three character mnemonic aliases.\nYou can find these aliases (together with my prompt customization) under the form of a [custom plugin for oh-My-ZSH](https://github.com/robbyrussell/oh-my-zsh/wiki/Customization) named... [`Falkor`](custom/plugins/falkor/falkor.plugin.zsh)\n\nSee [`falkor.plugin.zsh`](custom/plugins/falkor/falkor.plugin.zsh) for more details.\n\n## Installation, the lazy way\n\n* [Install zsh](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH)\n* [Install Oh-My-ZSH](http://ohmyz.sh/)\n\n    ```bash\n    curl -fsSL --skip-existing  -o /tmp/oh-my-zsh-installer.sh \\\n        https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh\n    less /tmp/oh-my-zsh-installer.sh # review installer\n    # run it to install into $XDG_DATA_HOME/zsh\n    ZSH=$HOME/.local/share/oh-my-zsh sh /tmp/oh-my-zsh-installer.sh\n    ```\n\n* Clone [Falkor's dotfile](https://github.com/Falkor/dotfile) as suggested, _i.e._\n\n    ```bash\n    git clone https://github.com/Falkor/dotfiles.git ~/.config/dotfiles.falkor.d\n    ```\n\nNow run:\n\n``` bash\ncd ~/.config/dotfiles.falkor.d\n./install.sh -n --zsh     # DRY_RUN\n./install.sh --zsh        \n```\n\nThis will configure the following components:\n\n* `~/.zshenv`\n* `~/.config/zsh`\n* `~/.local/share/oh-my-zsh` (Oh-My-ZSH)\n* `$ZSH_CUSTOM`, pointing to `~/.config/zsh/custom`\n\n\n## Uninstall\n\n``` bash\ncd ~/.config/dotfiles.falkor.d\n./install.sh --delete --zsh\n```\n\n\n## Customizations\n\nyou can define your own aliases under `~/.oh-my-zsh/custom/private_aliases.zsh` (which is **not meant to be tracked** thus ignored within [Falkor's dotfiles `oh-my-zsh/custom/.gitignore`](.gitignore) for instance).\n\nFollow also [this guide from Oh-My-ZSH](https://github.com/robbyrussell/oh-my-zsh/wiki/Customization) for more details.\n\nIn particular, you can install the following completions:\n\n```bash\ngit clone https://github.com/sunlei/zsh-ssh ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-ssh\n```\n\n\n## Note on [Powerlevel10k](https://github.com/romkatv/powerlevel10k) theme configuration\n\nYou might wish to reproduce my configuration of [Powerlevel10k](https://github.com/romkatv/powerlevel10k) as depicted in the above screenshot yet without installing my dotfiles.\n\n* Install the [recommended fonts](https://github.com/romkatv/powerlevel10k#meslo-nerd-font-patched-for-powerlevel10k). I prepared a dedicated script to install nerd fonts in another repository so feel free to use it (see [`scripts/font-install`](https://gitlab.com/svarrette-anssi/tutorial-git/-/blob/main/scripts/font-install))\n\n    ```bash\n    wget -nv -P /tmp https://gitlab.com/svarrette-anssi/tutorial-git/-/raw/main/scripts/font-install\n    less /tmp/font-install # review the script \n    /tmp/font-install -h  # help / usage\n    /tmp/font-install     # dry-run\n    /tmp/font-install  -x # => install FiraCode Meslo SourceCodePro\n    ```\n\n* Configure your favorite Terminal to use the patched Fonts with glyphs you just installed\n    \n    - also install your favorite [color scheme](https://gogh-co.github.io/Gogh/), in my case: DarkSide\n    \n* Install [Powerlevel10k for your plugin manager](https://github.com/romkatv/powerlevel10k#get-started) if not yet done:\n    \n    ```bash\n    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \"${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k\"\n    ```\n    \n    - In your zsh configuration, set `ZSH_THEME=\"powerlevel10k/powerlevel10k`\n    \n* Copy [`p10k-falkor.zsh`](.p10k.zsh) into `$ZSH/.p10k.zsh`\n\n* Restart zsh\n\nSee also [the official prompt customization guide](https://github.com/bhilburn/powerlevel9k#prompt-customization) for alternative segments you might wish to integrate.\n\n\n\n"
  },
  {
    "path": "oh-my-zsh/custom/.gitignore",
    "content": "/*.zsh\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_assh",
    "content": "#compdef assh\n###############################################################################\n# -*- mode:sh; -*-\n# Time-stamp: <Thu 2017-03-16 15:37 svarrette>\n#\n# Zsh completion for [assh](https://github.com/moul/advanced-ssh-config)\n#\n# Copyright (c) 2017 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n###############################################################################\n# Enable this completion file by adding somewhere in your zsh configuration (most\n# probably ~/.zshrc):\n#     fpath=(/path/to/this/dir $fpath)\n#\n# Test modification of this file in live in your shell:\n#\n#  unfunction _assh && autoload -U _assh\n#\n\ntypeset -A opt_args\n\n# Main dispatcher\n_assh()\n{\n    local -a _assh_cmds\n    _assh_cmds=(\n        'info:Display system-wide information'\n        'config:Manage ssh and assh configuration'\n        'sockets:Manage control sockets'\n        'help:Shows a list of commands or help for one command'\n        'connect:Connect to host SSH socket, used by ProxyCommand'\n    )\n    local curcontext=\"$curcontext\" state line ret=1\n    typeset -A opt_args\n    _arguments -C \\\n               '(- *)'{-h,--help}'[show this help message and exit]' \\\n               '(- *)'{--version,-v}\"[Show the version and exit]\" \\\n               '(- *)'{-q,--quiet}\"Silence warnings\" \\\n               '(- *)'{-V,--verbose}'[Enable verbose output]' \\\n               '(- *)'{--debug,-D}'[Enable debug mode]' \\\n               '(-c --config)'{-c,--config=}'[location of config file]:filename:_files' \\\n               ': :->command' \\\n               '*:: :->options' && ret=0\n    case $state in\n        (command)\n            _describe -t commands 'assh' _assh_cmds && ret=0\n            ;;\n        (options)\n            curcontext=${curcontext%:*}-$line[1]:\n            case $line[1] in\n                (config) __assh_config && ret=0;;\n                (connect) _hosts && ret=0;;\n                (info)  ret=0;;\n                (sockets) __assh_sockets && ret=0;;\n                (help)\n                    # could do better here to avoid repetition\n                    _describe -t commands 'assh help' _assh_cmds && ret=0\n                    ;;\n            esac\n            ;;\n    esac\n    return ret\n}\n\n## Manage ssh and assh configuration\n__assh_config() {\n    local -a _assh_config_cmds\n    _assh_config_cmds=(\n        'build:Build .ssh/config'\n        'json:Returns the JSON output'\n        'list:List all hosts from assh config'\n        'graphviz:Generate a Graphviz graph of the hosts'\n        'search:Search entries by given search text'\n        'help:Shows a list of commands or help for one command'\n    )\n    local curcontext=\"$curcontext\" state line\n    typeset -A opt_args\n    _arguments -C \\\n               '--help[show this help message and exit]' \\\n               ': :->command' \\\n               '*:: :->options'\n    case $state in\n        (command)\n            _describe -t commands \"assh config subcommand\" _assh_config_cmds\n            ;;\n        (options)\n            case $line[1] in\n                (help)\n                    _describe -t commands 'assh config help' _assh_config_cmds && ret=0\n                    ;;\n                (build)\n                    _arguments -C \\\n                               {-h,--help}'[show this help message and exit]' \\\n                               {-e,--expand}'[Expand all fields]' \\\n                               '--ignore-known-hosts:Ignore known-hosts file' && ret=0\n                    ;;\n                (json|list)\n                    _arguments -C \\\n                               {-e,--expand}'[Expand all fields]'  && ret=0\n                    ;;\n                (graphviz)\n                    _arguments -C \\\n                               '--show-isolated-hosts:Show isolated hosts' && ret=0\n                    ;;\n\n            esac\n            ;;\n    esac\n    return ret\n}\n\n# Manage control sockets\n__assh_sockets() {\n    local -a _assh_config_cmds\n    _assh_sockets_cmds=(\n        'list:List active control sockets'\n        'flush:Close control sockets'\n        'master:Open a master control socket'\n    )\n    local curcontext=\"$curcontext\" state line\n    typeset -A opt_args\n    _arguments -C \\\n               '--help[show this help message and exit]' \\\n               ': :->command' \\\n               '*:: :->options'\n    case $state in\n        (command)\n            _describe -t commands \"assh sockets subcommand\" _assh_sockets_cmds\n            ;;\n        (options)\n            case $line[1] in\n                (help)\n                    _describe -t commands 'assh sockets help' _assh_sockets_cmds && ret=0\n                    ;;\n                (list|flush|master)\n                    _arguments -C \\\n                               {-h,--help}'[show this help message and exit]' && ret=0\n                    ;;\n            esac\n            ;;\n    esac\n    return ret\n}\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_devbox",
    "content": "#compdef devbox\ncompdef _devbox devbox\n\n# zsh completion for devbox                               -*- shell-script -*-\n\n__devbox_debug()\n{\n    local file=\"$BASH_COMP_DEBUG_FILE\"\n    if [[ -n ${file} ]]; then\n        echo \"$*\" >> \"${file}\"\n    fi\n}\n\n_devbox()\n{\n    local shellCompDirectiveError=1\n    local shellCompDirectiveNoSpace=2\n    local shellCompDirectiveNoFileComp=4\n    local shellCompDirectiveFilterFileExt=8\n    local shellCompDirectiveFilterDirs=16\n    local shellCompDirectiveKeepOrder=32\n\n    local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace keepOrder\n    local -a completions\n\n    __devbox_debug \"\\n========= starting completion logic ==========\"\n    __devbox_debug \"CURRENT: ${CURRENT}, words[*]: ${words[*]}\"\n\n    # The user could have moved the cursor backwards on the command-line.\n    # We need to trigger completion from the $CURRENT location, so we need\n    # to truncate the command-line ($words) up to the $CURRENT location.\n    # (We cannot use $CURSOR as its value does not work when a command is an alias.)\n    words=(\"${=words[1,CURRENT]}\")\n    __devbox_debug \"Truncated words[*]: ${words[*]},\"\n\n    lastParam=${words[-1]}\n    lastChar=${lastParam[-1]}\n    __devbox_debug \"lastParam: ${lastParam}, lastChar: ${lastChar}\"\n\n    # For zsh, when completing a flag with an = (e.g., devbox -n=<TAB>)\n    # completions must be prefixed with the flag\n    setopt local_options BASH_REMATCH\n    if [[ \"${lastParam}\" =~ '-.*=' ]]; then\n        # We are dealing with a flag with an =\n        flagPrefix=\"-P ${BASH_REMATCH}\"\n    fi\n\n    # Prepare the command to obtain completions\n    requestComp=\"${words[1]} __complete ${words[2,-1]}\"\n    if [ \"${lastChar}\" = \"\" ]; then\n        # If the last parameter is complete (there is a space following it)\n        # We add an extra empty parameter so we can indicate this to the go completion code.\n        __devbox_debug \"Adding extra empty parameter\"\n        requestComp=\"${requestComp} \\\"\\\"\"\n    fi\n\n    __devbox_debug \"About to call: eval ${requestComp}\"\n\n    # Use eval to handle any environment variables and such\n    out=$(eval ${requestComp} 2>/dev/null)\n    __devbox_debug \"completion output: ${out}\"\n\n    # Extract the directive integer following a : from the last line\n    local lastLine\n    while IFS='\\n' read -r line; do\n        lastLine=${line}\n    done < <(printf \"%s\\n\" \"${out[@]}\")\n    __devbox_debug \"last line: ${lastLine}\"\n\n    if [ \"${lastLine[1]}\" = : ]; then\n        directive=${lastLine[2,-1]}\n        # Remove the directive including the : and the newline\n        local suffix\n        (( suffix=${#lastLine}+2))\n        out=${out[1,-$suffix]}\n    else\n        # There is no directive specified.  Leave $out as is.\n        __devbox_debug \"No directive found.  Setting do default\"\n        directive=0\n    fi\n\n    __devbox_debug \"directive: ${directive}\"\n    __devbox_debug \"completions: ${out}\"\n    __devbox_debug \"flagPrefix: ${flagPrefix}\"\n\n    if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then\n        __devbox_debug \"Completion received error. Ignoring completions.\"\n        return\n    fi\n\n    local activeHelpMarker=\"_activeHelp_ \"\n    local endIndex=${#activeHelpMarker}\n    local startIndex=$((${#activeHelpMarker}+1))\n    local hasActiveHelp=0\n    while IFS='\\n' read -r comp; do\n        # Check if this is an activeHelp statement (i.e., prefixed with $activeHelpMarker)\n        if [ \"${comp[1,$endIndex]}\" = \"$activeHelpMarker\" ];then\n            __devbox_debug \"ActiveHelp found: $comp\"\n            comp=\"${comp[$startIndex,-1]}\"\n            if [ -n \"$comp\" ]; then\n                compadd -x \"${comp}\"\n                __devbox_debug \"ActiveHelp will need delimiter\"\n                hasActiveHelp=1\n            fi\n\n            continue\n        fi\n\n        if [ -n \"$comp\" ]; then\n            # If requested, completions are returned with a description.\n            # The description is preceded by a TAB character.\n            # For zsh's _describe, we need to use a : instead of a TAB.\n            # We first need to escape any : as part of the completion itself.\n            comp=${comp//:/\\\\:}\n\n            local tab=\"$(printf '\\t')\"\n            comp=${comp//$tab/:}\n\n            __devbox_debug \"Adding completion: ${comp}\"\n            completions+=${comp}\n            lastComp=$comp\n        fi\n    done < <(printf \"%s\\n\" \"${out[@]}\")\n\n    # Add a delimiter after the activeHelp statements, but only if:\n    # - there are completions following the activeHelp statements, or\n    # - file completion will be performed (so there will be choices after the activeHelp)\n    if [ $hasActiveHelp -eq 1 ]; then\n        if [ ${#completions} -ne 0 ] || [ $((directive & shellCompDirectiveNoFileComp)) -eq 0 ]; then\n            __devbox_debug \"Adding activeHelp delimiter\"\n            compadd -x \"--\"\n            hasActiveHelp=0\n        fi\n    fi\n\n    if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then\n        __devbox_debug \"Activating nospace.\"\n        noSpace=\"-S ''\"\n    fi\n\n    if [ $((directive & shellCompDirectiveKeepOrder)) -ne 0 ]; then\n        __devbox_debug \"Activating keep order.\"\n        keepOrder=\"-V\"\n    fi\n\n    if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then\n        # File extension filtering\n        local filteringCmd\n        filteringCmd='_files'\n        for filter in ${completions[@]}; do\n            if [ ${filter[1]} != '*' ]; then\n                # zsh requires a glob pattern to do file filtering\n                filter=\"\\*.$filter\"\n            fi\n            filteringCmd+=\" -g $filter\"\n        done\n        filteringCmd+=\" ${flagPrefix}\"\n\n        __devbox_debug \"File filtering command: $filteringCmd\"\n        _arguments '*:filename:'\"$filteringCmd\"\n    elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then\n        # File completion for directories only\n        local subdir\n        subdir=\"${completions[1]}\"\n        if [ -n \"$subdir\" ]; then\n            __devbox_debug \"Listing directories in $subdir\"\n            pushd \"${subdir}\" >/dev/null 2>&1\n        else\n            __devbox_debug \"Listing directories in .\"\n        fi\n\n        local result\n        _arguments '*:dirname:_files -/'\" ${flagPrefix}\"\n        result=$?\n        if [ -n \"$subdir\" ]; then\n            popd >/dev/null 2>&1\n        fi\n        return $result\n    else\n        __devbox_debug \"Calling _describe\"\n        if eval _describe $keepOrder \"completions\" completions $flagPrefix $noSpace; then\n            __devbox_debug \"_describe found some completions\"\n\n            # Return the success of having called _describe\n            return 0\n        else\n            __devbox_debug \"_describe did not find completions.\"\n            __devbox_debug \"Checking if we should do file completion.\"\n            if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then\n                __devbox_debug \"deactivating file completion\"\n\n                # We must return an error code here to let zsh know that there were no\n                # completions found by _describe; this is what will trigger other\n                # matching algorithms to attempt to find completions.\n                # For example zsh can match letters in the middle of words.\n                return 1\n            else\n                # Perform file completion\n                __devbox_debug \"Activating file completion\"\n\n                # We must return the result of this command, so it must be the\n                # last command, or else we must store its result to return it.\n                _arguments '*:filename:_files'\" ${flagPrefix}\"\n            fi\n        fi\n    fi\n}\n\n# don't run the completion function when being source-ed or eval-ed\nif [ \"$funcstack[1]\" = \"_devbox\" ]; then\n    _devbox\nfi\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_gh",
    "content": "#compdef gh\ncompdef _gh gh\n\n# zsh completion for gh                                   -*- shell-script -*-\n\n__gh_debug()\n{\n    local file=\"$BASH_COMP_DEBUG_FILE\"\n    if [[ -n ${file} ]]; then\n        echo \"$*\" >> \"${file}\"\n    fi\n}\n\n_gh()\n{\n    local shellCompDirectiveError=1\n    local shellCompDirectiveNoSpace=2\n    local shellCompDirectiveNoFileComp=4\n    local shellCompDirectiveFilterFileExt=8\n    local shellCompDirectiveFilterDirs=16\n    local shellCompDirectiveKeepOrder=32\n\n    local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace keepOrder\n    local -a completions\n\n    __gh_debug \"\\n========= starting completion logic ==========\"\n    __gh_debug \"CURRENT: ${CURRENT}, words[*]: ${words[*]}\"\n\n    # The user could have moved the cursor backwards on the command-line.\n    # We need to trigger completion from the $CURRENT location, so we need\n    # to truncate the command-line ($words) up to the $CURRENT location.\n    # (We cannot use $CURSOR as its value does not work when a command is an alias.)\n    words=(\"${=words[1,CURRENT]}\")\n    __gh_debug \"Truncated words[*]: ${words[*]},\"\n\n    lastParam=${words[-1]}\n    lastChar=${lastParam[-1]}\n    __gh_debug \"lastParam: ${lastParam}, lastChar: ${lastChar}\"\n\n    # For zsh, when completing a flag with an = (e.g., gh -n=<TAB>)\n    # completions must be prefixed with the flag\n    setopt local_options BASH_REMATCH\n    if [[ \"${lastParam}\" =~ '-.*=' ]]; then\n        # We are dealing with a flag with an =\n        flagPrefix=\"-P ${BASH_REMATCH}\"\n    fi\n\n    # Prepare the command to obtain completions\n    requestComp=\"${words[1]} __complete ${words[2,-1]}\"\n    if [ \"${lastChar}\" = \"\" ]; then\n        # If the last parameter is complete (there is a space following it)\n        # We add an extra empty parameter so we can indicate this to the go completion code.\n        __gh_debug \"Adding extra empty parameter\"\n        requestComp=\"${requestComp} \\\"\\\"\"\n    fi\n\n    __gh_debug \"About to call: eval ${requestComp}\"\n\n    # Use eval to handle any environment variables and such\n    out=$(eval ${requestComp} 2>/dev/null)\n    __gh_debug \"completion output: ${out}\"\n\n    # Extract the directive integer following a : from the last line\n    local lastLine\n    while IFS='\\n' read -r line; do\n        lastLine=${line}\n    done < <(printf \"%s\\n\" \"${out[@]}\")\n    __gh_debug \"last line: ${lastLine}\"\n\n    if [ \"${lastLine[1]}\" = : ]; then\n        directive=${lastLine[2,-1]}\n        # Remove the directive including the : and the newline\n        local suffix\n        (( suffix=${#lastLine}+2))\n        out=${out[1,-$suffix]}\n    else\n        # There is no directive specified.  Leave $out as is.\n        __gh_debug \"No directive found.  Setting do default\"\n        directive=0\n    fi\n\n    __gh_debug \"directive: ${directive}\"\n    __gh_debug \"completions: ${out}\"\n    __gh_debug \"flagPrefix: ${flagPrefix}\"\n\n    if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then\n        __gh_debug \"Completion received error. Ignoring completions.\"\n        return\n    fi\n\n    local activeHelpMarker=\"_activeHelp_ \"\n    local endIndex=${#activeHelpMarker}\n    local startIndex=$((${#activeHelpMarker}+1))\n    local hasActiveHelp=0\n    while IFS='\\n' read -r comp; do\n        # Check if this is an activeHelp statement (i.e., prefixed with $activeHelpMarker)\n        if [ \"${comp[1,$endIndex]}\" = \"$activeHelpMarker\" ];then\n            __gh_debug \"ActiveHelp found: $comp\"\n            comp=\"${comp[$startIndex,-1]}\"\n            if [ -n \"$comp\" ]; then\n                compadd -x \"${comp}\"\n                __gh_debug \"ActiveHelp will need delimiter\"\n                hasActiveHelp=1\n            fi\n\n            continue\n        fi\n\n        if [ -n \"$comp\" ]; then\n            # If requested, completions are returned with a description.\n            # The description is preceded by a TAB character.\n            # For zsh's _describe, we need to use a : instead of a TAB.\n            # We first need to escape any : as part of the completion itself.\n            comp=${comp//:/\\\\:}\n\n            local tab=\"$(printf '\\t')\"\n            comp=${comp//$tab/:}\n\n            __gh_debug \"Adding completion: ${comp}\"\n            completions+=${comp}\n            lastComp=$comp\n        fi\n    done < <(printf \"%s\\n\" \"${out[@]}\")\n\n    # Add a delimiter after the activeHelp statements, but only if:\n    # - there are completions following the activeHelp statements, or\n    # - file completion will be performed (so there will be choices after the activeHelp)\n    if [ $hasActiveHelp -eq 1 ]; then\n        if [ ${#completions} -ne 0 ] || [ $((directive & shellCompDirectiveNoFileComp)) -eq 0 ]; then\n            __gh_debug \"Adding activeHelp delimiter\"\n            compadd -x \"--\"\n            hasActiveHelp=0\n        fi\n    fi\n\n    if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then\n        __gh_debug \"Activating nospace.\"\n        noSpace=\"-S ''\"\n    fi\n\n    if [ $((directive & shellCompDirectiveKeepOrder)) -ne 0 ]; then\n        __gh_debug \"Activating keep order.\"\n        keepOrder=\"-V\"\n    fi\n\n    if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then\n        # File extension filtering\n        local filteringCmd\n        filteringCmd='_files'\n        for filter in ${completions[@]}; do\n            if [ ${filter[1]} != '*' ]; then\n                # zsh requires a glob pattern to do file filtering\n                filter=\"\\*.$filter\"\n            fi\n            filteringCmd+=\" -g $filter\"\n        done\n        filteringCmd+=\" ${flagPrefix}\"\n\n        __gh_debug \"File filtering command: $filteringCmd\"\n        _arguments '*:filename:'\"$filteringCmd\"\n    elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then\n        # File completion for directories only\n        local subdir\n        subdir=\"${completions[1]}\"\n        if [ -n \"$subdir\" ]; then\n            __gh_debug \"Listing directories in $subdir\"\n            pushd \"${subdir}\" >/dev/null 2>&1\n        else\n            __gh_debug \"Listing directories in .\"\n        fi\n\n        local result\n        _arguments '*:dirname:_files -/'\" ${flagPrefix}\"\n        result=$?\n        if [ -n \"$subdir\" ]; then\n            popd >/dev/null 2>&1\n        fi\n        return $result\n    else\n        __gh_debug \"Calling _describe\"\n        if eval _describe $keepOrder \"completions\" completions $flagPrefix $noSpace; then\n            __gh_debug \"_describe found some completions\"\n\n            # Return the success of having called _describe\n            return 0\n        else\n            __gh_debug \"_describe did not find completions.\"\n            __gh_debug \"Checking if we should do file completion.\"\n            if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then\n                __gh_debug \"deactivating file completion\"\n\n                # We must return an error code here to let zsh know that there were no\n                # completions found by _describe; this is what will trigger other\n                # matching algorithms to attempt to find completions.\n                # For example zsh can match letters in the middle of words.\n                return 1\n            else\n                # Perform file completion\n                __gh_debug \"Activating file completion\"\n\n                # We must return the result of this command, so it must be the\n                # last command, or else we must store its result to return it.\n                _arguments '*:filename:_files'\" ${flagPrefix}\"\n            fi\n        fi\n    fi\n}\n\n# don't run the completion function when being source-ed or eval-ed\nif [ \"$funcstack[1]\" = \"_gh\" ]; then\n    _gh\nfi\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_git-subtree",
    "content": "#compdef git-subtree\n#description mange subtree paths\n\n__git_subtree() {\n\nlocal curcontext=$curcontext state line ret=1\ndeclare -A opt_args\n\n_arguments -C \\\n  '(-h --help)'{-h,--help}'[show the help]' \\\n  '-q[quiet command output]' \\\n  '-d[show debug messages]' \\\n  ': :->command' \\\n  '*:: :->option-or-argument' && ret=0\n\ncase $state in\n  (command)\n    declare -a commands\n\n    commands=(\n      'add:add a new subtree'\n      'merge:merge remote refspec into prefix'\n      'pull:fetch remote refspec and merge'\n      'push:push local changes to remote refspec'\n      'split:separate local subtree into separate branch')\n\n    _describe -t commands command commands && ret=0\n    ;;\n  (option-or-argument)\n    curcontext=${curcontext%:*}-$line[1]:\n\n    case $line[1] in\n      (add|merge|pull|push)\n        _arguments -w -S -s \\\n          '--squash[merge subtree changes as a single commit]' \\\n          '(-P,--prefix)'{-P,--prefix=}'[path to the subdirectory]:subtree path:_directories -r \"\"' \\\n          '(-m,--message)'{-m,--message=}'[commit message for the merge]' \\\n          ':repository:__git_any_repositories' \\\n          ':remote branch:__git_remotes' && ret=0\n        ;;\n      (split)\n        _arguments -w -S -s \\\n          '--annotate=[add message as annotation to each commit]' \\\n          '(-b,--branch)'{-b,--branch=}'[name of branch to contain new history]: :__git_local_branch_names' \\\n          '(-P,--prefix)'{-P,--prefix=}'[path to the subdirectory]:subtree path:_directories -r \"\"' \\\n          '--ignore-joins[force regeneration of entire history, skips rejoin points]' \\\n          '--onto=[commit id of first revision of subproject history]: :__git_tree_ishs' \\\n          '--rejoin[merge newly created history back into main project]' && ret=0\n        ;;\n    esac\n    ;;\nesac\n\nreturn ret\n\n}\n# vim: set ft=zsh:\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_keybase",
    "content": "#compdef keybase\n#autoload\n\n# keybase completion, based on cli help text\n# https://github.com/rbirnie/oh-my-zsh-keybase\n\nlocal curcontext=\"$curcontext\" state line ret=1\nlocal -a _command_args\n\n_arguments -C -A \"-v\" -A \"--version\" \\\n  '(- 1 *)'{-v,--version}'[display version information]' \\\n  '1: :->cmds' \\\n  '*:: :->args' && ret=0\n\ncase $state in\n  cmds)\n    _values \"keybase command\" \\\n    \"btc[add a signed cryptocurrency address to your profile]\" \\\n    \"cert[print out the CA cert the client uses to authorize HTTPS connections]\" \\\n    \"dir[sign or verify a directory's contents]\" \\\n    \"config[make an initial configuration file]\" \\\n    \"decrypt[decrypt a file]\" \\\n    \"encrypt[encrypt a message and output to stdout or a file]\" \\\n    \"help[display help]\" \\\n    \"id[Identify a user, but do not accept or reject trust]\" \\\n    \"join[establish a new account on keybase.io]\" \\\n    \"keygen[generate a new PGP public key and optionally push it to the server]\" \\\n    \"list-signatures[list of your non-revoked signatures]\" \\\n    \"list-tracking[list people you are tracking]\" \\\n    \"login[establish a session]\" \\\n    \"logout[logout from the server]\" \\\n    \"pull[pull your public (& private, if possible) key(s) from the server]\" \\\n    \"push[push a PGP key from the client to the server]\" \\\n    \"prove[add a proof of identity]\" \\\n    \"reset[reset the local setup, deleting all local cached state]\" \\\n    \"revoke[revoke the currently active PGP keys]\" \\\n    \"revoke-signatures[revoke a proof or signature]\" \\\n    \"search[search all users]\" \\\n    \"sign[sign a message]\" \\\n    \"status[print current status]\" \\\n    \"switch[switch to a different user, and nuke the current state]\" \\\n    \"track[verify a user's authenticity and optionally track them]\" \\\n    \"untrack[untrack this user]\" \\\n    \"update[update the keybase client software]\" \\\n    \"verify[verify a file]\" \\\n    \"version[output version information about this client]\"\n    ret=0\n    ;;\n  args)\n    case $line[1] in\n      help)\n        _values 'commands' \\\n          'btc' \\\n          'cert' \\\n          'dir' \\\n          'config' \\\n          'decrypt' \\\n          'encrypt' \\\n          'help' \\\n          'id' \\\n          'join' \\\n          'keygen' \\\n          'list-signatures' \\\n          'list-tracking' \\\n          'login' \\\n          'logout' \\\n          'pull' \\\n          'push' \\\n          'prove' \\\n          'reset' \\\n          'revoke' \\\n          'revoke-signatures' \\\n          'search' \\\n          'sign' \\\n          'status' \\\n          'switch' \\\n          'track' \\\n          'untrack' \\\n          'update' \\\n          'verify' \\\n          'version' && ret=0\n        ;;\n      btc)\n        _values \"btc command\" \\\n          'btc[the address to sign and publicly post]'\n        _command_args=(\n          '(--force)--force[force overwrite, revoking any old addresses]'\n        )\n        ;;\n      cert)\n        _values \"cert command\" \\\n          'host[which host to authorize]'\n        _command_args=(\n          '(--all)--all[list all possible certs in JSON form]' \\\n        )\n        ;;\n      config)\n        _command_args=(\n          '(--get)--get[Read the given configuration option]:GET' \\\n          '(--json)--json[interpret the value as JSON]' \\\n          '(--pretty)--pretty[pretty-print JSON]' \\\n          '(--server)--server[specify which server to use]:SERVER' \\\n          '(--reset-server)--reset-server[reset the server to default]' \\\n        )\n        ;;\n      decrypt)\n        _command_args=(\n          '(--base64)--base64[output result as base64-encoded data]' \\\n          '(--track-remote)--track-remote[remotely track by default]' \\\n          '(--track-local)--track-local[do not prompt for remote tracking]' \\\n          '(--assert)--assert=-[provide an identity assertion]:ASSERT' \\\n          '(--batch)--batch[batch-mode without interactivity]' \\\n          '(--prompt-remote)--prompt-remote[prompt for remote tracking]' \\\n          '(--track)--track[prompt for tracking if necessary]' \\\n          '(--no-id)--no-id[do not try to ID the user]' \\\n          '(--signed)--signed[assert signed]' \\\n          '(--signed-by)--signed-by=-[assert signed by the given user]:SIGNED_BY' \\\n          '(--message)--message=-[provide the message on the command line]:MESSAGE' \\\n          '(--output)--output=-[output to the given file]:OUTPUT'\\\n        )\n        _files\n        ;;\n      dir)\n        _values \"dir command\" \\\n          \"sign[sign a directory's contents]\" \\\n          \"verify[verify a directory's contents]\"\n        ;;\n      encrypt)\n        _command_args=(\n          '(--track-remote)--track-remote[remotely track by default]' \\\n          '(--track-local)--track-local[do not prompt for remote tracking]' \\\n          '(--assert)--assert=-[provide an identity assertion]:ASSERT' \\\n          '(--batch)--batch[batch-mode without interactivity]' \\\n          '(--prompt-remote)--prompt-remote[prompt for remote tracking]' \\\n          '(--sign)--sign[sign in addition to encrypting]' \\\n          '(--message)--message=-[provide the message on the command line]:MESSAGE' \\\n          '(--binary)--binary[output in binary (rather than ASCII/armored)]' \\\n          '(--output)--output=-[the output file to write the encryption to]' \\\n        )\n        _values \"encrypt command\" \\\n          'them[the username of the receiver]'\n        _files\n        ;;\n      id)\n        _values \"id command\" \\\n          'them[the username to id]'\n        _command_args=(\n          '(--assert)--assert=-[provide a key assertion]:ASSERT' \\\n        )\n        ;;\n      keygen)\n        _command_args=(\n          '(--push)--push[true if we should push]' \\\n          '(--secret)--secret[push the secret key to the server]' \\\n          '(--update)--update[update the public key with new key fields]' \\\n        )\n        ;;\n      list-signatures)\n        _command_args=(\n          '(--revoked)--revoked[show revoked signatures too]' \\\n          '(--verbose)--verbose[a full dump, with more gory details]' \\\n          '(--json)--json[output in json format; default is simple text list]' \\\n          '(--type)--type=-[the type of signatures to output; choose from \"track\",\"proof\",\"currency\",\"self\"; all by default]:TYPE' \\\n        )\n        ;;\n      list-tracking)\n        _command_args=(\n          '(--verbose)--verbose[a full dump, with more gory details]' \\\n          '(--json)--json[output in json format; default is simple text list]' \\\n        )\n        _values \"list-tracking\" \\\n          'filter[a regex to filter by]'\n        ;;\n      login)\n        _command_args=(\n          '(--no-key-pull)--no-key-pull[do not pull secret key from server]' \\\n        )\n        ;;\n      pull)\n        _command_args=(\n          '(--force)--force[force repull from server even if it is already stored locally]' \\\n        )\n        ;;\n      push)\n        _command_args=(\n          '(--gen)--gen[generate a new key]' \\\n          '(--show-public-only-keys)--show-public-only-keys[Allow picking of public keys for which no secret key is available (not recommended)]' \\\n          '(--skip-add-email)--skip-add-email[Skip the prompt asking if we want to store email to key; do not do it]' \\\n          '(--add-email)--add-email[Add email to key by default, if needed]' \\\n          '(--secret)--secret[push the secret key to the server]' \\\n          '(--update)--update[update the public key with new key fields]' \\\n        )\n        _values \"push command\" \\\n          'search[search parameter to find the right key]'\n        ;;\n      prove)\n        _command_args=(\n          '(--help)--help[Show this help message and exit.]' \\\n          '(--force)--force[do not stop for any prompts]' \\\n          '(--output)--output[output proof text to file (rather than standard out)]:OUTPUT' \\\n        )\n        _values \"push command\" \\\n          'service[the name of service; can be one of: {twitter,github,web,dns,reddit,coinbase,hackernews}]' \\\n          'remote_name[username or hostname at that service]'\n        ;;\n      reset|revoke|switch)\n        _command_args=(\n          '(--force)--force[do not prompt for approval; force it]' \\\n        )\n        ;;\n      revoke-signatures)\n        _command_args=(\n          '(--seqno)--seqno[specify signature as a sequence number]' \\\n        )\n        ;;\n      search)\n        _command_args=(\n          '(--verbose)--verbose[a full dump, with more gory details]' \\\n          '(--json)--json[output in json format; default is simple text list]' \\\n        )\n        ;;\n      sign)\n        _command_args=(\n          '(--message)--message=-[provide the message on the command line]:MESSAGE' \\\n          '(--binary)--binary[output in binary (rather than ASCII/armored)]' \\\n          '(--clearsign)--clearsign[make a clear signature]' \\\n          '(--detach-sign)--detach-sign[make a detached signature]' \\\n          '(--output)--output=-[specify an output file]:OUTPUT:_files' \\\n        )\n        _files\n        ;;\n      status)\n        _command_args=(\n          '(--text)--text[output in text format; default is JSON]' \\\n        )\n        ;;\n      track)\n        _command_args=(\n          '(--track-remote)--track-remote[remotely track by default]' \\\n          '(--track-local)--track-local[do not prompt for remote tracking]' \\\n          '(--assert)--assert=-[provide an identity assertion]:ASSERT' \\\n          '(--batch)--batch[batch-mode without interactivity]' \\\n          '(--prompt-remote)--prompt-remote[prompt for remote tracking]' \\\n        )\n        _values \"untrack command\" \\\n          'them[the username of the user to track]'\n        ;;\n      untrack)\n        _command_args=(\n          '(--remove-key)--remove-key[remove key from GPG keyring]' \\\n          '(--batch)--batch[run in batch mode / do not prompt]' \\\n          '(--keep-key)--keep-key[preserve key in GPG keyring]' \\\n        )\n        _values \"untrack command\" \\\n          'them[the username of the user to untrack]'\n        ;;\n      update)\n        _command_args=(\n          '(--npm)--npm=-[an alternate path for NPM]:NPM' \\\n          '(--url)--url=-[specify a URL prefix for fetching]:URL' \\\n          '(--skip-cleanup)--skip-cleanup[Do not cleanup temporary stuff after install]' \\\n          '(--cmd)--cmd=-[the command to run]:CMD' \\\n          '(--prefix)--prefix=-[the prefix to install to]:PREFIX' \\\n          '(--global)--global[install globally; do not try to guess prefix]' \\\n        )\n        ;;\n      verify)\n        _command_args=(\n          '(--base64)--base64[output result as base64-encoded data]' \\\n          '(--track-remote)--track-remote[remotely track by default]' \\\n          '(--track-local)--track-local[do not prompt for remote tracking]' \\\n          '(--assert)--assert=-[provide an identity assertion]:ASSERT' \\\n          '(--batch)--batch[batch-mode without interactivity]' \\\n          '(--prompt-remote)--prompt-remote[prompt for remote tracking]' \\\n          '(--track)--track[prompt for tracking if necessary]' \\\n          '(--no-id)--no-id[do not try to ID the user]' \\\n          '(--signed)--signed[assert signed]' \\\n          '(--signed-by)--signed-by=-[assert signed by the given user]:SIGNED_BY' \\\n          '(--message)--message=-[provide the message on the command line]:MESSAGE' \\\n        )\n        _files\n        ;;\n    esac\n    ;;\nesac\n\n_arguments \\\n  $_command_args \\\n  '(-h)'--help'[Show help message and exit.]' \\\n  &&  return 0\n\nreturn ret\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_mkdocs",
    "content": "#compdef mkdocs\n########################################################################################\n# -*- mode:sh; -*-\n# Time-stamp: <Thu 2017-02-02 15:36 svarrette>\n#\n# Zsh completion for [MkDocs](http://www.mkdocs.org/)\n#\n# Copyright (c) 2017 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n################################################################################\n# Enable this completion file by adding somewhere in your zsh configuration (most\n# probably ~/.zshrc):\n#     fpath=(/path/to/this/dir $fpath)\n# Test modification in live in your shell:\n#\n#  unfunction _mkdocs && autoload -U _mkdocs\n#\ntypeset -A opt_args\n\n# Main dispatcher\n_mkdocs()\n{\n    local -a _mkdocs_cmds\n    _mkdocs_cmds=(\n        'build:Build the MkDocs documentation'\n        'gh-deploy:Deploy your documentation to GitHub Pages'\n        'json:Build the MkDocs documentation to JSON files...'\n        'new:Create a new MkDocs project'\n        'serve:Run the builtin development server'\n    )\n    local curcontext=\"$curcontext\" state line ret=1\n    typeset -A opt_args\n    _arguments -C \\\n               '(- *)'{-h,--help}'[show this help message and exit]' \\\n               '(- *)'{--version,-V}\"[Show the version and exit]\" \\\n               '(- *)'{-q,--quiet}\"Silence warnings\" \\\n               '(- *)'{-v,--verbose}'[Enable verbose output]' \\\n               ': :->command' \\\n               '*:: :->options' && ret=0\n    case $state in\n        (command)\n            _describe -t commands 'mkdocs' _mkdocs_cmds && ret=0\n            ;;\n        (options)\n            curcontext=${curcontext%:*}-$line[1]:\n            case $line[1] in\n                (build) ret=0;;\n                (serve) __mkdocs_serve && ret=0;;\n                (new) _arguments -C \\\n                {-h,--help}'[show this help message and exit]' \\\n                \":dir:_directories\" && ret=0;;\n            esac\n            ;;\n    esac\n    return ret\n}\n\n## Run the builtin development server\n__mkdocs_serve() {\n  local curcontext=$curcontext state line ret=1\n  declare -A opt_args\n  _arguments -s -S \\\n     {-h,--help}'[show this help message and exit]:' \\\n     {-q,--quiet}\"[Silence warnings]:\" \\\n     {-v,--verbose}'[Enable verbose output]' \\\n     {-s,--strict}'[Enable strict mode. This will cause MkDocs to abort the build on any warnings.]' \\\n     '--theme[The theme to use when building your documentation]:theme:(readthedocs mkdocs)' \\\n     '--livereload[Enable the live reloading in the development server (this is the default)]' \\\n     '--no-livereload[Disable the live reloading in the development server]' \\\n     '--dirtyreload[Enable the live reloading in the development server, but only re-build files that have changed]' \\\n     '--dev-addr[IP address and port to serve documentation locally]:host:(localhost\\:8000 localhost\\:8080)' \\\n     \"*::args:_nothing\"\n}\n\n_mkdocs \"$@\"\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_parallel",
    "content": "#compdef parallel\n###############################################################################\n# -*- mode:sh; -*-\n# Zsh completion for GNU parallel\n#\n# Adapted from https://github.com/cgjosephlee/GNU-parallel-zsh-completion/\n# (completed with my other options)\n###############################################################################\n# Enable this completion file by adding somewhere in your zsh configuration (most\n# probably ~/.zshrc):\n#     fpath=(/path/to/this/dir $fpath)\n#\n# Test modification of this file in live in your shell:\n#\n#  unfunction _parallel && autoload -U _parallel\n#\n\n\nlocal args\n\nargs+=(\n    '(--bar)--bar[Show progress as a progress bar]'\n    '(--bg)--bg[Run command in background]'\n    '(--dry-run)--dry-run[Print the job to run and do nothing]'\n    '(--eta)--eta[Show the estimated number of seconds before finishing]'\n    '(-j --jobs --max-procs -P)'{-j+,--jobs,--max-procs,-P+}'[Run this many jobs in parallel (see manual)]:int:'\n    '(--joblog)--joblog[Logfile for executed jobs]::_files'\n    '(-k --keep-order)'{-k,--keep-order}'[Keep sequence of output same as the order of input]'\n    '(--fg)--fg[Run command in foreground]'\n    '(-C --colsep)'{-C,--colsep}'[Column separator]:regexp:'\n    '(--number-of-cores)--number-of-cores[Print  the  number  of  physical CPU cores and exit]'\n    '(--number-of-threads)--number-of-threads[Print  the  number  of  hyperthreaded  CPU cores and exit]'\n    '(--pipe --spreadstdin)'{--pipe,--spreadstdin}'[Spread input to jobs on stdin]'\n    '(-p --interactive)'{-p,--interactive}'[Prompt the user about whether to run each command line (implies -v)]'\n    '(--plus)--plus[Activate additional replacement strings]'\n    '(--progress)--progress[Show progress of computations]'\n    '(-r --no-run-if-empty)'{-r,--no-run-if-empty}'[Skip if the stdin only contains whitespace]'\n    '(--recstart)--recstart[String used to split at record start]:string:'\n    '(--recend)--recend[String used to split at record end]:string:'\n    '(--resume --resume-failed --retry-failed)'{--resume,--resume-failed,--retry-failed}'[Retry all failed jobs in joblog (see manual)]'\n    '(--retries)--retries[Retry n times]:int:'\n    '(--rpl)--rpl[Use tag as a replacement string for perl expression]:string:'\n    '(--regexp)--regexp[Interpret --recstart and --recend as regular expressions]:string:'\n    '(--semaphore)--semaphore[Work as a counting semaphore (implies --bg)]'\n    '(--tag)--tag[Tag lines with arguments as prefix and TAB (\\t)]'\n    '(--tee)--tee[Pipe all data to all jobs]'\n    '(--trim)--trim[Trim white space in input]:string:((\n        n\\:\\ No\\ trim\n        l\\:\\ Left\\ trim\n        r\\:\\ Right\\ trim\n        lr\\:\\ Both\\ trim\n        rl\\:\\ Both\\ trim\n    ))'\n    '(--use-cores-instead-of-threads)--use-cores-instead-of-threads[Use physical cores instead of hyperthreaded cores as parallelism degree]'\n    '(-v --verbose)'{-v,--verbose}'[Print the job to be run on stderr]'\n    '(-):command: _command_names -e'\n    '*::args: _normal'\n    )\n\n_arguments -s $args\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_poetry",
    "content": "#compdef poetry\n\n_poetry_82f996e0042b8327_complete()\n{\n    local state com cur\n    local -a opts\n    local -a coms\n\n    cur=${words[${#words[@]}]}\n\n    # lookup for command\n    for word in ${words[@]:1}; do\n        if [[ $word != -* ]]; then\n            com=$word\n            break\n        fi\n    done\n\n    if [[ ${cur} == --* ]]; then\n        state=\"option\"\n        opts+=(\"--ansi:Force ANSI output.\" \"--directory:The working directory for the Poetry command \\(defaults to the current working directory\\).\" \"--help:Display help for the given command. When no command is given display help for the list command.\" \"--no-ansi:Disable ANSI output.\" \"--no-cache:Disables Poetry source caches.\" \"--no-interaction:Do not ask any interactive question.\" \"--no-plugins:Disables plugins.\" \"--quiet:Do not output any message.\" \"--verbose:Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug.\" \"--version:Display this application version.\")\n    elif [[ $cur == $com ]]; then\n        state=\"command\"\n        coms+=(\"about:Shows information about Poetry.\" \"add:Adds a new dependency to pyproject.toml and installs it.\" \"build:Builds a package, as a tarball and a wheel by default.\" \"'cache clear':Clears a Poetry cache by name.\" \"'cache list':List Poetry\\'s caches.\" \"check:Validates the content of the pyproject.toml file and its consistency with the poetry.lock file.\" \"config:Manages configuration settings.\" \"'debug info':Shows debug information.\" \"'debug resolve':Debugs dependency resolution.\" \"'env info':Displays information about the current environment.\" \"'env list':Lists all virtualenvs associated with the current project.\" \"'env remove':Remove virtual environments associated with the project.\" \"'env use':Activates or creates a new virtualenv for the current project.\" \"export:Exports the lock file to alternative formats.\" \"help:Displays help for a command.\" \"init:Creates a basic pyproject.toml file in the current directory.\" \"install:Installs the project dependencies.\" \"list:Lists commands.\" \"lock:Locks the project dependencies.\" \"new:Creates a new Python project at <path\\>.\" \"publish:Publishes a package to a remote repository.\" \"remove:Removes a package from the project dependencies.\" \"run:Runs a command in the appropriate environment.\" \"search:Searches for packages on remote repositories.\" \"'self add':Add additional packages to Poetry\\'s runtime environment.\" \"'self install':Install locked packages \\(incl. addons\\) required by this Poetry installation.\" \"'self lock':Lock the Poetry installation\\'s system requirements.\" \"'self remove':Remove additional packages from Poetry\\'s runtime environment.\" \"'self show':Show packages from Poetry\\'s runtime environment.\" \"'self show plugins':Shows information about the currently installed plugins.\" \"'self update':Updates Poetry to the latest version.\" \"shell:Spawns a shell within the virtual environment.\" \"show:Shows information about packages.\" \"'source add':Add source configuration for project.\" \"'source remove':Remove source configured for the project.\" \"'source show':Show information about sources configured for the project.\" \"update:Update the dependencies as according to the pyproject.toml file.\" \"version:Shows the version of the project or bumps it when a valid bump rule is provided.\")\n    fi\n\n    case $state in\n        (command)\n            _describe 'command' coms\n        ;;\n        (option)\n            case \"$com\" in\n\n            (about)\n            opts+=()\n            ;;\n\n            (add)\n            opts+=(\"--allow-prereleases:Accept prereleases.\" \"--dev:Add as a development dependency. \\(Deprecated\\) Use --group=dev instead.\" \"--dry-run:Output the operations but do not execute anything \\(implicitly enables --verbose\\).\" \"--editable:Add vcs/path dependencies as editable.\" \"--extras:Extras to activate for the dependency.\" \"--group:The group to add the dependency to.\" \"--lock:Do not perform operations \\(only update the lockfile\\).\" \"--optional:Add as an optional dependency.\" \"--platform:Platforms for which the dependency must be installed.\" \"--python:Python version for which the dependency must be installed.\" \"--source:Name of the source to use to install the package.\")\n            ;;\n\n            (build)\n            opts+=(\"--format:Limit the format to either sdist or wheel.\" \"--output:Set output directory for build artifacts. Default is \\`dist\\`.\")\n            ;;\n\n            ('cache clear')\n            opts+=(\"--all:Clear all entries in the cache.\")\n            ;;\n\n            ('cache list')\n            opts+=()\n            ;;\n\n            (check)\n            opts+=(\"--lock:Checks that poetry.lock exists for the current version of pyproject.toml.\")\n            ;;\n\n            (config)\n            opts+=(\"--list:List configuration settings.\" \"--local:Set/Get from the project\\'s local configuration.\" \"--unset:Unset configuration setting.\")\n            ;;\n\n            ('debug info')\n            opts+=()\n            ;;\n\n            ('debug resolve')\n            opts+=(\"--extras:Extras to activate for the dependency.\" \"--install:Show what would be installed for the current system.\" \"--python:Python version\\(s\\) to use for resolution.\" \"--tree:Display the dependency tree.\")\n            ;;\n\n            ('env info')\n            opts+=(\"--executable:Only display the environment\\'s python executable path.\" \"--path:Only display the environment\\'s path.\")\n            ;;\n\n            ('env list')\n            opts+=(\"--full-path:Output the full paths of the virtualenvs.\")\n            ;;\n\n            ('env remove')\n            opts+=(\"--all:Remove all managed virtual environments associated with the project.\")\n            ;;\n\n            ('env use')\n            opts+=()\n            ;;\n\n            (export)\n            opts+=(\"--all-extras:Include all sets of extra dependencies.\" \"--dev:Include development dependencies. \\(Deprecated\\)\" \"--extras:Extra sets of dependencies to include.\" \"--format:Format to export to. Currently, only constraints.txt and requirements.txt are supported.\" \"--only:The only dependency groups to include.\" \"--output:The name of the output file.\" \"--with:The optional dependency groups to include.\" \"--with-credentials:Include credentials for extra indices.\" \"--without:The dependency groups to ignore.\" \"--without-hashes:Exclude hashes from the exported file.\" \"--without-urls:Exclude source repository urls from the exported file.\")\n            ;;\n\n            (help)\n            opts+=()\n            ;;\n\n            (init)\n            opts+=(\"--author:Author name of the package.\" \"--dependency:Package to require, with an optional version constraint, e.g. requests:\\^2.10.0 or requests=2.11.1.\" \"--description:Description of the package.\" \"--dev-dependency:Package to require for development, with an optional version constraint, e.g. requests:\\^2.10.0 or requests=2.11.1.\" \"--license:License of the package.\" \"--name:Name of the package.\" \"--python:Compatible Python versions.\")\n            ;;\n\n            (install)\n            opts+=(\"--all-extras:Install all extra dependencies.\" \"--compile:Compile Python source files to bytecode. \\(This option has no effect if modern-installation is disabled because the old installer always compiles.\\)\" \"--dry-run:Output the operations but do not execute anything \\(implicitly enables --verbose\\).\" \"--extras:Extra sets of dependencies to install.\" \"--no-dev:Do not install the development dependencies. \\(Deprecated\\)\" \"--no-directory:Do not install any directory path dependencies\\; useful to install dependencies without source code, e.g. for caching of Docker layers\\)\" \"--no-root:Do not install the root package \\(the current project\\).\" \"--only:The only dependency groups to include.\" \"--only-root:Exclude all dependencies.\" \"--remove-untracked:Removes packages not present in the lock file. \\(Deprecated\\)\" \"--sync:Synchronize the environment with the locked packages and the specified groups.\" \"--with:The optional dependency groups to include.\" \"--without:The dependency groups to ignore.\")\n            ;;\n\n            (list)\n            opts+=()\n            ;;\n\n            (lock)\n            opts+=(\"--check:Check that the poetry.lock file corresponds to the current version of pyproject.toml. \\(Deprecated\\) Use poetry check --lock instead.\" \"--no-update:Do not update locked versions, only refresh lock file.\")\n            ;;\n\n            (new)\n            opts+=(\"--name:Set the resulting package name.\" \"--readme:Specify the readme file format. Default is md.\" \"--src:Use the src layout for the project.\")\n            ;;\n\n            (publish)\n            opts+=(\"--build:Build the package before publishing.\" \"--cert:Certificate authority to access the repository.\" \"--client-cert:Client certificate to access the repository.\" \"--dist-dir:Dist directory where built artifact are stored. Default is \\`dist\\`.\" \"--dry-run:Perform all actions except upload the package.\" \"--password:The password to access the repository.\" \"--repository:The repository to publish the package to.\" \"--skip-existing:Ignore errors from files already existing in the repository.\" \"--username:The username to access the repository.\")\n            ;;\n\n            (remove)\n            opts+=(\"--dev:Remove a package from the development dependencies. \\(Deprecated\\) Use --group=dev instead.\" \"--dry-run:Output the operations but do not execute anything \\(implicitly enables --verbose\\).\" \"--group:The group to remove the dependency from.\" \"--lock:Do not perform operations \\(only update the lockfile\\).\")\n            ;;\n\n            (run)\n            opts+=()\n            ;;\n\n            (search)\n            opts+=()\n            ;;\n\n            ('self add')\n            opts+=(\"--allow-prereleases:Accept prereleases.\" \"--dry-run:Output the operations but do not execute anything \\(implicitly enables --verbose\\).\" \"--editable:Add vcs/path dependencies as editable.\" \"--extras:Extras to activate for the dependency.\" \"--source:Name of the source to use to install the package.\")\n            ;;\n\n            ('self install')\n            opts+=(\"--dry-run:Output the operations but do not execute anything \\(implicitly enables --verbose\\).\" \"--sync:Synchronize the environment with the locked packages and the specified groups.\")\n            ;;\n\n            ('self lock')\n            opts+=(\"--check:Check that the poetry.lock file corresponds to the current version of pyproject.toml. \\(Deprecated\\) Use poetry check --lock instead.\" \"--no-update:Do not update locked versions, only refresh lock file.\")\n            ;;\n\n            ('self remove')\n            opts+=(\"--dry-run:Output the operations but do not execute anything \\(implicitly enables --verbose\\).\")\n            ;;\n\n            ('self show')\n            opts+=(\"--addons:List only add-on packages installed.\" \"--latest:Show the latest version.\" \"--outdated:Show the latest version but only for packages that are outdated.\" \"--tree:List the dependencies as a tree.\")\n            ;;\n\n            ('self show plugins')\n            opts+=()\n            ;;\n\n            ('self update')\n            opts+=(\"--dry-run:Output the operations but do not execute anything \\(implicitly enables --verbose\\).\" \"--preview:Allow the installation of pre-release versions.\")\n            ;;\n\n            (shell)\n            opts+=()\n            ;;\n\n            (show)\n            opts+=(\"--all:Show all packages \\(even those not compatible with current system\\).\" \"--latest:Show the latest version.\" \"--no-dev:Do not list the development dependencies. \\(Deprecated\\)\" \"--only:The only dependency groups to include.\" \"--outdated:Show the latest version but only for packages that are outdated.\" \"--top-level:Show only top-level dependencies.\" \"--tree:List the dependencies as a tree.\" \"--why:When showing the full list, or a --tree for a single package, display whether they are a direct dependency or required by other packages\" \"--with:The optional dependency groups to include.\" \"--without:The dependency groups to ignore.\")\n            ;;\n\n            ('source add')\n            opts+=(\"--default:Set this source as the default \\(disable PyPI\\). A default source will also be the fallback source if you add other sources. \\(Deprecated, use --priority\\)\" \"--priority:Set the priority of this source. One of: default, primary, secondary, supplemental, explicit. Defaults to primary.\" \"--secondary:Set this source as secondary. \\(Deprecated, use --priority\\)\")\n            ;;\n\n            ('source remove')\n            opts+=()\n            ;;\n\n            ('source show')\n            opts+=()\n            ;;\n\n            (update)\n            opts+=(\"--dry-run:Output the operations but do not execute anything \\(implicitly enables --verbose\\).\" \"--lock:Do not perform operations \\(only update the lockfile\\).\" \"--no-dev:Do not update the development dependencies. \\(Deprecated\\)\" \"--only:The only dependency groups to include.\" \"--sync:Synchronize the environment with the locked packages and the specified groups.\" \"--with:The optional dependency groups to include.\" \"--without:The dependency groups to ignore.\")\n            ;;\n\n            (version)\n            opts+=(\"--dry-run:Do not update pyproject.toml file\" \"--next-phase:Increment the phase of the current version\" \"--short:Output the version number only\")\n            ;;\n\n            esac\n\n            _describe 'option' opts\n        ;;\n        *)\n            # fallback to file completion\n            _arguments '*:file:_files'\n    esac\n}\n\n_poetry_82f996e0042b8327_complete \"$@\"\ncompdef _poetry_82f996e0042b8327_complete /home/svarrette/.local/share/pipx/venvs/poetry/bin/poetry\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_rvm",
    "content": "#compdef rvm\n\n\\typeset curcontext state line cmds ret\n\ncurcontext=\"$curcontext\"\nret=1\n\n_arguments -C \\\n  '(- 1 *)'{-v,--version}'[display version information]' \\\n  '(-l|--level)'{-l,--level}'+[patch level to use with rvm use / install]:number' \\\n  '(--bin)--bin[path for binaries to be placed (~/.rvm/bin/)]:path:_files' \\\n  '(--source)--source[src directory to use (~/.rvm/src/)]:path:_files' \\\n  '(--archives)--archives[directory for downloaded files (~/.rvm/archives/)]:path:_files' \\\n  '-S[Specify a script file to attempt to load and run (rubydo)]:file:_files' \\\n  '-e[Execute code from the command line]:code' \\\n  '(-G)-G[root gem path to use]:path:_files' \\\n  '(--gems)--gems[Used to set the gems_flag, use with remove to remove gems]' \\\n  '(--archive)--archive[Used to set the archive_flag, use with remove to remove archive]' \\\n  '(--patch)--patch[With MRI Rubies you may specify one or more full paths to patches]' \\\n  '(-C|--configure)'{-C,--configure}'=[custom configure options]' \\\n  '(--nice)--nice[process niceness (for slow computers, default 0)]:number' \\\n  '(--ree)--ree-options[Options passed directly to ree ./installer on the command line]:options' \\\n  '(--head)--head[with update, updates rvm to git head version]' \\\n  '(--rubygems)--rubygems[with update, updates rubygems for selected ruby]' \\\n  '(--default)--default[with ruby select, sets a default ruby for new shells]' \\\n  '(--debug)--debug[Toggle debug mode on for very verbose output]' \\\n  '(--trace)--trace[Toggle trace mode on to see EVERYTHING rvm is doing]' \\\n  '(--force)--force[Force install, even given ruby is already install]' \\\n  '(--summary)--summary[Used with rubydo to print out a summary of the commands run]' \\\n  '(--latest)--latest[with gemset --dump skips version strings for latest gem]' \\\n  '(--gems)--gems[with uninstall/remove removes gems with the interpreter]' \\\n  '(--docs)--docs[with install, attempt to generate ri after installation]' \\\n  '(--reconfigure)--reconfigure[Force ./configure on install even if Makefile already exists]' \\\n  '(--quiet-curl)--quiet-curl[Makes curl silent when fetching data]' \\\n  '1: :->cmds' \\\n  '*: :->args' && ret=0\n\ncase $state in\n\n  cmds)\n\n    cmds=( ${(f)\"$(_call_program commands rvm help 2> /dev/null | __rvm_sed -e '/^== Action/,/^== Implementation/!d; / :: /!d; s/^[ *]*\\([^ ]*\\) *:: *\\(.*\\)/\\1:\\2/')\"} )\n    cmds+=( $(rvm list strings) )\n    _describe -t commands 'rvm command' cmds && ret=0\n    ;;\n\n  args)\n\n    case $line[1] in\n\n      (use|uninstall|remove|list)\n\n        if (( CURRENT == 3 )); then\n          # See if we’ve made it to the ‘@’; eg, 1.9.2@\n          if ! __rvm_grep '@' <<< \"${line[CURRENT-1]}\" >/dev/null ; then\n            _values -S , 'rubies' \\\n              $(rvm list strings | __rvm_sed -e 's/ruby-\\([^) ]*\\)-\\([^) ]*\\)/ruby-\\1-\\2 \\1-\\2 \\1/g') \\\n              default system $(rvm alias list names) && ret=0\n          else\n            # Construct a full version string for each of the gemsets.\n            # Eg, 1.9.2@min 1.9.2@rail3 …\n            _values -S , 'gemsets' \\\n              $(rvm ${line[CURRENT-1]%%@*} gemset list | __rvm_awk '/^[ -_[:alnum:]]+$/ {print \"'${line[CURRENT-1]%%@*}'@\"$1}')\n          fi\n        fi\n        ;;\n\n      (install|fetch)\n\n        _values -S , 'rubies' $(rvm list known_strings) && ret=0\n        ;;\n\n      gemset)\n\n        if (( CURRENT == 3 )); then\n          _values 'gemset_commands' $(rvm gemset help | __rvm_sed -e '/create/!d; s/^.*[{]\\(.*\\)[}].*$/\\1/; s/,/ /g')\n        else\n          #_values -S , 'gemsets' $(rvm gemset list | __rvm_grep -v gemset 2>/dev/null)\n          _values -S , 'gemsets' $(rvm gemset list | __rvm_grep -Ev '(gemset|info)' 2>/dev/null | __rvm_awk '/^[ -_[:alnum:]]+$/ {print '$1'}')\n        fi\n        ret=0\n        ;;\n\n      package)\n\n        if (( CURRENT == 3 )); then\n          _values 'package_commands' $(rvm package | __rvm_sed -e '/Usage/!d; s/^.*[{]\\(.*\\)[}] [{].*$/\\1/; s/,/ /g')\n        else\n          _values 'packages' $(rvm package | __rvm_sed -e '/Usage/!d; s/^.*[}] [{]\\(.*\\)[}].*$/\\1/; s/,/ /g')\n        fi\n        ret=0\n        ;;\n\n      *)\n        (( ret )) && _message 'no more arguments'\n        ;;\n\n    esac\n    ;;\nesac\n\nreturn ret\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_toolbox",
    "content": "#compdef toolbox\ncompdef _toolbox toolbox\n\n# zsh completion for toolbox                              -*- shell-script -*-\n\n__toolbox_debug()\n{\n    local file=\"$BASH_COMP_DEBUG_FILE\"\n    if [[ -n ${file} ]]; then\n        echo \"$*\" >> \"${file}\"\n    fi\n}\n\n_toolbox()\n{\n    local shellCompDirectiveError=1\n    local shellCompDirectiveNoSpace=2\n    local shellCompDirectiveNoFileComp=4\n    local shellCompDirectiveFilterFileExt=8\n    local shellCompDirectiveFilterDirs=16\n    local shellCompDirectiveKeepOrder=32\n\n    local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace keepOrder\n    local -a completions\n\n    __toolbox_debug \"\\n========= starting completion logic ==========\"\n    __toolbox_debug \"CURRENT: ${CURRENT}, words[*]: ${words[*]}\"\n\n    # The user could have moved the cursor backwards on the command-line.\n    # We need to trigger completion from the $CURRENT location, so we need\n    # to truncate the command-line ($words) up to the $CURRENT location.\n    # (We cannot use $CURSOR as its value does not work when a command is an alias.)\n    words=(\"${=words[1,CURRENT]}\")\n    __toolbox_debug \"Truncated words[*]: ${words[*]},\"\n\n    lastParam=${words[-1]}\n    lastChar=${lastParam[-1]}\n    __toolbox_debug \"lastParam: ${lastParam}, lastChar: ${lastChar}\"\n\n    # For zsh, when completing a flag with an = (e.g., toolbox -n=<TAB>)\n    # completions must be prefixed with the flag\n    setopt local_options BASH_REMATCH\n    if [[ \"${lastParam}\" =~ '-.*=' ]]; then\n        # We are dealing with a flag with an =\n        flagPrefix=\"-P ${BASH_REMATCH}\"\n    fi\n\n    # Prepare the command to obtain completions\n    requestComp=\"${words[1]} __complete ${words[2,-1]}\"\n    if [ \"${lastChar}\" = \"\" ]; then\n        # If the last parameter is complete (there is a space following it)\n        # We add an extra empty parameter so we can indicate this to the go completion code.\n        __toolbox_debug \"Adding extra empty parameter\"\n        requestComp=\"${requestComp} \\\"\\\"\"\n    fi\n\n    __toolbox_debug \"About to call: eval ${requestComp}\"\n\n    # Use eval to handle any environment variables and such\n    out=$(eval ${requestComp} 2>/dev/null)\n    __toolbox_debug \"completion output: ${out}\"\n\n    # Extract the directive integer following a : from the last line\n    local lastLine\n    while IFS='\\n' read -r line; do\n        lastLine=${line}\n    done < <(printf \"%s\\n\" \"${out[@]}\")\n    __toolbox_debug \"last line: ${lastLine}\"\n\n    if [ \"${lastLine[1]}\" = : ]; then\n        directive=${lastLine[2,-1]}\n        # Remove the directive including the : and the newline\n        local suffix\n        (( suffix=${#lastLine}+2))\n        out=${out[1,-$suffix]}\n    else\n        # There is no directive specified.  Leave $out as is.\n        __toolbox_debug \"No directive found.  Setting do default\"\n        directive=0\n    fi\n\n    __toolbox_debug \"directive: ${directive}\"\n    __toolbox_debug \"completions: ${out}\"\n    __toolbox_debug \"flagPrefix: ${flagPrefix}\"\n\n    if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then\n        __toolbox_debug \"Completion received error. Ignoring completions.\"\n        return\n    fi\n\n    local activeHelpMarker=\"_activeHelp_ \"\n    local endIndex=${#activeHelpMarker}\n    local startIndex=$((${#activeHelpMarker}+1))\n    local hasActiveHelp=0\n    while IFS='\\n' read -r comp; do\n        # Check if this is an activeHelp statement (i.e., prefixed with $activeHelpMarker)\n        if [ \"${comp[1,$endIndex]}\" = \"$activeHelpMarker\" ];then\n            __toolbox_debug \"ActiveHelp found: $comp\"\n            comp=\"${comp[$startIndex,-1]}\"\n            if [ -n \"$comp\" ]; then\n                compadd -x \"${comp}\"\n                __toolbox_debug \"ActiveHelp will need delimiter\"\n                hasActiveHelp=1\n            fi\n\n            continue\n        fi\n\n        if [ -n \"$comp\" ]; then\n            # If requested, completions are returned with a description.\n            # The description is preceded by a TAB character.\n            # For zsh's _describe, we need to use a : instead of a TAB.\n            # We first need to escape any : as part of the completion itself.\n            comp=${comp//:/\\\\:}\n\n            local tab=\"$(printf '\\t')\"\n            comp=${comp//$tab/:}\n\n            __toolbox_debug \"Adding completion: ${comp}\"\n            completions+=${comp}\n            lastComp=$comp\n        fi\n    done < <(printf \"%s\\n\" \"${out[@]}\")\n\n    # Add a delimiter after the activeHelp statements, but only if:\n    # - there are completions following the activeHelp statements, or\n    # - file completion will be performed (so there will be choices after the activeHelp)\n    if [ $hasActiveHelp -eq 1 ]; then\n        if [ ${#completions} -ne 0 ] || [ $((directive & shellCompDirectiveNoFileComp)) -eq 0 ]; then\n            __toolbox_debug \"Adding activeHelp delimiter\"\n            compadd -x \"--\"\n            hasActiveHelp=0\n        fi\n    fi\n\n    if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then\n        __toolbox_debug \"Activating nospace.\"\n        noSpace=\"-S ''\"\n    fi\n\n    if [ $((directive & shellCompDirectiveKeepOrder)) -ne 0 ]; then\n        __toolbox_debug \"Activating keep order.\"\n        keepOrder=\"-V\"\n    fi\n\n    if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then\n        # File extension filtering\n        local filteringCmd\n        filteringCmd='_files'\n        for filter in ${completions[@]}; do\n            if [ ${filter[1]} != '*' ]; then\n                # zsh requires a glob pattern to do file filtering\n                filter=\"\\*.$filter\"\n            fi\n            filteringCmd+=\" -g $filter\"\n        done\n        filteringCmd+=\" ${flagPrefix}\"\n\n        __toolbox_debug \"File filtering command: $filteringCmd\"\n        _arguments '*:filename:'\"$filteringCmd\"\n    elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then\n        # File completion for directories only\n        local subdir\n        subdir=\"${completions[1]}\"\n        if [ -n \"$subdir\" ]; then\n            __toolbox_debug \"Listing directories in $subdir\"\n            pushd \"${subdir}\" >/dev/null 2>&1\n        else\n            __toolbox_debug \"Listing directories in .\"\n        fi\n\n        local result\n        _arguments '*:dirname:_files -/'\" ${flagPrefix}\"\n        result=$?\n        if [ -n \"$subdir\" ]; then\n            popd >/dev/null 2>&1\n        fi\n        return $result\n    else\n        __toolbox_debug \"Calling _describe\"\n        if eval _describe $keepOrder \"completions\" completions $flagPrefix $noSpace; then\n            __toolbox_debug \"_describe found some completions\"\n\n            # Return the success of having called _describe\n            return 0\n        else\n            __toolbox_debug \"_describe did not find completions.\"\n            __toolbox_debug \"Checking if we should do file completion.\"\n            if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then\n                __toolbox_debug \"deactivating file completion\"\n\n                # We must return an error code here to let zsh know that there were no\n                # completions found by _describe; this is what will trigger other\n                # matching algorithms to attempt to find completions.\n                # For example zsh can match letters in the middle of words.\n                return 1\n            else\n                # Perform file completion\n                __toolbox_debug \"Activating file completion\"\n\n                # We must return the result of this command, so it must be the\n                # last command, or else we must store its result to return it.\n                _arguments '*:filename:_files'\" ${flagPrefix}\"\n            fi\n        fi\n    fi\n}\n\n# don't run the completion function when being source-ed or eval-ed\nif [ \"$funcstack[1]\" = \"_toolbox\" ]; then\n    _toolbox\nfi\n"
  },
  {
    "path": "oh-my-zsh/custom/completions/_ykman",
    "content": "#compdef ykman\n\n_ykman_completion() {\n    local -a completions\n    local -a completions_with_descriptions\n    local -a response\n    (( ! $+commands[ykman] )) && return 1\n\n    response=(\"${(@f)$(env COMP_WORDS=\"${words[*]}\" COMP_CWORD=$((CURRENT-1)) _YKMAN_COMPLETE=zsh_complete ykman)}\")\n\n    for type key descr in ${response}; do\n        if [[ \"$type\" == \"plain\" ]]; then\n            if [[ \"$descr\" == \"_\" ]]; then\n                completions+=(\"$key\")\n            else\n                completions_with_descriptions+=(\"$key\":\"$descr\")\n            fi\n        elif [[ \"$type\" == \"dir\" ]]; then\n            _path_files -/\n        elif [[ \"$type\" == \"file\" ]]; then\n            _path_files -f\n        fi\n    done\n\n    if [ -n \"$completions_with_descriptions\" ]; then\n        _describe -V unsorted completions_with_descriptions -U\n    fi\n\n    if [ -n \"$completions\" ]; then\n        compadd -U -V unsorted -a completions\n    fi\n}\n\nif [[ $zsh_eval_context[-1] == loadautofunc ]]; then\n    # autoload from fpath, call function directly\n    _ykman_completion \"$@\"\nelse\n    # eval/source/. command, register function for later\n    compdef _ykman_completion ykman\nfi\n\n"
  },
  {
    "path": "oh-my-zsh/custom/plugins/falkor/falkor.plugin.zsh",
    "content": "# -*- mode: sh; -*-\n#####################################################################################\n# Time-stamp: <Sun 2026-04-26 16:01 svarrette>\n#   _____     _ _              _        ___  _     __  __       _____    _\n#  |  ___|_ _| | | _____  _ __( )___   / _ \\| |__ |  \\/  |_   _|__  /___| |__\n#  | |_ / _` | | |/ / _ \\| '__|// __| | | | | '_ \\| |\\/| | | | | / // __| '_ \\\n#  |  _| (_| | |   < (_) | |    \\__ \\ | |_| | | | | |  | | |_| |/ /_\\__ \\ | | |\n#  |_|  \\__,_|_|_|\\_\\___/|_|    |___/  \\___/|_| |_|_|  |_|\\__, /____|___/_| |_|\n#                                                         |___/\n#                          ____  _             _\n#                         |  _ \\| |_   _  __ _(_)_ __\n#                         | |_) | | | | |/ _` | | '_ \\\n#                         |  __/| | |_| | (_| | | | | |\n#                         |_|   |_|\\__,_|\\__, |_|_| |_|\n#                                       |___/\n#####################################################################################\n# .       Copyright (c) 2016-2025 Sebastien Varrette <Sebastien.Varrette@gmail.com>\n#\n# Personal Custom plugin for Oh My Zsh, mainly designed to host my favorite\n# aliases and my theme specialization\n# Install nerd-font (see https://github.com/ryanoasis/nerd-fonts#font-installation)\n# On Mac OS X:\n#     brew tap caskroom/fonts\n#     brew cask install font-hack-nerd-font\n# Then in iTerm2, change the font for non-ASCII Font to 14pt Hack Regular Nerd Font Complete\n#\n### Organization\n#\n# ~/.config/zsh/custom\n#   ├── plugins\n#       └── falkor\n#           └── falkor.plugin.zsh\n#\n### Usage:\n#\n# In your .zshrc,  add the following\n#\n#    [...]\n#    plugins=(...) # Whatever default plugins you wish to use\n#    # Custom plugins\n#    plugins+=(falkor)\n\n#####################################################################################\n\nexport DEFAULT_USER=\"$USER\"\n\n# ===================================================================\n# ================== Falkor's Command Aliases =======================\n# ===================================================================\n\n# -------------------------------------------------------------------\n# make some commands (potentially) less destructive\n# -------------------------------------------------------------------\nalias rm='rm -i'\n\n# ls, the common ones I use a lot shortened for rapid fire usage\n#alias l='ls -lFh'     #size,show type,human readable\nalias la='ls -lAFh'   #long list,show almost all,show type,human readable\nalias lr='ls -tRFh'   #sorted by date,recursive,show type,human readable\nalias lt='ls -ltFh'   #long list,sorted by date,show type,human readable\nalias ll='ls -l'      #long list\n\n# fuzzy typing\nalias car='cat'\n\n# -------------------------------------------------------------------\n# Git -- most comes from the git plugin\n# -------------------------------------------------------------------\nalias g='git'\nalias ga='git add'\nalias gb='git branch -a'\n# age of each branch\nalias gbage='for k in `git branch -a | perl -pe '\\''s/^..(.*?)( ->.*)?$/\\1/'\\''`; do echo -e `git show --pretty=format:\"%Cgreen%ci %Cblue%cr%Creset\" $k -- | head -n 1`\\\\t$k; done | sort -r'\n# stop bother me with merge messages\ngbnoedit() {\n    git config branch.$(git rev-parse --abbrev-ref HEAD).mergeoptions --no-edit\n}\nalias gc='git checkout'\nalias gcount='git shortlog -sn'\nif [[ -n ${ZSH_VERSION-} ]]; then\n    compdef gcount=git\nfi\nalias gcl='git clone'\nalias clone='git clone'\nalias gd='git diff'\nalias dg='git diff'\nalias GD='git diff HEAD~1 HEAD'\nalias gf='git fetch -va'\nalias gfp='git fetch -va --prune'\nalias gg=\"git log  --graph --pretty=format:'%C(auto)%h -%d %s %Cgreen(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit --max-count=20\"\nalias ggl=\"git log --graph --pretty=format:'%C(auto)%h -%d %s %Cgreen(%cr)%Creset %C(bold blue)<%an>%Creset' --abbrev-commit\"\nalias gl='git log  --graph --oneline --decorate --max-count=20'\ngm() {\n    git commit -s -m \"$*\"\n}\ngma() {\n    git commit -s -am \"$*\"\n}\ngms() {\n    git commit -s -S -m \"$*\"\n}\ngmas() {\n    git commit -s -S -am \"$*\"\n}\n# Conventional commit helpers -- see https://www.conventionalcommits.org/\n__git-conventional-commit() {\n  local type=\"$1\"\n  local scope=\"$2\"\n  local ref=\"\"\n  shift 2\n  local body=\"$*\"\n  local msg=\"\"\n  # extract reference when applicable\n  if [[ \"${body}\" =~ 'ref[s]*:([0-9]+)' ]]; then\n    # ref=\"\\nRefs: ${BASH_REMATCH[1]}\" # Does not work ;(\n    ref=\"\\n\\nRefs: $(echo \"${body}\" | sed 's/.*ref[s]*:\\([[:digit:]]\\+\\)/\\#\\1/' | sed 's/,/, \\#/g')\"\n    body=$(echo \"${body}\" | sed 's/ref[s]*:.*$//')\n  fi\n  if [ -z \"${body}\" ]; then\n    msg=\"${type}: ${scope}${ref}\"\n  else\n    msg=\"${type}(${scope}): ${body}${ref}\"\n  fi\n  echo -e \"${msg}\"\n}\nfeat-gm()     { gm  \"$(__git-conventional-commit 'feat'     $*)\" }\nfeat-gma()\t\t{ gma \"$(__git-conventional-commit 'feat'\t\t  $*)\" }\nfix-gm()\t\t\t{ gm\t\"$(__git-conventional-commit 'fix'\t\t\t$*)\" }\nfix-gma()\t\t\t{ gma \"$(__git-conventional-commit 'fix'\t\t\t$*)\" }\nrefactor-gm() { gm  \"$(__git-conventional-commit 'refactor' $*)\" }\nrefactor-gma(){ gma \"$(__git-conventional-commit 'refactor' $*)\" }\ndocs-gm()\t\t\t{ gm  \"$(__git-conventional-commit 'docs'\t\t  $*)\" }\ndocs-gma()\t\t{ gma \"$(__git-conventional-commit 'docs'\t\t  $*)\" }\n# perf\n# revert\n# style\n# test\n\nalias p='git push'\nalias gp='git push'\nalias gpu='git push'\nalias gpd='git push --dry-run'\nalias gpoat='git push origin --all && git push origin --tags'\n[[ -n ${ZSH_VERSION-} ]] && compdef _git gpoat=git-push\nalias gr='git remote -v'\nalias gra='git remote add'\nalias grr='git remote rm'\nalias grt='cd $(git rev-parse --show-toplevel || echo \".\")'\nalias s='git status'\nalias gs='git status'\nalias gss='git status --short'\nfunction gsa() {\n  local url=$1\n  local dir=`basename $url .git`\n\t[ -d \".submodules\" ] && dir=\".submodules/$dir\"\n  [ $# -eq 2 ] && dir=$2\n  echo \"=> adding git submodule from '$url' in '$dir'\"\n  git submodule add $url $dir\n  git commit -s -m \"Add '$dir' as git submodule from '$url'\" .gitmodules $dir\n}\n#alias gsa='git submodule add'\nalias gsi='git submodule init'\nalias gsu='git submodule update'\ngsupgrade() {\n  git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'\n}\nalias u='git pull'\nalias up='git pull'\nalias gu='git pull'\nalias gta='git tag -a -m'\nalias cdroot='git rev-parse && cd ./$(git rev-parse --show-cdup)'\n\n#-------\n# Myrepo\n#--------\nalias mradd='mr register'\nalias mrup='(cd ~; mr -j update)'\n\n# ------------\n# Utilities\n# ------------\nbup() {\n  echo \"Updating your [Homebrew] system\"\n  brew update\n  brew upgrade\n  brew cu\n  brew cleanup\n}\nalias o='open'\nalias of='lsof -nP +c 15 | grep LISTEN'\nalias m='make -j8'\nalias skim='open -a Skim'\nnospace-in-filename(){\n  local f=\"$*\"\n  echo \"=> replacing ' ' (space) with '-' in '${f}'\"\n  mv $f $(echo $f| tr ' ' '-')\n}\nif [[ -n ${ZSH_VERSION-}  ]]; then\n\tzstyle \":completion:*:*:skim:*\" file-patterns \"*.pdf *(-/)\"\n  zcompclean() {\n    rm -rf ${XDG_CONFIG_HOME}/zsh/.zcompdump*\n    autoload -U compinit && compinit\n  }\n  # https://stackoverflow.com/questions/59940971/zsh-autocomplete-slow-for-ssh/64147638#64147638\n  # FIX for slow SSH completion\n  refresh_ssh_autocomplete () {\n    host_list=($(cat ~/.ssh/config | grep 'Host '  | awk '{s = s $2 \" \"} END {print s}'))\n    zstyle ':completion:*:(ssh|scp|sftp):*' hosts $host_list\n  }\nfi\nalias mkdir='mkdir -p'\n# Search for files and page it\nsearch() {\n    find . -iname \"*$@*\" | less;\n}\n\nif [[ -n ${ZSH_VERSION-}  ]]; then\n  alias refresh='sourcezshrc'\nelse\n  alias refresh='source ~/.profile'\nfi\n\n\n\nalias sshx='ssh -C -X -c blowfish'\nalias proxy='ssh -C -q -T -n -N -D 1080'\nalias rsyncfalkor='rsync -P -avzu'\n\nalias nothankyouadobe=\"sudo -H killall ACCFinderSync \\\"Core Sync\\\" AdobeCRDaemon \\\"Adobe Creative\\\" AdobeIPCBroker node \\\"Adobe Desktop Service\\\" \\\"Adobe Crash Reporter\\\";sudo -H rm -rf \\\"/Library/LaunchAgents/com.adobe.AAM.Updater-1.0.plist\\\" \\\"/Library/LaunchAgents/com.adobe.AdobeCreativeCloud.plist\\\" \\\"/Library/LaunchDaemons/com.adobe.*.plist\\\"\"\ntopgrep() {\n  if [[ $# -ne 1 ]]; then\n    echo \"Usage: topgrep <expression>\"\n  else\n    top -pid $(pgrep $1)\n  fi\n}\n\nmkcd () {\n    mkdir -p \"$@\" && cd \"$@\"\n}\n#alias diff='colordiff'  # for colors\nalias draw='figlet -c -w 80'\n# Which directory is hiding all the bytes?\nalias dux='du -h -d 1 | sort -n'\n# Ask more gently to run the last command ;)\nalias pls='sudo `fc -n -l -1`'\nalias \":q\"=\"exit\"\n\n# Quick tarball backup\nbackup() {\n  [[ -z \"$1\" ]] && return\n  local dst=$(echo $1 | sed \"s/^\\./dot/\" )\n  local archive=\"backup_$(date +%F)_${dst}.tgz\"\n  echo \"=> creating tarball archive '${archive}' to backup '$@'\"\n  tar cvzf ${archive} $@\n}\n\n# Optimize PDF/JPEG/PNG size\noptipdf () {\n\tlocal pdf=$1\n\tlocal res=`basename $pdf .pdf`-optimized.pdf\n\tnoglob gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -sOutputFile=$res $pdf\n\tlocal opti_size=`du -k $res | cut -f1`\n\tlocal size=`du -k $pdf | cut -f1`\n\tif [[ \"$opti_size\" -lt \"$size\"  ]]; then\n\t\techo \" => optimized PDF of smaller size ($opti_size vs. $size) thus overwrite $pdf\"\n\t\tmv $res $pdf\n\t\tgit commit -s -m \"reduce size of PDF '$pdf'\" $pdf\n\telse\n\t\techo \" => already optimized PDF thus discarded\"\n\t\trm -f $res\n\tfi\n}\nalias reducepdf='optipdf'\nif [[ -n ${ZSH_VERSION-}   ]]; then\n\tcompdef '_files -g \"*.pdf\"' optipdf\nfi\nalias optipng='optipng -o9 -zm1-9 -strip all'\nalias optijpg='jpegoptim'\n\n# ---------------------------------------------\n# United Colors of Benetton: Colors everywhere\n# ---------------------------------------------\n\n# Less with syntax color -\nalias lessh='LESSOPEN=\"| /usr/local/bin/src-hilite-lesspipe.sh %s\" less -M '\n# man with colors -- thanks @hcartiaux for the tip\nman() {\n    env LESS_TERMCAP_mb=$'\\E[01;31m' \\\n        LESS_TERMCAP_md=$'\\E[01;38;5;74m' \\\n        LESS_TERMCAP_me=$'\\E[0m' \\\n        LESS_TERMCAP_se=$'\\E[0m' \\\n        LESS_TERMCAP_so=$'\\E[38;5;246m' \\\n        LESS_TERMCAP_ue=$'\\E[0m' \\\n        LESS_TERMCAP_us=$'\\E[04;38;5;146m' \\\n        man \"$@\"\n}\n\n# TaskWarrior\nalias t='task list'\n\n# ---------------\n# Emacs business\n# ---------------\n#alias es=\"emacs --daemon\"\n#alias em=\"emacsclient -nw --alternate-editor='vim'\"\n\n# ---------------\n# iTerm2 business\n# ---------------\n\n# Setup tab and window title functions for iterm2\n# iterm behaviour: until window name is explicitly set, it'll always track tab title.\n# So, to have different window and tab titles, iterm_window() must be called\n# first. iterm_both() resets this behaviour and has window track tab title again).\n# Source: http://superuser.com/a/344397\nset_iterm_name() {\n  mode=$1; shift\n  echo -ne \"\\033]$mode;$@\\007\"\n}\niterm_both()   { set_iterm_name 0 $@; }\niterm_tab()    { set_iterm_name 1 $@; }\ntitle()        { iterm_both $@;       }\niterm_window() { set_iterm_name 2 $@; }\n\n# GPG management\ngpg-update-tty() {\n  export GPG_TTY=$(tty)\n  gpg-connect-agent \"updatestartuptty\" /bye >/dev/null\n}\n\n# -------------------\n# Yubikey management\n# -------------------\n# https://github.com/drduh/YubiKey-Guide#switching-between-two-or-more-yubikeys\nyubi-switch() {\n  echo '=> switch Yubikey'\n  gpg-connect-agent \"scd serialno\" \"learn --force\" /bye\n  echo '=> reset GPG_TTY'\n  export GPG_TTY=$(tty)\n  echo '=> force pinentry reset'\n  gpg-connect-agent \"updatestartuptty\" /bye >/dev/null\n}\n\n# ---------------\n# ZSH management\n# ---------------\nalias zshenv=\"$EDITOR ${HOME}/.zshenv\" # Quick access to the .zshenv file\nalias zshrc=\"$EDITOR ${XDG_CONFIG_HOME}/zsh/zshrc\" # Quick access to the .zshrc file\nalias sourcezshrc=\"source ${XDG_CONFIG_HOME}/zsh/zshrc\"\nalias zshfalkor=\"$EDITOR ${XDG_CONFIG_HOME}/zsh/custom/plugins/falkor/falkor.plugin.zsh\" # Quick access to this file\n\n\n#-----------------------\n# Global alias (for ZSH)\n# ----------------------\nif [[ -n ${ZSH_VERSION-} ]]; then\n    alias -g L=\"| less\"             # Write L after a command to page through the output.\n    alias -g H=\"| head -n 20\"       # Write H after a command to get the 20 first lines\n    alias -g G='| grep --color -i'  # Write G after the command to grep it\n    alias -g TL='| tail -20'\n    alias -g NUL=\"> /dev/null 2>&1\" # You get the idea.\nfi\n"
  },
  {
    "path": "oh-my-zsh/custom/plugins/zsh-completions.local/zsh-completions.plugin.zsh",
    "content": "# -*- mode:sh; -*-\n###############################################################################\n# Include the zsh-completions installed by Homebrew\n\n_homebrew-installed() {\n  type brew &> /dev/null\n}\n_zsh-completion-from-homebrew-installed() {\n    brew --prefix zsh-completions &> /dev/null\n}\n\n# RVM Completion\nif [[ -d \"$HOME/.rvm/scripts/zsh/Completion\" ]]; then\n    fpath=($HOME/.rvm/scripts/zsh/Completion $fpath)\nfi\n# General Homebrew ZSH completions\nif _homebrew-installed && _zsh-completion-from-homebrew-installed ; then\n  fpath=('/usr/local/share/zsh-completions' $fpath)\nfi\n\n# My custom completions\nfpath=(\"${XDG_CONFIG_HOME}/zsh/custom/completions\" $fpath)\n"
  },
  {
    "path": "pyenv/init.sh",
    "content": "# Initialization of the pyenv and pyenv-virtualenv\n# - pyenv: https://github.com/pyenv/pyenv\n# - pyenv-virtualenv: https://github.com/pyenv/pyenv-virtualenv\n\nif [ -n \"$(which pyenv 2>/dev/null)\" ]; then\n  eval \"$(pyenv init --path)\"    # Required since 1.2.27-21\n  eval \"$(pyenv init -)\"\n  eval \"$(pyenv virtualenv-init -)\"\n\n  export PYENV_VIRTUALENV_DISABLE_PROMPT=1\nfi\n"
  },
  {
    "path": "screen/.screenrc",
    "content": "# -*- mode:sh; -*-\n###################################################################################\n# .screenrc -- configuration file for [screen](http://www.gnu.org/software/screen/)\n# Time-stamp: <Mon 2016-02-29 13:48 svarrette>\n#\n#                      ___  ___ _ __ ___  ___ _ __  _ __ ___\n#                     / __|/ __| '__/ _ \\/ _ \\ '_ \\| '__/ __|\n#                    _\\__ \\ (__| | |  __/  __/ | | | | | (__\n#                   (_)___/\\___|_|  \\___|\\___|_| |_|_|  \\___|\n#\n###################################################################################\n# Resources:\n# *  gyaresu's .screenrc: http://delicious.com/search?p=screenrc\n###################################################################################\n\n# Don't display the copyright page\nstartup_message off\n\n# tab-completion flash in heading bar\nvbell off\n\n# keep scrollback n lines\ndefscrollback 1000\n\nshelltitle \"$ |bash\"\n\n# THIS IS THE PRETTY BIT\n#change the hardstatus settings to give an window list at the bottom of the\n##screen, with the time and date and with the current window highlighted\nhardstatus             alwayslastline\n#hardstatus string '%{= mK}%-Lw%{= KW}%50>%n%f* %t%{= mK}%+Lw%< %{= kG}%-=%D %d %M %Y %c:%s%{-}'\nhardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'\n"
  },
  {
    "path": "screen/README.md",
    "content": "# Falkor's Dotfiles - GNU Screen configuration\n\n[GNU Screen](http://www.gnu.org/software/screen/‎) is a tool to manage persistent terminal sessions.\nIt allows to create several virtual consoles inside a single terminal, enabling:\n\n* the user to connect to a remote system  by ssh then start screen and create multiple terminal windows and run applications in each, without the need for additional ssh connections;\n* the decoupling of the terminal from the running applications, thus even if the network connection is broken, or the user needs to disconnect from the remote system, the applications started in screen windows, will keep running and the user can later reconnect to the screen session and continue work.\n\nI personally dislike the fact that by default there is no visual way to know that I'm under a screen session.\nThe provided [`.screenrc`](.screenrc) helps to offer a status bar displaying the valuable information of the screen:\n\n* the host running the original screen session (bottom left)\n* a window list at the bottom -- the current one beeing placed between red parenthesis\n* date and time (I always like to keep track of the time ;))\n\n## Screenshot\n\n![](https://raw.githubusercontent.com/Falkor/dotfiles/master/screenshots/screenshot_falkor_screen.png)\n\n## Installation\n\nYou can use the `install.sh` script featured with the [Falkor's dotfile](https://github.com/Falkor/dotfile) repository.\n\n``` bash\n$> cd ~/.dotfiles.falkor.d\n$> ./install.sh --screen      # OR ./install.sh --with-screen\n```\nThis will setup the following files:\n\n* `~/.screenrc`\n\n## Uninstall\n\n``` bash\n$> cd ~/.dotfiles.falkor.d\n$> ./install.sh --delete --screen\n```\n\n\n## Basic commands (cheat-sheet)\n\nYou can start a screen session (_i.e._ creates a single window with a shell in it) with the `screen` command.\nIts main command-lines options are listed below:\n\n| Command      | Description                                                                                                  |\n|--------------|--------------------------------------------------------------------------------------------------------------|\n| `screen`     | start a new screen session                                                                                   |\n| `screen -ls` | does not start screen, but prints a list of `pid.tty.host` strings identifying your current screen sessions. |\n| `screen -r`  | resumes from a __detached__ screen session                                                                   |\n| `screen -x`  | attach to a not detached screen session in __Multi display mode__*                                           |\n|              |                                                                                                              |\n\n* _Note_: Multi display mode allows you and another user to _share_ the same session which proves to be quite useful to debug remote systems.\n\nOnce within a screen, you can invoke a screen command which consist of a \"`CTRL + a`\" sequence followed by another character.\nThe main commands are listed in the below table:\n\n| Screen Command             | Mnemonic    | Description                                                     |\n|----------------------------|-------------|-----------------------------------------------------------------|\n| `CTRL + a c`               | (create)    | creates a new Screen window. The default Screen number is zero. |\n| `CTRL + a n`               | (next)      | switches to the next window.                                    |\n| `CTRL + a p`               | (prev)      | switches to the previous window.                                |\n| `CTRL + a d`               | (detach)    | detaches from a Screen                                          |\n| `CTRL + a A`               | (title)     | rename the current window                                       |\n| `CTRL + a 0-9`             | (go to 0-9) | switches between windows 0 through 9.                           |\n| `CTRL + a k` or `CTRL + d` | (kill)      | destroy the current window                                      |\n| `CTRL + a ?`               | (help)      | display a list of all the command options available for Screen. |\n|                            |             |                                                                 |\n"
  },
  {
    "path": "screenshots/src/.gitignore",
    "content": "*.tiff\n"
  },
  {
    "path": "shell/.gitignore",
    "content": "/*.sh\n"
  },
  {
    "path": "shell/available/asdf.sh",
    "content": "# asdf - Multiple Runtime Version Manager\n# See https://asdf-vm.com/\n#\n# Installation in a (tentative) XDG compliant way\n#   git clone https://github.com/asdf-vm/asdf.git ~/.local/share/asdf --branch v0.15.0\n# See https://github.com/asdf-vm/asdf/issues/687\n#\n# Below are config to 'simulate' XDG behaviour through\n# https://asdf-vm.com/manage/configuration.html\n\nif [ -d \"${XDG_DATA_HOME}/asdf\" ]; then\n  export ASDF_DIR=\"${XDG_DATA_HOME}/asdf\" # location of asdf core scripts\n  # location where asdf will install plugins, shims and tool versions.\n  export ASDF_DATA_DIR=\"${XDG_DATA_HOME}/asdf\"\n  if [ -f \"${ASDF_DIR}/asdf.sh\" ]; then\n    .  \"${ASDF_DIR}/asdf.sh\"\n  fi\n\n  # Setup completion\n  if [[ -n ${ZSH_VERSION-}  ]]; then\n    # append completions to fpath\n    fpath=(${ASDF_DIR}/completions $fpath)\n    # initialise completions with ZSH's compinit\n    autoload -Uz compinit && compinit\n  else\n    if [ -f \"${ASDF_DIR}/completions/asdf.$(basename $SHELL)\" ]; then\n      . \"${ASDF_DIR}/completions/asdf.$(basename $SHELL)\"\n    fi\n  fi\n\n  # https://asdf-vm.com/manage/configuration.html#asdfrc\n  export ASDF_CONFIG_FILE=\"${XDG_CONFIG_HOME}/asdf/asdfrc\"\n\n  # https://github.com/asdf-community/asdf-python#default-python-packages\n  export ASDF_PYTHON_DEFAULT_PACKAGES_FILE=\"${XDG_CONFIG_HOME}/asdf/default-python-packages\"\n\n  # https://github.com/asdf-vm/asdf-nodejs#default-npm-packages\n  export ASDF_NPM_DEFAULT_PACKAGES_FILE=\"$HOME/.config/asdf/default-npm-packages\"\n\nfi\n"
  },
  {
    "path": "shell/available/assh.sh",
    "content": "# Wrapper for Advanced-SSH\n# See https://github.com/moul/assh\n#\nif [ -x \"$(command -v assh 2>/dev/null)\" ]; then\n  alias ssh=\"assh wrapper ssh --\"\nfi\n"
  },
  {
    "path": "shell/available/atom.sh",
    "content": "# Settings for Atom\n\nif [ -x \"$(command -v atom 2>/dev/null)\" ]; then\n\texport ATOM_HOME=$XDG_CONFIG_HOME/atom\nfi\n"
  },
  {
    "path": "shell/available/autojump.sh",
    "content": "# Autojump -- a faster way to navigate your filesystem\n# Use\n#      j  <pattern>\n#\n# To cd into the recent directory you visited those fullpath matches\n# <pattern>\n#\n# For more info: https://github.com/wting/autojump\n\nAUTOJUMP_CONFIG=\"/usr/local/etc/profile.d/autojump.sh\"\n\nif [[ -n ${ZSH_VERSION-}  ]]; then\n  [ ! -f \"${AUTOJUMP_CONFIG}\" ] && AUTOJUMP_CONFIG=\"/usr/share/autojump/autojump.zsh\"\nelse\n  [ ! -f \"${AUTOJUMP_CONFIG}\" ] && AUTOJUMP_CONFIG=\"/usr/share/autojump/autojump.sh\"\nfi\n\n\n[ -f \"${AUTOJUMP_CONFIG}\" ] && . ${AUTOJUMP_CONFIG} || true\n"
  },
  {
    "path": "shell/available/beets.sh",
    "content": "# Bash completion for Beets\n# See http://beets.readthedocs.io/en/latest/reference/cli.html#completion\n#\n# if [ -x  \"$(command -v beet 2>/dev/null)\" ]; then\n#   case $shell in\n#     bash) eval \"$(beet completion)\";;\n#     zsh)\n#       autoload bashcompinit;\n#       bashcompinit;\n#       _get_comp_words_by_ref() { :; };\n#       compopt() { :; };\n#       _filedir() { :; };\n#       eval \"$(beet completion)\"\n#       ;;\n#     *)\n#     ;;\n#   esac\n# fi\n"
  },
  {
    "path": "shell/available/curl.sh",
    "content": "# Customization for curl, assuming XDG Base Directory setup\n# See https://specifications.freedesktop.org/basedir-spec/latest/\n# Place this file in the custom directory settings for your favorite shell\n\nif [ -x \"$(command -v curl 2>/dev/null)\" ]; then\n\texport CURL_HOME=\"$XDG_CONFIG_HOME/curl\"\nfi\n"
  },
  {
    "path": "shell/available/direnv.sh",
    "content": "# Custom load for direnv\n# See https://direnv.net/\n\nif [ -x \"$(command -v direnv 2>/dev/null)\" ]; then\n    eval \"$(direnv hook $(basename $SHELL))\"\n    # export DIRENV_WARN_TIMEOUT=100s\n\n    # See https://github.com/direnv/direnv/wiki/Python#restoring-the-ps\n    show_virtual_env() {\n        if [[ -n \"$VIRTUAL_ENV\" && -n \"$DIRENV_DIR\" ]]; then\n            echo \"($(basename $VIRTUAL_ENV))\"\n        fi\n    }\n    if [[ -n ${ZSH_VERSION-} ]]; then\n        setopt PROMPT_SUBST\n    else\n        export -f show_virtual_env\n    fi\n\n    PS1='$(show_virtual_env) '$PS1\nfi\n"
  },
  {
    "path": "shell/available/easybuild.sh",
    "content": "# http://easybuild.readthedocs.io/en/latest/Installation.html\n\nif [ -x \"$(command -v eb 2>/dev/null)\" ]; then\n\texport EASYBUILD_PREFIX=$HOME/.local/easybuild\n\texport EASYBUILD_MODULES_TOOL=Lmod\nfi\n"
  },
  {
    "path": "shell/available/fzf.sh",
    "content": "# Wrapper for fzf (Command-line fuzzy finder)\n# See https://github.com/junegunn/fzf\n#\nif [ -x \"$(command -v fzf 2>/dev/null)\" ]; then\n  source <(fzf --zsh)\nfi\n"
  },
  {
    "path": "shell/available/glab.sh",
    "content": "# gitlab CLI \n# see https://docs.gitlab.com/cli/\n\nif [ -x \"$(command -v glab 2>/dev/null)\" ]; then\n  if [[ -n ${ZSH_VERSION-} ]]; then\n    # zsh completion\n    source <(glab completion -s zsh); compdef _glab glab\n  else\n    # bash completion\n    source <(glab completion -s bash)\n  fi\nfi\n"
  },
  {
    "path": "shell/available/go.sh",
    "content": "\nif [ -x \"$(command -v go 2>/dev/null)\" ]; then\n\texport GOPATH=${XDG_CACHE_HOME}/go\n\texport PATH=${GOPATH}/bin:$PATH\nfi\n"
  },
  {
    "path": "shell/available/gpg-agent.sh",
    "content": "# gpg-agent - Secret key management for GnuPG configuration\n#\n# Daemon to manage secret (private) keys independently from any protocol\n# The agent is automatically started on demand by gpg, gpgconf, or gpg-connect-agent\n# After changing the configuration, reload the agent with\n#             gpg-connect-agent reloadagent /bye\n#\nif [ -x \"$(command -v gpg-agent 2>/dev/null)\" ]; then\n    # check if ssh-support is enable in your gpg-agent config\n    if [ -f $(gpgconf --list-dirs homedir)/gpg-agent.conf ] && [ -n \"$(grep -ve '^#' $(gpgconf --list-dirs homedir)/gpg-agent.conf | grep enable-ssh-support)\" ]; then\n        export GPG_TTY=$(tty)\n        export SSH_AUTH_SOCK=\"$(gpgconf --list-dirs agent-ssh-socket)\"\n        gpgconf --launch gpg-agent\n    fi\nfi\n"
  },
  {
    "path": "shell/available/llvm.sh",
    "content": "\n# Mac OS config\nif [ -x \"$(command -v brew 2>/dev/null)\" ]; then\n  export LLVMPATH=$(brew --prefix llvm)\n  export PATH=${LLVMPATH}/bin:$PATH\nfi\n"
  },
  {
    "path": "shell/available/nix.sh",
    "content": "# Nix installer\n#\n\nif [ -e \"$HOME/.nix-profile/etc/profile.d/nix.sh\" ]; then\n  . $HOME/.nix-profile/etc/profile.d/nix.sh\nfi # added by Nix installer\n\nif [ -x \"$(command -v nix 2>/dev/null)\" ]; then\n  # Bugfix locales - see https://nixos.wiki/wiki/Locales\n  # Assumes you have run:\n  #    nix-env -iA nixpkgs.glibcLocales\n  export LOCALE_ARCHIVE=\"$(nix-env --installed --no-name --out-path --query glibc-locales)/lib/locale/locale-archive\"\nfi\n\n\n"
  },
  {
    "path": "shell/available/nvm.sh",
    "content": "# NVM: Node Version Manager\n# See https://github.com/nvm-sh/nvm\n\n\nif [ -x \"$(command -v nvm 2>/dev/null)\" ]; then\n\t\n\t[[ -n ${ZSH_VERSION-} ]] && setopt no_aliases\n\t\n\texport NVM_DIR=\"$([ -z \"${XDG_CONFIG_HOME-}\" ] && printf %s \"${HOME}/.nvm\" || printf %s \"${XDG_CONFIG_HOME}/nvm\")\"\n\t[ -s \"$(brew --prefix nvm)/nvm.sh\" ] && . \"$(brew --prefix nvm)/nvm.sh\"  # This loads nvm\n\t[ -s \"$(brew --prefix nvm)/etc/bash_completion.d/nvm\" ] && . \"$(brew --prefix nvm)/etc/bash_completion.d/nvm\"  # This loads nvm bash_completion\n\t\n\t[[ -n ${ZSH_VERSION-} ]] && setopt aliases\nfi \n"
  },
  {
    "path": "shell/available/pdk.sh",
    "content": "# https://puppet.com/docs/pdk/1.x/pdk_install.html\n\n# Add /opt/puppetlabs/pdk/bin to the path for sh compatible users\nPDKDIR=/opt/puppetlabs/pdk\nif [ -d \"${PDKDIR}\" ]; then\n  if ! echo \"$PATH\" | grep -q \"${PDKDIR}/bin\" ; then\n    export PATH=$PATH:${PDKDIR}/bin\n  fi\nfi\n"
  },
  {
    "path": "shell/available/pipx.sh",
    "content": "# Wrapper for pipx\n# See https://github.com/pypa/pipx\n#\n\nif [ -x \"$(command -v pipx 2>/dev/null)\" ]; then\n  # Add ~/.local/bin\n  if [ -n \"${XDG_CACHE_HOME}\" ]; then\n    export PATH=\"${XDG_CACHE_HOME}/bin:$PATH\"\n  fi\n  # pipx completions\n  # eval \"$(register-python-argcomplete pipx)\"\nfi\n"
  },
  {
    "path": "shell/available/pyenv.sh",
    "content": "# Initialization of the pyenv and pyenv-virtualenv\n# - pyenv: https://github.com/pyenv/pyenv\n# - pyenv-virtualenv: https://github.com/pyenv/pyenv-virtualenv\n\nif [ -x \"$(command -v pyenv 2>/dev/null)\" ]; then\n  eval \"$(pyenv init -)\"\n  eval \"$(pyenv virtualenv-init -)\"\n\n  export PYENV_VIRTUALENV_DISABLE_PROMPT=1\nfi\n"
  },
  {
    "path": "shell/available/screen.sh",
    "content": "# Specific configuration for screen\n# See https://github.com/Falkor/dotfiles/tree/master/screen\n\nif [ -x \"$(command -v screen 2>/dev/null)\" ]; then\n  export SCREENRC=~/.config/screen/screenrc\nfi\n"
  },
  {
    "path": "shell/available/spacemacs.sh",
    "content": "# Spacemacs\n# inspired from https://practical.li/spacemacs/install-spacemacs/#clone-practicalli-spacemacs-configuration\n#\n\nif [ -d \"${XDG_CONFIG_HOME}/spacemacs\" ]; then \n   # Set XDG location of Emacs Spacemacs configuration\n   export SPACEMACSDIR=\"$XDG_CONFIG_HOME/spacemacs\"\nfi \n\n"
  },
  {
    "path": "shell/available/taskwarrior.sh",
    "content": "# Specific configuration for TaskWarrior\n# See https://taskwarrior.org/docs/configuration.html\n\nif [ -x \"$(command -v task 2>/dev/null)\" ]; then\n  # export TASKRC=~/.config/task/taskrc\n  # export TASKDATA=~/.config/task\nfi\n"
  },
  {
    "path": "shell/available/toolbox.sh",
    "content": "# Wrapper for toolbx\n# See https://containertoolbx.org/\n\nif [ -x \"$(command -v toolbox 2>/dev/null)\" ]; then\n  if [[ -n ${ZSH_VERSION-} ]]; then\n    # zsh completion\n    # /usr/share/zsh/site-functions/_toolbox\n  else\n    # bash completion\n    # /usr/share/bash-completion/completions/toolbox.bash\n  fi\nfi\n"
  },
  {
    "path": "shell/available/uv.sh",
    "content": "# Wrapper for uv, an extremely fast Python package and project manager, written in Rust\n# See https://docs.astral.sh/uv/\n\nif [ -x \"$(command -v uv 2>/dev/null)\" ]; then\n  if [[ -n ${ZSH_VERSION-} ]]; then\n    # zsh completion\n    eval \"$(uv generate-shell-completion zsh)\"\n    # /usr/share/zsh/site-functions/_toolbox\n  else\n    # bash completion\n    # /usr/share/bash-completion/completions/toolbox.bash\n  fi\nfi\n"
  },
  {
    "path": "shell/available/vagrant.sh",
    "content": "# Vagrant aliases\n# See also https://www.calebwoods.com/2015/05/05/vagrant-guest-commands/\n\nif [ -x \"$(command -v vagrant 2>/dev/null)\" ]; then\n\talias vup=\"vagrant up\"\n\talias vh=\"vagrant halt\"\n\talias vs=\"vagrant status\"\n\talias v=\"vagrant ssh\"\n\tvc() {\n\t  vagrant ssh -c \"$@\"\n\t}\nfi \n"
  },
  {
    "path": "shell/available/vim.sh",
    "content": "# XDG compliant setup for vim\n# Assuming you install your vim configuration under ~/.config/vim/vimrc as done\n# by default by Falkor's dotfiles -- see https://github.com/Falkor/dotfiles\n\nif [ -f \"${XDG_CONFIG_HOME}/vim/vimrc\" ]; then \n   export VIMINIT='let $MYVIMRC=\"$XDG_CONFIG_HOME/vim/vimrc\" | source $MYVIMRC'\nfi\n"
  },
  {
    "path": "shell/custom/.gitignore",
    "content": "*.sh\n"
  },
  {
    "path": "systemd/user/rtags-rdm.service",
    "content": "# RTags Server Daemon\n# https://github.com/Andersbakken/rtags/wiki/Setup#integration-with-systemd-gnu-linux\n#\n[Unit]\nDescription=RTags Daemon\n\nRequires=rtags-rdm.socket\n\n[Service]\nType=simple\nExecStart=/usr/bin/rtags-rdm -v --inactivity-timeout 300 --log-flush\nExecStartPost=/bin/sh -c \"echo +19 > /proc/$MAINPID/autogroup\"\nNice=19\nCPUSchedulingPolicy=idle\n"
  },
  {
    "path": "systemd/user/rtags-rdm.socket",
    "content": "# RTAgs Server Management\n# https://github.com/Andersbakken/rtags/wiki/Setup#integration-with-systemd-gnu-linux\n# See rtags-rc : default socket location is XDG_RUNTIME_DIR/rdm.socket\n[Unit]\nDescription=RTags daemon socket\n\n[Socket]\nListenStream=%t/rdm.socket\n\n[Install]\nWantedBy=default.target\n"
  },
  {
    "path": "tests/01-install_script.bats",
    "content": "#! /usr/bin/env bats\n################################################################################\n# 01-install_script.bats\n# Time-stamp: <Mon 2017-01-23 01:42 svarrette>\n#\n# Bats: Bash Automated Testing System -- https://github.com/sstephenson/bats\n# Installation:\n#  == OS X ==\n#\n#      $> brew install bats\n#\n#   before_install:\n#      - if [ \"$(uname -s)\" == \"Darwin\"  ]; then brew install bats; fi\n#\n#\n#  == Debian-like ==\n#\n#      $> sudo apt-get install software-properties-common\n#      $> sudo apt-get install python-software-properties\n#      $> sudo add-apt-repository ppa:duggan/bats --yes\n#      $> sudo apt-get update -qq\n#      $> sudo apt-get install -qq bats\n#\n#   before_install:\n#      - sudo add-apt-repository ppa:duggan/bats --yes\n#      - sudo apt-get update -qq\n#      - sudo apt-get install -qq bats\n#\n#\n#  == Manual ==\n#\n#    before_script:\n#      - git clone https://github.com/sstephenson/bats.git /tmp/bats\n#      - mkdir -p /tmp/local\n#      - bash /tmp/bats/install.sh /tmp/local\n#      - export PATH=$PATH:/tmp/local/bin\n#\n# Resources:\n# - How to use Bats to test your command line tools:\n#            https://blog.engineyard.com/2014/bats-test-command-line-tools\n# - Ex of travis-CI integration:\n#            https://github.com/duggan/pontoon/blob/master/.travis.yml\n# - Another project using bats:\n#            https://github.com/ekalinin/envirius/tree/master/tests\n################################################################################\n\nload test_helper\n\nDOTFILE_INSTALL=\"$BATS_TEST_DIRNAME/../install.sh --force --offline\"\n\nsetup() {\n    # Avoid to run the tests on your machine\n    case \"$(hostname -f)\" in\n        *travis* | *testing*)  echo \"=> Tests on travis resources\";;\n        *vagrant*) echo \"=> Tests on vagrant resources\";;\n        *) # Detect TRAVIS_CI_RUN environment variable (set in .travis.yml)\n            if [ -z \"${TRAVIS_CI_RUN}\" ]; then\n                echo \"tests on $(hostname -f) skiped\"\n                skip\n            fi;;\n    esac\n}\n\n# teardown() {\n#     # if [ -d \"${DOTFILES_D}\" ]; then\n#     #     echo \"Dotfile ${DOTFILES_D} exists and will be removed\"\n#     #     rm -rf ${DOTFILES_D}\n#     # fi\n# }\n\n@test \"default install (no option)\" {\n    run $DOTFILE_INSTALL\n    [ $status -eq 0 ]\n    [ -d \"${DOTFILES_D}\" ]\n}\n\n@test \"install --bash\" {\n    run $DOTFILE_INSTALL --bash\n    assert_success\n    assert_falkor_dotfile_present \"bash/.bashrc\"\n    assert_falkor_dotfile_present \"bash/.inputrc\"\n    assert_falkor_dotfile_present \"bash/.bash_profile\"\n    assert [ -e \"${DOTFILES_D}/bash/custom/aliases.sh\" ]\n}\n\n@test \"install --bash --delete\" {\n    run $DOTFILE_INSTALL --bash --delete\n    assert_success\n    assert_falkor_dotfile_absent \"bash/.bashrc\"\n    assert_falkor_dotfile_absent \"bash/.inputrc\"\n    assert_falkor_dotfile_absent \"bash/.bash_profile\"\n    assert [ ! -e \"${DOTFILES_D}/bash/custom/aliases.sh\" ]\n}\n\n\n@test \"install --vim\" {\n    run $DOTFILE_INSTALL --vim\n    assert_success\n    assert [ -e \"${DOTFILES_D}/vim/vimrc\" ]\n}\n\n# @test \"install --vim --delete\" {\n#     run $DOTFILE_INSTALL --vim --delete\n#     assert_success\n#     assert [ ! -e \"${DOTFILES_D}/vim\" ]\n# }\n\n@test \"install --screen\" {\n    run $DOTFILE_INSTALL --screen\n    assert_success\n    assert_falkor_dotfile_present \"screen/.screenrc\"\n}\n\n@test \"install --screen --delete\" {\n    run $DOTFILE_INSTALL --screen --delete\n    assert_success\n    assert_falkor_dotfile_absent \"screen/.screenrc\"\n}\n\n@test \"install --git\" {\n  [ -n \"${TRAVIS_CI_RUN}\" ] && skip\n  run $DOTFILE_INSTALL --git\n  assert_success\n  assert_falkor_dotfile_present \"git/config\"\n  assert_falkor_dotfile_present \"git/config.local\"\n}\n\n\n@test \"install --git --delete\" {\n    [ -n \"${TRAVIS_CI_RUN}\" ] && skip\n    run $DOTFILE_INSTALL --git --delete\n    assert_success\n    assert_falkor_dotfile_absent \"git/config\"\n    assert_falkor_dotfile_absent \"git/config.local\"\n}\n\n# @test \"install --zsh\" {\n#     #[ -n \"${TRAVIS_CI_RUN}\" ] && skip\n#     run bash -c \"echo password | $DOTFILE_INSTALL --zsh\"\n#     assert_success\n#     assert_falkor_dotfile_present \"oh-my-zsh/.zshrc\"\n#     assert [ -h \"${TARGET}/.oh-my-zsh/custom/plugins/falkor\" ]\n#     assert [ -h \"${TARGET}/.oh-my-zsh/custom/themes/powerlevel9k\" ]\n# }\n\n# @test \"install --zsh --delete\" {\n#     #[ -n \"${TRAVIS_CI_RUN}\" ] && skip\n#     run bash -c \"echo y | $DOTFILE_INSTALL --zsh --delete\"\n#     assert_success\n#     assert_falkor_dotfile_absent \"oh-my-zsh/.zshrc\"\n#     assert [ ! -e \"${TARGET}/.oh-my-zsh/custom/plugins/falkor\" ]\n#     assert [ ! -e \"${TARGET}/.oh-my-zsh/custom/themes/powerlevel9k\" ]\n# }\n"
  },
  {
    "path": "tests/README.md",
    "content": "-*- mode: markdown; mode: visual-line; fill-column: 80 -*-\n\n-------------------------------------\n# Automatic Tests of Falkor/dotfiles\n\nThese tests are based on [Bats](https://github.com/sstephenson/bats): Bash Automated Testing System.\nCoupled with [Travis-CI](https://docs.travis-ci.com/), it offers a nice continuous integration framework -- see [Travis CI for Complete Beginners](https://docs.travis-ci.com/user/for-beginners)\n\n\n## Pre-requisites\n\n### Bats installation\n\nI made a `setup_bats.sh` script for that (also for easier integration with travis) which roughly performs the following actions:\n\n* On Mac OS: use [Homebrew](http://brew.sh/) to install the `bats` package\n* On Linux system, a manual installation is performed under `/tmp/local/bin` (to ensure a full compliance with Travis virtualized boxes), which consists in:\n\n   ```bash\n   $> git clone https://github.com/sstephenson/bats.git /tmp/bats\n   $> mkdir -p /tmp/local\n   $> bash /tmp/bats/install.sh /tmp/local\n   $> export PATH=$PATH:/tmp/local/bin\n   ```\n\nNote that their is normally a way to rely on Debian packages yet I never managed to make it work.\nFor the records, the procedure would have been:\n\n```bash\n$> apt-get install software-properties-common python-software-properties  # to get 'add-apt-repository'\n$> add-apt-repository ppa:duggan/bats --yes\n$> apt-get update -qq\n$> apt-get install -qq bats\n```\n\nHowever the package repository does not work any more\n\n    W: Failed to fetch http://ppa.launchpad.net/duggan/bats/ubuntu/dists/wheezy/main/binary-amd64/Packages  404  Not Found\n\n### Travis integration\n\nTake a look at the repository [.travis.yml](../.travis.yml)\n\n## Directory Layout\n\n```bash\ntests/\n├── *.bats            # The bats files, each defining a set of unit tests\n├── README.md         # This file\n└── setup_bats.sh     # run/source this file to install Bats on your system\n```\n\n## Run the tests\n\nSimply run\n\n     $> bats .       # from the tests directory\n\nOR, from the root repository\n\n     $> make tests   # from the root directory of the dotfiles repository\n\n## Resources\n\nYou might find the below links interestings:\n\n* [Bats Wiki](https://github.com/sstephenson/bats/wiki) and [Homepage](https://github.com/sstephenson/bats)\n* [How to use Bats to test your command line tools](https://blog.engineyard.com/2014/bats-test-command-line-tools)\n"
  },
  {
    "path": "tests/setup_bats.sh",
    "content": "#! /bin/bash\n################################################################################\n# setup_bats.sh - Setup Bats -- Bash Automated Testing System\n# .               See https://github.com/sstephenson/bats\n# Time-stamp: <Thu 2016-03-03 11:18 svarrette>\n#\n# Usage:\n#       source setup_bats.sh\n#\n# You SHOULD source this file since it might alter the PATH variable\n################################################################################\n\nCOLOR_RED=\"\\033[0;31m\"\nCOLOR_BACK=\"\\033[0m\"\n\nprint_error_and_exit() {\n    echo -e  \"${COLOR_RED}***ERROR***${COLOR_BACK} $*\"\n    exit 1\n}\nif [ \"$(uname -s)\" == \"Darwin\"  ]; then\n    [ -z \"`which brew`\" ] && print_error_and_exit \"Install Homebrew: see http://brew.sh/\"\n    if [ -z \"`which bats`\" ]; then\n        echo \"=> installing bats\"\n        brew install bats\n    else\n        echo \"... bats seems to be already installed\"\n    fi\nelif [ \"$(uname -s)\" == \"Linux\" ]; then\n    if [ -z \"`which bats`\" ]; then\n        echo \"=> manual install of bats\"\n        if [ ! -d /tmp/bats ]; then\n            git clone https://github.com/sstephenson/bats.git /tmp/bats\n        else\n            cd /tmp/bats; git pull; cd -\n        fi\n        mkdir -p /tmp/local\n        bash /tmp/bats/install.sh /tmp/local\n        export PATH=$PATH:/tmp/local/bin\n    else\n        echo \"... bats seems to be already installed\"\n    fi\nelse\n    print_error_and_exit \"unsupported system\"\nfi\n"
  },
  {
    "path": "tests/test_helper.bash",
    "content": "#! /usr/bin/env bash\n################################################################################\n# test_helper.bash -\n# Time-stamp: <Mon 2017-01-23 01:34 svarrette>\n#\n# Copyright (c) 2016 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n#\n################################################################################\n\n# Colors\nCOLOR_RED=\"\\033[0;31m\"\nCOLOR_BACK=\"\\033[0m\"\n\n# Constant\n#DOTFILES_D=${DOTFILES_D:=$HOME/.config/dotfiles.falkor.d}\nDOTFILES_D=${DOTFILES_D:=$HOME/.config}\nTARGET=${TARGET:=$HOME}\n\n\n# See https://github.com/jasonkarns/bats-assert\n# Note: flunk forces a test failure with an optional message\nload helpers/assertions/all\n\n\nprint_error_and_exit() {\n    echo -e  \"${COLOR_RED}***ERROR***${COLOR_BACK} $*\"\n    exit 1\n}\n\nassert_falkor_dotfile_present() {\n    local filename=$(basename $1)\n    local falkor_dotfile=${DOTFILES_D}/$1\n    local relative_target=${falkor_dotfile/#$HOME\\//}\n    local dotfile=${TARGET}/$filename\n    if [[ ! -e \"${dotfile}\" ]]; then\n        flunk \"the dotfile '${dotfile}' does not exists\"\n    else\n        if [[ -h \"${dotfile}\" ]]; then\n            if [ \"$(readlink $dotfile)\" != \"${relative_target}\" ]; then\n                flunk \"the dotfile '$dotfile' is a symlink yet it does not point to '${relative_target}' (but to '$(readlink $dotfile)')\"\n            fi\n        elif [[ -f \"${dotfile}\" ]]; then\n            local checksum_src=`shasum $dotfile        | cut -d ' ' -f 1`\n            local checksum_dst=`shasum $falkor_dotfile | cut -d ' ' -f 1`\n            if [ \"${checksum_src}\" != \"${checksum_dst}\" ]; then\n                flunk \"${dotfile} is present and a file, yet its content differs from '${falkor_dotfile}'\"\n            fi\n        fi\n    fi\n}\n\nassert_falkor_dotfile_absent() {\n    local filename=$(basename $1)\n    local falkor_dotfile=${DOTFILES_D}/$1\n    local dotfile=${TARGET}/$filename\n    if [[ -e \"${dotfile}\" ]]; then\n        if [[ -h \"${dotfile}\" ]]; then\n            if [ \"$(readlink $dotfile)\" == \"${falkor_dotfile}\" ]; then\n                flunk \"the dotfile '$dotfile' is a symlink still pointing to '${falkor_dotfile}'\"\n            fi\n        elif [[ -f \"${dotfile}\" ]]; then\n            local checksum_src=`shasum $dotfile        | cut -d ' ' -f 1`\n            local checksum_dst=`shasum $falkor_dotfile | cut -d ' ' -f 1`\n            if [ \"${checksum_src}\" == \"${checksum_dst}\" ]; then\n                flunk \"${dotfile} is present and a file, yet its content is the same as the one of '${falkor_dotfile}'\"\n            fi\n        fi\n    fi\n}\n"
  },
  {
    "path": "tmux/README.md",
    "content": "# Tmux\n\n[Tmux](https://github.com/tmux/tmux/wiki/Getting-Started), a modern terminal multiplexer, alternative to GNU screen.\n\n* [cheatsheet](https://tmuxcheatsheet.com/)\n\n## Installation\n\n```bash\n# Install Tmux Plugin Manager: https://github.com/tmux-plugins/tpm\ngit clone https://github.com/tmux-plugins/tpm ~/.config/tmux/plugins/tpm\n# Copy/symlink the present tmux.conf under ~/.config/tmux/ \n```\n\n```bash\nsudo apt install tmux tmuxinator\n```\n\nYou also need to install [Tmux Plugin Manager](https://github.com/tmux-plugins/tpm) which helps to manage several interesting plugins -- see [plugin list](https://github.com/tmux-plugins/list):\n\n```bash\ngit clone https://github.com/tmux-plugins/tpm ~/.config/tmux/plugins/tpm\n```\n\n## Configuration\n\nThe default configuration is located under `$XDG_CONFIG_HOME/tmux/tmux.conf` (for compliance with the  [XDG Base Directory Specifications](https://specifications.freedesktop.org/basedir-spec/latest/)).\n\nCopy or symlink the present [`tmux.conf`](tmux.conf) under `~/.config/tmux/`\n\nThe first time you run `tmux`, install the defined plugins with `Ctrl+b I` (aka `<prefix> I`)\n\n## Reminder of the main `tmux` commands\n\nKindly refer to many [cheatsheets](https://geoffcorey.github.io/tmux/linux/tpm/cli/2023/12/23/tmux-and-tpm.html) existing online, yet here are a recall of the main commands:\n\n* You can start a tmux session (_i.e._ creates a single window with a shell in it) with the `tmux` command.\n\n| Command                         | Description                                        |\n| :------------------------------ | :------------------------------------------------- |\n| `tmux [new -s <name>]`          | start a new tmux session (named `<name>`)          |\n| `tmux ls`                       | list current tmux sessions                         |\n| `tmux attach [-t <name>] [-r] ` | attach to a named screen session (`-r`: read-only) |\n| `tmux kill-session [-t <name>]` | kill session `<name>` (all: `tmux kill-server`)    |\n\nOnce within a tmux session, similarly to [Gnu screen](../screen/README.md), you can invoke a command which consist of a \"`CTRL + b`\" sequence followed by another character.\nThe main commands are listed in the below table:\n\n| __Command__      | __Description__                      |\n| :--------------- | :----------------------------------- |\n| `Ctrl+b c`       | __create__ new tab                   |\n| `Ctrl+b n`       | go to __next__ tab                   |\n| `Ctrl+b p`       | go to __previous__ tab               |\n| `Ctrl+b ,`       | rename / set tab title               |\n| `Ctrl+b x`       | kill current tab                     |\n| `Ctrl+b [0-9]`   | switch to tab number __[0-9]__       |\n| `Ctrl+b d`       | __detach__                           |\n| `Ctrl+b &`       | quit and killall _(not recommended)_ |\n| `Ctrl+b [`       | Enter/leave copy mode                |\n|                  | \\texti{(up/down; space to select}    |\n| `Ctrl+b ?`       | Help                                 |\n| `Ctrl+b %`       | vertical split pane                  |\n| `Ctrl+b \"`       | horizontal split pane                |\n| `Ctrl+b <arrow>` | move to pane                         |\n| `Ctrl+b q`       | Show pane numbers                    |\n\nWith the Tmux plugins installed, you also have access to other commands:\n\n\n| __Command__      |                       __Tmux plugin__                        | __Description__                                  |\n| :--------------- | :----------------------------------------------------------: | :----------------------------------------------- |\n| `Ctrl+b SPACE`   | [tmux-which-key](https://github.com/alexwforsythe/tmux-which-key) | Nice menu facilitating key navigation            |\n| `Ctrl+b I`       |  [Tmux plugin manager](https://github.com/tmux-plugins/tpm)  | __install__ plugins and refresh tmux environment |\n| `Ctrl+b U`       |                                                              | __update__ plugins                               |\n| `Ctrl+b Alt u`   |                                                              | remove/uninstall plugins not on the plugin list  |\n| `Ctrl+b shift p` | [tmux-logging](https://github.com/tmux-plugins/tmux-logging) | Enter/leave logging mode                         |\n\n"
  },
  {
    "path": "tmux/tmux.conf",
    "content": "# Time-stamp: <Mon 2024-12-30 11:28 svarrette>\n################################################################################\n# tmux.conf - TMux configuration\n################################################################################\n#        _                                          __\n#       | |_ _ __ ___  _   ___  __  ___ ___  _ __  / _|\n#       | __| '_ ` _ \\| | | \\ \\/ / / __/ _ \\| '_ \\| |_\n#       | |_| | | | | | |_| |>  < | (_| (_) | | | |  _|\n#      (_)__|_| |_| |_|\\__,_/_/\\_(_)___\\___/|_| |_|_|\n#\n################################################################################\n# Install Tmux Plugin Manager: https://github.com/tmux-plugins/tpm\n#    git clone https://github.com/tmux-plugins/tpm ~/.config/tmux/plugins/tpm\n#\n# Then install the present configuration file into ~/.tmux.conf (or better)\n# $XDG_CONFIG_HOME/tmux/tmux.conf\n#\n# If you intend to use the 'falkor' theme for tmux-powerline, ensure\n#  ~/.config/tmux-powerline points to tmux-powerline\n#\n# TMux cheatsheet: https://tmuxcheatsheet.com/\n################################################################################\n\n### List of enabled plugins: https://github.com/tmux-plugins/list\nset -g @plugin 'tmux-plugins/tpm'  # Tmux Plugin Manager\n\n# number of sensible defaults for Tmux, such as enabling mouse support and making it easier to split and resize panes.\nset -g @plugin 'tmux-plugins/tmux-sensible'\n\n### tmux-powerline: https://github.com/erikw/tmux-powerline\n# see falkor theme under tmux-powerline/themes/\nset -g @plugin 'erikw/tmux-powerline'\n\n####  https://github.com/tmux-plugins/tmux-sidebar\n#    prefix + Tab - toggle sidebar with a directory tree\n#    prefix + Backspace - toggle sidebar and move cursor to it (focus it)\nset -g @plugin 'tmux-plugins/tmux-sidebar'\n# Alternative (assuming https://github.com/nvim-tree/nvim-tree.lua is installed)\n# et -g @treemux-tree-nvim-init-file '~/.tmux/plugins/treemux/configs/treemux_init.lua'\n# set -g @plugin 'kiyoon/treemux'\n\n### https://github.com/tmux-plugins/tmux-logging\nset -g @plugin 'tmux-plugins/tmux-logging'  # <prefix> SHIFT p\n\n### <prefix> SPACE\nset -g @plugin 'alexwforsythe/tmux-which-key'\n\n# Custom bindings\nbind-key -T prefix X confirm-before kill-session\n\n# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)!!!\nrun '~/.config/tmux/plugins/tpm/tpm'\n"
  },
  {
    "path": "vim/.oldfr/.vimrc",
    "content": "\"\n\"  .vimrc -- my personal VIM configuration\n\"            see http://github.com/Falkor/dotfiles\n\"\n\"  Copyright (c) 2010 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n\"                http://varrette.gforge.uni.lu\n\"\n\"             _\n\"      __   _(_)_ __ ___  _ __ ___\n\"      \\ \\ / / | '_ ` _ \\| '__/ __|\n\"       \\ V /| | | | | | | | | (__\n\"      (_)_/ |_|_| |_| |_|_|  \\___|\n\"\n\"\n\" To be reworked... for instance using\n\"   http://github.com/rtomayko/dotfiles/blob/rtomayko/.vimrc\n\"\n\" /etc/vim/vimrc ou ~/.vimrc\n\" Fichier de configuration de Vim\n\" Formation Debian GNU/Linux par Alexis de Lattre\n\" http://www.via.ecp.fr/~alexis/formation-linux/\n\n\" ':help options.txt' ou ':help nom_du_paramtre' dans Vim\n\" pour avoir de l'aide sur les paramtres de ce fichier de configuration\n\n\" Avertissement par flash (visual bell) plutt que par beep\nset vb\n\n\" Encoding\nset enc=iso-8859-1\n\n\" Active la coloration syntaxique\nsyntax on\n\" Utiliser le jeu de couleurs standard\ncolorscheme default\nset background=dark\n\n\" Affiche la position du curseur 'ligne,colonne'\nset ruler\n\" Affiche une barre de status en bas de l'cran\nset laststatus=2\n\" Contenu de la barre de status\nset statusline=%<%f%h%m%r%=%l,%c\\ %P\n\n\" Largeur maxi du texte insr\n\" '72' permet de wrapper automatiquement  72 caractres\n\" '0' dsactive la fonction\nset textwidth=0\n\n\" Wrappe  72 caractres avec la touche '#'\nmap # {v}! par 72\n\" Wrappe et justifie  72 caractres avec la touche '@'\nmap @ {v}! par 72j\n\n\" Ne pas assurer la compatibilit avec l'ancien Vi\nset nocompatible\n\" Nombre de colonnes\n\"set columns=80\n\" Nombre de commandes dans l'historique\nset history=50\n\" Options du fichier ~/.viminfo\nset viminfo='20,\\\"50\n\" Active la touche Backspace\nset backspace=2\n\" Autorise le passage d'une ligne  l'autre avec les flches gauche et droite\nset whichwrap=<,>,[,]\n\" Garde toujours une ligne visible  l'cran au dessus du curseur\nset scrolloff=1\n\" Affiche les commandes dans la barre de status\nset showcmd\n\" Affiche la paire de parenthses\nset showmatch\n\" Essaye de garder le curseur dans la mme colonne quand on change de ligne\nset nostartofline\n\" Option de la compltion automatique\nset wildmode=list:full\n\" Par dfaut, ne garde pas l'indentation de la ligne prcdente\n\" quand on commence une nouvelle ligne\nset noautoindent\n\" Options d'indentation pour un fichier C\nset cinoptions=(0\n\n\" xterm-debian est un terminal couleur\nif &term =~ \"xterm-debian\" || &term =~ \"xterm-xfree86\"\n    set t_Co=16\n    set t_Sf=\u001b[3%dm\n    set t_Sb=\u001b[4%dm\nendif\n\n\" Quand on fait de la programmation, on veut qu'il n'y ait jamais de\n\" vraies tabulations insres mais seulement 4 espaces\nautocmd BufNewfile,BufRead *.c set expandtab\nautocmd BufNewfile,BufRead *.c set tabstop=4\nautocmd BufNewfile,BufRead *.h set expandtab\nautocmd BufNewfile,BufRead *.h set tabstop=4\nautocmd BufNewfile,BufRead *.cpp set expandtab\nautocmd BufNewfile,BufRead *.cpp set tabstop=4\n\n\" Dcommentez les 2 lignes suivantes si vous voulez avoir les tabulations et\n\" les espaces marqus en caractres bleus\n\"set list\n\"set listchars=tab:>-,trail:-\n\n\" Les recherches ne sont pas 'case sensitives'\nset ignorecase\n\" Mettre en surlign les expressions recherches\nset hlsearch\n\n\" Fichier d'aide\nset helpfile=$VIMRUNTIME/doc/help.txt.gz\n\n\" Le dcoupage des folders se base sur l'indentation\nset foldmethod=indent\n\" 12 niveaux d'indentation par dfaut pour les folders\nset foldlevel=12\n\n\" Police de caractre pour Gvim qui supporte le symbole euro\nset guifont=-misc-fixed-medium-r-semicondensed-*-*-111-75-75-c-*-iso8859-15\n"
  },
  {
    "path": "vim/README.md",
    "content": "# Falkor's Dotfiles -- vim configuration\n\n## Screenshot\n\n![](https://raw.githubusercontent.com/Falkor/dotfiles/master/screenshots/screenshot_falkor_vim.png)\n\n## Installation\n\nYou can use the `install.sh` script featured with the [Falkor's dotfile](https://github.com/Falkor/dotfile) repository.\n\n``` bash\n$> cd ~/.config/dotfiles.falkor.d\n$> ./install.sh --vim      # OR ./install.sh --with-vim\n```\nThis will setup the configuration files in `~/.config/vim`, following the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/)\nTo be able to inform vim about this 'exotic' location (ssuming the `$XDG_*` variables are configured in your shell), you need to setup the environment variable `$VIMINIT` as follows (see `shell/available/vim.sh`):\n\n~~~bash\n# XDG compliant setup for vim\n# Assuming you install your vim configuration under ~/.config/vim/vimrc as done\n# by default by Falkor's dotfiles -- see https://github.com/Falkor/dotfiles\nexport VIMINIT='let $MYVIMRC=\"$XDG_CONFIG_HOME/vim/vimrc\" | source $MYVIMRC'\n~~~\n\nUpon the first launch, vim will also setup the directory `~/.cache/vim/` to host in particular the packages installed automatically with [NeoBundle](https://github.com/Shougo/neobundle.vim/blob/master/doc/neobundle.txt).\n\n## Uninstall\n\n``` bash\n$> cd ~/.config/dotfiles.falkor.d\n$> ./install.sh --delete --vim\n```\n\n## Customizations\n\n* define your own custom bundle in `~/.vimrc.local.bundles`\n* use `.vimrc.local` to place your local custom vim code.\n"
  },
  {
    "path": "vim/config/autocmd.vim",
    "content": "\n\" File Types {{{\n\"-------------------------------------------------\n\"\" The PC is fast enough, do syntax highlight syncing from start\n\" augroup vimrc-sync-fromstart\n\"   autocmd!\n\"   autocmd BufEnter * :syntax sync fromstart\n\" augroup END\n\n\"\" txt\n\" augroup vimrc-wrapping\n\"   autocmd!\n\"   autocmd BufRead,BufNewFile *.txt call s:setupWrapping()\n\" augroup END\n\n\" authorize change of line using left/right arrow\nset whichwrap=<,>,[,]\n\n\n\"\" make/cmake\naugroup vimrc-make-cmake\n  autocmd!\n  autocmd FileType make setlocal noexpandtab\n  autocmd BufNewFile,BufRead CMakeLists.txt setlocal filetype=cmake\naugroup END\n\nset autoread\n\n\"\" always delete trailing whitespace UNLESS it's a markdown file\n\"\" The function :FixWhitespace comes from NeoBundle bronson/vim-trailing-whitespace\nlet g:extra_whitespace_ignored_filetypes = [ 'md' ]\nautocmd BufWritePre * :FixWhitespace\n\n\n\" Update Emacs Time-stamp\n\" autocmd BufWritePre *.* :%s/^\\s*\\(\\/\\/\\|#\\|%\\|\"\\)\\s\\+Time-stamp:\\s\\+<\\zs.*/\\=strftime('%a %Y-%m-%d') . ' ' . strftime('%H:%M') . ' ' . $USER . '>'/e\n\naugroup MyAutoCmd\n\n\t\" Update filetype on save if empty\n\tautocmd BufWritePost *\n\t\t\t\t\\ if &l:filetype ==# '' || exists('b:ftdetect')\n\t\t\t\t\\ |   unlet! b:ftdetect\n\t\t\t\t\\ |   filetype detect\n\t\t\t\t\\ | endif\n\n\tautocmd FileType crontab setlocal nobackup nowritebackup\n\n\tautocmd FileType gitcommit setlocal spell\n\n\tautocmd FileType gitcommit,qfreplace setlocal nofoldenable\n\n\tautocmd FileType zsh setlocal foldenable foldmethod=marker\n\n\t\" Improved include pattern\n\tautocmd FileType html\n\t\t\t\t\\ setlocal includeexpr=substitute(v:fname,'^\\\\/','','') |\n\t\t\t\t\\ setlocal path+=./;/\n\n\tautocmd FileType markdown\n\t\t\t\t\\ setlocal spell expandtab autoindent\n\t\t\t\t\t\\ formatoptions=tcroqn2 comments=n:>\n\n\tautocmd FileType apache setlocal path+=./;/\n\n\tautocmd FileType cam setlocal nonumber synmaxcol=10000\n\n\tautocmd FileType go highlight default link goErr WarningMsg |\n\t\t\t\t\\ match goErr /\\<err\\>/\n\n\tautocmd FileType python\n\t\t\\ if has('python') || has('python3') |\n\t\t\\   setlocal omnifunc=jedi#completions |\n\t\t\\ else |\n\t\t\\   setlocal omnifunc= |\n\t\t\\ endif\n\tautocmd BufWritePost ~/.vim/doc/* :helptags ~/.vim/doc\n\naugroup END\n\n\" vim-python\naugroup vimrc-python\n\tautocmd!\n\tautocmd FileType python setlocal expandtab shiftwidth=4 tabstop=8 colorcolumn=79\n\t\\ formatoptions+=croq softtabstop=4 smartindent\n\t\\ cinwords=if,elif,else,for,while,try,except,finally,def,class,with\naugroup END\n\n\" }}}\n\" Internal Plugin Settings \" {{{\n\" ------------------------\n\n\" PHP \"{{{\nlet g:PHP_removeCRwhenUnix = 0\n\n\" }}}\n\" Python \"{{{\nlet g:python_highlight_all = 1\n\n\" }}}\n\" Vim \"{{{\nlet g:vimsyntax_noerror = 1\n\"let g:vim_indent_cont = 0\n\n\" }}}\n\" Bash \"{{{\nlet g:is_bash = 1\n\n\" }}}\n\" Java \"{{{\nlet g:java_highlight_functions = 'style'\nlet g:java_highlight_all = 1\nlet g:java_highlight_debug = 1\nlet g:java_allow_cpp_keywords = 1\nlet g:java_space_errors = 1\nlet g:java_highlight_functions = 1\n\n\" }}}\n\" JavaScript \"{{{\nlet g:SimpleJsIndenter_BriefMode = 1\nlet g:SimpleJsIndenter_CaseIndentLevel = -1\n\n\" }}}\n\n\" Ruby \"{{{\naugroup vimrc-ruby\n  autocmd!\n  autocmd BufNewFile,BufRead *.rb,*.rbw,*.gemspec setlocal filetype=ruby\n  autocmd FileType ruby set tabstop=2|set shiftwidth=2|set expandtab softtabstop=2 smartindent\naugroup END\nlet g:tagbar_type_ruby = {\n  \\ 'kinds' : [\n  \\ 'm:modules',\n  \\ 'c:classes',\n  \\ 'd:describes',\n  \\ 'C:contexts',\n  \\ 'f:methods',\n  \\ 'F:singleton methods'\n  \\ ]\n\\ }\n\n\" }}}\n\n\" Markdown \"{{{\nlet g:markdown_fenced_languages = [\n\t\\  'coffee',\n\t\\  'css',\n\t\\  'erb=eruby',\n\t\\  'javascript',\n\t\\  'js=javascript',\n\t\\  'json=javascript',\n\t\\  'ruby',\n\t\\  'sass',\n\t\\  'xml',\n\t\\  'vim'\n\t\\]\n\n\" }}}\n\" }}}\n\" vim: set ts=2 sw=2 tw=80 noet :\n"
  },
  {
    "path": "vim/config/general.vim",
    "content": "\n\" General Settings\n\"---------------------------------------------------------\n\" General {{{\nset mouse=a                  \" Enable mouse to scroll in command-line mode\nset modeline                 \" automatically setting options from modelines\nset report=0                 \" Don't report on line changes\nset noerrorbells             \" Don't trigger bell on error\nset visualbell t_vb=         \" Don't make any faces\nset lazyredraw               \" don't redraw while in macros\nset hidden                   \" hide buffers when abandoned instead of unload\nset fileformats=unix,dos,mac \" Use Unix as the standard file type\nset magic                    \" For regular expressions turn magic on\nset path=.,**                \" Directories to search when using gf\nset virtualedit=block        \" Position cursor anywhere in visual block\nset history=1000             \" Search and commands remembered\nset synmaxcol=1000           \" Don't syntax highlight long lines\nsyntax on\nsyntax sync minlines=256     \" Update syntax highlighting for more lines\nset ttyfast                  \" Indicate a fast terminal connection\nset formatoptions+=1         \" Don't break lines after a one-letter word\nset formatoptions-=t         \" Don't auto-wrap text\n\nif has('vim_starting')\n\tset encoding=utf-8         \" The encoding displayed.\n\tset fileencoding=utf-8     \" The encoding written to file.\n\t\"setglobal bomb           \"  put \"byte order mark\" (BOM) at the start of Unicode files.\n  \"set fileencodings=ucs-bom,utf-8,latin1\n\tset binary\nendif\n\n\" What to save for views:\n\" set viewoptions-=options viewoptions+=slash,unix\n\n\" What not to save in sessions:\nset sessionoptions-=options\nset sessionoptions-=globals\nset sessionoptions-=folds\nset sessionoptions-=help\nset sessionoptions-=buffers\n\nset clipboard=unnamed\n\" if has('clipboard') || has('gui_running')\n\" \tset clipboard=unnamed,unnamedplus\n\" endif\n\" General }}}\n\n\" Wildmenu {{{\n\" --------\nif has('wildmenu')\n\tset nowildmenu\n\tset wildmode=list:longest,full\n\tset wildoptions=tagfile\n\tset wildignorecase\n\tset wildignore+=.git,*.pyc,*.spl,*.o,*.out,*~,#*#,%*\n\tset wildignore+=*.jpg,*.jpeg,*.png,*.gif,*.zip,**/tmp/**,*.DS_Store\nendif\n\n\" }}}\n\n\" Tabs and Indents {{{\n\" ----------------\nset textwidth=80    \" Text width maximum chars before wrapping\nset expandtab       \" Do expand tabs to spaces as default\nset tabstop=2       \" The number of spaces a tab is\nset softtabstop=2   \" While performing editing operations\nset smarttab        \" Tab insert blanks according to 'shiftwidth'\nset autoindent    \" Don't Use same indenting on new lines\nset smartindent     \" Smart autoindenting on new lines\nset shiftround      \" Round indent to multiple of 'shiftwidth'\nset shiftwidth=2    \" Number of spaces to use in auto(indent)\n\n\" }}}\n\" Folds {{{\n\" -----\nif has('folding')\n\tset foldenable\n\tset foldmethod=syntax\n\tset foldlevelstart=99\n\tset foldtext=FoldText()\nendif\n\n\" }}}\n\" Time {{{\n\" --------\nset timeout ttimeout\nset timeoutlen=750  \" Time out on mappings\nset ttimeoutlen=250 \" Time out on key codes\nset updatetime=1000 \" Idle time to write swap\n\nif has('nvim')\n\t\" https://github.com/neovim/neovim/issues/2017\n\tset ttimeoutlen=-1\nendif\n\n\" }}}\n\" Searching {{{\n\" ---------\nset ignorecase      \" Search ignoring case\nset smartcase       \" Keep case when searching with *\nset infercase\nset incsearch       \" Incremental search\nset hlsearch        \" Highlight search results\nset wrapscan        \" Searches wrap around the end of the file\nset showmatch       \" Jump to matching bracket\nset matchpairs+=<:> \" Add HTML brackets to pair matching\nset matchtime=1     \" Tenths of a second to show the matching paren\nset cpoptions-=m    \" showmatch will wait 0.5s or until a char is typed\n\n\" }}}\n\" Behavior {{{\n\" --------\nset linebreak                   \" Break long lines at 'breakat'\nset breakat=\\ \\\t;:,!?           \" Long lines break chars\nset nostartofline               \" Cursor in same column for few commands\nset whichwrap+=h,l,<,>,[,],~    \" Move to following line on certain keys\nset splitbelow splitright       \" Splits open bottom right\nset switchbuf=usetab,split      \" Switch buffer behavior\nset backspace=eol,start,indent  \" Intuitive backspacing in insert mode\nset diffopt=filler,iwhite       \" Diff mode: show fillers, ignore white\nset showfulltag                 \" Show tag and tidy search in completion\nset completeopt=menuone         \" Show menu even for one item\nset complete=.                  \" No wins, buffs, tags, include scanning\nset nowrap                      \" No wrap by default\n\n\" }}}\n\nset shell=/bin/sh       \" Use Bourne shell for command substitution\n\n\" Editor UI Appearance {{{\n\" --------------------\nset noshowmode          \" Don't show mode in cmd window\nset shortmess=aoOTI     \" Shorten messages and don't show intro\nset scrolloff=3         \" Keep at least 3 lines above/below\nset sidescrolloff=3     \" Keep at least 3 lines left/right\nset pumheight=20        \" Pop-up menu's line height\nset number              \" Show line numbers\n\"set relativenumber      \" Use relative instead of absolute line numbers\nset ruler               \" Enable default status ruler\nset nolist                \" Show hidden characters\n\nset showtabline=2       \" Always show the tabs line\nset tabpagemax=30       \" Maximum number of tab pages\nset winwidth=30         \" Minimum width for current window\nset winheight=1         \" Minimum height for current window\nset previewheight=8     \" Completion preview height\nset helpheight=12       \" Minimum help window height\n\nset display=lastline\nset title               \" No need for a title\n\" Title format: see https://coderwall.com/p/lznfyw/better-title-string-for-vim\n\" directory info (max 12 char)          | buff. no | filename | modified | Type | Row no.\nset titlestring=...%{strpart(expand(\\\"%:p:h\\\"),stridx(expand(\\\"%:p:h\\\"),\\\"/\\\",strlen(expand(\\\"%:p:h\\\"))-12))}%=%n.\\ \\ %{expand(\\\"%:t:r\\\")}\\ %m\\ %Y\\ \\ \\ \\ %l\\ of\\ %L\nset showcmd             \" Show command in status line\nset cmdheight=2         \" Height of the command line\nset cmdwinheight=5      \" Command-line lines\nset noequalalways       \" Don't resize windows on split or close\nset laststatus=2        \" Always show a status line\nset colorcolumn=80      \" Highlight the 80th character limit\n\n\" Do not display completion messages\n\" Patch: https://groups.google.com/forum/#!topic/vim_dev/WeBBjkXE8H8\nif has('patch-7.4.314')\n\tset shortmess+=c\nendif\n\n\" For snippet_complete marker\nif has('conceal') && v:version >= 703\n\tset conceallevel=2 concealcursor=niv\nendif\n\n\" }}}\n\" vim: set ts=2 sw=2 tw=80 noet foldmethod=marker:\n\"\n"
  },
  {
    "path": "vim/config/init.vim",
    "content": "\n\" Vim Initialization\n\" ------------------\n\n\" Global Mappings \"{{{\n\" Use spacebar instead of '\\' as leader. Require before loading plugins.\nlet g:mapleader=\"\\<Space>\"\nlet g:maplocalleader=','\n\n\" Release keymappings for plug-in.\nnnoremap <Space>  <Nop>\nxnoremap <Space>  <Nop>\nnnoremap ,        <Nop>\nxnoremap ,        <Nop>\n\n\" }}}\n\n\" XDG and Vim directory Settings \"{{{\n\" mkdir -p \"$(XDG_CACHE_HOME)/vim/\"{backup,session,swap,tags,undo,view,notes}; \"\nfor vimdir in ['swap', 'backup', 'undo', 'plugins', 'shada', 'viminfo']\n  \" swap: swp files, stored in directory\n  \" backup .bak files, stored in backupdir\n  if !isdirectory($VARPATH . vimdir)\n    call mkdir(   $VARPATH . vimdir, \"p\")\n  endif\nendfor\nif has('nvim')\n\tset shada='30,/100,:50,<10,@10,s50,h,n$VARPATH/shada\nelse\n\tset viminfo='30,/100,:500,<10,@10,s10,h,n$VARPATH/viminfo\nendif\n\nset undofile swapfile nobackup\nset directory=$VARPATH/swap//,$VARPATH,~/tmp,/var/tmp,/tmp\nset undodir=$VARPATH/undo//,$VARPATH,~/tmp,/var/tmp,/tmp\nset backupdir=$VARPATH/backup/,$VARPATH,~/tmp,/var/tmp,/tmp\nset viewdir=$VARPATH/view/\nset nospell spellfile=$VIMPATH/spell/en.utf-8.add\n\n\n\" Don't backup files in temp directories or shm\nif exists('&backupskip')\n\tset backupskip+=/tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/*,/private/var/*,.vault.vim\nendif\n\n\" Don't keep swap files in temp directories or shm\naugroup swapskip\n\tautocmd!\n\tsilent! autocmd BufNewFile,BufReadPre\n\t\t\\ /tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/*,/private/var/*,.vault.vim\n\t\t\\ setlocal noswapfile\naugroup END\n\n\" Don't keep undo files in temp directories or shm\nif has('persistent_undo')\n\taugroup undoskip\n\t\tautocmd!\n\t\tsilent! autocmd BufWritePre\n\t\t\t\\ /tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/*,/private/var/*,.vault.vim\n\t\t\t\\ setlocal noundofile\n\taugroup END\nendif\n\n\" Don't keep viminfo for files in temp directories or shm\naugroup viminfoskip\n\tautocmd!\n\tsilent! autocmd BufNewFile,BufReadPre\n\t\t\\ /tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*,*/shm/*,/private/var/*,.vault.vim\n\t\t\\ setlocal viminfo=\naugroup END\n\nset viminfo+=n$VARPATH/viminfo\nset runtimepath=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$VIM,$VIMRUNTIME\n\" }}}\n\n\" Set augroup \"{{{\naugroup MyAutoCmd\n\tautocmd!\naugroup END\n\n\" }}}\n\" Load vault settings \"{{{\nif filereadable(expand('$VIMPATH/.vault.vim'))\n\texecute 'source' expand('$VIMPATH/.vault.vim')\nendif\n\n\" }}}\n\" Setup NeoBundle \"{{{\nlet s:plugins_dir = expand('$VARPATH/plugins')\n\"let g:neobundle#types#git#default_protocol = 'https'\n\nif has('vim_starting')\n\tif isdirectory($XDG_CONFIG_HOME.'/vim')\n\t\t\" Respect XDG\n\t\tlet $MYVIMRC=expand('$XDG_CONFIG_HOME/vim/vimrc')\n\t\tset runtimepath=$VIMPATH,$VIM/vimfiles,$VIMRUNTIME\n\tendif\n\n\t\" Load NeoBundle for package management\n\tif &runtimepath !~? '/neobundle.vim'\n\t\tif ! isdirectory(s:plugins_dir.'/neobundle.vim')\n        \" Clone NeoBundle if not found\n        echo \"Installing NeoBundle...\"\n        echo \" \"\n        execute printf('!git clone %s://github.com/Shougo/neobundle.vim.git',\n        \\ (exists('$http_proxy') ? 'https' : 'git'))\n        \\ s:plugins_dir.'/neobundle.vim'\n    endif\n\n    execute 'set runtimepath^='.s:plugins_dir.'/neobundle.vim'\nendif\n\n\" Load minimal version of vim while SSHing\nif len($SSH_CLIENT)\n    let $VIM_MINIMAL = 1\nendif\nendif\n\n\" }}}\n\" Disable default plugins \"{{{\n\n\" Disable menu.vim\nif has('gui_running')\n  set guioptions=Mc\nendif\n\n\" Disable pre-bundled plugins\nlet g:loaded_getscript = 1\nlet g:loaded_getscriptPlugin = 1\nlet g:loaded_matchparen = 1\nlet g:loaded_netrw = 1\nlet g:loaded_netrwPlugin = 1\nlet g:loaded_netrwFileHandlers = 1\nlet g:loaded_netrwSettings = 1\nlet g:loaded_rrhelper = 1\nlet g:loaded_tar = 1\nlet g:loaded_tarPlugin = 1\nlet g:loaded_2html_plugin = 1\nlet g:loaded_vimball = 1\nlet g:loaded_vimballPlugin = 1\nlet g:loaded_zip = 1\nlet g:loaded_zipPlugin = 1\nlet g:loaded_gzip = 1\n\" }}}\n\n\" vim: set ts=2 sw=2 tw=80 noet :\n"
  },
  {
    "path": "vim/config/keybindings.vim",
    "content": "\n\" Key Bindings and Abbreviations\n\"---------------------------------------------------------\n\" Documentation reminder for shortcuts:\n\" {cmd} {attr} {lhs} {rhs}\n\" where\n\"    {cmd}  is one of ':map', ':map!', ':nmap', ':vmap', ':imap',\n\"           ':cmap', ':smap', ':xmap', ':omap', ':lmap', etc.\n\"    {attr} is optional and one or more of the following: <buffer>, <silent>,\n\"        <expr> <script>, <unique> and <special>.\n\"        More than one attribute can be specified to a map.\n\"    {lhs}  left hand side, is a sequence of one or more keys that you will use\n\"        in your new shortcut.\n\"    {rhs}  right hand side, is the sequence of keys that the {lhs} shortcut keys\n\"        will execute when entered.\n\"\n\" :nmap - Display normal mode maps\n\" :imap - Display insert mode maps\n\" :vmap - Display visual and select mode maps\n\" :smap - Display select mode maps\n\" :xmap - Display visual mode maps\n\" :cmap - Display command-line mode maps\n\" :omap - Display operator pending mode maps\n\"\n\" Special Key notations -- see http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_2)\n\" <BS>           Backspace\n\" <Tab>          Tab\n\" <CR>           Enter\n\" <Enter>        Enter\n\" <Return>       Enter\n\" <Esc>          Escape\n\" <Space>        Space\n\" <Up>           Up arrow\n\" <Down>         Down arrow\n\" <Left>         Left arrow\n\" <Right>        Right arrow\n\" <F1> - <F12>   Function keys 1 to 12\n\" #1, #2..#9,#0  Function keys F1 to F9, F10\n\" <Insert>       Insert\n\" <Del>          Delete\n\" <Home>         Home\n\" <End>          End\n\" <PageUp>       Page-Up\n\" <PageDown>     Page-Down\n\" <bar>          the '|' character, which otherwise needs to be escaped '\\|'\n\n\" _____________________________________________________\n\" no one is really happy until you have this shortcuts\ncnoreabbrev W! w!\ncnoreabbrev Q! q!\ncnoreabbrev Qall! qall!\ncnoreabbrev Wq wq\ncnoreabbrev Wa wa\ncnoreabbrev wQ wq\ncnoreabbrev WQ wq\ncnoreabbrev W w\ncnoreabbrev Q q\ncnoreabbrev Qall qall\n\n\"______________________________________________\n\" Fonctions Keys {{{\nnoremap  <F1> :NERDTreeToggle %<CR>\nnnoremap <F2> :set nonumber!<CR>\n\nif neobundle#tap('undotree') \"{{{\n  nnoremap <F7>  :UndotreeToggle<CR>\n\n  call neobundle#untap()\nendif\n\" }}}\n\n\nnmap     <F8> :TagbarToggle<CR>    \" displays tags in a window, ordered by scope\n\n\" }}}\n\n\n\"______________________________________________\n\" Opening Files/Buffers (with ctrlp plugin) {{{\nlet g:ctrlp_prompt_mappings = {\n\\ 'AcceptSelection(\"e\")': ['<c-t>'],\n\\ 'AcceptSelection(\"t\")': ['<cr>', '<2-LeftMouse>'],\n\\ } \" open in a new tab\nnnoremap <Leader>o :CtrlP <CR>        \" open new file\nnnoremap <Leader>b :CtrlPBuffer<CR>   \" open buffer\n\" }}}\n\n\" \" Type <Space>w to save file (a lot faster than :w<Enter>):\n\" function! <SID>StripTrailingWhitespaces(command)\n\"     let l = line(\".\")\n\"     let c = col(\".\")\n\"     %s/\\s\\+$//e\n\"     call cursor(l, c)\n\" endfun\n\"\n\nnnoremap <Leader>w :w<CR>\n\n\" \" Mimic Emacs ??? {{{\n\" autocmd FileType * setlocal indentkeys+=!<Tab>  \" Use tab to indent\n\n\" }}}\n\n\"___________________\n\" Bash/Emacs-like {{{\nmap <C-e> $\nmap <C-a> 0|\nmap <C-k> d$\nmap! <C-e> <esc>A\nmap! <C-a> <esc>0i\nmap! <C-k> <esc>d$\n\" }}}\n\n\" Comments comes from The NERD Commenter (A plugin that allows for easy\n\" commenting of code for many filetypes.  http://www.vim.org/scripts/script.php?script_id=1218\n\n\"___________________\n\" Copy/Paste/Cut {{{\nif has('unnamedplus')\n  set clipboard=unnamed,unnamedplus\nendif\n\" see http://tilvim.com/2014/03/18/a-better-paste.html\n\" a better paste\nmap <Leader>p :set paste<CR>o<esc>\"*]p:set nopaste<cr>\"\n\" noremap YY \"+y<CR>\n\" noremap <leader>p \"+gP<CR>\n\" noremap XX \"+x<CR>\n\nif has('macunix')\n  \" pbcopy for OSX copy/paste\n  vmap <C-x> :!pbcopy<CR>\n  vmap <C-c> :w !pbcopy<CR><CR>\nendif\n\n\n\" \" Automatically jump to end of text you pasted:\n\" vnoremap <silent> y y`]\n\" vnoremap <silent> p p`]\n\" nnoremap <silent> p p`]\n\n\" Quickly select text you just pasted:\n\" noremap gV `[v`]\n\" }}}\n\n\"_________________\n\" Split Screen {{{\nnoremap <Leader>h :<C-u>split<CR>\nnoremap <Leader>v :<C-u>vsplit<CR>\nnnoremap <Tab><Tab> <c-w>w           \" Go to next pane with Tab+Tab\n\" }}}\n\n\"_________\n\" Tabs {{{\nnnoremap <C-t> :tabnew<CR>\nnnoremap <Leader><Left>  gT\nnnoremap <Leader><Right> gt\nnnoremap te :tabe<Space>\n\" }}}\n\n\n\" Buffer {{{\nnoremap <leader>q :bd<CR>\n\" }}}\n\n\"_______________________________________________\n\" Visual line stuff <Space><Space> {{{\nnmap <Leader><Leader> V\nvmap < <gv\nvmap > >gv\nif neobundle#tap('vim-expand-region') \"{{{\n  vmap v <Plug>(expand_region_expand)\n  vmap V <Plug>(expand_region_shrink)\n  call neobundle#untap()\nendif\n\" Move visual block\nvnoremap J :m '>+1<CR>gv=gv\nvnoremap K :m '<-2<CR>gv=gv\n\n\" }}}\n\n\n\"_________________________________________________\nif neobundle#tap('incsearch.vim') \" Searching {{{\n\tlet g:incsearch#auto_nohlsearch = 1\n\tmap /  <Plug>(incsearch-forward)\n\tmap ?  <Plug>(incsearch-backward)\n\"\tmap g/ <Plug>(incsearch-stay)\n\tmap n  <Plug>(incsearch-nohl-n)\n\tmap N  <Plug>(incsearch-nohl-N)\n\tcall neobundle#untap()\nendif\nnnoremap <silent> <leader>f :Rgrep<CR>\n\n\"}}}\n\n\"_________\n\" Git {{{\nnoremap <Leader>ga :Gwrite<CR>\nnoremap <Leader>gc :Gcommit<CR>\nnoremap <Leader>gpu :Gpush<CR>\nnoremap <Leader>gup :Gpull<CR>\nnoremap <Leader>gs :Gstatus<CR>\nnoremap <Leader>gb :Gblame<CR>\nnoremap <Leader>gd :Gvdiff<CR>\nnoremap <Leader>gr :Gremove<CR>\nif neobundle#tap('vim-gitgutter')\n  nmap <Leader>ggn <Plug>GitGutterNextHunk\n\tnmap <Leader>ggp <Plug>GitGutterPrevHunk\n\tnmap <Leader>ggp <Plug>GitGutterPreviewHunk\n  call neobundle#untap()\nendif\n\" }}}\n\n\"_________\n\" Python / Jedi {{{\nif neobundle#tap('jedi-vim')\n  let g:jedi#goto_command = \"<leader>d\"\n  \" let g:jedi#goto_assignments_command = \"<leader>g\"\n  let g:jedi#goto_definitions_command = \"\"\n  let g:jedi#documentation_command = \"K\"\n  let g:jedi#usages_command = \"<leader>n\"\n  let g:jedi#completions_command = \"<C-Space>\"\n  let g:jedi#rename_command = \"<leader>r\"\n\n  call neobundle#untap()\nendif\n\" }}}\n\n\"\" Opens an edit command with the path of the currently edited file filled in\nnoremap <Leader>e :e <C-R>=expand(\"%:p:h\") . \"/\" <CR>\n\" Opens a tab edit command with the path of the currently edited file filled\nnoremap <Leader>te :tabe <C-R>=expand(\"%:p:h\") . \"/\" <CR>\n\n\"_________\n\" Misc {{{\nmap q: :q    \" Stop that stupid window from popping up\n\nmap <silent> <C-n> :set invhlsearch<CR>\n\n\" easy .vimrc editing {{{1 \"\n\" quickly edit and source vimrc\n:nnoremap <leader>ev :vsplit $MYVIMRC<cr>\n:nnoremap <leader>sv :source $MYVIMRC<cr>\n\n\" nmap <Leader>rc :source $XDG_CONFIG_HOME/vim/vimrc<CR>\n\" 1}}} \"\n"
  },
  {
    "path": "vim/config/neobundle.vim",
    "content": "\n\" Plugins with NeoBundle\n\"---------------------------------------------------------\n\n\" Always loaded {{{\n\" -------------\nNeoBundle 'scrooloose/nerdtree'\nNeoBundle 'scrooloose/nerdcommenter'\nNeoBundle 'jistr/vim-nerdtree-tabs.git'    \" single panel\nNeoBundle 'tpope/vim-commentary'\nNeoBundle 'tpope/vim-fugitive'\nNeoBundle 'ctrlpvim/ctrlp.vim'\nNeoBundle 'itchyny/vim-cursorword'\nNeoBundle 'itchyny/vim-gitbranch'\nNeoBundle 'airblade/vim-gitgutter'\nNeoBundle 'nathanaelkane/vim-indent-guides'\nNeoBundle 'sheerun/vim-polyglot'\nNeoBundle 'vim-scripts/grep.vim'\nNeoBundle 'bronson/vim-trailing-whitespace'\nNeoBundle 'jiangmiao/auto-pairs'\nNeoBundle 'majutsushi/tagbar'          \" displays tags in a window, ordered by scope, require 'brew install ctags-exuberant'\nNeoBundle 'scrooloose/syntastic'\n\" NeoBundle 'Shougo/vimproc.vim', {\n\" \\ 'build' : {\n\" \\     'windows' : 'tools\\\\update-dll-mingw',\n\" \\     'cygwin' :  'make -f make_cygwin.mak',\n\" \\     'mac' :     'make -f make_mac.mak',\n\" \\     'unix' :    'make -f make_unix.mak',\n\" \\    },\n\" \\ }\nif v:version > 702\n  NeoBundle 'Shougo/vimshell.vim'\nendif\n\nNeoBundle 'rafi/vim-tinyline'\nNeoBundle 'rafi/vim-tagabana'\n\nNeoBundle 'dietsche/vim-lastplace'\n\n\"\" Vim-Session\nNeoBundle 'xolox/vim-misc'\nNeoBundle 'xolox/vim-session'\n\n\"\" Snippets\nNeoBundle 'SirVer/ultisnips'\nNeoBundle 'honza/vim-snippets'\n\n\"\" Color Themes\nNeoBundle 'vim-scripts/CSApprox'           \" Make gvim-only colorschemes work transparently in terminal vim\nNeoBundle 'vim-airline/vim-airline'        \" see https://github.com/vim-airline/vim-airline/wiki/Screenshots\nNeoBundle 'vim-airline/vim-airline-themes'\nNeoBundle 'tomasr/molokai'\nNeoBundle 'altercation/vim-colors-solarized'\nNeoBundle 'scwood/vim-hybrid'\nNeoBundle 'mhinz/vim-janah'\nNeoBundle 'sickill/vim-monokai'\nNeoBundle 'flazz/vim-colorschemes'\nNeoBundle 'NLKNguyen/papercolor-theme'\n\n\"\" Vim-Bootstrap Updater\nNeoBundle 'sherzberg/vim-bootstrap-updater'\n\n\"\" Give me back my emacs bindings ;)\n\" NeoBundle 'andrep/vimacs'\n\n\" visually select increasingly larger regions of text\nNeoBundle 'terryma/vim-expand-region'\n\" Custom textobjects\nNeoBundle 'kana/vim-textobj-user'\nNeoBundle 'kana/vim-textobj-entire'\nNeoBundle 'kana/vim-textobj-indent'\nNeoBundle 'kana/vim-textobj-syntax'\nNeoBundle 'kana/vim-textobj-line'\nNeoBundle 'nelstrom/vim-textobj-rubyblock'\n\nNeoBundle 'vim-scripts/gitignore'\n\n\" LAZY LOADING from here on!\n\" --------------------------------------------------------\n\n\" Fetch repositories, but don't add to runtimepath\nNeoBundleFetch 'chriskempson/base16-shell'\nNeoBundleFetch 'rafi/awesome-vim-colorschemes'\n\n\" }}}\n\" Language {{{\n\" --------\nNeoBundleLazy 'othree/html5.vim', {'on_ft': 'html'}\nNeoBundleLazy 'mustache/vim-mustache-handlebars', {'on_ft': 'html'}\nNeoBundleLazy 'rcmdnk/vim-markdown', {'on_ft': 'markdown'}\nNeoBundleLazy 'chase/vim-ansible-yaml', {'on_ft': ['yaml', 'ansible']}\nNeoBundleLazy 'mitsuhiko/vim-jinja', {'on_ft': ['htmljinja', 'jinja']}\nNeoBundleLazy 'groenewege/vim-less', {'on_ft': 'less'}\nNeoBundleLazy 'hail2u/vim-css3-syntax', {'on_ft': 'css'}\nNeoBundleLazy 'chrisbra/csv.vim', {'on_ft': 'csv'}\nNeoBundleLazy 'hynek/vim-python-pep8-indent', {'on_ft': 'python'}\nNeoBundleLazy 'jmcantrell/vim-virtualenv', {'on_ft': 'python'}\nNeoBundleLazy 'elzr/vim-json', {'on_ft': 'json'}\nNeoBundleLazy 'cespare/vim-toml', {'on_ft': 'toml'}\nNeoBundleLazy 'PotatoesMaster/i3-vim-syntax', {'on_ft': 'i3'}\nNeoBundleLazy 'ekalinin/Dockerfile.vim', {'on_ft': 'Dockerfile'}\nNeoBundleLazy 'vim-ruby/vim-ruby', {'on_ft': 'ruby', 'on_map': '<Plug>'}\nNeoBundleLazy 'jelera/vim-javascript-syntax', {'on_ft': 'javascript'}\nNeoBundleLazy 'jiangmiao/simple-javascript-indenter', {'on_ft': 'javascript'}\nNeoBundleLazy 'fatih/vim-go', {\n\t\\ 'on_ft': 'go',\n\t\\ 'on_cmd': ['GoInstallBinaries', 'GoUpdateBinaries']\n\t\\ }\n\n\" }}}\n\" Commands {{{\n\" --------\nNeoBundleLazy 'mbbill/undotree', {'on_cmd': 'UndotreeToggle'}\n\nif $VIM_MINIMAL ==? ''\n\tNeoBundleLazy 'thinca/vim-guicolorscheme', {'on_cmd': 'GuiColorScheme'}\n\tNeoBundleLazy 'guns/xterm-color-table.vim', {'on_cmd': 'XtermColorTable'}\n\tNeoBundleLazy 'thinca/vim-quickrun', {'on_map': '<Plug>'}\n\tNeoBundleLazy 'thinca/vim-prettyprint', {'on_cmd': 'PP', 'on_func': 'PP'}\nendif\n\n\" }}}\n\n\" vim: set ts=2 sw=2 tw=80 noet :\n"
  },
  {
    "path": "vim/config/plugins.vim",
    "content": "\n\" Plugin Settings -- Keybindings are defined separatel\n\"---------------------------------------------------------\n\nif neobundle#tap('nerdtree') \"{{{\n\tnnoremap <leader>n :NERDTreeFocus<CR>\n  nnoremap <leader>t :NERDTreeToggle<CR>\n  \" nnoremap <C-f> :NERDTreeFind<CR>\n\t\" nice arrow\n\tlet g:NERDTreeDirArrows = 1\n\t\" not so much cruft\n\tlet g:NERDTreeMinimalUI = 1\n\tlet g:NERDTreeShowBookmarks = 1\n\tlet NERDTreeShowHidden=1\n\thi def link NERDTreeRO Normal\n\thi def link NERDTreePart StatusLine\n\thi def link NERDTreeDirSlash Directory\n\thi def link NERDTreeCurrentNode Search\n\thi def link NERDTreeCWD Normal\n\t\" Not so much color\n\tlet g:NERDChristmasTree = 0\n\n\tlet g:nerdtree_tabs_focus_on_files = 1\n\tlet g:nerdtree_tabs_open_on_gui_startup = 0\n\n\tlet g:NERDTreeChDirMode=2\n\tlet g:NERDTreeIgnore=['\\.rbc$', '\\~$', '\\.pyc$', '\\.db$', '\\.sqlite$', '__pycache__', '\\.md\\.tex$', '\\.elc$']\n\tlet g:NERDTreeSortOrder=['^__\\.py$', '\\/$', '*', '\\.swp$', '\\.bak$', '\\~$']\n\tlet g:NERDTreeShowBookmarks=1\n\tlet g:nerdtree_tabs_focus_on_files=1\n\tlet g:NERDTreeMapOpenInTabSilent = '<RightMouse>'\n\tlet g:NERDTreeWinSize = 50\n\tset wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.db,*.sqlite\n\t\" nnoremap <silent> <F2> :NERDTreeFind %<CR>\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\n\nif neobundle#tap('neocomplete') && has('lua') \"{{{\n\tlet g:neocomplete#enable_at_startup = 1\n\tlet g:neocomplete#data_directory = $VARPATH.'/complete'\n\tlet neobundle#hooks.on_source    = $VIMPATH.'/config/plugins/neocomplete.vim'\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\nif neobundle#tap('grep.vim') \"{{{\n\tlet Grep_Default_Options = '-IR'\n\tlet Grep_Skip_Files = '*.log *.db'\n\tlet Grep_Skip_Dirs = '.git node_modules'\n\tcall neobundle#untap()\nendif\n\"}}}\n\n\n\nif neobundle#tap('vimshell.vim') \"{{{\n\tlet g:vimshell_user_prompt = 'fnamemodify(getcwd(), \":~\")'\n\tlet g:vimshell_prompt =  '$ '\nendif\n\"}}}\n\n\nif neobundle#tap('neosnippet') \"{{{\n\tlet g:neosnippet#enable_snipmate_compatibility = 0\n\tlet g:neosnippet#enable_preview = 1\n\tlet g:neosnippet#disable_runtime_snippets = { '_': 1 }\n\tlet g:neosnippet#data_directory  = $VARPATH.'/snippet'\n\tlet g:neosnippet#snippets_directory =\n\t\t\t\t\\$VIMPATH.'/snippet,'\n\t\t\t\t\\.$VARPATH.'/plugins/neosnippet-snippets/neosnippets,'\n\t\t\t\t\\.$VARPATH.'/plugins/mpvim/snippets,'\n\t\t\t\t\\.$VARPATH.'/plugins/vim-ansible-yaml/snippets,'\n\t\t\t\t\\.$VARPATH.'/plugins/vim-go/gosnippets/snippets'\n\n\timap <expr><C-o> neosnippet#expandable_or_jumpable() ? \"\\<Plug>(neosnippet_expand_or_jump)\" : \"\\<ESC>o\"\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\nif neobundle#tap('vim-signature') \"{{{\n\tlet g:SignatureMarkTextHLDynamic = 1\n\tlet g:SignatureMarkerTextHLDynamic = 1\n\tlet g:SignaturePurgeConfirmation = 1\n\tlet g:signature_set_location_list_convenience_maps = 0\n\tlet g:SignatureMap = {\n\t\t\\ 'ListLocalMarks':    'm/',\n\t\t\\ 'ListLocalMarkers':  'm?',\n\t\t\\ 'Leader':            'm',\n\t\t\\ 'PlaceNextMark':     'm,',\n\t\t\\ 'ToggleMarkAtLine':  'm.',\n\t\t\\ 'PurgeMarksAtLine':  'm-',\n\t\t\\ 'DeleteMark':        'dm',\n\t\t\\ 'PurgeMarks':        'm<Space>',\n\t\t\\ 'PurgeMarkers':      'm<BS>',\n\t\t\\ 'GotoNextSpotAlpha': 'mj',\n\t\t\\ 'GotoPrevSpotAlpha': 'mk',\n\t\t\\ 'GotoNextMarkerAny': 'mJ',\n\t\t\\ 'GotoPrevMarkerAny': 'mK',\n\t\t\\ 'GotoNextMarker': '',\n\t\t\\ 'GotoPrevMarker': '',\n\t\t\\ 'GotoNextLineAlpha': '',\n\t\t\\ 'GotoPrevLineAlpha': '',\n\t\t\\ 'GotoNextSpotByPos': '',\n\t\t\\ 'GotoPrevSpotByPos': '',\n\t\t\\ 'GotoNextLineByPos': '',\n\t\t\\ 'GotoPrevLineByPos': ''\n\t\t\\ }\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\nif neobundle#tap('vim-session') \"{{{\n\tnmap <Leader>se :<C-u>SaveSession<CR>\n\tnmap <Leader>os :<C-u>OpenSession last<CR>\n\n\tlet g:session_directory = $VARPATH.'/session'\n\tlet g:session_default_name = 'last'\n\tlet g:session_default_overwrite = 1\n\tlet g:session_verbose_messages = 0\n\tlet g:session_autosave = 'no'\n\tlet g:session_autoload = 'no'\n\tlet g:session_persist_colors = 0\n\tlet g:session_command_aliases = 1\n\tlet g:session_menu = 0\n\tcall neobundle#untap()\nendif\n\n\"}}}\nif neobundle#tap('jedi-vim') \"{{{\n\tsetlocal completeopt=menuone,longest\n\t\" let g:jedi#force_py_version = 3\n\tlet g:jedi#completions_enabled = 0\n\tlet g:jedi#auto_vim_configuration = 0\n\tlet g:jedi#smart_auto_mappings = 0\n\tlet g:jedi#use_tag_stack = 0\n\tlet g:jedi#popup_select_first = 1\n\tlet g:jedi#use_splits_not_buffers = 'right'\n\tlet g:jedi#completions_command = ''\n\tlet g:jedi#popup_on_dot = 0\n\tlet g:jedi#max_doc_height = 40\n\tlet g:jedi#show_call_signatures = 0\n\tlet g:jedi#show_call_signatures_delay = 1000\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\n\nif neobundle#tap('vim-ruby') \"{{{\n\tlet g:rubycomplete_buffer_loading    = 1\n\tlet g:rubycomplete_classes_in_global = 1\n\tlet g:rubycomplete_rails             = 1\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\n\n\nif neobundle#tap('vim-gitgutter') \"{{{\n\tlet g:gitgutter_highlight_lines = 1\n\tlet g:gitgutter_realtime = 1\n\tlet g:gitgutter_eager    = 0\n\tlet g:gitgutter_map_keys = 0\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\n\" See https://github.com/preservim/vim-markdown\nif neobundle#tap('vim-markdown') \"{{{\n\tlet g:vim_markdown_initial_foldlevel = 5\n\tlet g:vim_markdown_frontmatter = 1\n\tlet g:vim_markdown_conceal = 0\n  let g:vim_markdown_folding_disabled = 1\n  let g:vim_markdown_conceal_code_blocks = 0\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\nif neobundle#tap('vim-jinja') \"{{{\n\tlet g:htmljinja_disable_detection = 0\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\n\nif neobundle#tap('undotree') \"{{{\n\tnnoremap <Leader>gu  :UndotreeToggle<CR>\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\nif neobundle#tap('caw.vim') \"{{{\n\tautocmd MyAutoCmd FileType * call s:init_caw()\n\tfunction! s:init_caw()\n\t\tif ! &l:modifiable\n\t\t\tsilent! nunmap <buffer> gc\n\t\t\tsilent! xunmap <buffer> gc\n\t\t\tsilent! nunmap <buffer> gcc\n\t\t\tsilent! xunmap <buffer> gcc\n\t\t\tsilent! nunmap <buffer> gcv\n\t\t\tsilent! xunmap <buffer> gcv\n\t\telse\n\t\t\tnmap <buffer> gc <Plug>(caw:prefix)\n\t\t\txmap <buffer> gc <Plug>(caw:prefix)\n\t\t\tnmap <buffer> gcc <Plug>(caw:wrap:toggle)\n\t\t\txmap <buffer> gcc <Plug>(caw:wrap:toggle)\n\t\t\tnmap <buffer> gcv <Plug>(caw:I:toggle)\n\t\t\txmap <buffer> gcv <Plug>(caw:I:toggle)\n\t\tendif\n\tendfunction\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\nif neobundle#tap('vim-indent-guides') \"{{{\n\tlet g:indent_guides_enable_on_vim_startup = 1\n\tlet g:indent_guides_exclude_filetypes = ['help', 'unite', 'vimfiler']\n\tlet g:indent_guides_default_mapping = 0\n\tlet g:indent_guides_indent_levels = 10\n\t\" nmap <silent><Leader>i :<C-u>IndentGuidesToggle<CR>\n\n\tif !has('nvim')\n\t\tfunction! neobundle#hooks.on_post_source(bundle)\n\t\t\tautocmd MyAutoCmd BufEnter *.py,*.js,*.rb if &expandtab\n\t\t\t\t\\ |   IndentGuidesEnable\n\t\t\t\t\\ | else\n\t\t\t\t\\ |   IndentGuidesDisable\n\t\t\t\t\\ | endif\n\t\tendfunction\n\tendif\n\tcall neobundle#untap()\nendif\n\n\"}}}\nif neobundle#tap('vim-asterisk') \"{{{\n\tmap *   <Plug>(asterisk-*)\n\tmap #   <Plug>(asterisk-#)\n\tmap g*  <Plug>(asterisk-g*)\n\tmap g#  <Plug>(asterisk-g#)\n\tmap z*  <Plug>(asterisk-z*)\n\tmap gz* <Plug>(asterisk-gz*)\n\tmap z#  <Plug>(asterisk-z#)\n\tmap gz# <Plug>(asterisk-gz#)\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\n\nif neobundle#tap('vim-quickrun') \"{{{\n  nmap <silent> <Leader>r <Plug>(quickrun)\n  call neobundle#untap()\nendif\n\n\"}}}\nif neobundle#tap('dictionary.vim') \"{{{\n\tnnoremap <silent> <Leader>? :<C-u>Dictionary -no-duplicate<CR>\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\nif neobundle#tap('vim-cursorword') \"{{{\n\taugroup cursorword-filetype\n\t\tautocmd!\n\t\tautocmd FileType qf,vimfiler,vimshell,thumbnail,vimcalc,quickrun,github-dashboard\n\t\t\t\\ let b:cursorword = 0\n\taugroup END\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\nif neobundle#tap('vimacs') \"{{{\n\tlet g:VM_Enabled=1\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\nif neobundle#tap('syntastic') \"{{{\n\tlet g:syntastic_always_populate_loc_list=1\n\tlet g:syntastic_auto_loc_list = 1\n\tlet g:syntastic_error_symbol='✗'\n\tlet g:syntastic_warning_symbol='⚠'\n\tlet g:syntastic_style_error_symbol = '✗'\n\tlet g:syntastic_style_warning_symbol = '⚠'\n\tlet g:syntastic_auto_loc_list=1\n\tlet g:syntastic_aggregate_errors = 1\n\tlet g:syntastic_python_checkers=['python', 'flake8']\n\tlet g:syntastic_python_flake8_post_args='--ignore=W391'\n\tlet g:syntastic_tex_chktex_showmsgs = 0\n\tlet g:syntastic_auto_jump = 0\n\tlet g:syntastic_check_on_wq = 0\n\t\" let g:syntastic_disabled_filetypes=['tex']\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\n\"  if neobundle#tap('UltiSnips') \"{{{\n\"  \tlet g:UltiSnipsExpandTrigger=\"<tab>\"\n\"  \tlet g:UltiSnipsJumpForwardTrigger=\"<tab>\"\n\"  \tlet g:UltiSnipsJumpBackwardTrigger=\"<c-b>\"\n\"  \tlet g:UltiSnipsEditSplit=\"vertical\"\n\"\n\"  \tcall neobundle#untap()\n\"  endif\n\"\n\" \"}}}\n\nif neobundle#tap('tagbar') \"{{{\n\tlet g:tagbar_autofocus = 1\n\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\n\n\n\" vim: set ts=2 sw=2 tw=80 noet :\n"
  },
  {
    "path": "vim/config/theme.vim",
    "content": "if exists('g:vim_installing') || exists('g:colors_name')\n\tfinish\nendif\n\nset t_Co=256\nset cursorline           \" highlight current line\n\n\" Actual Color Scheme {{{\n\" ---------\nset background=light     \" use 'dark' or 'light'\ncolorscheme PaperColor\n\" highlight BadWhitespace ctermfg=darkred ctermbg=black guifg=#382424 guibg=black\n\n\" }}}\n\n\" Airline - lean & mean status/tabline {{{\nif neobundle#tap('vim-airline-themes')\n\tlet g:airline_theme = 'papercolor'     \" you probably want to match your color scheme\n\tlet g:airline#extensions#virtualenv#enabled = 1\n\n\tcall neobundle#untap()\nendif\nlet g:airline_powerline_fonts = 1\n\n\"}}}\n\nset gcr=a:blinkon0       \" Disable the blinking cursor.\n\n\" Change cursor shape between insert and normal mode in iTerm2.app\nif $TERM_PROGRAM =~ \"iTerm\"\n    let &t_SI = \"\\<Esc>]50;CursorShape=1\\x7\" \" Vertical bar in insert mode\n    let &t_EI = \"\\<Esc>]50;CursorShape=0\\x7\" \" Block in normal mode\nendif\n\n\" base16 themes - Access colors present in 256 colorspace\nlet g:base16colorspace = 256\nlet g:base16_shell_path = $VARPATH.'/plugins/base16-shell/'\n\nset guioptions=aci\nif has(\"gui_mac\") || has(\"gui_macvim\")\n\tset guifont=Source\\ Code\\ Pro\\ for\\ Powerline:h14\n\tset transparency=7\n\tset langmenu=en_EN.UTF-8\nelse\n\tlet g:CSApprox_loaded = 1\n\tset guifont=Anonymous\\ Pro\\ 12\n\tif $COLORTERM == 'gnome-terminal'\n\t\tset term=gnome-256color\n\telse\n\t\tif $TERM == 'xterm'\n\t\t\tset term=xterm-256color\n\t\tendif\n\tendif\nendif\n\n\" UI elements \"{{{\nlet no_buffers_menu=1\nset showbreak=↪\nset fillchars=vert:│,fold:─\nset listchars=tab:\\⋮\\ ,extends:⟫,precedes:⟪,nbsp:.,trail:·\n\n\" }}}\n\" VimFiler icons {{{\nif neobundle#tap('vimfiler.vim')\n\t\" Icons: │ ┃ ┆ ┇ ┊ ┋ ╎ ╏\n\tlet g:vimfiler_tree_indentation = 1\n\tlet g:vimfiler_tree_leaf_icon = '┆'\n\tlet g:vimfiler_tree_opened_icon = '▼'\n\tlet g:vimfiler_tree_closed_icon = '▷'\n\tlet g:vimfiler_file_icon = ' '\n\tlet g:vimfiler_readonly_file_icon = '⭤'\n\tlet g:vimfiler_marked_file_icon = '✓'\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\" GitGutter icons {{{\nif neobundle#tap('vim-gitgutter')\n\tlet g:gitgutter_sign_added = '▎'\n\tlet g:gitgutter_sign_modified = '▎'\n\tlet g:gitgutter_sign_removed = '▏'\n\tlet g:gitgutter_sign_removed_first_line = '▔'\n\tlet g:gitgutter_sign_modified_removed = '▋'\n\tcall neobundle#untap()\nendif\n\n\"}}}\n\" Indent-Guides icons {{{\nif neobundle#tap('vim-indent-guides')\n\tlet g:indent_guides_guide_size = 1\n\tlet g:indent_guides_start_level = 1\n\tlet g:indent_guides_auto_colors = 0\n\tcall neobundle#untap()\nendif\n\"}}}\n\n\n\n\n\n\n\" vim: set ts=2 sw=2 tw=80 noet :\n"
  },
  {
    "path": "vim/config/vimrc",
    "content": "\" header {{{\n\"\n\" The MIT License (MIT)\n\"\n\" Copyright (c) 2010-2017 Sebastien Varrette\n\" Initial code Copyright (c) from Marek Wywiał\n\" see https://github.com/onjin/vim-startup\n\"\n\" Permission is hereby granted, free of charge, to any person obtaining a copy\n\" of this software and associated documentation files (the \"Software\"), to deal\n\" in the Software without restriction, including without limitation the rights\n\" to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\" copies of the Software, and to permit persons to whom the Software is\n\" furnished to do so, subject to the following conditions:\n\"\n\" The above copyright notice and this permission notice shall be included in all\n\" copies or substantial portions of the Software.\n\"\n\" THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\" AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\" LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\" OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\" SOFTWARE.\n\"\n\" header }}}\n\nif &compatible\n    set nocompatible    \" Be iMproved\nendif\n\n\" Sets up Vim to use directories specified by XDG environment variables as\n\" defined in the specification:\n\" https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html\n\"\n\" Implementation inspired by:\n\" https://github.com/kaleb/vim-files/blob/master/xdg.vim\nif empty($XDG_CACHE_HOME)\n  let $XDG_CACHE_HOME = $HOME.'/.cache'\nendif\nif empty($XDG_CONFIG_HOME)\n  let $XDG_CONFIG_HOME = $HOME.'/.config'\nendif\n\nif isdirectory($XDG_CONFIG_HOME.'/vim')\n\tlet $VIMPATH=expand('$XDG_CONFIG_HOME/vim')\n\tlet $VARPATH=expand('$XDG_CACHE_HOME/vim')\nelse\n\tlet $VIMPATH=expand('$HOME/.vim')\n\tlet $VARPATH=expand('$HOME/.cache/vim')\nendif\n\n\nfunction! s:source_file(path)\n\texecute 'source' fnameescape($VIMPATH.'/config/'.a:path)\nendfunction\n\nfunction! s:source_home_file(path)\n\texecute 'source' fnameescape($HOME.'/'.a:path)\nendfunction\n\n\"=====================================================\n\" Initialize base requirements, incl. NeoBundle Load\n\"=====================================================\ncall s:source_file('init.vim')\n\n\"==================================================\n\"    NeoBundle installed packages / plugins\n\"==================================================\n\" See https://github.com/Shougo/neobundle.vim\n\" TODO: migrate to Dein\n\" Required:\nlet s:plugins_dir = expand('$VARPATH/plugins')\ncall neobundle#begin(s:plugins_dir)\nNeoBundleFetch 'Shougo/neobundle.vim'\n\"===== Define plugins to install =======\ncall s:source_file('neobundle.vim')\n\ncall neobundle#local(s:plugins_dir . '/awesome-vim-colorschemes', {})\ncall neobundle#local(expand('$VIMPATH/dev'), {})\n\n\" ===== Plugins configurations ==== \"\ncall s:source_file('plugins.vim')\nif filereadable(expand('$VIMPATH/custom/vimrc.bundles'))\n  source $VIMPATH/custom/vimrc.bundles\nendif\ncall neobundle#end()\n\" }}}\n\n\" Must be after plugins\nfiletype plugin indent on\nsyntax enable\n\n\" If there are uninstalled bundles found on startup,\n\" this will conveniently prompt you to install them.\nNeoBundleCheck\n\n\"==================================================\n\"       Topic-based Configuration Modules\n\"==================================================\n\" Loading configuration modules {{{\ncall s:source_file('general.vim')\ncall s:source_file('theme.vim')\ncall s:source_file('autocmd.vim')\ncall s:source_file('keybindings.vim')\n\n\"==================================================\n\"       Local customizations\n\"==================================================\nif filereadable(expand('$HOME/.vimrc.local'))\n\tcall s:source_home_file('.vimrc.local')\nendif\nif filereadable(expand('$XDG_CONFIG_HOME/vim/custom/vimrc.local'))\n\tsource '$XDG_CONFIG_HOME/vim/custom/vimrc.local'\nendif\n\nif has('nvim')\n\tcall s:source_file('neovim.vim')\nendif\n\" }}}\n\ncall neobundle#call_hook('on_source')\nset secure\n\n\" vim: set ts=2 sw=2 tw=80 noet :\n"
  },
  {
    "path": "vim/init.vim",
    "content": "\" -*- mode:vimrc; -*-\n\"===========================================================================\n\"  .vimrc -- my personal VIM configuration\n\"            see http://github.com/Falkor/dotfiles\n\"\n\"  Copyright (c) 2010-2017 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n\"                                 _\n\"                          __   _(_)_ __ ___  _ __ ___\n\"                          \\ \\ / / | '_ ` _ \\| '__/ __|\n\"                           \\ V /| | | | | | | | | (__\n\"                          (_)_/ |_|_| |_| |_|_|  \\___|\n\"\n\" Largely inspired: https://github.com/rafi/vim-config\n\"===========================================================================\n\" Note: Skip initialization for vim-tiny or vim-small.\nif 1\n\texecute 'source' fnamemodify(expand('<sfile>'), ':h').'/config/vimrc'\nendif\n"
  },
  {
    "path": "vim/old/.vimrc",
    "content": "\" -*- mode:vimrc; -*-\n\"===========================================================================\n\"  .vimrc -- my personal VIM configuration\n\"            see http://github.com/Falkor/dotfiles\n\"\n\"  Copyright (c) 2010-2016 Sebastien Varrette <Sebastien.Varrette@uni.lu>\n\"                                 _\n\"                          __   _(_)_ __ ___  _ __ ___\n\"                          \\ \\ / / | '_ ` _ \\| '__/ __|\n\"                           \\ V /| | | | | | | | | (__\n\"                          (_)_/ |_|_| |_| |_|_|  \\___|\n\"\n\"===========================================================================\n\"\" NeoBundle core\n\"===========================================================================\nif has('vim_starting')\n  set nocompatible               \" Be iMproved\n\n  \" Required:\n  set runtimepath+=~/.vim/bundle/neobundle.vim/\nendif\n\nlet neobundle_readme=expand('~/.vim/bundle/neobundle.vim/README.md')\n\nlet g:vim_bootstrap_langs = \"ruby,python,c,html\"\nlet g:vim_bootstrap_editor = \"vim\"\t\t\t\t\" nvim or vim\n\nif !filereadable(neobundle_readme)\n  echo \"Installing NeoBundle...\"\n  echo \"\"\n  silent !mkdir -p ~/.vim/bundle\n  silent !git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim/\n  let g:not_finsh_neobundle = \"yes\"\n\n  \" Run shell script if exist on custom select language\nendif\n\n\" Required:\ncall neobundle#begin(expand('~/.vim/bundle/'))\n\n\" Let NeoBundle manage NeoBundle\n\" Required:\nNeoBundleFetch 'Shougo/neobundle.vim'\n\n\"===========================================================================\n\"\" NeoBundle install packages\n\"===========================================================================\nNeoBundle 'scrooloose/nerdtree'\nNeoBundle 'scrooloose/nerdcommenter'\nNeoBundle 'jistr/vim-nerdtree-tabs.git'\nNeoBundle 'tpope/vim-commentary'\nNeoBundle 'tpope/vim-fugitive'\nNeoBundle 'ctrlpvim/ctrlp.vim'\nNeoBundle 'vim-airline/vim-airline'\nNeoBundle 'vim-airline/vim-airline-themes'\nNeoBundle 'airblade/vim-gitgutter'\nNeoBundle 'sheerun/vim-polyglot'\nNeoBundle 'vim-scripts/grep.vim'\nNeoBundle 'vim-scripts/CSApprox'\nNeoBundle 'bronson/vim-trailing-whitespace'\nNeoBundle 'jiangmiao/auto-pairs'\nNeoBundle 'majutsushi/tagbar'\nNeoBundle 'scrooloose/syntastic'\nNeoBundle 'Shougo/vimproc.vim', {\n      \\ 'build' : {\n      \\     'windows' : 'tools\\\\update-dll-mingw',\n      \\     'cygwin' : 'make -f make_cygwin.mak',\n      \\     'mac' : 'make -f make_mac.mak',\n      \\     'unix' : 'make -f make_unix.mak',\n      \\    },\n      \\ }\n\n\"\" Vim-Session\nNeoBundle 'xolox/vim-misc'\nNeoBundle 'xolox/vim-session'\n\nif v:version >= 703\n  NeoBundle 'Shougo/vimshell.vim'\nendif\n\nif v:version >= 704\n  \"\" Snippets\n  NeoBundle 'SirVer/ultisnips'\n  NeoBundle 'FelikZ/ctrlp-py-matcher'\nendif\n\nNeoBundle 'honza/vim-snippets'\n\n\"\" Color Themes\nNeoBundle 'tomasr/molokai'\nNeoBundle 'altercation/vim-colors-solarized'\nNeoBundle 'scwood/vim-hybrid'\nNeoBundle 'mhinz/vim-janah'\nNeoBundle 'sickill/vim-monokai'\nNeoBundle 'flazz/vim-colorschemes'\nNeoBundle 'NLKNguyen/papercolor-theme'\n\n\"\" Vim-Bootstrap Updater\nNeoBundle 'sherzberg/vim-bootstrap-updater'\n\n\"\" Custom bundles\n\n\"\" Python Bundle\nNeoBundle \"davidhalter/jedi-vim\"\nNeoBundle \"Yggdroot/indentLine\"\n\nNeoBundle 'vim-scripts/c.vim'\n\n\"\" HTML Bundle\n\" NeoBundle 'amirh/HTML-AutoCloseTag'\nNeoBundle 'hail2u/vim-css3-syntax'\nNeoBundle 'gorodinskiy/vim-coloresque'\nNeoBundle 'tpope/vim-haml'\nNeoBundle 'mattn/emmet-vim'\n\n\"\" Ruby Bundle\nNeoBundle \"tpope/vim-rails\"\nNeoBundle \"tpope/vim-rake\"\nNeoBundle \"tpope/vim-projectionist\"\nNeoBundle \"thoughtbot/vim-rspec\"\nNeoBundle \"ecomba/vim-ruby-refactoring\"\n\n\"\" Include user's extra bundle\nif filereadable(expand(\"~/.vimrc.local.bundles\"))\n  source ~/.vimrc.local.bundles\nendif\n\ncall neobundle#end()\n\n\" Required:\nfiletype plugin indent on\n\n\" If there are uninstalled bundles found on startup,\n\" this will conveniently prompt you to install them.\nNeoBundleCheck\n\n\"===========================================================================\n\"\" Basic Setup\n\"===========================================================================\"\n\"\" Encoding\nset encoding=utf-8\nset fileencoding=utf-8\nset fileencodings=utf-8\n\n\"\" Fix backspace indent\nset backspace=indent,eol,start\n\n\n\"\" Tabs. May be overriten by autocmd rules\nset softtabstop=4 tabstop=8 shiftwidth=4 expandtab\n\" set softtabstop=0\n\n\"\" Map leader to ,\nlet mapleader=','\n\n\"\" Enable hidden buffers\nset hidden\n\n\"\" Searching\nset hlsearch\nset incsearch\nset ignorecase\nset smartcase\n\n\"\" Encoding\nset bomb\nset binary\nset ttyfast\n\n\"\" Directories for swp files\nset nobackup\nset noswapfile\n\nset fileformats=unix,dos,mac\nset showcmd\nset shell=/bin/sh\n\n\" session management\nlet g:session_directory = \"~/.vim/session\"\nlet g:session_autoload = \"no\"\nlet g:session_autosave = \"no\"\nlet g:session_command_aliases = 1\n\n\"===========================================================================\n\"\" Visual Settings\n\"===========================================================================\nsyntax on\nset ruler\nset number\n\nlet no_buffers_menu=1\nif !exists('g:not_finsh_neobundle')\n  \" colorscheme molokai\n  \"  colorscheme hybrid\n  set background=light\n  colorscheme PaperColor\nendif\n\nset mousemodel=popup\nset t_Co=256\nset cursorline\nset guioptions=egmrti\nset gfn=Monospace\\ 10\n\nif has(\"gui_running\")\n  if has(\"gui_mac\") || has(\"gui_macvim\")\n    set guifont=Menlo:h12\n    set transparency=7\n  endif\nelse\n  let g:CSApprox_loaded = 1\n\n\n  if $COLORTERM == 'gnome-terminal'\n    set term=gnome-256color\n  else\n    if $TERM == 'xterm'\n      set term=xterm-256color\n    endif\n  endif\n\nendif\n\nif &term =~ '256color'\n  set t_ut=\nendif\n\n\"\" Disable the blinking cursor.\nset gcr=a:blinkon0\nset scrolloff=3\n\n\"\" Status bar\nset laststatus=2\n\n\"\" Use modeline overrides\nset modeline\nset modelines=10\n\nset title\nset titleold=\"Terminal\"\nset titlestring=%F\n\nset statusline=%F%m%r%h%w%=(%{&ff}/%Y)\\ (line\\ %l\\/%L,\\ col\\ %c)\\\n\nif exists(\"*fugitive#statusline\")\n  set statusline+=%{fugitive#statusline()}\nendif\n\n\" vim-airline\nlet g:airline_theme = 'powerlineish'\nlet g:airline#extensions#syntastic#enabled = 1\nlet g:airline#extensions#branch#enabled = 1\nlet g:airline#extensions#tabline#enabled = 1\nlet g:airline#extensions#tagbar#enabled = 1\n\n\" vim-markdown\nlet g:vim_markdown_conceal = 0\n\n\"===========================================================================\n\"\" Abbreviations\n\"===========================================================================\n\"\" no one is really happy until you have this shortcuts\ncnoreabbrev W! w!\ncnoreabbrev Q! q!\ncnoreabbrev Qall! qall!\ncnoreabbrev Wq wq\ncnoreabbrev Wa wa\ncnoreabbrev wQ wq\ncnoreabbrev WQ wq\ncnoreabbrev W w\ncnoreabbrev Q q\ncnoreabbrev Qall qall\n\n\"\" NERDTree configuration\nlet g:NERDTreeChDirMode=2\nlet g:NERDTreeIgnore=['\\.rbc$', '\\~$', '\\.pyc$', '\\.db$', '\\.sqlite$', '__pycache__']\nlet g:NERDTreeSortOrder=['^__\\.py$', '\\/$', '*', '\\.swp$', '\\.bak$', '\\~$']\nlet g:NERDTreeShowBookmarks=1\nlet g:nerdtree_tabs_focus_on_files=1\nlet g:NERDTreeMapOpenInTabSilent = '<RightMouse>'\nlet g:NERDTreeWinSize = 50\nset wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.pyc,*.db,*.sqlite\n\" nnoremap <silent> <F2> :NERDTreeFind %<CR>\nnoremap <F1> :NERDTreeToggle %<CR>\nnnoremap <F2> :set nonumber!<CR>\n\n\" grep.vim\nnnoremap <silent> <leader>f :Rgrep<CR>\nlet Grep_Default_Options = '-IR'\nlet Grep_Skip_Files = '*.log *.db'\nlet Grep_Skip_Dirs = '.git node_modules'\n\n\" vimshell.vim\nlet g:vimshell_user_prompt = 'fnamemodify(getcwd(), \":~\")'\nlet g:vimshell_prompt =  '$ '\n\n\" terminal emulation\nif g:vim_bootstrap_editor == 'nvim'\n  nnoremap <silent> <leader>sh :terminal<CR>\nelse\n  nnoremap <silent> <leader>sh :VimShellCreate<CR>\nendif\n\n\"===========================================================================\n\"\" Functions\n\"===========================================================================\nif !exists('*s:setupWrapping')\n  function s:setupWrapping()\n    set wrap\n    set wm=2\n    set textwidth=79\n  endfunction\nendif\n\n\"===========================================================================\n\"\" Autocmd Rules\n\"===========================================================================\n\"\" The PC is fast enough, do syntax highlight syncing from start\naugroup vimrc-sync-fromstart\n  autocmd!\n  autocmd BufEnter * :syntax sync fromstart\naugroup END\n\n\"\" Remember cursor position\naugroup vimrc-remember-cursor-position\n  autocmd!\n  autocmd BufReadPost * if line(\"'\\\"\") > 1 && line(\"'\\\"\") <= line(\"$\") | exe \"normal! g`\\\"\" | endif\naugroup END\n\n\"\" txt\naugroup vimrc-wrapping\n  autocmd!\n  autocmd BufRead,BufNewFile *.txt call s:setupWrapping()\naugroup END\n\n\" authorize change of line using left/right arrow\nset whichwrap=<,>,[,]\n\n\n\"\" make/cmake\naugroup vimrc-make-cmake\n  autocmd!\n  autocmd FileType make setlocal noexpandtab\n  autocmd BufNewFile,BufRead CMakeLists.txt setlocal filetype=cmake\naugroup END\n\nset autoread\n\n\"\" always delete trailing whitespace UNLESS it's a markdown file\n\"\" The function :FixWhitespace comes from NeoBundle bronson/vim-trailing-whitespace\nlet g:extra_whitespace_ignored_filetypes = [ 'md' ]\nautocmd BufWritePre * :FixWhitespace\n\n\n\n\"===========================================================================\n\"\" Mappings\n\"===========================================================================\n\"\" Split\nnoremap <Leader>h :<C-u>split<CR>\nnoremap <Leader>v :<C-u>vsplit<CR>\n\n\"\" Git\nnoremap <Leader>ga :Gwrite<CR>\nnoremap <Leader>gc :Gcommit<CR>\nnoremap <Leader>gsh :Gpush<CR>\nnoremap <Leader>gll :Gpull<CR>\nnoremap <Leader>gs :Gstatus<CR>\nnoremap <Leader>gb :Gblame<CR>\nnoremap <Leader>gd :Gvdiff<CR>\nnoremap <Leader>gr :Gremove<CR>\n\n\" session management\nnnoremap <leader>so :OpenSession<Space>\nnnoremap <leader>ss :SaveSession<Space>\nnnoremap <leader>sd :DeleteSession<CR>\nnnoremap <leader>sc :CloseSession<CR>\n\n\"\" Tabs\nnnoremap <Tab> gt\nnnoremap <S-Tab> gT\nnnoremap <silent> <S-t> :tabnew<CR>\n\n\"\" Set working directory\nnnoremap <leader>. :lcd %:p:h<CR>\n\n\"\" Opens an edit command with the path of the currently edited file filled in\nnoremap <Leader>e :e <C-R>=expand(\"%:p:h\") . \"/\" <CR>\n\n\"\" Opens a tab edit command with the path of the currently edited file filled\nnoremap <Leader>te :tabe <C-R>=expand(\"%:p:h\") . \"/\" <CR>\n\n\"\" ctrlp.vim\nset wildmode=list:longest,list:full\nset wildignore+=*.o,*.obj,.git,*.rbc,*.pyc,__pycache__\nlet g:ctrlp_custom_ignore = '\\v[\\/](node_modules|target|dist)|(\\.(swp|tox|ico|git|hg|svn))$'\nlet g:ctrlp_user_command = \"find %s -type f | grep -Ev '\"+ g:ctrlp_custom_ignore +\"'\"\nlet g:ctrlp_use_caching = 1\ncnoremap <C-P> <C-R>=expand(\"%:p:h\") . \"/\" <CR>\nnoremap <leader>b :CtrlPBuffer<CR>\nlet g:ctrlp_map = '<leader>e'\nlet g:ctrlp_open_new_file = 'r'\nlet g:ctrlp_cache_dir = $HOME . '/.cache/ctrlp'\nif executable('ag')\n    let g:ctrlp_user_command = 'ag %s -l --nocolor --ignore '+ g:ctrlp_custom_ignore +' -g \"\"'\nendif\n\n\" snippets\nlet g:UltiSnipsExpandTrigger=\"<tab>\"\nlet g:UltiSnipsJumpForwardTrigger=\"<tab>\"\nlet g:UltiSnipsJumpBackwardTrigger=\"<c-b>\"\nlet g:UltiSnipsEditSplit=\"vertical\"\n\n\" syntastic\nlet g:syntastic_always_populate_loc_list=1\nlet g:syntastic_error_symbol='✗'\nlet g:syntastic_warning_symbol='⚠'\nlet g:syntastic_style_error_symbol = '✗'\nlet g:syntastic_style_warning_symbol = '⚠'\nlet g:syntastic_auto_loc_list=1\nlet g:syntastic_aggregate_errors = 1\nlet g:syntastic_python_checkers=['python', 'flake8']\nlet g:syntastic_python_flake8_post_args='--ignore=W391'\nlet g:syntastic_tex_chktex_showmsgs = 0\n\" let g:syntastic_disabled_filetypes=['tex']\n\n\" Tagbar\nnmap <silent> <F4> :TagbarToggle<CR>\nlet g:tagbar_autofocus = 1\n\n\" Disable visualbell\nset visualbell t_vb=\n\n\"\" Copy/Paste/Cut\nif has('unnamedplus')\n  set clipboard=unnamed,unnamedplus\nendif\n\" see http://tilvim.com/2014/03/18/a-better-paste.html\n\" a better paste\nmap <Leader>p :set paste<CR>o<esc>\"*]p:set nopaste<cr>\"\nnoremap YY \"+y<CR>\n\" noremap <leader>p \"+gP<CR>\nnoremap XX \"+x<CR>\n\nif has('macunix')\n  \" pbcopy for OSX copy/paste\n  vmap <C-x> :!pbcopy<CR>\n  vmap <C-c> :w !pbcopy<CR><CR>\nendif\n\n\"\" Buffer nav\nnoremap <leader>z :bp<CR>\nnoremap <leader>q :bp<CR>\nnoremap <leader>x :bn<CR>\nnoremap <leader>w :bn<CR>\n\n\"\" Close buffer\nnoremap <leader>c :bd<CR>\n\n\"\" Clean search (highlight)\nnnoremap <silent> <leader><space> :noh<cr>\n\n\"\" Switching windows\nnoremap <C-j> <C-w>j\nnoremap <C-k> <C-w>k\nnoremap <C-l> <C-w>l\nnoremap <C-h> <C-w>h\n\n\"\" Vmap for maintain Visual Mode after shifting > and <\nvmap < <gv\nvmap > >gv\n\n\"\" Move visual block\nvnoremap J :m '>+1<CR>gv=gv\nvnoremap K :m '<-2<CR>gv=gv\n\n\"\" Open current line on GitHub\nnoremap ,o :!echo `git url`/blob/`git rev-parse --abbrev-ref HEAD`/%\\#L<C-R>=line('.')<CR> \\| xargs open<CR><CR>\n\n\"\" Custom configs\n\n\" vim-python\naugroup vimrc-python\n  autocmd!\n  autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=8 colorcolumn=79\n      \\ formatoptions+=croq softtabstop=4 smartindent\n      \\ cinwords=if,elif,else,for,while,try,except,finally,def,class,with\naugroup END\n\n\" jedi-vim\nlet g:jedi#popup_on_dot = 0\nlet g:jedi#goto_assignments_command = \"<leader>g\"\nlet g:jedi#goto_definitions_command = \"<leader>d\"\nlet g:jedi#documentation_command = \"K\"\nlet g:jedi#usages_command = \"<leader>n\"\nlet g:jedi#rename_command = \"<leader>r\"\nlet g:jedi#show_call_signatures = \"0\"\nlet g:jedi#completions_command = \"<C-Space>\"\nlet g:jedi#smart_auto_mappings = 0\n\n\n\" vim-airline\nlet g:airline#extensions#virtualenv#enabled = 1\n\n\n\n\n\n\nlet g:rubycomplete_buffer_loading = 1\nlet g:rubycomplete_classes_in_global = 1\nlet g:rubycomplete_rails = 1\n\naugroup vimrc-ruby\n  autocmd!\n  autocmd BufNewFile,BufRead *.rb,*.rbw,*.gemspec setlocal filetype=ruby\n  autocmd FileType ruby set tabstop=2|set shiftwidth=2|set expandtab softtabstop=2 smartindent\naugroup END\n\nlet g:tagbar_type_ruby = {\n    \\ 'kinds' : [\n        \\ 'm:modules',\n        \\ 'c:classes',\n        \\ 'd:describes',\n        \\ 'C:contexts',\n        \\ 'f:methods',\n        \\ 'F:singleton methods'\n    \\ ]\n\\ }\n\n\" RSpec.vim mappings\nmap <Leader>t :call RunCurrentSpecFile()<CR>\nmap <Leader>s :call RunNearestSpec()<CR>\nmap <Leader>l :call RunLastSpec()<CR>\nmap <Leader>a :call RunAllSpecs()<CR>\n\n\" Ruby refactory\nnnoremap <leader>rap  :RAddParameter<cr>\nnnoremap <leader>rcpc :RConvertPostConditional<cr>\nnnoremap <leader>rel  :RExtractLet<cr>\nvnoremap <leader>rec  :RExtractConstant<cr>\nvnoremap <leader>relv :RExtractLocalVariable<cr>\nnnoremap <leader>rit  :RInlineTemp<cr>\nvnoremap <leader>rrlv :RRenameLocalVariable<cr>\nvnoremap <leader>rriv :RRenameInstanceVariable<cr>\nvnoremap <leader>rem  :RExtractMethod<cr>\n\n\"\" Include user's local vim config\nif filereadable(expand(\"~/.vimrc.local\"))\n  source ~/.vimrc.local\nendif\n\n\"===========================================================================\n\"\" Convenience variables\n\"===========================================================================\n\n\" vim-airline\nif !exists('g:airline_symbols')\n  let g:airline_symbols = {}\nendif\n\nif !exists('g:airline_powerline_fonts')\n  let g:airline#extensions#tabline#left_sep = ' '\n  let g:airline#extensions#tabline#left_alt_sep = '|'\n  let g:airline_left_sep          = '▶'\n  let g:airline_left_alt_sep      = '»'\n  let g:airline_right_sep         = '◀'\n  let g:airline_right_alt_sep     = '«'\n  let g:airline#extensions#branch#prefix     = '⤴' \"➔, ➥, ⎇\n  let g:airline#extensions#readonly#symbol   = '⊘'\n  let g:airline#extensions#linecolumn#prefix = '¶'\n  let g:airline#extensions#paste#symbol      = 'ρ'\n  let g:airline_symbols.linenr    = '␊'\n  let g:airline_symbols.branch    = '⎇'\n  let g:airline_symbols.paste     = 'ρ'\n  let g:airline_symbols.paste     = 'Þ'\n  let g:airline_symbols.paste     = '∥'\n  let g:airline_symbols.whitespace = 'Ξ'\nelse\n  let g:airline#extensions#tabline#left_sep = ''\n  let g:airline#extensions#tabline#left_alt_sep = ''\n\n  \" powerline symbols\n  let g:airline_left_sep = ''\n  let g:airline_left_alt_sep = ''\n  let g:airline_right_sep = ''\n  let g:airline_right_alt_sep = ''\n  let g:airline_symbols.branch = ''\n  let g:airline_symbols.readonly = ''\n  let g:airline_symbols.linenr = ''\nendif\n"
  },
  {
    "path": "vim/old/xdg.vim",
    "content": "\" Sets up Vim to use directories specified by XDG environment variables as\n\" defined in the specification:\n\" https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html\n\"\n\" Implementation inspired by:\n\" https://github.com/kaleb/vim-files/blob/master/xdg.vim\n\nif empty($XDG_CACHE_HOME)\n  let $XDG_CACHE_HOME = $HOME.'/.cache'\nendif\nif empty($XDG_CONFIG_HOME)\n  let $XDG_CONFIG_HOME = $HOME.'/.config'\nendif\n\nif !isdirectory($XDG_CACHE_HOME . \"/vim/swap\")\n  call mkdir($XDG_CACHE_HOME . \"/vim/swap\", \"p\")\nendif\nset directory=$XDG_CACHE_HOME/vim/swap//,/var/tmp//,/tmp//\nset directory=$XDG_CACHE_HOME/vim/swap,~/,/tmp\n\nif !isdirectory($XDG_CACHE_HOME . \"/vim/backup\")\n  call mkdir($XDG_CACHE_HOME . \"/vim/backup\", \"p\")\nendif\nset backupdir=$XDG_CACHE_HOME/vim/backup//,/var/tmp//,/tmp//\n\n\" Double slash does not actually work for backupdir, here's a fix\nau BufWritePre * let &backupext='@'.substitute(substitute(substitute(expand('%:p:h'), '/', '%', 'g'), '\\', '%', 'g'), ':', '', 'g')\n\n\" See :help persistent-undo\nif !isdirectory($XDG_CACHE_HOME . \"/vim/undo\")\n  call mkdir($XDG_CACHE_HOME . \"/vim/undo\", \"p\")\nendif\nset undodir=$XDG_CACHE_HOME/vim/undo//,/var/tmp//,/tmp//\nset undofile\n\nset viminfo+=n$XDG_CACHE_HOME/vim/viminfo\n\nset runtimepath-=~/.vim\nset runtimepath^=$XDG_CONFIG_HOME/vim\nset runtimepath-=~/.vim/after\nset runtimepath+=$XDG_CONFIG_HOME/vim/after\n"
  }
]